Software development is a wonderful field to be a noob in. Perhaps more than any other discipline, there is a wealth of information available for free online–everything from fundamental computer science courses, to the night-by-night learning notes of a master programmer. And, of course, there are millions upon millions of lines of Open Source code free for the reading.
Unfortunately, this embarassment of riches can be as much stumbling block as well as a stepping-stone. You can learn a lot from this information overload, but you can also waste a great deal of time and find yourself with very little to show for it. Personally, I’ve probably wasted thousands of hours in this way over the years. It’s only recently that I’ve come to identify the antipattern behind this waste. I hope that in writing this I can help you to avoid my mistakes.
The pattern usually looks something like this:
Oh man, this web programming stuff is HOT! I need to get in on this!
Let’s see… if I want to program for the web, I’ll need to learn a programming language better suited for the web. And I don’t want to get stuck with on that sucks, so I need to pick the very best one. Research ALL the languages![insert 3 months of reading about Perl, Python, Ruby, and PHP and maybe writing one or two “hello world” examples]
OK, my “hello world” was totally better in Blub than in any of the other languages. But now I need to pick the right web stack for my awesome app ideas. Subscribe to ALL of the blogs![Insert three months of voraciously reading web programming blog articles.]
I’ve been reading some of these blogs, and while it seems like everyone is using “Ruts”, it has almost become passé now. Some of the more obscure competitor frameworks look a lot cooler. I’ve read all of their design rationales, and despite the fact that I’ve never written an app in Ruts, I totally agree with their critiques. Yeah, I don’t want to to be stuck in a 6-month- old outmoded framework like Ruts.
Also I need to remember to use the “Box Turtle Pattern” that everyone is talking about.
No wait, now they are realizing Box Turtle doesn’t scale, and the Elephant Plop pattern is the way to go. Man, why did we ever think Box Turtle was a good idea? Whew, glad I hadn’t started my app yet. Dodged a bullet!
Oops, no, looks like Classic Box Turtle coding is making a comeback with a vengeance. Man they are totally right, when you do it correctly it’s way more robust than Elephant Plop.
Gosh, what a vibrant community! These advances are hard to keep up with! When am I ever going to find time to write code?
Oh man, this smartphone programming stuff is really heating up…
Without further ado, here is Avdi’s autodidact guide to learning a new programming technology:
- Do not subscribe to all of the blogs. As yet you have no way of contextualizing the information you will receive from this firehose, and it will just be a paralyzing stream of often-contradictory information.
- Make a list of the alternative languages/libraries/frameworks/whatever.
- Pick the most popular one. Here are the criteria for “most popular”:
- You can easily discover high-traffic fora–mailing lists, IRC rooms, forums–dedicated to it. When you ask newbie questions on these fora, they are quickly answered.
- There is at least one reputable book about the topic. Books aren’t a perfect indicator of technology viability, but the fact that someone has taken the time to organize knowledge in a systematic fashion is a decent heuristic pointing to a certain level of stability.
- There is a healthy users group dedicated to the technology, meeting regularly in your nearest big city.
- At least a few people in the community are too hip for it, and have vocally moved on.
- Yes, I said the most popular. Not the “best”. You don’t have enough information to figure out the “best” one yet. We’ll get to that. Right now, you need to pick the one where any problem you run into as you learn can be easily googled.
- Join that local users group. Attend it diligently. You will need those people.
- Buy, and read, a book about it. Yes, an actual book that you can read on your actual iPad. Or even, (gasp) on paper. Books have some nice properties which most online learning resources lack:
- They are (relatively) complete. Free online tutorials have a nasty tendency to have gaping “to be written” sections, or to simply stop right in the middle.
- They usually focus on fundamentals, rather than the latest nifty techniques. Right now you need fundamentals.
- They have structure. Right now you need structure.
- Authors of capital-B Books typically spend more time making sure that you’ll be able to reproduce the examples shown in the book using a given version of the tools. Not always (sadly), but usually. For that matter, they usually have fully-worked examples rather than snippets.
- Fewer hyperlinks, and thus fewer opportunities to be distracted by rabbit holes which lead everywhere except to you writing actual working software.
- Now use what you’ve learned in a project. For the love of pete do not use it on a project you get paid for, unless you have an explicit understanding with your employer that you are using something you’ve never used before, and will probably get it totally wrong and have to rip it up and start again in six months. Otherwise, use it on a personal project. A small personal project.
- When you run into trouble, consult the people in the aforementioned fora and local users groups. You are attending those groups regularly, right?
- Congratulations! You now have the beginnings of context and perspective on this new realm of knowledge. The annoyances which caused those aforementioned hipsters to abandon technology X are no longer academic to you; they are real things which you have also dealt with.
- With your newfound perspective in hand, review that list you made in step 2. Toss out the projects which have become defunct since you made the list. Pick out one which specifically addresses the problems and irritations you encountered in step 6. Use online tutorials, blogs, whatever; you know the territory now and don’t need to be so pedantic.
This is the framework I’m going to try to stick to, going forward. If you decide to try it, please let me know how it works out for you.