Finishing game dev projects is hard! I was recently asked to provide some tips on personal productivity, specifically for hobbyist or indie developers. As I started I realized that this was also harder to do than I thought. Nevertheless, here we go!
These little nuggets of wisdom are the main reason that I regularly meet my goals and finish my personal projects. I’ve learned these over years and years of unfinished projects until I finally became more disciplined. (This was actually a major source of personal pain for me until I overcame it.) Maintaining a productive lifestyle is a lot like personal hygiene—you have to practice regularly for it to be helpful.
Here are some development habits that I practice regularly that help me to pick and see projects through to the end. Note that I didn’t have to pad this list to get exactly ten items; it just kind of worked out that way.
1. Reserve some “uninterruptible dev time” for myself. This is time where I insist that nobody interrupts me. I close my lab door and work away on a project. I usually have a solid goal (or set of smaller goals) that I plan to make progress on. To be clear, this is dev-only time, where my next several moves have already been planned out. It is in this chunk of time that I execute them.
2. When I can’t implement, I think. Can’t afford to spend a few hours in front of my computer? That’s okay! I read somewhere that a good programmer spends 90% of their time thinking and the other 10% of their time coding. Time to think is essential because it allows me to draw up a battle plan and use my”uninterruptible dev time” more effectively. I can do this virtually anywhere: in the shower, while driving, etc. I solve a lot of problems this way without ever touching a keyboard.
3. Use smaller opportunities when they present themselves. Deciding to use that half-hour before I meet a friend over coffee can do amazing things for my focus during that half-hour. If I know that my time is limited, I can commit myself to a small, manageable task that brings me closer to the completion of my project.
4. Pick my projects wisely. It’s hard for me not to get excited when I’m struck with a fun-sounding idea. However, I’m now wise enough to know that the shot of adrenaline I get when I come up with something interesting does not automatically translate to, “it’s a good idea to spend time on this.” At any given time I usually have several interesting things that I’d like to work on. Eventually, though, after a few days, one of them floats to the surface after I calm down.
5. Keep the end goal in mind. If I’ve committed myself to a project, I’ve decided that it’s worth the long haul (for whatever values of “long” that are appropriate given the size of the project). The image of the completed game, application, or random DIY/robotics project is what keeps me going, and so I enjoy visualizing what it would be like to have that final product. This keeps me focused and helps pull me through the occasional times when I have to implement a feature but don’t want to because it’s not fun.
6. Re-focus if necessary. Because I take pride in my work and want to produce the best “thing” that I can, it’s easy to get caught up in an endless stream of tweaking graphical effects, refactoring or compressing my code, or future-proofing everything I do (or worse, spending all of my time writing fancy development tools like level editors or asset mungers). Yes, these are all important things and no programmer can deny that they are fun as hell, but I could spend the rest of my life doing these things and never complete anything else. I continually ask myself, “is this strictly required, and is it strictly required right now?”
7. Start those scary features. Sometimes I’ll go back and look at previous projects from long ago that I stopped working on. A surprising number of them had something in common—they were all halted at some point just before a big, hairy, and non-fun dev task had to take place. I’ve since learned to pick my projects more wisely in such a way that I can push through those difficult dev tasks. Those scary features I tried to avoid became a lot less scary once I closed my eyes, pretended it was a bad dream, and started anyways.
8. Take a break if I need to. I don’t pressure myself to be continually working on something. If I’ve picked my project carefully enough, the desire to work on it will come back after a few days or weeks.
9. Embrace “good enough”. Winston Churchill once said that “perfection is the enemy of progress.” If I spent my entire life perfecting every aspect of my projects (including code), I’d never finish, and I wouldn’t like the end result anyways. Developers are artists, and artists are never satisfied with their work (nor should they be expected to be). Recognizing when to say, “this is good enough for now” is a skill that takes practice. “Good enough” is a delicate balance between, “it will take forever to implement this perfectly,” and, “I can do this in eight minutes but it’s a total hack and my future self will hate me for it.”
10. Get an expensive hobby. Okay, I really wouldn’t recommend doing this, but one of the things that taught me to be productive was building robots…and then not finishing them. Robotics is a pricey hobby, and an unfinished robot translates into a lot of wasted cash. I learned very quickly how to realistically pick projects and set goals for myself when suddenly failure to finish was rewarded with not only wasted time, but wasted money as well.