It’s always striking to see how many of our colleagues in the software industry are musicians. That fact occurred to me last week as I went to jam with some guys I’d never played with before. The lead guitarist walked over to me as I was setting up my kit and said, “You work for Microsoft, right?” and so began a twenty minute conversation about how he had worked in IT for years before retiring and going on to teach and play guitar full time.
Everywhere I travel, I find software developers and architects who moonlight as musicians. I’ve been thinking a lot about this lately and think I’ve discovered why so many of us sit in front of a computer keyboard by day and a piano keyboard by night: The act of learning and playing a musical instrument requires many of the same mental attributes and skill sets that are essential to being a good software developer. I’ve decided to explore this topic a little deeper in a series of posts. This being the first, we’ll focus on the building blocks of both skills: Technique.
Learning to Play
I started playing the drums when I was eight-years-old and in the third grade. I can still remember my first band practice at school, holding the huge pair of standard issue Ludwig concert sticks and hitting the solid steel Ludwig concert snare drum my parents rented for me (secretly hoping all the time that my desire to be a percussionist would soon fade, I’m sure). The first thing we learned to play were the 13 essential drum rudiments. These are the building blocks of playing the instrument and are excellent exercises for building coordination and speed. The first one we I learned then, and most percussionist still learn today, is called the paradiddle.
The paradiddle is repetitive pattern between the left and right hands. It looks like this: R-L-R-R-L-R-L-L. Go ahead, try it. I know you want to.
When starting to learn this rudiment, you begin the pattern slowly, focusing on keeping each stroke even with the next at a steady tempo. When this initial slow tempo feels good, then you gradually speed up, continuing to focus on evenness and tempo. If your strokes start to become uneven or you have trouble keeping up the tempo, slow down until things get better and then, gradually begin to increase in speed again. Here’s an example:
While learning this first of many rudiments, I was also instructed in how to properly hold the sticks in my hand:
- Let the stick sit relaxed in your hand
- Use the rebound of the stick off the drum head to help propel the next stroke
- Use your fingers to catch and manipulate the stick
- The stroke comes from snapping your wrist, not your arm – you’ll never get speed using your arms
I was getting all this instruction while still having to think the pattern “R-L-R-R-L-R-L-L” consciously. This was really hard to learn in the beginning. I was teaching my body to operate in a way it never had before, wiring up nerve paths that didn’t exist, and trying to maintain a level of discipline to make it all happen. The last point proved to be more difficult that the previous two.
As with any learning experience, you have to learn the basics before you can move on more advanced techniques and concepts. Let’s face it, practice the rudiments can be really boring, but they help you build the technique you need to take your skills to the next level. And the commitment you show to practicing the basics has a direct correlation to the level of your success. Are there exceptions to this rule? Always, but they are very rare.
Learning to Code
So, what’s the correlation to learning to code? As I detailed in my software development meme, I don’t have what you would call a traditional background for someone who does what I do for a living. I started college as music performance major and then switched to English literature, in which I went on to eventually earn a Master’s Degree. Coming out of graduate school, newly married, I found the job market somewhat lacking in open “poet” positions, so I went back to my old hobby, computer programming.
Truth be told, I learned to write software in “the modern era” by purchasing books like “Teach Yourself Visual Basic 4 in 21 Days” and “JavaScript Unleashed.” We laugh about those kinds of books these days, but back then, in the pre-WROX days, those were great learning tools available conveniently at my local Borders. I was working a fulltime job, so I spent hours and hours each night after my wife went to bed sitting in front of my Windows 95 PC doing exercise after exercise, learning language syntax and form:
- The things I use in the user interface are called “controls,” and their behavior is controlled by “events”
- Objects represent entities specific to my application or business problem – their actions are called “methods,” their descriptors are called “properties”
- Text data is handled as a “string,” numeric values can be “short,” “int”, “long,” “double,” etc.
- SQL is the language you use to communicate with databases
Of course, these seem ridiculously natural to us now, but at one point, all of these concepts were new. They’re called “rudimentary” because these concepts are the building blocks of what allow us to write applications, just like the mastery of the paradiddle contributed to my becoming a better drummer.
This was me learning the technique of software development. Like learning to read music, which is itself a new language, I was learning the rudiments of software development. And just like their musical counterparts, these rudiments don’t automatically make good software. Without a fundamental understanding of structure, style and yes, art, software is just a series of lines of code stacked one on top of the other. The more you practice the art, the more you learn about how these rudimentary concepts coalesce to create something greater than the some of their parts.
And thus is the transition between the rudiments and the final product. Music is more than just playing notes on a page. It’s weaving those notes together and producing something musical with them, like this alteration on the simple paradiddle when I sit behind my drum kit:
Likewise, writing software is more than just slapping code onto the screen. Your code is built into a larger structure and constructed carefully to maximize performance, user experience and maintainability. This is the quintessential art of software development, and one of the reasons why I think so many creative people are drawn to software in the first place. Like music (and most other forms of art as well), programming marries the strengths of both hemispheres of the brain. The analytical, pragmatic mind enables and facilitates the creative vision, providing it the tools it needs to be realized. Thus, technique evolves into proficiency and, eventually, mastery.
So, what happens once we practice the rudiments and become proficient artists? In my next post, we’ll explore the similarities of musical composition and software design.