Pragmatic Thinking & Learning: The Dreyfus Model

I recently started reading Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt (Yes, the guy from The Pragmatic Programmer). It's a cool book, so cool in fact that I believe it's one of the best things I've read on the topic.

I wanted to write a series summarizing the main ideas Andy talks about in his book. This is, of course, not a replacement for reading it, but it will let you decide if it's right for you.

If I had to summarize the book in a single phrase, I'd say it's a collection of models and techniques to understand how to make the most out of your brain. The first of such ideas (and the topic of this article) is the Dreyfus model.

The Dreyfus model aims to illustrate how humans acquire abilities and progress through different levels of skill. It was originally proposed by the brothers Stuart & Hubert Dreyfus in 1980 at the University of California, Berkeley.

The model divides the progression of skill in 5 stages:

  1. Novice
  2. Advanced beginner
  3. Competent
  4. Proficient
  5. Expert

Let's take a look at the typical characteristics of each level.


Novice is the lowest possible level of proficiency at any given skill. You are a novice when you have little or no experience at a particular activity.

A novice's main goal is to get things done: all they care about is completing the task at hand. The best tool you can provide a novice with is a series of rules in the form "If X happens, then you have to do Y". A collection of context-free rules like this will help them achieve their short-term goals.

Think about building furniture, a task most of us are novices at. I can't build pretty furniture from scratch, but give me an IKEA set with instructions and I will assembly a couch without problem (my wife knows this might not be totally true).

Of course, if something doesn't fit in the rule decision tree, a novice wouldn't know what to do and will need the help of a more experienced individual. For advancing in the skill ladder, novices need to change their attitude and start learning properly.

It's important to notice that lots of low-intensity effort do not help: being a Junior for 10 years is just 1 year of experience ten times.

Advanced beginner

Remember that decision tree made of context-free rules novices depend on? Advanced beginners start to break away from it, and have some level of autonomy when it comes to solving problems.

The most important thing for advanced beginners is to have access to information: project documentation or tools like StackOverflow provide what they need to get things done. They start to be able to apply advice, as long as it's given in the right context.

An advanced beginner starts to formulate some general principles, but still lacks the bigger-picture view of things.


People at the competent level have a huge advantage over advanced beginners: they have much more solid conceptual models of the domain and can troubleshoot/solve problems they haven't seen before.

A competent practitioner has enough previous experience to plan and execute tasks, but still has trouble with perspective. It can be hard to determine which details need more focus and which ones can be safely ignored.

This is a stage where most software developers find themselves sooner or later: you know you can program, but when you start a project from scratch it can be hard to know which classes to create or which abstractions the project needs. The problem is not in writing the project, but in knowing what focus on and what to leave for later.

With more experience and deliberate effort, they can reach the next stage: proficient.


A proficient practitioner can see (and needs) the bigger picture: they understand what things to pay attention to and which ones to ignore. They also have a much better grasp of the domain's conceptual models.

Their work is guided not by hard-and-fast rules, but by applying maxims and principles in the right context (like design patterns and S.O.L.I.D principles, for example). Proficient practitioners strive to understand the general concepts around a skill, and reject oversimplifications.

Maybe the most important breakthrough at this level is that it enables you to self-improve by reflecting on how you've done things in the past and correcting them.


Because of their vast experience, experts are the main sources of information in any field. They are the ones continually looking for better ways of doing things and advancing the field.

Due to their previous experience, they have amassed a huge number of patterns in their brain. As a result, they usually work based on intuition: they can find solutions to problems based on what 'feels right'. This intuition is just a form of focused pattern matching: ingrained subconscious processes that make things seem easy.

Experts are rare, something around 1-5% of the population.

People have different skill levels

It's important to understand that different people are at different levels of proficiency at any particular activity. This is especially true at work: a team will be composed of individuals with different skill levels.

This is an important realization that can alter a team's productivity, as it lets you provide to individuals what they need. You know that people in the early stages of development need context-free rules and detailed instructions, so don't waste your time appealing to their intuition, they just haven't formed it yet.

Experts, on the other hand, need freedom and trust to use their intuition and advanced pattern matching. If you force them to follow arbitrary procedures because "that's how we do things", you might be wasting a very rare and valuable asset. Both groups need different things, so be sure to provide an environment where both groups can be productive.

The other important thing to remember is that, in order to advance in any particular skill, you need to take responsibility for your own growth. A conscious effort to improve and tackling incrementally harder challenges will help you improve, whereas mindless repetition will lead you nowhere.

Great! Welcome to this series, I hope you'll find it useful and learn one or two things that will help your career.

Thank you for reading!

What to do next

  • Share this article with friends and colleagues. Thank you for helping me reach people who might find this information useful.
  • This article is based on Pragmatic Thinking and Learning: Refactor Your Wetware. This and other very helpful books can be found in the recommended reading list.
  • Send me an email with questions, comments or suggestions (it's in the About Me page)
Author image
Budapest, Hungary
Hey there, I'm Juan. A programmer currently living in Budapest. I believe in well-engineered solutions, clean code and sharing knowledge. Thanks for reading, I hope you find my articles useful!