I remember when I finished first grade and I thought I was done with school. The reason I wanted to go to school in the first place was to learn to read and at the end of first grade I thought I had that down cold. What more was there to learn? I see some of that with programming as well. People take a first programming course and they think they’re done – they’re programmers! Well not so fast. There is more to it than that just as there was more to learning and even reading when I finished the first grade. Others come to me and tell me they want to learn enough programming to create a specific application (rarely one that is that easy) or the next Halo 3 (never that easy) or something. There is this cram school mentality that seems to overtake so many people. Unfortunately, programming like so many things takes a while to really, deeply learn.
I ran across the article Teach Yourself Programming in Ten Years by Peter Norvig recently and it does a good job of addressing this very issue. Here is a key paragraph from that article:
Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again.
What is key in so many of these endeavors? Practice. Careful, deliberate practice. One can get that practice several ways – projects in class, projects while working for a living, projects for fun and competition (Imagine Cup is a great one for college students USACO is good for many high school students.), and more. But programming is still a skill – some would say an art or perhaps a craft – and it takes practice to get good at it.
Some students like to point out some of the top programmers in the world did not go to college or dropped out (Bill Gates for example) but they neglect the fact that those people all practiced A LOT! They wrote code day and night. Plus of course they are really really smart. For most people I think formal training is a huge help and speeds up the learning process greatly. But in the end practice is what makes it work. That and a willingness to learn constantly. The article includes a recipe for programming success that lists more items than just practice BTW. I think it undervalues formal training but it does include it.
The relative merits of formal training and practice and what the ratio should be makes for an interesting discussion. I really think the best people have some of both. What do you think?