A while ago I wrote a post how to lose traction on a personal software project, based on mistakes I have made myself in the past that have slowed down or even completely stopped progress. Today I want to share a tip that has greatly improved my time management since I've started doing it, and helped combat many "programmer's block" moments I am notorious for.
Coming back to work
After you take a break from a coding project for a while, getting back into the groove can be difficult. Stopping for a while can be a great way to gain perspective and maybe reevaluate your goals of what the application should and shouldn't be, but it can also be really hard starting again where you left off.
If you know you will be leaving for a while, and want to return later, you can try leaving a test failing, or some other obvious problem that needs fixing (like a syntax error), but these only keep you going in the short term. It can be difficult choosing the next big piece of functionality to work on.
Keeping an eye on the big picture
Have you ever been in the situation where, working on an application, you surround yourself with a forest of rich infrastructure code -- configuration, data access, logging, UI widgets etc -- and then stop and realise that's all your application is: an empty shell that doesn't do anything useful yet?
Or alternatively, do you ever find yourself getting lost in detail, giving unfair attention to making one little component perfect while neglecting the other 90% needed to be up and running for the alpha release?
All those little extra "clean up" tasks you want to do
While coding I'm always spotting things I want to clean up like refactorings, missing comments, source code formatting, etc. I want to finish my current task before starting something new (and can't until I check in my current work anyway), but I do want to do these little clean ups at some stage.
All these problems really boil down to one simple question -- what should I work on next?
The programmers' to-do list
I have found from own personal experience that sitting down to cut code without a well-thought-out plan of attack is asking for trouble. As well as the examples above, I generally skip from task to task, dabbling in things I find interesting, but not gaining much real traction towards a useful application.
Over the past few months, I have discovered that keeping a detailed to-do list is a great tool for combating these problems and staying on track. The premise is very simple: take a high-level block of work -- e.g. implementing a single user story -- and break it down into all the little programming steps you need to do to get there, no matter how insignificant or obvious.
Here's a dumb example snippet of a to-do list for a web app I am working on in my spare time (the whole thing runs about four pages total). You can see the 'high level' tasks get vaguer towards the end, because I haven't planned them out yet, and right at the bottom there are unimportant cleanup tasks.
The key here is to be fine-grained; you want to see all the little tasks that needs to be done, and then tick them off to see your progress. Even if they are always assumed -- like validation -- it's like a calendar, only useful if you know all your appointments are in there. And it doesn't really matter where your high-level tasks start, as long as together they add up to a program that will be useful to a user.
Defer little tasks
If you think of an easy little 'clean up' task you'd like to do, don't do it now -- just write it down instead. Why? Because:
- If you do it now, it could sidetrack you from your current focus
- It might be a low priority and a poor use of your time right now
- Instead of doing it now, it could be an easy way to get back into the groove later
For example, if you've got half an hour free before going somewhere, and want to spend it on your application, you don't want to be starting fresh on some giant new piece of work. Why not spend the minutes crossing off one or two of those little clean-up tasks you've been meaning to do?
Alternatively, if you're not in the mood to code, you could use the time as a planning session and try to think of the next big task you want to achieve, and all the small steps that make it up. This is just as helpful as cutting coding, and makes you think about the big picture.
To-do list software
I'm a geek, so naturally, I want some flash tool for managing my to-do list. There are a lot to-do list applications on the web like Todoist and Remember the Milk. I tried a few, but eventually just went back to a bulleted, indented Word document because I found it by far the quickest to work with.