Pablo Picasso was one of the most famous modern artists of the 20th century. While many of his paintings border on the abstract, he sharpened his artisitc skill on more realistic and traditional styles. Novelty and creativity are important parts of great art, but just as necessary to making anything great is the technical ability to take an idea and represent it in the real world — even abstract expressionists could paint unbelieveably realistic landscapes if they felt the need.
I’m certainly no artist, but the lesson here applies more broadly: practicing technical skills on their own is an important part of the creative process.
Science and Charity by Pablo Picasso, 1897 (age 16)
Guernica by Pablo Picasso, 1937 (age 56).
I’ve got more than a few ideas for open-source projects and apps that I’d like to implement. I also have more than a few languages, frameworks and technologies that I’m itching to learn how to use. For a long time I’ve taken to heart the advice that the best way to learn a new programming language or framework is to build a larger-scale project with it that you’re excited about. What I’m realizing, though, is that innovation tokens apply just as much to side projects where you’re looking to grow and learn as they do for production applications. The more mental energy spent designing a UI and triaging bug reports, the less energy there is for diving deep into a new language, investigating performance bottlenecks and learning other tools.
My thoughts on this really solidified as I started a read-through of Crafting Interpreters with Kotlin. Even though the book fully spells out the code and structure of the interpreter, just translating the code to a different language has helped me learn a ton about language implementation in general and Kotlin in particular along the way.
This isn’t to say that you shouldn’t push forward on your own ideas. But in order to put the best work out there, it’s important to also dedicate energy to honing technical skill on its own with some more well-defined projects that still require a lot of depth of implementation. Challenging Projects Every Programmer Should Try and its sequel are good lists to start off with.