Do you know what the difference between competence and proficiency is?
That sounds like a trick question, because the words seem to mean the same thing. But the subtle distinction between them is critically important.
Competence means having enough experience and knowledge to get stuff done; proficiency involves knowing why you are doing something in a certain way, and how it fits into the big picture. In other words, a proficient practitioner is always a competent practitioner, but the opposite may not be true.
The Dreyfus Model of Skill Acquisition covers this topic in great detail. Although its title sounds a bit academic, the paper is very approachable—and it has an amazing cover page that will make you feel like you’re reading a secret Illuminati cable that you found in some hidden library in a haunted house:
I recommend reading the original source material for a great overview of the path from beginner to expert. But in this article, I will focus on the bottleneck for most software developers I’ve known: crossing the divide from competence to proficiency.
So first, let’s establish a working definition of competence as just meaning “I know how to do stuff”—it’s an oversimplification, but it’s close enough for our needs. It’s fair to say that no matter what kind of occupation you work in, knowing how to do stuff is pretty important. If you are a programmer, learning how to do stuff is a huge part of your work:
- I need to know how to use revision control
- I need to know how to use a consistent coding style
- I need to know how to set up a continuous integration server
- I need to know how to query a database
- I need to know how to implement a responsive layout
- I need to know how to work with a service API
And don’t get me wrong: Knowing how to do stuff, and a lot of it, is critically important. Don’t stop working on that, or you’ll soon find yourself out a job.