I was once told that I'm not good at being bad at things, and that is absolutely true. There's nothing that frustrates me more than a steep learning curve. Logically, I know that failure is a part of growth; emotionally, I'm a perfectionist and I hate to fail.
This, obviously, is not the best trait to have in the field of front-end development, which is in a constant state of flux. There's always a new framework, language, or concept to learn (anyone else currently tackling CSS Grid?) – the challenge is exciting, but it's a double-edged sword. Constantly feeling like a beginner wears on you, and it becomes easy to make excuses for ourselves. "There's no real reason for me to learn this. It's just gonna be replaced by something else in a few years, anyway." One of the things that has most helped me in approaching this feeling of constant incompetence was learning more about learning itself – in this case, the Hierarchy of Competence.
The Hierarchy of Competence is a model, developed by Noel Burch in the 1970s, that attempts to explain the stages we go through as we learn a new skill. All of us go through these same general stages as we're learning, but we'll spend different amounts of time in them depending on a variety of factors: what similar experiences we already have, what learning method we're using, what teachers we have (or don't have), our available resources, etc.
Image credit via Creative Commons
Understanding this process and being able to place ourselves within it as we work to master new skills can offer a very helpful perspective when it feels as if we're making no progress at all. It's also great for times when we're the teacher – it helps us place the learner in their journey, understand what they're feeling, and make sure we're meeting them where they are.
During this first stage, we know nothing – not even how much we do not know.
It's like when you're 15, about to get your learner's permit and watching your parents drive, saying to yourself "How hard could that really be?"
Without even the knowledge of scope, we are likely to make wild assumptions and draw incorrect conclusions. It's a state of ignorance – not meant in a cruel way, but in a literal one. We don't know because we can't know. We are unaware even of what we're lacking. This is the natural beginning stage of tackling any new language, concept, or skill, but it's especially difficult to confront when you're the one in the teaching position. The learner in this stage needs patience and simple explanations in plain, straightforward language. In many cases, this is where we, the developer, are meeting our clients.
In this stage, we've learned just enough to realize how much we don't know.
This is like your first few times behind the wheel: you read the driver's ed book, but it turns out actually driving the car is much more difficult than you anticipated. You're having a hard time remembering where all the controls are, there's a lot of sharp braking, and you just had a very close encounter with a mailbox. You finish each drive feeling exhausted, frustrated, and overwhelmed.
This is the infamous "knowing just enough to be dangerous" stage – we've gotten our feet wet and we have a loose grasp of the basics, but we're just not good at it yet. We know enough about how it's supposed to work to know that we're not doing it right. This is that stage where we copy/paste a lot from Stack Overflow and just kind of hope it works...somehow. Code is messy and repetitive, and it takes us ages to accomplish seemingly simple tasks. If we're going to give up and quit, this is where it will most likely happen – but if we can push through, we can make it to
In this stage, we've gained enough knowledge to be able to create something that works...but it's a bit messy, and it takes some effort on our end to make it happen.
You've passed the exam and have your license! You feel mostly comfortable on the road, but driving still takes a fair amount of concentration and effort. You keep the music volume low because it's distracting, and you still struggle during inclement weather. But the freedom is fantastic.
In this stage, you've mastered the basics and are able to execute higher-level exercises...with time, effort, and occasionally a little help. Your code may not be ideal, but everything is working and you're able to explain how and why. You know what's possible, but sometimes you have to Google how to do it. When someone asks if you can do this, though, you're willing to say "yes" without hesitation.
This is the final stage of learning – mastery of the skill.
By now, driving has become truly second-nature. You don't have to think about signaling before changing lanes, you just do it automatically. Changing the music or holding a conversation while you drive is no longer challenging. You feel like you make your daily commute on autopilot most of the time.
In this last stage, we no longer have to consciously think about what we're doing – we've learned it so thoroughly, it's become completely natural. We no longer have to Google elements or commands we can't remember, and we're the ones answering the questions on Stack Overflow now. The longer we practice this skill, the more automatic it becomes – but usually, at this point, we'll be ready to seek out something new to challenge ourselves and the process will begin again.
Next time you're trying to explain a concept to a client or a junior dev who just isn't getting it, dammit, step back, take a deep breath, and refer to the Hierarchy of Competence. What they're going through is most likely just a normal part of learning, and if you can take an educated guess at the stage they're in, you'll be able to approach them with empathy and offer them more accurately tailored support. In the case of talking with our clients, we come across as infinitely more professional and experienced when we can offer explanations that make sense to them at their current level of understanding – without making them feel foolish or stupid. And when we are the learners, understanding the hierarchy can help us be more forgiving to ourselves and embrace the role of failure as a natural, unavoidable part of the process. In a field where we'll all be learning for the rest of our careers, taking a look at learning itself will always be well worth our time.