Programming Skill and Dreyfus’ Stages of Expertise

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.

Advanced Beginner

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.

This entry was posted in Uncategorized and tagged , , , . Bookmark the permalink.

6 Responses to Programming Skill and Dreyfus’ Stages of Expertise

  1. Geoff says:

    But you need to get clear on whether you’re pursuing mastery or not, because there’s no point in half-assing it.

    It’s more than a shouldn’t, mastery can’t be half-assed. Mastery requires personal dedication and a constant commitment to reviewing and improving.

    As soon as someone on the path to mastery stops doing this, they just become an expert at wherever they were at when they stopped.

  2. Nick Urban says:

    I completely agree. Perhaps I didn’t state it clearly, but what I was meant was that there’s not much point in trying to improve, once you’re an expert, unless you are going to make it a life-project.

  3. Geoff says:

    I totally agree. Mastery is a lifestyle.

  4. Boykie says:

    I suppose it loosely ties in with the Pareto principle i.e after achieving 80% mastery you’d rather pursue other interests as completing the remaining 20% will take a whole lot more effort than it took to achieve the 80%.

    Nice post!

  5. Nick Urban says:

    Thanks for the support. What you said certainly applies, that you get most of the benefit from the first 80% of skill acquisition, but I’ve heard the Pareto principle stated a bit differently, namely (as Wikipedia says), that “80% of the effects come from 20% of the causes”.

    That would seem to suggest that you get the most benefit from the first 20% of your study, which, if we assume that progress is on a kind of uniform linear scale, would leave you with competency at best.

    But skill development is not on a linear scale. There’s a real topography to it. In particular, the first three levels don’t require emotional commitment, but the latter levels do. Mastery, in particular, is qualitatively different from the others, because it takes on the character of a life-project, which, if successful, reshapes the meaning of success in the given discipline. I don’t think I can really qualify that in terms of a percentage 🙂

  6. Pingback: Tweets that mention Programming Skill and Dreyfus’ Stages of Expertise | Sophwarist --

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s