I've been wanting to write about and explore the Dreyfus Model of Skills Acquisition and show how it can be practically applied to learning Agile development. However, before I do that I need to provide an introduction to the model and some background.
I attended the QCon conference in 2007 and a talk by Dave Thomas entitled Developing Expertise: Herding racehorses, racing sheep" really struck a chord with me. In the talk he introduced the Dreyfus Model of Skills Acquisition and illustrated how it applies to every skill we currently have as well as any new skill we hope to learn. He then spent some time relating it to the discipline of software engineering.
The essence of it is that each person will be at different stages in learning of specific topics and subjects. And, that people move from Novice to Expert through five stages of learning and at each of those stages they need a different kind of support in order to move to the next level.
Dave's original article entitled End of the Knowledge Worker? describes how the model first proposed by Dreyfus to determine the limits of A.I. was picked up by the nursing profession. A friend of mine who is a nurse has since also confirmed that the Dreyfus model is used quiet a lot in nursing and medicine. In fact when nurses are trained each of their skills are ranked according to the appropriate stage on the Dreyfus model and they will either pass or fail their assessment based on that.
There may be some philosophical debate about some of the Hubert Dreyfus claims but the stages he describes which are based on observation are important and obvious in everyday life. They have also been validated and used to great success in the nursing profession as well as others. Most of the pragmatic programmers books are based on learning using this model and adapt the learning styles as you proceed through the books based on your expected skill level.
The following, mostly based on Dave's presentation, are my notes and current understanding of the 5 stages of learning;
- Novice:
- Want and need to be told what to do
- Need rules and maxims and context
- Have very specific needs
- You need to give them short-term goals and successes
- In a team where everyone is a Novice hopeless becomes contagious
- Advanced Beginner:
- The type of person you leave on their own saying "whatever you do, don't do x" and when you come back later and they have done x.
- Advanced Beginner programmers need to use pairing, unit testing and mentoring
- They are still concentrating to get stuff done
- Competent
- Competent programmers have begun to act on long-term plans and goals.
- They can troubleshoot most problems on their own.
- They develop conceptual models of how things work.
- They seek out expert advice.
- Proficient
- They feel like they are going backwards because they've just realised that the world is much bigger than they thought it was.
- They are constantly asking why something is the way it is?
- They need to know why things are done a certain way.
- The worst thing you can do to a proficient programmer is to say... "just because"
- Expert
- Experts generally talk in metaphors and stories
- They work primarily from intuition and can't justify what they do
- They require the big picture to be effective
- Experts need autonomy
- Two really good experts will sometimes change sides and keep arguing
- Experts generally can't justify a decision so learn to lie about the reasoning
- They are constantly seeking new information
- You should probably never allow an expert to choose your architecture because they will choose it because they are curious to see if it works :)
In his talk Dave then goes on to describe that he thinks most programmers in the software industry are Advanced Beginners. He thinks this is because there's no mentoring available, Competent people take risks and make decisions themselves and that most programmers want to be told what to do.
I've found this suggestion offered by Dave very useful. Next time you're in a conversation with someone on a specific subject or topic see if you can rank them according to their stage on the Dreyfus Model for that specific subject or skill. Once you've done that and you know your own stage of learning it can become easier for you to interact with that person in a way that is more beneficial to both of you learning and improving.
In my next article I will discuss my understanding of the processes of learning Agile software development and how the Dreyfus Model of Skills Acquisition might be able to help.