Be Like Linus in 10,000 Easy Steps
by Sean and Andrew
Like us, you're probably not in the top 1% of all programmers. If you are, congratulations to you! Stop reading this and go finish hadooping your big data to prove your new functional reactive framework is crushing node.js before you run out of monads.
The rest of us? Well... we didn't discover coding yesterday, but we aren't in the top 1% either. In other words, we know we're somewhere in the bell portion of the bell curve.
We'd like to keep getting better, but how? How do you grow into membership in the top one percent of programmers? It's not easy, but we have a few suggestions.
Define Your Specific Goals and Motivations
You probably have a specific motivation for wanting to be better as well: you want to make more money, or you want to be able to do all the development for your own startup idea, or you want more respect and accolades from your peers, or you want to be invited to speak at top conferences, or be Internet geek famous, or something else. Whatever it is, it's important. Figure it out and write it down. Decide what your life will look like when you get there, and be sure that's what you really want.
Get an Honest Assessment of Where You're At
Now that you know where you are going and why, you need to evaluate where you are at currently. An honest self-assessment is critical.
After making notes on your strengths, weaknesses, and the areas you'd like to be stronger, ask for co-worker's and mentor's opinions of your technical strengths and weaknesses. Compare those notes. Where is the agreement on areas for improvement? What are your private weaknesses that are well hidden and only you know? What are the blind spots where you didn't realize you were weak?
Define a Path to Improvement
You now know where you want to go and why, and where you are starting from, so you just need a path to get there. In other words, you need a series of small, achievable steps that will lead you to greater skillfulness in the areas you have identified.
Start gathering the resources that can teach you what you need to know at each step. These can be articles, videos, books, MOOCs or classes. You can also identify a person that's going to teach you a specific concept or skill, or help you plan out your learning path. If you truly stuck on how to move forward in an area, ask trusted technical communities like HackerNews and Stack Overflow for advice.
Measure Your Progress
It's important to have a feedback mechanism for each step, a way to know if your learning is effective. It's how you'll know it's time to move on the next level or next area.
When learning programming skills and knowledge, we've found that a "Can I do X?" test is the best feedback mechanism. Your "X" may be adding some new capability to a project by leveraging a language, library, or technique you're trying to learn. It might be a stand-alone code sample that definitely does "X". Or it may just be writing a blog post explaining how something works. In any case, spend time thinking hard about a targeted, definitive outcome, something you can't do today that you will be able to do when you have this next new skill or piece of knowledge. Stick with it until you've accomplished "X".
Put in the Time, Habitually
Finally, you need to do the work. The new cliche is you need 10,000 hours to truly master something. 10,000 hours is 4 1/2 years at 40 hours a week. You don't need that much time to master CSS selectors or C bit-fiddling, but you're certainly looking at 10,000+ hours to climb into the rarified air of a generalist guru-level programmer with a couple specialities.
Be wary at this point. Danger lurks in pondering the big picture. None of the programmers you respect and admire sat down and said, "I'm going to spend 10,000 hours over the next 5 years developing my craft." Instead, the key is to focus on the little picture: incremental improvements. What's the very next thing that you can do that will have you learning and stretching your skills and growing, even a little bit? Do some of that each day.
The surest way to put in the time you'll need to spend practicing and learning is to develop a daily habit. At Snooty Monkey, we set aside dedicated time each week to spend practicing and learning new development skills that we've decided we want to have as individuals or as a company. Then we hold each other accountable.
Making the time for learning is both the hardest and easiest part of self-learning. It's the easiest because, no matter how busy we think we are with our full-time jobs, our kids and our lives, we all have some time in the day that can be used for self-improvement. Don't spend that 1/2 hour surfing the Web, or watching Big Bang Theory, or sleeping in, and instead invest it in your programming skills.
Consistently choosing to make this time investment is also the hardest part because there is always something easier, more relaxing, more fun, or even more urgent that we can do with our time.
Developing a learning habit, so that spending time each day on learning becomes automatic and default, rather than an explicit decision. You'll also want to bring in positive peer pressure from someone you respect ho help you quickly adjust when your habit fails you before your habit goes cold.
Help With Your First Step
If this all sounds good, but you're still not sure what's the best next step to take, there's good news: we're putting the finishing touches on a free tool that lets you assess yourself, get peer assessments, decide which areas you'd like to improve in, and then identifies the learning resources that'll help get you there. The tool already has pointers to some of the best content, and it's open to feedback and improvement, so we're looking forward to it getting better over time.
It launches in early December. Sign up to our self-education email list and we'll drop you a short email to remind you about it.
Never stop learning!