I started learning how to program in the late 1990’s. It was exciting times, the first dot com bubble hadn’t yet burst and I wanted in. I was determined to learn how to write software as fast as possible. So I started buying books and reading the newsgroups. I eventually learned, but in hindsight I realize that I wasted a ridiculous amount of time. Knowing what I know now, here’s what I'd do differently.
How to learn
In high school I took a couple years of spanish, but had very little to show for it. I could never really hold a conversation in Spanish and today I’m no better at spanish than my wife who took french. In contrast, I know several people who were foreign exchange students in non-english speaking countries. They all have similar stories about conquering language barriers, each of them were functional with the new language within a couple months of using it and most can converse in that language today. I think a similar approach is the most useful with programming languages. You must start using the language to become functional quickly.
Unfortunately I took the traditional “school book” approach when I started learning to program. I spent too much time reading books, and browsing newsgroups. I felt that I should learn everything I could about a language, all the features & standard libraries… an unrealistic goal and an in-effective use of my time. Today when I’m writing code I’d estimate that I routinely use about 20% of the languages features.
This begs the question:
Why should I spend equivalent time and effort learning the other 80% that I won't routinely use?
I would have been far better off just learning the 20% that I’ll regularly need to start.
Which 20% to learn
Ok so how do you know which 20% to learn? Just like my exchange student friends, you’ll only discover the 20% by using the language. In other words, you need to communicate with the language / make things with the language you’d like to learn.
Don't set a goal to learn language X, set goals to make things with language X.
What to make
Make simplified clones of apps you know and use such as: blog engine, twitter clone, airbnb clone, reddit clone, etc... If you're starting from zero language knowledge, learn just enough about the language syntax to read it then go find repo’s on github that have already made clones. Read their code to see what they are doing and then build your own clone using language X. Start small, and make things that are achievable in a short time period. When you’re actually making things, you’ll figure out the 20% you’ll need.
Make many things
Once there was a pottery teacher who split his class in half. He told half of his class to make as many pieces as possible. They were to strive for quantity over quality. The other half of the class were told to focus on making one masterpiece. At the end of the semester, the students that were told to make many pieces were also making things far superior in every way, than the students who were trying to make a single masterpiece. Take this anecdote to heart, I find it’s very true in the programming world.
Picking language X
The only other guidance I’d provide is choose the simplest language of the popular choices. You may be tempted to choose a feature rich language, because more features would intuitively seem better. The problem with feature rich languages is there are often many ways to do the same thing, which will leaves you wondering what’s the best way to solve this. You’ll definitely need to learn the idiomatic way to do things, but if there is only one way to do something then you’ll have no choice but to learn the correct way.
You're going to hit many walls, but you must push through it. You’re going to look at lines of code that a seasoned developer will understand at a glance, but you’ll need to spend 20+ minutes to figure out what’s happening, and even after 20+ minutes, you’ll just barely have a working knowledge… Understand that for most of us this is just how it works. You’ll need grit, keep pushing! I can think of no better word than grit.
Find a Mentor
I didn’t have a good mentor for much of my early years. I knew that it would be a good idea, but I didn’t make it a priority and that was a huge mistake. What would a mentor have done for me? I’d have learned faster, I’d have had far less frustrations, I’d have someone to vent to, I’d have made significantly faster progress, I’d have had more opportunities, my path to success would have been far shorter...
I didn’t fully recognize what a mistake I’d made until earlier this year when I was able to mentor a couple of aspiring software developers. The small amount of time I put into these young developers, was a huge benefit to them and me. It was a mutually beneficial relationship. New developers must seek a mentor, don’t be afraid to ask. When you find a mentor, step up to the plate and don’t be a slacker.
Don’t Be Paralyzed by Fear
Learning new things can be a bit scary, but don’t be paralyzed by fear. Ask the question in your mind, it’s probably not stupid. You’ll make mistakes, you’ll misunderstand things, you’ll screw things up because you're human and that’s what we all do. So be bold, don’t be afraid to make mistakes and when you do, own them and learn from them.
“Compulsive avoidance of embarrassment is a form of suicide” - Colin Marshall
Join the community
Go to meetup.com and find local tech meetups that are interesting to you. I’ve found that most of them are very welcoming. This is where you’ll make contacts, possibly find a mentor, find job opportunities and stay up with what’s new. Don’t worry about what you know or don’t know. Just show up!
"Tell me and I forget, teach me and I may remember, involve me and I learn." ― Benjamin Franklin