In my last article, I posed an off-the-cuff model of skill development in order to illustrate a point about when we ought to improve our programming technique and when we ought to spend our time on other things. Today I began reading Hubert Dreyfus’ pocket-sized wonder On the Internet, and his description of skill development puts mine to shame.
Whereas I mentioned only familiarity, competence, and mastery with little regard to their specific content, Dreyfus gives a detailed account of the progress made by students. He uses this account to show the limitations of distance learning, but for our purposes, I’ll just summarize his stages of development:
A novice learns rules for performing certain easily understood actions in response to certain easily observable features of the environment.
An advanced beginner has had some real-world experience and has begun to develop sensitivity to context in addition to the rules of the novice.
Competence comes when the student learns to sort their experience into relevant and non-relevant portions. This is necessary, because as experience increases, the number of recognizable aspects of a situation increases dramatically.
Moving beyond competency requires an emotional commitment by the student and a serious concern with the quality of their performance. It appears that the shift from a rule-based / rational mode of activity to an intuitive one requires a corresponding shift from a detached to an emotionally charged attitude of participation.
With proficiency, a student has internalized enough successes and failures that he is able to recognize situations immediately, but he must still deliberate in order to chosen an appropriate action.
An expert not only immediately recognizes each situation, but he intuitively knows the appropriate response. Experts are thus able to perform very smoothly, since no time is spent in deliberation. (Dreyfus’ “expertise” is roughly equivalent to how I used “competence” in the previous article.)
Mastery is the final and highest development of a given skill, and it is largely distinguished by an ability and willingness to go against established practices in search of increasingly better solutions. This willingness is usually the result of a strong dedication and passion for the material, which allows the master to persevere through failed attempts that could easily have been avoided had they been content to remain experts. Masters advance the state of the art.
If I were to update my recommendation using Dreyfus’ model, I would say that it is worth being an expert at anything you are doing professionally. If you are going to be a programmer, you might as well be an expert programmer. But you need to get clear on whether you’re pursuing mastery or not, because there’s no point in half-assing it. You’re not going to perform as well as a regular expert and you won’t get to the discipline-changing clarity of the master, either. That’s why it makes more sense to diversify if you’re not going to go for mastery one hundred percent.
The other wonderful thing about Dreyfus’ model is that it allows us to understand why so many people get stuck at competence and never reach expertise, no matter how long they spend programming. They don’t have the emotional involvement required to get there. To become an expert, you need an aesthetic sensitivity to your subject matter. You need to appreciate the beautiful and the good and despise the ugly and the rotten.
That’s why you can often tell a person’s skill or potential based on their reactions to code of varying quality. If they respond with disgust to hacky garbage and wondrous admiration to some little pearl, they may not be masters, but you know they’re on the right track.