I need to learn Python this year. I've put it off for so long.
— David Odes (@chiefdavidsays) January 19, 2023
It has been around seven months since I started learning Python, but my progress has been predictably slow for the last four as I’ve had to prioritise wrapping up my final year of Engineering school.
My internship program last year was flexible enough to allow me to explore cybersecurity and build up my Python knowledge.
I had set ambitious targets for myself that factored in resumption, Nigerian electricity (or lack thereof), and the hustle/survival.
I was on track for the first three months, hitting my personal development goals.
However, things haven’t gone as planned lately.
Since resumption, I have only made gradual progress and I’m inline to underperform the milestones I had set for myself at the beginning of the year.
I realised that I needed to re-evaluate my process which led me to discover the Dreyfus model of skill acquisition.
I’ve found it helpful. Helpful enough that I thought to share.
So here is a breakdown of Nat Eliason’s blog post “The Step-by-Step Guide to Go From Novice to Expert in Any Skill” which covers the Dreyfus model of skill acquisition in depth.
What is the Dreyfus Model of Skill Acquisition?

The Dreyfus model of skill acquisition is a framework developed by Stuart and Hubert Dreyfus.
It outlines five distinct stages that individuals go through as they develop a new skill through formal instruction and practical experience.
They are:
- Novice
- Advanced Beginner
- Competent
- Proficient
- Expert
Novice
As a novice, you rely heavily on clear, step-by-step instructions a.k.a recipes.
You need explicit guidance because you lack the context to understand why you’re doing what you’re doing.
For example, an instructor teaches you what variables, strings, methods, etc., are with practical exercises and walk-throughs.
At this stage, you can’t yet differentiate between important and unimportant details, which can lead to feeling overwhelmed.
You may also struggle with adaptation and the inability to prioritise what to learn.
Advanced Beginner
As an advanced beginner, you start recognising patterns and understanding the context in which certain actions are appropriate.
You try tasks on your own.
Like writing a simple Python script that monitors changes made to a file/folder and logs them in a text file.
You’re still reliant on simple guidelines and may struggle to generalise your skills to handle unfamiliar or complex situations, but you don’t need your hands to be held every time.
Most people reach this level but never graduate from it.
Competent
At this stage, you have developed a more holistic understanding of what you’re learning.
You can perceive situations as a whole rather than relying solely on fragmented knowledge or patterns.
You may still face challenges when encountering highly complex or novel situations, but you have developed the ability to analyse problems systematically and apply your knowledge in a structured manner.
Unlike the advanced beginner who would struggle with troubleshooting, at level competent, you can do your own troubleshooting but might require guidance from someone more proficient.
Proficient
The proficient stage represents a level of mastery where you can perform tasks with fluidity.
It goes beyond the conscious application of rules and guidelines.
You can make informed decisions based on your intuitive grasp of the subject and your experience rather than relying solely on analytical reasoning.
Expert
The expert stage is the pinnacle of skill acquisition, representing the highest level of mastery and proficiency in your field.
This is the stage where you start pushing boundaries.
Unlike proficient learners, who still rely on some form of conscious deliberation, experts’ actions are seamless and natural, requiring minimal cognitive effort.
Your skills will have become so deeply ingrained that you’ll operate almost on instinct.
If at level proficient, you could handle most programming tasks and solve complex problems with minimal guidance; as an expert, you’re contributing to the development of libraries and frameworks.
How to Progress from One Stage to the Next
Eliason outlines a practical approach to progressing through the different stages.
From Novice to Advanced Beginner
To transition from novice, where you rely solely on recipes and instructions, to advanced beginner, you’ll have to break away from fixed recipes and combine them with maxims (general rules or principles).
e.g. Solving a problem with your own methods rather than relying on instructions. Even if you have to take an unconventional path.
This process of improvisation and experimentation will help you develop the contextual understanding required to become an Advanced Beginner.
From Advanced Beginner to Competent
At advanced beginner, you may feel overwhelmed by the multitude of recipes and maxims at your disposal.
Eliason suggests deliberately limiting the information you can consider in a given situation.
e.g. If you were learning to code, you could incorporate constraint-based practice like deciding not to rely on Artificial intelligence to solve a difficult challenge.
By forcing yourself to work with fewer variables, you’ll develop a more intuitive grasp of what is truly relevant.
From Competent to Proficient
The shift from competent to proficient often happens gradually and naturally, as Eliason explains.
Proficiency = practice x experience
The more you practice, take on difficult challenges, and learn from the outcomes of relying on your intuition about what to concentrate on, the more intuitive and natural that judgment will become.
From Proficient to Expert
Reaching the pinnacle of expertise requires not only intuiting what to focus on but also how to execute those goals.
Eliason emphasises the need for ongoing learning and experimentation, following your instincts, and allowing yourself to be emotionally invested in the entire process.
With consistency, practice, and patience, mastery is possible.