A couple of months ago I was pair programming with a colleague, sharing my screen, and he was amazed to see the number of branches I had in my git repo. This wasn’t simply a case of poor git hygene, these were branches that I had started but never pushed, branches that were never merged. As I explained this I realized that my attitude towards starting and finishing projects has changed dramatically over the years.

I spend a lot of my time at work thinking through how to solve problems. Some of these solutions come pretty quickly based on experience, but when I have questions about how I might be able to use or stretch some API, or about what a comfortable API for some feature might look like, I like to answer those questions with code.

These little experiments might take ten minutes or several hours, but they help me see concrete implementations of different ideas. They’re usually just enough of the implementation to answer some question, and I try not to pull them directly into production code, but these branches represent anything but wasted time.

This kind of experimentation does more than answer specific questions about some framework, it offers a way to try creating and working with different API shapes to learn what works, and what ends up being challenging.

For a while I spent time working on a multiplatform XMPP chat client. That project didn’t result in any published apps or libraries, but I got the chance to implement the extensible Broadway MVP pattern used at Cashapp, described by Benoit in his DroidconNYC 2022 talk (now encapsulated in the Circuit library from Slack). I also got to experiment with how to structure a library around a spec that uses streaming, stateful connections instead of the more common transactional APIs.

At another point I spent a little time making a browser for Gemini, the HTTP alternative to the web. This is a niche protocol, and the project again didn’t result in any real product, but allowed me to scratch my own intellectual itch by making a Kotlin Multiplatform library around a simple spec.

Once, I built a React.js web app for launching remote, headless IntelliJ IDEA instances, allowing you to use IntelliJ IDEs from the browser. The whole web app was styled as a classic Mac desktop, complete with tiled wallpaper and stylized app icons. That obviously didn’t go anywhere, but hey, I learned React!

While it may seem like there’s shame in unfinished projects, they can also provide a lot of value. We learn through experience, and we gain experience by doing. So whether you think you’ll be able to finish them or not, I think you should start more projects.