The Dreyfus Model
Recently I read Pragmatic Thinking and Learning, by Andy Hunt. One of the early chapters deals with the Dreyfus model of skill acquisition, and applies it to software development.
The Dreyfus model identifies 5 skill levels:
- Novice
- Wants to achieve a goal, and not particularly interested in learning.
- Requires context free rules to follow.
- When something unexpected happens will get stuck.
- Advanced Beginner
- Beginning to break away from fixed rules.
- Can accomplish tasks on own, but still has difficulty troubleshooting.
- Wants information fast.
- Competent
- Developed a conceptual model of task environment.
- Able to troubleshoot.
- Beginning to solve novel problems.
- Seeks out and solve problems.
- Shows initiative and resourcefulness.
- May still have trouble determining which details to focus on when solving a problem.
- Proficient
- Needs the big picture.
- Able to reflect on approach in order to perform better next time.
- Learns from experience of others.
- Applies maxims and patterns.
- Expert
- Primary source of knowledge and information in a field.
- Constantly look for better ways of doing things.
- Write books and articles and does the lecture circuit.
- Work from intuition.
- Knows the difference between irrelevant and important details.
Hunt makes some observations about how to progress towards higher Dreyfus levels:
- Most people do not progress beyond the Advanced beginner level.
- To reach an expert level will take at least 10 years of practice. Not simply doing the job, but actively focusing at improving.
- To progress you must accept responsibility, simply following orders will not work.
There are several things about the Dreyfus model which resonate with me, as someone round the advanced beginner/competent level of software development. I certainly have a problem distinguishing between relevant and unimportant details when looking at other folks code. I am poor at applying design patterns, because I don't know them very well and have not practised them. I'm still quite rule based about what I do.
Much later in the book, Hunt discusses how to practice, and makes a particularly important point; you have to have a safe environment in which to experiment. There are two aspects to this. You need to make your coding safe with source control, unit test and build automation. These practices should be applied to your learning projects as well as professional work. (I need to set up build automation for my learning projects). And secondly it has to be OK if you fail - you'll never try anything new unless it is.