Practice makes you a better developer

We’ve all heard the saying “practice makes perfect,” but how you practice and what you practice are critical to making it an effective practice session. Consider some tips from a recent “Learning how to Learn” newsletter.

There are no shortcuts to skill mastery

It may vary somewhat from region to region, but in general, software developers are in fairly high demand in the job market. As a result, it is not uncommon for a developer to get regular unsolicited requests to apply for open positions. Even though I’m not looking for work, I’ll sometimes read the job descriptions out of curiosity. Perhaps you have done the same. I’ve observed a trend in these job announcements: on average, only two skill levels are being pursued, the novice and the expert.

You won’t usually see these specific terms used, you need to read between the lines. For example, “junior developer” often really means “we need a warm body to do basic tasks and we don’t want to pay a lot.” Sometimes the clue is in the number of years of experience. “6 years of iOS experience” really translates to expert, considering that the iOS SDK has only been available for about 6.5 years. Other times, you’ll see horrible stereotypes like “rockstar” or “code ninja”, when what they really want to ask for is an expert.

But what do descriptions like “novice” or “expert” really mean? Who determines if I am an expert? Is it subjective or something that can be specifically measured? One useful method for considering skill level is the Dreyfus model of skill acquisition. In this method, there are five different levels of mastery for a skill: novice, advanced beginner, competent, proficient, expert. There are several factors that determine where an individual falls for a particular skill. (This may seem obvious, but it’s important to point out that you can be proficient in one skill, but only competent in another. This is true even for very closely related skills within a single field.)

I’m going to gloss over two important details right now: what is the precise definition of each skill level, and how do I determine my level for a particular skill? Both of these will be featured in a future newsletter. If you absolutely cannot wait, I highly recommend getting Pragmatic Thinking and Learning and reading chapter 2.

The area I want to focus on is how to move up the skill ladder. If you’ve subscribed to this newsletter, there is a very strong likelihood you are not content with remaining at your current skill level. Or perhaps you want to acquire new skills and move beyond the novice stage. What is the secret? Many people don’t like to hear it, but the surest way to increase your mastery of a skill is practice. As highlighted in the opening heading, there is no shortcut to this process. But what do we practice? Why is practice so important?

Let’s step back out of the world of technology for a moment and look at skill acquisition in another area: music. When you learn to play a musical instrument, a lot of practice is involved. When I was younger, I took piano lessons. These lessons were about 20 - 30 minutes, twice a week. I would play a selection for the teacher, she would make some observations on my technique, and then I would get a specific assignment to practice until next time. But in addition to some short musical piece, I was ALWAYS expected to practice my scales.

Scales are one of the most basic elements of playing a musical instrument. It is one of the first things you learn, but it is something that remains part of your practice, even as you master the instrument. This isn’t just true of piano, it’s true of stringed instruments, brass and woodwinds, and even a singer’s voice. It is common for even world-renowned musicians to still spend time each practice session on scales. Why is so much emphasis placed on such a basic technique?

It’s not just about memorization, although this is a part of it. One big benefit you get from repeated practice of scales is muscle memory. Your fingers become so accustomed to certain patterns of movement, they become second nature. In addition, you improve your technique. Playing a note on an instrument involves numerous variables: how hard you strike, how long you hold, how you blend to the next note, and so on. The more you practice playing basic sequences of individual notes, the more precise and the more expressive your technique becomes. Scales are the basis for music theory. Deeply understanding these basic building blocks of composition help in improvisation, accompaniment and a richer appreciation for a musical piece. Not to be overlooked either, scales train your ear. You know what various scales should sound like. This liberates you from being too tied to sheet music or thinking too hard about individual notes and instead you can think in phrases. A trained ear also helps you spot when something isn’t quite right, helping you to adjust quickly if you get off course a bit.

So how can we apply this to software development skills? What is the equivalent of musical scales in a programming language?

Practice the basics. String manipulation, array sorting/filtering, input processing, database interaction. These are the “scales” for programming. Go to the documentation for your language, find a high-level guide or introduction and build some exercises around these basic things.

With and without tooling. We all have our favorite tools. For some, it is an IDE, for others it is a powerful text editor. Often, we have shortcuts and macros and key combos and snippets and templates and all kinds of ways to automate what we do. When practicing, take time to practice both with and without these aids. Sometimes, I would practice scales on the piano in the dark, only by touch. Being proficient with the basics in even a “vanilla” environment helps with mastery.

Code katas. A “code kata” is a simple exercise meant to be repeated and practiced time and time again. Scoring a bowling game, converting decimal to Roman numerals, calculating prime factors. These are all classic examples, but there are many many more.

Just like a musician, a programmer can benefit from muscle memory, improved technique, a deep understanding of the basic building blocks of their craft and a “trained ear” that knows what common solutions look like. Of course, practicing scales is not the only thing a musician does. They spend plenty of time on other deep areas of study as well. So don’t limit yourself to this one technique, but don’t overlook it either. “Warm up” with a scale on a regular basis and acquire a deeper mastery of your skill.

For a practical demonstration of this approach to practice and learning, take a look at Zed Shaw’s “Learning the Hard Way” series. He has a musical background and applies many of these concepts to his method as well. Related to this, Zed recently appeared on the Hanselminutes podcast and talked about some of these same concepts.

If you enjoyed this article, and want more tips on effective learning for software developers, take 30 seconds and subscribe to my newsletter below.

NOTE: This particular newsletter has been retired, but you can use the form below to stay on top of other interesting articles, announcements, and tools.