Recently I read a book called Peak, from Anders Ericsson, in which author describes how people become good (world class good) at what they do. I don't want to spoil it for you, but I'll say that author believes that talent has nothing (or very little) to do with it. Continued, persistent, focused and targeted training is the key. Author calls it deliberate practice.

There are many examples in the book on how exactly deliberate practice looks like for people mastering chess, music instrument or a simpler task such as trying to memorize a lot of numbers.

They all come down to these main principles:

Author provides much more evidence in the book as to what exactly happens during deliberate practice, but here's the brief: Deliberate practice helps to develop new mental representations that are held in long term memory. Expert performance is the ability to see patterns that seem random or confusing to people with less developed mental representations, therefore the main goal of deliberate practice is developing new mental representations.

There are two prerequisites for deliberate practice to be most effective:

When it comes to software engineering, we're a bit unlucky, as our field doesn't lend itself nicely to deliberate practice. It is a reasonably new field and we're still trying to figure out what exactly sets experts apart. Additionally, it is sometimes hard to measure progress in software engineering performance. There are areas that are measurable such as algorithmic programming which even has a competitive scene, but those hardly encompass what we as software engineers do. Luckily, I think we're over the "how many lines of code can one write" as a measure of performance.

Furthermore, author says: Deliberate practice develops skills that other people have already figured out how to do and for which effective training techniques have been established. I don't think we've figured out software engineering yet and we definitely don't have effective training techniques. I also don't think this is necessarily a bad idea, it just means that more things are left on us to experiment with. Additionally, our field and environment in which we work change so fast it will be hard to establish techniques that will be valid in a couple of years or decades. Computers we have today are vastly more powerful than those of 20 years ago, problems we're facing today are very different and require different approaches and skills to solve and business requirements have evolved as well. While we're on this topic, I don't think our tools have evolved proportionally - we're still using the same tools and methods to develop software we did 40 or 50 years ago and seems like we're convinced a new JavaScript framework will save the day. This is a topic for another post, but Bret Victor has some great content on this.

What can we do

However, we can get close. While we might not know what exactly does it mean to be an expert or a master in software engineering, we can still employ the ideas of deliberate practice to improve.

Here are some things that worked for me:

Lastly, remember, by definition deliberate practice is outside of your comfort zone, which means it will and should be hard. If you're struggling, that's good, keep it up.