When new developers come on board or are simply asking advice one of the things I am asked about are “the secrets to becoming a good/better developer”. That simple question is enough to trigger multiple follow up questions. Is developing software a talent, an aptitude or maybe a skill acquired by practice? I spend countless hours honing my skillset at work, at home and on this blog, but can I get better? Reading this article from Joel on Software seems to indicate that your skills are somehow set and unchangeable:

I’ve come to realize that understanding pointers in C is not a skill, it’s an aptitude. In first year computer science classes, there are always about 200 kids at the beginning of the semester, all of whom wrote complex adventure games in BASIC for their PCs when they were 4 years old. They are having a good ol’ time learning C or Pascal in college, until one day the professor introduces pointers, and suddenly, they don’t get it. They just don’t understand anything any more. 90% of the class goes off and becomes Political Science majors, then they tell their friends that there weren’t enough good looking members of the appropriate sex in their CompSci classes, that’s why they switched. For some reason most people seem to be born without the part of the brain that understands pointers. Pointers require a complex form of doubly-indirected thinking that some people just can’t do, and it’s pretty crucial to good programming. A lot of the “script jocks” who started programming by copying JavaScript snippets into their web pages and went on to learn Perl never learned about pointers, and they can never quite produce code of the quality you need.

While I recognize the brilliance of this piece, in hindsight I do not agree with Joel’s premise that somehow pointers are an ideal way of capturing whether a developer has the chops to take on and produce quality code. The substantive moves to frameworks that hide the notion of references and pointers tells me that those concepts were never the point (pardon the pun) to begin with. So for me the question becomes what are the tools that provide us with the best possible chance of success and do you have practical and successful experiences with those tools?

Is this the fundamental difference between an engineer and a scientist? The principles and tools verses the pure academic pursuit of knowledge? I will leave that specific discussion for another day.

“It is not the spoon that bends only yourself”

During a recent Hanselminutes podcast the comparison was made with Michael Jordan’s relatively unsuccessful venture into baseball, basically put, if an athlete in the order of MJ could not switch sports and become a great baseball player then no amount of training can help a poor developer become an average one. There is so much fail in this statement I do not know where to start. MJ had not played baseball for over 12 years which was probably the root of the problem, he then only played baseball for about 9 months. Even when he got back to playing basketball he looked almost human for about a year. In both cases a lack of targeted practice made one of the greatest athletes of all time look less than average in two sports.

One achieves intellectual work by engaging and internalizing content through practice. In truth it is a combination of things (aptitude, skill, practice, etc), some people get recursion and pointers as soon as you show them an example, for some people it may as well be discussion in the Special Theory of Relativity, so practice in this indirect method of thinking is required. No one is suggesting that you can teach “height” (to push the basketball analogy a bit further), but you could teach almost anyone to become a great spot up shooter.

Put even more simply I do believe you can overcome any basic deficiencies with practice and a commitment to your craft. It only rarely result in you becoming the Michael Jordan of your field, but you could become a successful role player.