Software engineering is a field where learning how to learn is crucial. Things are constantly changing as new libraries are released or updated, new tools become popular, and programming languages rise and fall. You have to constantly be learning just to keep up.
This is why it makes sense for developers to spend time learning how to learn, as a meta-cognitive skill. For many developers, this leads them to use Anki to memorize more of a programming language, build side projects to explore a new framework, or spend time practicing to improve their typing speed.
While these are valuable learning pursuits, there are other ways to improve in a skill that aren't so directly related to it.
Types of Related Skills
"Being a developer" is really learning a bunch of different skills. There are the high-level skills, like problem solving, and the more mundane low-level skills that you probably never think about, like typing. Each of these is directly related to the area of focus: being a developer.
From this area of focus, we can think about other types of skills and how they relate back.
Sticking with our example of typing: you do type code so investing time to improve your typing speed will help you be a better programmer. This is what I call a supplementary skill. Most people focus their learning here - on skills that are supplementary to their profession.
While focusing on supplementary skills can be really valuable, they suffer from one big draw back: they're too closely related to your primary skill set so your brain doesn't get a break. Are you really going to want to spend 30 minutes practicing typing after you spent the whole day typing code? No. That sounds miserable. So how can you improve while giving your brain the break it needs? By focusing on complementary skills.
Complementary skills are those that are different in substance but similar in spirit.
Investing time in complementary skills can help you improve in your main area of focus without burning out. The trick is to find complementary skills that let your brain and body practice without realizing that you are honing aspects of your main skill set.
Take the example of a runner who wants to improve their speed. As a runner, you could practice the box jump. It would have a direct impact on your ability to run, improving the amount of force you can generate from your legs. It would also be a miserable slog. Box jumps definitely have "typing practice" energy.
So instead of practicing box jumps, a runner could take up meditation or yoga. The effect on their running may not be immediately obvious, but both meditation and yoga are focused on controlling your breath, which is a crucial part of running.
This is how complimentary skills work. The substance of running and meditation (i.e. what you are doing) are very different. But there is some shared nature in the two, which in this case is controlling your breath.
So now the question is, what is complimentary to programming?
Complimentary to Programming
I find it difficult to identify complementary skills by any another means than enumerating and seeing where there is overlap. The complimentary skills or hobbies you pursue should be ones that you find interesting and enjoyable, so the first ones that come to mind might be the best ones to pursue.
Three that I can think of are: math, foreign languages, and musical instruments.
The big trick that society played on a lot of us is that math is actually really cool. But middle and high school made it unbearably boring and forced us to memorize it.
Math is fundamentally about thinking, problem solving, and creativity - much like programming. More importantly though, there are interesting things you can do with math - like calculate the height of a tree from 40 yards away.
If you like brain teasers and code katas, then you'll probably enjoy completing math problems. I do not enjoy brain teasers, but I still enjoy learning about math. There is a practical aspect to it that I find really enjoyable.
There's a reason we call them programming languages: they're ultimately tools to communicate our thinking to the computer and other programmers. Programming languages are also social, just like spoken languages.
Learning a new language changes how you think and how you express your thoughts. Certain languages are more developed at communicating different kinds of ideas, which is the theory behind why there are so many German engineers, Italian artists, and French poets.
Learning to play a musical instrument is about building your muscle memory, also known as embodied experience or unconscious competence.
If you know how to drive, then you're already acquainted with embodied experience. You don't consciously think about what steps to take when you need to change lanes. You just do it.
The same is true for music: you look up the chords for a song on Ultimate Guitar (which is basically Stack Overflow for stringed instruments) and struggle through learning to play the song until you've memorized it. Then, you play the song from experience and can even start to improvise and make the song your own.
Just like with coding.
The point is that things you learn in another pursuit can be useful in your profession. Josh Waitzkin, the author of The Art of Learning and former chess prodigy turned marital arts champion turned investing coach, has a name for this: thematic interconnectedness.
A concept you learn in one field can be applied in another, revealing the deeper theme behind the concept. Josh's experience was about translating lessons from his Grandmaster chess games to sparring in martial arts world championships.
I can't speak to any of that. At all. But I can relate thematic interconnectedness to my own experiences. For instance, a few years ago, I wasn't very handy around the house. I could change a lightbulb, but could not be relied upon to do much else. I've since taken over doing all the maintenance on my wife's car and almost all the handy work around our apartment.
I've replaced windshield wipers, an electric side mirror (that involved taking apart the side door), and a broken garbage disposal. I also completely remodeled our closet, demolishing and clearing out the old one and replacing everything.
It feels crazy to say but none of these things ended up being that hard, once I started approaching them the same way I would errors in an unfamiliar codebase or learning how to build something with a new framework.
So before you decide to dedicate another evening to learning a new programming language or front end framework, consider learning something else. What you learn is up to you, just go and learn something that excites you and see how it relates back to programming. I bet you'll be surprised.