In the field of education and learning, some models have been elaborated. One well known is the Dreyfus model of skill acquisition. It describes how students acquire skills through formal instruction and practicing. As we address the question of development skills with Sybil, it’s for us an interesting point of view and inspiration
The original model consists in five distinct stages: novice, advanced beginner, competent, proficient, and expert. When acquiring and developing a skill, the person goes through those 5 stages by learning some principles on which he takes decision. When at the beginning, those principles mainly consist in rigid and explicit rules, they evolve to tacit knowledge, i.e. principles that are simply internalized.
The 5 stages
A novice will rigidly apply taught rules or plans without judgment.
An advanced beginner has developed a limited perception of the situation. He still addresses the different aspects of a task or a problem independently without any priority.
A competent accumulates information and can deal with multiple aspects in the same time. That allows him to understand the consequences of his actions on the goals. At that moment, he can build and plan a procedure to tackle a problem or reach a goal.
A proficient has a global overview of the situation, understands the importance of different aspects to deal with, and prioritizes them. He perceives how he needs to deviate from the normal pattern to apply, and he follows not only local rules or guidelines, but also maxims with an application variating with the addressed situation
An expert has developed a tacit and deep knowledge thanks to his huge practical experience. He doesn’t need anymore to directly and explicitly rely on rules, guidelines, or maxims. When he faces a problem, he knows intuitively what is possible, and how to approach the situation. He also feels when it is a new kind of problem that he never meets before. He then follows an analytical approach.
Let’s try to apply those definitions to the acquisition of a given first programming language X without considering its ecosystem of libraries for the sake of simplicity.
A novice had learned to recognize the most important common keywords and syntax rules allowing him to tell if they belong to X or not. He can also copy some very small snippet of code in X that seems correct to him syntactically but not really understand its meaning. He can also compile and run the program (or just interpret it), and tell if the output is an error or not, but not interpret it.
The Advanced Beginner
An advanced beginner recognizes expressions and other language structures in X such as arithmetical expression or loop, and he understands their meaning, i.e. he can expect they produce a certain output when used appropriately. By doing so, he can modify them in order to change their output as he thinks it would. He also understands simple directives that the compiler or the interpreter gives when an error occurs such as a syntax error or the line number where the error has occurred.
A competent is finally capable to write simple programs achieving a whole goal. He recognizes if the output is the expected one, and he can corrects it if not. He starts also to apply some patterns such as the common way to iterate over a collection.
A proficient can plan how he will write a complex program by splitting it in several parts or subprograms. He follows general maxims such as SOLID if X allows to do object oriented programming. When he has to meet some requirements such as using a collection offering rapid read access, he knows which solution to apply.
After programming in X on a daily basis, an expert writes code to obtain an expected output without thinking explicitly to syntax rules or expression grammar. When the program stops on an error, he knows what he should correct and where. When he faces something new, he returns to an explicit approach.
A model of skill progression in software development
It’s an interesting model that gives a way to categorize the different skill levels. The difficulty is to apply their definition to a certain domain. It is possible to translate them, but the development of metrics is not straightforward and certainly debatable.
I’m not the first one (for instance check the programmer competency matrix), and even some web sites try to capture those levels in some way (stackoverflow.com, coderwall.com). But as a developer, I’d like to have a measure of my skills that helps me to understand how I progress, what I need to improve, where I need to go, as a teacher or coach can do.
And you what’s your opinion?
Some related reading:
- Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt (pragprog.com)
- Building Software Development Expertise – Using The Dreyfus Model (skorks.com)
- Dreyfus Model: More thoughts (markhneedham.com)
- Building experts using the Dreyfus Model (lizkeogh.com)
- Level 5 means never having to say you’re sorry (codinghorror.com)
We are developing an Automated code reviews for Ruby developers using Github, discover how you can become a better Ruby developer.