Originally published on Medium
During my school years, I used to spend a lot of time playing the accordion. Thousands of hours. I was quite good at it — I had the honor to play to our President, Prime Minister, won more than 10 international competitions. Bach, Mozart was my bread.
Eventually, I decided that it’s not something that I want to do full-time after I finish high school. Now that the accordion is my hobby and coding is my job, I’ve been thinking about how my musical path supplemented my present.
Coding is not only about coding
When you get involved with classical music, you quickly find out about all of the disciplines that surround it — harmony, history of music, solfeggio, and many others. You don’t necessarily have to be excellent at those to be a great classical musician, but knowledge in those areas contributes to overall success.
The same is true about coding. There are so many disciplines that surround coding: computer architecture, cryptography, networking, compilers, data structures & algorithms, you name it! Although cryptography will not directly help you implement CSS animations, it’s just a matter of time when you’ll be able to take an idea from an unrelated sphere and apply it in software engineering. Sometimes in totally unimaginable ways.
Reflect and learn from every mistake
After every concert, I and my accordion teacher would sit down and talk through every bigger mistake that I made. He’d ask why it happened and what do I think I can do to prevent it from happening again. I’ve also noticed by myself that if you’re not reflecting on your mistakes, the experience becomes lost. This has been one of the biggest lessons in my life and I am grateful that my teacher instilled this habit in me.
As a consequence, I’ve noticed that every time I spot a bug, I am extremely eager to fix it. This comes naturally because I am striving to be aware of every line of code that I write and the fact that there’s a bug is a huge surprise to me. It implies a flaw in my thought process that I want to learn from.
I had QA engineers from my team be surprised at how quickly I am able to fix my bugs. To be honest, that’s a double-edged sword, as I am not sure if I am more proud about my bug-solving abilities or the embarrassment of bugs being in my code in the first place 😶 Nevertheless, I think that illustrates how such attitude is reflected.
Don’t skip fundamentals
Kent C Dodds has said something that resonated very deeply with me:
The better you understand an abstraction, the more effective you will be at using it.
In classical music, learning a new composition implies a lot of steps:
Listening to how other musicians play the composition
Learning the theory and idea behind the composition
Learning to play the composition with just the right hand
It’s only a small fraction of the steps! The experience of learning incrementally and not skipping important parts of the learning process became engraved in me. So much so that it used to harm me. I was hesitating to learn higher-level concepts, such as WEB frameworks because I thought I lacked knowledge of computer science fundamentals.
However, it did much more good than bad. I now seek a certain degree of understanding in every line of code that I write. I think it is especially relevant nowadays because we are used to frameworks (think of Next.js or Ruby on Rails) that abstract an incredible amount of complexity off our hands.
Don’t search for an easy solution
You spend weeks learning a new classical piece. You think you cracked it, it’s no longer an issue to play it when nobody is listening. Then there comes a time for a concert. Everything that could go wrong, goes wrong. You’ve realized that those 50 hours spent on learning the new piece aren’t enough. 50 more hours are needed just so you can play it in front of an audience.
There is no “easy way out”. There is no “cutting corners”. If you want to achieve success, you’ll have to bleed in pain. Yes, there are many ways of accelerating success (finding guidance, for example), but ultimately it comes down to your individual effort. Keep that in mind when solving an unorthodox coding problem or learning a new framework. Don’t expect to find a short tutorial that will teach you ReactJS in 5 minutes.
Sharing is caring
One particular activity that I found really helpful during my active classical music days was listening to other players. A lot of listening to other players. In fact, I was doing that every day — listening to other accordion, violin players, pianists. I was not afraid to take their ideas and build on them. I think that’s one of the reasons that made me stand out from other accordionists.
I believe this is especially relevant in the software industry. Take open-source as an example — trillions of ideas are floating around that you can pick up and build upon every day. On top of that, a lot of software developers and companies are extremely eager to share their learnings through tech talks, blogs, workshops, and other sources. This is quite unique to our industry.
Don’t be afraid to work with that knowledge, but at the same time, don’t forget to innovate and build great ideas on top of other great ideas.
Conclusion
Performing classical music taught me many lessons that made me a better software developer. It led me to understand that:
Coding has a lot of disciplines that might indirectly help you write better code.
Every mistake that was made is a mistake to be learned from.
Strive to understand every line of code and every tool that you use.
I have to be ready to suffer when learning new concepts.
Learn from others. You can find vast amounts of knowledge if you search for it.