This is a note. Notes are work-in-progress thoughts and ponderings that I choose to share “out loud”, subject to change and revision.
As I pondered this question, I googled it and there were a lot of results. It’s not a novel question even if the answers I perused were…mostly unhelpful.
The common consensus – which I agree with – is that it’s really hard to figure out what deliberate practice looks like for a developer (or programmer or coder) because there is no one universally accepted standard of mastery. Development, coding, programming is broad – you can’t apply the principles of deliberate practice to it.
You can however, apply its principles to the different skills that as a developer you must have. Broadly speaking, for the kind of developer I am (and want to be), there are a few different arenas of skills:
- Physical Skills (typing, keyboard shortcuts)
- Communication Skills (with clients, with fellow developers, with designers, etc)
- Administrative Skills (command line, git, VS Code tricks)
- Data Skills (data models, high level algorithmic knowledge, how to break down the result in terms of information flow, etc)
- Language/Syntax Skills (knowing the syntax and functions available in your most commonly used programming languages, libraries, and frameworks)
- Developer Mindset (this is pretty vague and I’ll expand on this below)
I think that breakdown is fairly thorough and covers a lot of the things a developer needs to do (assuming we’re focussing purely on the developer aspect and not the million other aspects that could come into play depending on the kind of company you work in and what your role really entails outside of pure development).
On the “Developer Mindset”
The “Developer Mindset” is super vague and really a quizzical way to put it – but I also couldn’t think of another way to phrase it. In some ways, that mindset is a culmination/result of all the other categories of skills. It could be described as..hearing a problem and immediately starting to see the solution (or part of it) forming in your mind as you pull from your experience and knowledge to formulate an answer.
I do think that some people have a more intuitive grasp of how to approach a problem that complements how development/programming/coding works. I don’t think it’s a skill that can’t be taught. It can be and it gets stronger with practice. The ability to confront a problem and identify what you actually have to do or tackle in order to arrive at a solution from a development standpoint is pretty key. It’s what separates a junior dev from a senior one. In school, I think we called this “critical thinking skills.”
A junior dev looks at a problem and immediately jumps to implementation, a senior dev looks at a problem and first asks why, because she understands that sometimes the problem you’re presented with is not actually the problem at all but could be a symptom of a different problem. A junior dev wants to find the solution for the problem described to him, a senior dev wants to first understand the context of the problem because she recognizes that in order to fix an issue well, you often need a more holistic perspective of what’s going on.
But getting back to Deliberate Practice
Some of the categories of skills are actually pretty easy to design deliberate practice sessions for.
Physical skills are easy, there is a defined metric of mastery for typing and knowing keyboard shortcuts. And truthfully, I know that even I can get better at those things. I’m famous for my typos, life without the ability to edit my already-sent message would be much worse (and I remember a time when that was the case), I think too fast and my poor hands can’t often keep up with the speed of my thoughts, which results in typos.
Communication skills are harder to practice because you need to practice with someone. A fellow developer, client, designer, etc.
Administrative skills are also relatively easy to design deliberate practice curriculums for. Is there something you always have to look up how to do on the command line? Great, practice it. Afraid of vim? Excellent, sit down and write a piece of code in it. Always struggle with how to undo commits, practice it!
Data skills are some combination of practice and study, and overall, I’d say the theoretical practice and understanding of data models and information flow is not one enough developers (including myself) practice and focus on, despite it explicitly informing literally everything we code. This particular set of skills is high on my radar these days and something I’ve been pondering quite a lot.
Language skills are also easy to design deliberate practice sessions for. Having muscle memory for functions, syntax, and features available in your chosen language, library, or framework is a great boon and makes you better and faster at your work. Without a doubt.
This all begs the question – well, how do you define deliberate practice and how do you design those deliberate practice sessions? Well, there’s a lot of reading material out there on what deliberate practice is, so I won’t get into that too deeply. And as for how one designs deliberate practice sessions for development skills? Well that’s a note for a different day.
If you liked this article, you’ll enjoy my biweekly newsletter on modern development.
Get an original essay or tutorial in your inbox every other Tuesday.