I grew up playing the piano.
In my 20’s I didn’t practice much because my youthful transience didn’t lend itself to owning a piano. But I have one now I tinker on.
I also own a guitar which I purchased earlier this year. During my stint of unemployment I tried to practice with more discipline, but I mostly I failed at that endeavor.
It’s hard pick up the guitar, practice, and fail at the most fundamental basics when, instead, I could sit down at the piano and more effortlessly play something that at least sounds like music.
But honestly, the piano presents the same problem just on another level: practicing, i.e. learning by failing, is hard.
What strikes me as a common thread between programming and music is the necessity to repeatedly endure failure in order to get something right. It reminds me of this line from the book Coders:
When you meet a coder, you’re meeting someone whose core daily experience is of unending failure and grinding frustration.
That’s how it feels to practice, piano or guitar. However, there’s an interesting thing about practice.
I can practice for an hour, look back, and feel like I made little to no progress. But when my timeframe for reflection gets longer — looking back a week, a month, a year — the progress becomes much more readily apparent.
Writing code can be a lot like that.
You bang your head on a problem over and over and over, feeling like you’re getting nowhere, making zero progress. And at the end of a fit like that you don’t feel the improvement. Sometimes quite the opposite: you feel worse than when you started.
But when you look back weeks, months, or years, it’s much easier to see improvement — improvement that came because of a willingness to face the “unending failure and grinding frustration” you experience moment to moment.
You won’t always see progress, but stick to practicing and the longer the timeframe the more obvious it’ll become.