When my son was young, I used to coach his baseball team. On the team I typically had 3 different types of players:

  1. Naturally talented and coordinated
  2. Hard workers but maybe not so talented
  3. The kids that were there because their parents made them

The naturally talented kids excelled early on until things started to get advanced and it didn’t come as easily to them. The hard workers struggled early but stuck with it, practiced on their own time, and were eventually very successful. The third group, well they didn’t last very long in baseball. One thing I told the kids on my team consistently is that it is all about the basics; even the professional baseball players practice the basics.

Why did I stay on them about the basics? Because the basics were the foundation for all the cool things they wanted to do like, hit a home run, turn a double play, or throw xx mph. The naturally talented kids hated repeating the basics. It was “it’s too easy” or “I already know all this”. The hard workers practiced till they got it right and then kept practicing it right. Well the 3rd group just kinda participated to appease their parents, they had no interest or attention to really learn how to play baseball.

When it came to game time, the naturally talented often made basic errors, bad throws, missed easy ground balls etc…they were also the group most likely to blame it on someone else or something else. The hard workers however, were much more consistent in their performance, they may have made some errors (typically not as many), but they took ownership of that error and it rarely happened more then once. Often they could identify their error and knew how to fix it, and did.

"Do the best you can until you know better. Then when you know better, do better." - Maya Angelou

I see the same thing with many software engineers that I work with. Super smart, read a lot about development practices, and can breeze through life as a developer for a corporation without much of a challenge. However at some point they get stuck and just can’t seem to move forward in their career. Often they know of the basics, but often think they know better or that the basics are no longer applicable to them. They have been very good at building complicated systems and handing them off to others to maintain, they are masters at code reviews, and think the latest and greatest technologies will solve the problem with their hard to maintain and inextensible code. They KNEW better but can’t DO better.

Then you have the hard workers who may not be the fastest at delivering code, but are consistently trying to hone their skills. They aren’t afraid of failure because it is a learning opportunity and welcome the time to figure out how not to do it again. When they need to learn a new skill they don’t just read or watch a video about it, they find a way to apply it and explore its uses. They LEARNED better and then DO better.

As professional software engineers we have a responsibility to not only do the best we can but also to continuously do better. Just like professional baseball players we have to practice (hands on keyboard) the basics, get feedback on our work and adjust to be better. It is only then that we begin to become crafters of our profession. Those with natural talent and the humility to practice the basics and learn continually will become experts.

So how do we learn better ways to do better things? Using deliberate practice. K. Anders Ericsson, et al in the paper The Role of Deliberate Practice in the Acquisition of Expert Performance ascertains that it takes approximately 10 years of deliberate practice to achieve expert performance or mastery of a skill. It is not just the time that is required, but also the way the time was spent. Deliberate practice requires structure, specific tasks and feedback. These researchers proposed a framework for deliberate practice and the constraints that must be overcome:

  1. Time and access to resources such as teachers/coaches/mentors
  2. Motivation
  3. Effort

Here is what deliberate practice might look like for a developer/engineer:


Deliberate Practice Daily Cycle

Deliberate practice is not easy; it requires the discipline to set aside time to do practice, to practice with the intentionality to do it right, and to practice consistently. Here are a few hints to help overcome the constraints :

  1. Share your practice with someone and ask them to check-in on your progress
  2. Pair with someone (body doubling) - could be a fellow developer/engineer or could be a coach/mentor
  3. Keep a journal of your aha moments, insights, and progress
  4. Add new skills to the mix often and practice your skills together

If you don’t know what skills you need to practice or you are looking for new skills to up your game, try one or more of the following:

  1. Seek out a coach or mentor
  2. Find an expert and study what they do differently
  3. Get curious and experiment with different ways of working than what you do every day
  4. Expand your breadth of knowledge by reaching into other areas of creating software, such as business analysis, testing, user design, etc…

To become better requires humility, intentionality and discipline. Just like in baseball where game performance is dependent upon how well your body remembers what you practice; your ability to deliver high quality software quickly to your users/customers is dependent upon your ability to apply what you have developed through deliberate practice.

"Master the basics. Then practice them every day without fail. Small disciplines repeated with consistency every day lead to great achievements gained slowly over time"
- John Maxwell