I’ve been making computer games in some form or another for just over 25 years now. At the very beginning, as a hobby (passion) and completely by myself (although not for lack of trying to get some of my friends involved). In the late 90s, when I finally left academia and started making games professionally, teams were still relatively small, with a total of around 10-15 people per team. As we all know, budgets and scopes kept growing, and so did team sizes. At its peak, the largest team I worked at had around 200 people. That’s when I decided to go indie and started Power of Two Games, which was obviously just two of us. Finally, now as Snappy Touch, I’ve gone full circle: It’s just me again.
Development tools and hardware have changed quite a bit from the times I was writing in straight Z80 assembly and saving the programs to a tape. But I’ve also changed and learned a lot during all those years developing games, and even though I’m writing games by myself again, I’m doing things very differently from how I did them back at the start.
One thing that I’ve always done is to question everything. Why should I do things a certain way? Why is that the “accepted” way of doing something? And not surprisingly, at each step of the way, I’ve changed my development style to match my situation (often in ways that went against the “common wisdom”).
When it comes to solo development, I rely heavily on the concept of goals and iterations at multiple levels:
- Immediate (< 1 minute): Prioritizing the ideas going through my mind. Writing tests. Writing code.
- Short Range (< few hours): Tasks that move the project forward in some way.
- Mid Range (< 2 weeks): “Stories” that define a self-contained, significant part of the project.
- Long Range (full project, several months): Ship date, beta testing, etc.
It turns out, I use a different set of tools to help me manage the items at each level of the development cycle.
Immediate
These are the actions I take and complete in less than a minute or two. Most of them are writing tests (with UnitTest++, of course), writing code to make those tests pass, refactor code, and check it into Subversion. I have my Subversion repository hosted on Dreamhost and I access it through SSH so it’s secure, accessible from anywhere with an internet connection (or 3G signal and HandyLight), offsite, and easy to backup. And because Subversion works great offline (unlike Perforce), it’s not a problem to work without connection to the repository for a while.
I also need to manage my minute-to-minute thoughts, write down ideas and reprioritize them when the time comes. When I’m “in the zone”, I get way more ideas than I can execute with my fingers: This function needs to be moved to a different file, I really should be compacting that data over there, who was stupid enough to name this file this way?, that variable shouldn’t be cached, etc. If I don’t write things down, I will either forget them, or I’ll stress for hours until I finally get around to doing them. I could also do things as I think about them, but then I would be chasing a rabbit down a neverending hole and wouldn’t get any work done (I’m sure anybody who’s gotten lost browsing web pages can identify with that).
I used to do this the old-fashioned way, simply with paper and pencil (like Bob described in his blog post). However, I found that physical paper and pencil was just too limiting: I can type a lot faster than I can write, switching to writing requires moving away from the keyboard, and, most importantly, I need to bring the notes with me everywhere and it’s very difficult to rearrange, sort, or coalesce them in any way.
So instead, my tool of choice these days is JustNotes. It’s perfect for jotting down thoughts in a matter of seconds without even interrupting my train of thought. I have JustNotes bound to a global key, so in the middle of typing a line of code, I can press that key, enter whatever I’m thinking about, press the key again, and finish the line of code. All in 4-5 seconds. Don’t laugh: The fact that I can do that in just a few seconds without moving my hands away from the keyboard means I can use it any time without much penalty. It’s amazing how many things I jot down that I wouldn’t do otherwise.
Short Range
To manage tasks up to a few hours in length, I use Trac. Trac is a fantastic issue-tracking tool: It’s free, it’s fast, it’s simple, and it’s configurable. In the past I’ve used anything from spreadsheets, to Bugzilla, to publisher-owned bug databases, and nothing comes close to Trac for my needs. It also scales very well to teams of more than one person (although it might not be good enough for hundreds of people).
Just like Subversion, I have Trac hosted externally, through my web hosting company. Sometimes it’s frustrating if I need to access it and the server is down, but again, the convenience of having it off site makes it well-worth it.
Any task that requires more than 10-15 minutes goes in Trac, and then I can easily prioritize tasks depending on their importance. Usually, if an item has been on my instant queue in JustNotes for about a day and I haven’t gotten around to it, it either gets deleted or it gets moved into a full item in Trac. The only way progress happens is by ticking off Trac tasks. In the end, my projects live and die by Trac.
Medium Range
User stories (to borrow terminology from Scrum/XP) are visible, relatively self-contained features of the final project. They’re made up of several tasks, and usually take a few days to a few weeks to implement. A group of user stories make up a full iteration (sprint) of the game, which is usually between one and two weeks long. Sometimes user stories are complex enough (add a replay feature visible on the web site) that the full iteration is just the one user story.
I keep track of these stories in Trac as well. Trac is both an issue-tracking system and a wiki, so the wiki part is perfect to keep these user stories. In addition to that, I label tasks as belonging o a particular iteration. That allows me to separate what needs to be done for this iteration, from other tasks that I added for the future. At the start of each iteration, I decide on the user stories and either generate new tasks or label existing tasks as due for this iteration.
The wiki in Trac is extremely valuable for all sorts of other things: game design ideas, general brainstorming, gathering reference material, etc.
Trac ends up being the perfect mid-range vision of my project.
Long Range
User stories and tasks in Trac aren’t enough to cover a project that is potentially 3-4 months long. I need something that helps me with the longer view, otherwise I find that things creep up on me without realizing it because I’m so focused on the short and mid-range items.
The best tool I’ve found so far is very low-tech: A printable month-per-page calendar covering the full length of the project. Right now I’m shooting for a November release of my current project, so I printed August, September, October, and November and pinned them to the corkboard on my office. It’s amazing the sense of urgency that seeing your ship date gives you. You realize that you only have a handful of weeks before shipping and makes it much easier to prioritize tasks (and chop off features or save them for an update).
I realize this long-term, calendar view isn’t very useful if you don’t have a set release date and you want to continue chipping at your game until it’s ready. But even if your release date is flexible, having this long-term view can help you keep budgets in perspective and manage them accordingly.
Finally, for an extra bit of motivation (or maybe this falls in the category of excessive pressure), I just started using a countdown widget for the Mac OS Dashboard. Just in case the calendar view wasn’t enough, here’s a countdown (down to the second) of the time left until release.
Speaking of which, I think it’s time I get back to work. Only 102 days left!
New blog post: Indie Project Management For One: Tools #idevblogaday http://gamesfromwithin.com/indie-project…
@SnappyTouch time to port La Máquina del Tiempo to iOS!
@NimbleDave LOL! I’ll port it to the iPad because it’s so much fun typing on it! 🙂
@SnappyTouch Cool, you made a txt adventure game on the Amstrad ;-), so maybe LA MÃQUINA DEL TIEMPO could have a remake?
Good stuff. Nice how you’ve divvied up the tools into buckets, even if there’s some overlap. I’ve been thinking of adopting something like Trac. Does it work as well with a small group of 1-3 collaborators?
Thanks!
I’ve found it invaluable in small groups, actually. It’s great and offers a huge community of hacks (plugins) to get more mileage out of it.
My go-to addons definitely include check-in ticket references (add a snippet to post-commit and it will comment and/or close tickets when you reference them in your check-in comments).
Hi Matt,
Absolutely. Trac will scale to 1-3 people without any problem at all. You even have nice features like RSS feeds and email on change to help you keep track of what’s going on. Give it a try!
I have used SD before to have a local bug tracking system always available in the laptop that automatically syncs with my Trac when online (check http://syncwith.us/ or http://fsck.com/~jesse/tmp/2009-07-15/Ed%2BUAP05So4=/sd-intro.pdf for a quick intro).
But I am wondering… you have commented on Twitter you also use Things by Cultured Code. How does that fit into your process?
Interesting. I have definitely wished to have access to Trac sometimes I was offline. I’ll check it out.
Things it’s for everything that is not a project task: moving stuff, home improvement, writing deadlines, emails to answer in the future, etc.
And then I use ListMaker on the iPhone (http://software.dazeend.org/listmaker/) for shared lists with Amy (mostly grocery lists).
These are great tips, Noel. I had been looking for something like JustNotes for the exact same reason… I don’t want to spend too much time fidgeting with paper and pen when I have a quick thought. Thanks for the tip!
Have you tried a distributed revision control system? I’ve started using git for 1-3 person projects a while ago. And since then I can’t agree that “Subversion works great offline”…
Hi Nik,
I only gave Git the most cursories of tries, so not really. So far, there hasn’t been an itch that I need to scratch by changing version control systems. Besides, I hear most of them are horrible at dealing with large binary files (which are very common in games).
Maybe someday, when I really need the new features, or when someone comes up with good large file support, I’ll give it a try. In the meanwhile I’ll spend my energy on everything else that’s higher priority for me 🙂
Assuming you’re going to stick with mobile games I don’t think you’re going to find issues with binary files for a while. And SVN sucks at binary files by the way so it’s not like you’re losing anything there.
Personally I’d use Mercurial since it works on Windows/OSX/Linux with zero issues. Git hates Windows.
All of the distributed systems work far better offline than SVN since by definition they are distributed. That means you can check in while offline, something you can’t do with SVN. It means you can switch back to previous revisions, branch, all kinds of stuff offline.
If you have 3 more people the benefits get even better since 2 or more people can share changes without effecting the other people.
Seriously, it took me less than an hour or two to switch from SVN to Mercurial and it’s been totally worth it.
http://www.joelonsoftware.com/items/2010/03/17.html
As Nik says, I’d have thought you’d use a distributed VCS, like Git or Bazaar. I’ve been using the latter for a few months (on a 1-man hobby project), and yeah, I once thought SVN worked great too….
It really is amazing how much nicer distributed VCS tools are to work with.
I also use SVN hosted on Dreamhost, I’ve found that it works perfectly for my needs. I have nothing against git, but SVN works great(especially when you’re a solo developer), so I see absolutely no need to switch things up.
I doubt there are very many other iOS devs who use Windows like I do, but if there are, I highly recommend AbstractSpoon’s “ToDoList”, it’s pretty awesome, and it’s totally free(and open source): http://www.abstractspoon.com/tdl_resources.html
How does design fit into your workflow? Do you consider prototypes/sketches etc as stories? Do you do all the art yourself?
Design (game and UI) is just part of accomplishing a user story. I don’t usually make a task for it (unless it’s super-complex), but it happens naturally as I break up a user story and start implementing parts of it.
I have someone else do most of the art (but I’ll dabble in Photoshop/Maya when I have to). Getting the art back are definitely tasks in Trac because it helps us both keep things visible.
I just had a little unexpected brainstorm and I used Dragon Dictation to record my thoughts, copied/pasted the text from Dragon to Simplenote, and then cleaned up the Dragon mistakes with JustNotes on my computer. It all flowed really well.
I highly recommend Dragon Dictation.
Thanks for the tip Noel.
I realize I’m coming to this article 4 years later but I still found it extremely helpful, thanks for sharing.