You Can't Teach Expertise
Over the past several weeks, I've had the obligatory parental experience of teaching a teenager to drive. This can be a nerve-wracking process as the new driver learns the mechanics of controlling the car: steering, using the pedals, shifting gears, checking rear-view mirrors, etc. But all these are relatively simple tasks that young drivers mostly master without serious problems.
The real harrowing experiences start only after new drivers have been driving for a while, when they're out on the road with other drivers. And that's where "learning to drive" truly comes into play, because it's not control of the vehicle that makes a good driver although that's certainly a prerequisite. Instead, it's the ability to anticipate the unexpected that makes a good driver--and unfortunately, that's a skill you can't teach.
You can talk about potential problems. You can describe them, and have the learner tell you what they would do in such situations. You can even practice avoidance maneuvers. But each new driver must personally experience many of the common driving hazards (and survive them) to be able to anticipate similar situations and take steps to avoid problems.
Sadly, the same rules apply to becoming a good programmer. Consider an application that stores some data in a file, retrieving it each time a user launches the application. Beginning developers, having learned the syntax to open and write data to files, simply write the few lines of code that read and store the data. If they've been programming a while, they might even write a test to make sure the code is reading and writing the data correctly. And because the code works, beginners think they're done; they've accomplished the task, met the specifications, and tested their work.
An expert programmer, faced with the same situation, knows it's not that simple. Sure, it's easy to write code to read or store some data in a file--when everything goes right. But it's not so easy to code the application to handle all the things that can go wrong, even with this simple operation. The file might not exist. The disk might be full. The file may be corrupted. The user may not have permission to access the file. The file might be in use. If the file's not local, it might not be reachable.
Granted, not all these problems are likely to happen at any given time, but developers who have delivered applications to large numbers of people know that, given enough time, all of them will happen, sooner or later.
An expert can tell a non-expert to check for such conditions, and with those specifications, the non-expert can probably code them, but only the expert anticipates them. Just like driving, what makes a good programmer is not only the ability to solve the problems that occur, but the ability to foresee (and avoid) problems that haven't occurred yet. Unfortunately, experts learn how to do that by making mistakes. It's a sad commentary on the human condition. Each generation acquires expertise primarily by repeating the mistakes of the past generations. To paraphrase Neils Bohr, "An expert is someone who has made all the possible mistakes in a very narrow field."
But when you're riding in a car with a novice driver, you'll probably appreciate P. J. Plauger's version more, "My definition of an expert in any field is a person who knows enough about what's really going on to be scared."
0 TrackBacks
Listed below are links to blogs that reference this entry: You Can't Teach Expertise.
TrackBack URL for this entry: https://swarm.jupitermedia.com/mt-tb.cgi/9085











This is exactly what I've been trying to tell my bosses, who think that a junior developer can be turned into a seasoned senior developer via training/mentoring.
It's nose-to-the-grindstone for years, plus a certain innate talent for this work that makes the difference.
Thank you, thank you, tahnks you. After 10+ years of being labelled a bad guy for not being able to transfer the skills and knowledge acquired over a lengthy career to some recently graduated newbie it is a relief to have someone describe the problem in simple terms.
I would add that if you have apassion for what you are doing then you will find the time and make the effort to get good at it. An article in Scientific American said that you can become an expert in anything if you work at it for 10 years. If you think you learned everything you will ever need in college or university then you will soon join the herd of IT dinosours.
Many thanks for the article. As a programmer who has been applying my skills for more that 35 years I can look at a situation and quickly point out all the things that could go wrong. However I am also self taught - never having the chance when I was younger, nor the time now I am older to formalise my skills with a degree.
But in my field I am often presented by younger guys fresh out of university who have a degree and who also feel (sadly also the managers feel the same way) that they are instantly experts in programming.
However from my side I remember when Pascal was the flavor of the month, followed by Delphi, C, Modula, ADA,C++, LSIP, and FORTH etc. And in the 80;s and 90's almost every software company was putting out their own 3GL and 4GL.
But... When one looks deeply into it - the structure of programming has not changed much at all. Yes there are nicer tools that give you better enviroments to work in, create more code for you, enables you to reuse idea's thus saving time recoding.
At some time or other software meets hardware. Software is elegant, A = B = C is a given fact and will never change. However as soon as we interface with the real world the level of certainty goes down and the possibility of errors increases. Part of experiance is to look at a problem and work out where the greater risks are.
The chances of a user entering character into a numeric field will be higher than a hard drive not writing it's data. But both can still happen and so we must use these observations to harden our code.
Likewise universities often teach for the perfect world - but it is the experts at the coalface who have to complete the teaching.
That is - is the young guys are willing to learn :)