For years, I have been struggling with a problem I believe many programmers can relate to. I keep abandoning personal projects without ever finishing them. While an unfinished project isn’t always a waste of time, I have the goal of a nice portfolio that I can share with friends or potential employers. It’s also a personal thing, I want to prove to myself that I can actually finish, at the very least, three of four technically impressive projects.
In order to solve this problem, I analysized it and tried to construct and reliable solution. This article is basically the result of the notes I took during that process. I am hoping this knowledge is useful to other people in some way.
The problem
I’ll attempt to describe what the life cycle of an “abandone side project” looks like to me,
I usually pick a project because it “seems interesting” or “looks cool”. I’ll see someone on twitter share a cool shader or a physics engine and think “I NEED to build something like this”. This initial burst of inspiration usually last for about a weekend. I’ll read about the topic, watch some youtube videos, and build myself a working prototype before sunday ends.
The problems start shortly after this initial sprint. Sometimes, I’ll come home after work and feel too tired to touch on my project. Other times, I’ll hit a wall on progress due to a major knowledge gap and lose motivation. Other times, it’s other problems but you get the idea…
Once these things start happenign, it’s usually just a matter of days/weeks until this project gets sent to the shadow realm and replaced with the next.
The exceptions
I have experienced a few exceptions to this problem. Upon analyzing them, I found some key similarities.
The first exception is my job. I never find it hard to stay motivated when I’m working. Obviously, a job has much higher stakes than a side project, but I don’t think that’s the only factor. When working, I’m not taking on large projects on unknown topics based on “hype”. I’m working on small, well-defined independent tasks, that are within my skill-level or close enough to it that I can learn without getting stuck.
When looking at the second exception, two personal projects that I was fully able to finish, a CHIP8 emulator written in C, and a terminal library written in Zig, the above observations remain. Both of these projects were close to my skill level, based on a deep interest of mine (systems programming) and inherently divided into small, independent tasks (example: implement and test one emulator instruction at a time).
No hype, no massive knowledge gaps, and no implementation without prior planning. These seem to be the key points to creating a successful side project.
The solution
My solution has two parts. The first part involves updating my daily habits. To be a good engineer, one must in good mental and physical shape. The second part involves modying how I select and execute projects.
The first part
I belive my lack of motivation is sometimes caused by an overall lack of energy. I try to keep my body and mind healthy: I do 4+ hours of exercises and socialize a lot. However, I do have some weakpoints where I could improve, mainly my sleep schedule and my diet.
In order to increase my energy levels I will attempt to increase the amount of sleep hours and calories my body gets daily.
The second part
Clearly, the way I have been selecting and executing projects has been flawed. So, I will improve that.
From now on, I will select new side projects based on logic over hype. If a project idea is based on the last twitter post I saw, I will throw it in the trash. If a project is too far beyond my current knowledge, I will put it on my backlog and come back to it later.
In terms of execution, I will attempt to apply the following plan to all my future projects:
- Research: read articles and watch videos on the topic, remind myself of what I already know and fill any knowledge gaps.
- Planning: divide the project into small (1-2 weeks max), independent tasks.
- Execution: finish the tasks, one by one, take breaks when needed.
- Document: keep some documentation of which tasks have been completed and other relevant information.
I am pretty confident that, if I follow these rules, I won’t be abandoning a side project any time soon.
My next project
After I wrote this article, I decided to pick my next project to work on. I think writing this here will encorage me even further to make sure I fully finish it.
I have always wanted to learn more about embedded programming. To fullfill this wish, I recently bought a raspberry pi pico. I think a simple, but still interesting, project would be to create a small 2D graphics + physics engine that runs on the pico + an oled screen.
I already have most of the knowledge needed for this task (I’m decently familiar with graphics programming), and I think any embedded or physics knowledge I may be lacking can be learned quickly. If I haven’t finished this project in the next 2-3 weeks, feel free to insult me on twitter.