How I learn stuff
Ashley McNamara wrote a blog post in which she described an almost pointless coding course that she attended and paid a lot of money for. I had a similar experience a long time ago. I'm writing this post because Ashley asked me for my 'opinion on what the “right” way to go about learning software development is'.
I think my focus is on the introvert side of things. I'm sure someone else would talk about going to hack days and hanging out on IRC channels. Here's what I did...
In secondary school I didn't do any more than I was asked to do and the (B) grades rolled in so I figured I was doing okay. That attitude didn't stand me in such good stead on my bachelors degree, but I still managed to earn an honours degree in Chemistry and felt like I was ahead. I'd been brought up with a middle class belief in the power of qualifications and, though I only had a vague idea of how to turn them in to a living, having those qualifications was a reassuring safety blanket.
After a year on the dole, I lucked out and got a state-funded place on a taught masters degree in computer science. I was over the moon because this was what I'd wanted to do all along. My father, with great foresight, had sent me on a BASIC programming evening class when I was ten years old and I fell in love with the power of computer programming. (How I failed to get on to a CS bachelors degree is an amusing and embarrassing tale for another time.)
The masters course turned out to be a money spinner for a group of CS lecturers. They were supposedly teaching a course that would get people off the dole, but that would have required practical, vocational skills. What they actually taught were their individual specialisms. This ignored both the needs of the job market and whether a student could hope to get a useful amount of information in any individual module. As I was still a great believer in Qualifications, I didn't rock the boat. My older and much more practical course-mates were horrified and wished all that government money had been spent on a computer and a score of carefully chosen textbooks each.
Buy book, code examples, go build something
I still didn't have a job and, as I was waiting for one to magically appear, I decided to teach myself C++. There was a chance it might be more widely used than the Eiffel that I'd learnt on my masters course.
This fit a template for how I had and would learn different technologies: Buy a thick, approachable book that built chapter-on-chapter through code examples and just code every example, answer every question. My only refinements to this system (when I got more used to that internet thingamabob) were to make sure the book was well-reviewed and (for perverse languages like C++) find a supplementary book that concentrated on the gotchas.
I never completely finished these books. I just worked through them until I got bored. When I was younger I would give myself a hard time for doing this but I've since realised that I was bored because I'd already learnt what I needed in order to build the things I cared about. Working through more examples was keeping me from the enjoyment of building those things.
Here are the example/tutorial based books I used over the years:
- Assembly Language Step-By-Step (link is to newer edition) by Jeff Duntemann - made me love programming even more.
- C++ Primer Plus (link is to newer edition) by Stephen Prata - got me to a point where I then quickly became useful in a graphics technology startup.
- For Visual Basic I have no idea what the book was called. Many of the examples were wrong and it drove me nuts, but while being driven nuts I did learn all I needed.
- Pro C# 2008 and the .NET 3.5 Platform by Andrew Troelsen - tedious writing style but I got a C# job within a month of starting the book.
- Applications = Code + Markup, A Guide to the Microsoft Windows Presentation Foundation by Charles Petzold - utterly sublime. The best example of this style of book. Anyone who complains about the lack of pictures should supplement it with a story book for the under 5s.
When it doesn't work
This may sound like a convenient, repeatable system but there are times when this has not worked for me. For all the books mentioned above I succeeded in my aim. By the time I abandoned the book I had a much better grasp of the technology in question, and I put it in to practice immediately.
The major gotcha here is Discipline.
Working through a book this way takes discipline and I lack that discipline under certain circumstances:
I find tactically learning new technologies e.g. to generally improve my programming skills or my resume, utterly futile. Without the mind-focussing effect of a target application or job I get nowhere.
I get very impatient with this style of learning if I'm already fairly familiar the technology in question. I program in PHP and Ruby at the moment but I've learnt both of these "on the job" by modifying existing systems. I know there are holes in my knowledge but I plug them in an incremental way as I work. Trying to work through a thorough book on one of these languages is a recipe for huge frustration.
Is that it?
That's not the be-all and end-all of course. I'm sure I've learnt more while coding applications than while coding examples. I think the advantage of the book-as-programming-course approach is that my foundation in any given technology is as thorough and complete as the book is. But I have to use that knowledge immediately and repeatedly in order to lock it in. My C++ programming career lasted 9 years. I'm sure I could pick up any of the apps I wrote then and feel up to speed again in a day. Well, maybe a week. On the other hand, my C# / WPF career lasted 3 months and I'm sure that on coming face to face with the system I worked on then I would break out in a cold sweat.