If you build software you program every day. That doesn't mean you get better at programming every day.
Improving your hard technical skills makes all the software you build better. It exposes you to new opportunities, expands your knowledge into multiple fields and ultimately allows you to do more things with computers.
It doesn't happen by accident. In this market, you will be rewarded handsomely for building one boring CRUD application after another. To upgrade your hard technical skills however, you'll need to apply deliberate practice.
Cal Newport introduced me to the concept of deliberate practice. A quote from his blog:
The mistake most weak pianists make is playing, not practicing. If you walk into a music hall at a local university, you’ll hear people ‘playing’ by running through their pieces. This is a huge mistake. Strong pianists drill the most difficult parts of their music, rarely, if ever playing through their pieces in entirety.
How much of the software you build really pushes you outside your comfort zone? How much of it is the same thing you were building last year with different names?
Your highest rate of learning was at the beginning of your career. You spent hours trying to fix incomprehensible errors. You had no idea how to implement a simple web form but muddled through and figured it out as you went along. You had to force yourself to learn SQL with it's horrible syntax.
When's the last time you had to really dig deep to solve a technical problem? After a few years as a web developer, opportunities for really pushing yourself come few and far between. You can't rely on your day job to continually challenge you.
That's where deliberate practice comes in. Deliberate practice can be summarized as:
Activities designed, typically by a teacher, for the sole purpose of effectively improving specific aspects of an individual’s performance.
The key ideas behind deliberate practice is that it:
- Pushes you just outside your comfort zone
- Repeated often
- Feedback on results in continuously available
- It's highly demanding mentally
- It's difficult
- It requires good goals
We're all self-taught in this business. The only person who understands your skillset well enough to teach you is you. What challenges can you set yourself that meet these criteria?
The challenges have to push you just outside your comfort zone. It's no use trying to solve a complex problem in code if you can't yet iterate over an array. The gap in your knowledge that the challenge forces you to overcome needs to be surmountable.
Whatever challenges you settle on, they need to be repeated often. Much of the benefit of learning a new technique or skill is the ability to apply it in novel situations. This is much easier to hand if you've repeatedly worked through the same sort of problem.
For technical problems, we're lucky in that we get constant feedback on the correctness of our solutions. The code either runs and produces the desired output or it doesn't. It's much harder however to get good quality feedback on more subjective measures of our code: how easy it is to understand, how well-organised it is or how secure it is.
We're used to easy, frustration-free technical problems at work. After a few years of building web applications, you've seen most of the common problems and possible solutions for them. Deliberate practice should not feel like this. You know you've upgraded your skills if you're mentally exhausted after a technical challenge.
The goals of the challenges should be picked such that achieving them teaches you something new. It doesn't matter a great deal what the end result is, only what you learned on the way.
The Matasano Crypto Challenges are a great example of a set of exercises that meet these criteria for the majority of intermediate to senior level developers. They relentlessly pummel you with problems that require hard, focused thinking and fiddly solutions. The feedback is continual: your solutions either break crypto and produce the desired results or they don't.
Rosalind is another example of a set specifically crafted challenges designed to help you learn a technical specialty (bioinformatics) by applying your existing skills to real world problems.
Thanks to Andrew Broman for recommending Rosalind