I’m almost always coding personal projects for fun, to build automations for myself or learn new skills like server-side Swift or React Native or machine learning. But while that’s great for learning, and while there’s nothing wrong with learning for the sake of learning, it hasn’t led to much being finished. Instead, I have a pile of projects in my work folder (about 300 to date) and maybe 10-20% are usable. Aside from code, I’m learning maker skills like 3D modeling/printing, circuits, and woodworking, and those projects I definitely want to finish. It’s one thing for code to rot in a forgotten project folder, it’s another thing for a desk to be half-built taking up space in the garage.
Being stuck at home for 2020, I’ve wanted to finish more things, and head into 2021 getting more done. When I look at the personal project graveyard, I see some trends that are nearly universal.
- Often, the project ends up with some amount of pursuit of Perfect Engineering. Coming up with the ultimate architecture, or constant refactoring, or wasting time building something like I would at a job.
- Often times, I’m working with Swift which, while a great language for professionals building apps, makes for a very bad platform for hacker hobby projects. CI tools require constant maintenance, and while the language has finally started to become stable from an API perspective, frameworks built for them like SwiftUI and Vapor are on shifting sand foundations that change often, and cannot be relied on.
- Most of these die after two months or so. I might pick them back up again down the road, but it’s almost always for similarly periods of time. And if I do, there is time and energy wasted on relearning the old code base, refactoring things, getting the project running again on Swift updates, etc.
On a software engineering team, the first two are absolutely not problems. Investing time into architecture and anticipating problems pays off as less engineering time and fewer errors in production. Engineering teams can afford to spend people’s time to keeping Mac-specific build bots updated with the latest versions of Xcode, and can budget time for language changes and framework updates. But these are distractions whern you’re making a hobby project.
In the last month, I’ve tried two projects with a far scrappier approach. Instead of letting scope creep and architectural purity have their way, I gave myself a short time window to get the thing done, and then force myself to move on. The first was scoped for two weeks, and the second was done over the four day Christmas weekend. I had a clear goal of what I wanted the thing to do, and a short amount of time to make it work.
That means cutting corners at every turn. I used singletons and globals. I had dependencies talking to each other through direct communication or a single pub/sub messaging bus rather than go through clean interfaces. For a mobile app, instead of fancy patterns, I just crammed my view controllers full of functionality and connected them to each other. For a web app, I used basic server-side rendering and a single no-framework no-bundler JavaScript file for client-side UI control; no Webpack or React or GraphQL wasting time with setup and adding architectural complexity. By and large, I would be embarrassed to ever let anyone see this code, or turn into a pull request.
But in both cases, I finished ahead of time, and the thing exists. It works, and I can use it. And perhaps a bigger benefit, my brain can let it go when it’s done, and give my full focus to relaxing or doing housework or exercising. We talk a lot about work/life balance, and perhaps hobby/life balance is just as important.
I think this is how I’m going to approach personal coding projects for now. Scrap something together within a time box, and never mind how it’s built under the hood. I’m sure I’ll keep working on some long running projects, and I’m sure I’ll find ways to iterate on Thing 1.0 and add stuff to them. But by starting from this foundation going into projects in 2021, I can hopefully actually get more of them done.