Practice Makes Permanent
I recently had the opportunity to share some thoughts about the importance of craftsmanship in a 5-minute passion talk at Offline Camp in Berlin.
When I’m not coding, one of my favourite pastimes is playing guitar. It gives me a creative outlet that requires consistent and disciplined practice in order to progress. In the beginning I spent days learning the absolute basics — such as changing chords. Playing a D was easy, but going from C to D to G? That was murder. I was able to actually play a simple four-chord song after a few weeks of practice — barring a couple of slip-ups. But that was really only the beginning. Every skill acquired opened the door to a more advanced skill, but jumping to something more advanced without first mastering the basics would have slowed my overall progress. It would have been unwise to learn barre chords (where you shift a chord pattern up or down the fretboard by blocking off the lowest notes of each string with your index finger) without first learning to play the basic chord patterns.
Technique and muscle memory take time to master. It’s also easy to learn the wrong things and then have to undo the learning later. When I learned to employ vibrato (rapidly stretching and releasing the tension of a string to shift a note’s pitch) I had some poor technique that would likely have given me an RSI (repetitive strain injury) within a couple of years. Thankfully a friend of mine (a professional studied musician) noticed my poor technique and helped me to correct it. You see, I had practiced, even worked with discipline to get it right, but I had not perfected it.
Conventional wisdom fails here. Practice doesn’t necessarily make perfect. Practice makes permanent. Only perfect practice makes perfect.
Now this is all well when it comes to music, but I believe this applies equally to us as software engineers. A musician doesn’t walk on stage and perform without first due practice and preparation for the concert. At least, if they do, they run the risk of jeopardising their career and reputation, and ruining opportunities for further performance.
If we see ourselves as craftsmen and craftswomen, and take pride in our work, I believe we need to do the same. We should practice our techniques and hone our craft so that when we have to “perform,” the muscle memory is there. Muscle memory lets us do good work without expending mental energy on the technique, and allows us to put all of our energy into doing a good job.
Now there are many good ways of practicing, but I have a few suggestions that have worked well for me throughout my career.
- Code Retreats: Corey Haines developed this format of a day of disciplined practice where you pair up and work on Conway’s Game of Life. The pressure of deadlines is removed by imposing a 45-minute cutoff, after which you delete all the code you’ve just written — there’s no expectation that you actually finish building Game of Life. This liberates you to experiment with different approaches and techniques throughout the day. I can point to production code I’ve written (that’s stood the test of time) where I’ve applied lessons learned directly from doing a dozen Code Retreats. Find a craftsmanship group near you and run a Code Retreat! (http://coderetreat.org/)
- Code Katas: Similarly to how a kata in martial arts involves a series of defined steps to move from a beginning position to an ending position, a code kata is a well-defined problem that is intended to be repeated frequently. There’s a library of good katas at http://codekata.com/. Once you’ve mastered a solution to a code kata, you’re free to experiment with new techniques, or impose further constraints on your solution that can lead to interesting patterns and learnings. For example, what happens if you try write Conway’s Game of Life without ‘if’ conditions? Or what about not passing bare primitives? Or perhaps try solve it in a new language you aren’t familiar with, which leads us to…
- Learning new languages: Language gives us the ability to express our thoughts and opinions. By learning new programming languages you’ll be exposed to new and different ways of expressing yourself. Often languages will impose limitations in order to make gain elsewhere — and identifying those tradeoffs can be beneficial to your day-to-day work. If you’re looking for some inspiration, try implementing a familiar code kata in a new language. Rust and Clojure are both pretty exciting at the moment!
In summary, practice doesn’t make perfect. Practice makes permanent. Perfect practice makes perfect. Take the time to hone and practice your skills outside of work, so that you can be in top form when it’s your turn to perform!
Editor’s Note: This passion talk is one of many shared at Offline Camp, where a small group of campers with diverse interests come together to discuss Offline First. We hope to see you at an upcoming event!