Associate Teaching Professor
Carnegie Mellon University
I always have a side project.
I've written a lot about the meta aspects of side projects, such as why I prefer making useless stuff and programming as play. I've also shared one, two, and three lists of projects that I think every programmer should try.
Through my many, many side projects, I've identified 5 key qualities for a good project:
A clear objective. The core goal should be clear, like "I want to build a NES emulator" or "I want to learn how to make an LLM from scratch". The rest can be figured out as I go (I really don't do much planning).
Tangible artifact. It is very motivating to have something that I can see and touch, and even show to my friends. If the project doesn't lend itself to something interactive, then layer on a visualizer or playground app.
Minimal cognitive overhead. I despise distractions so I try to limit the number of extraneous concepts that I need to learn en route to my goal to one other thing. If I'm trying to learn how to do procedural generation in games, then I don't want to also be learning Swift, XCode, and OpenGL at the same time.
Existing resources. If I get stuck, I want there to be a plethora of resources and existing solutions for me to learn from. The core concept of my projects is never novel (though the specific combination of features and design choices often is).
Elastic scope. A great project is one that can be as simple or complex as I want—it can be completed in a weekend or in 6 months. I can customize it, simplify it, or add complexity to the areas of the project that interest me.
Take a look at the write-ups for a few of my side projects: