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?
Planning sessions
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.
July 13th, 2009 | 26 Comments



July 13th, 2009 at 11:36 pm
I’ve found freemind to be really good, any time you can add nodes and close them.
I really only use it when I’m working on several things at once, you can keep track of them and get started again quickly.
It’s especially good if you go to the pub and come in hung over the next day; when someone asks what your working on you can use it to remember quickly and in detail.
July 14th, 2009 at 12:43 am
I find remember + org mode in emacs really useful for this type of stuff. Whenever a little task comes up you hit the key combo and record it. It then stores the task in a simple marked up text file (an org file). It’s basically a glorified bulleted + indented text file with loads of functionality built into it.
July 14th, 2009 at 1:48 am
I’m a fan of http://code.google.com/p/doneyet.
July 14th, 2009 at 2:19 am
I’ve written a small app a few years ago to fill this exact need, since I couldn’t find anything that was good and simple enough: http://sourceforge.net/projects/dad/
July 14th, 2009 at 2:24 am
I personally like using mindmapping software for maintaining TODO lists, particularly FreeMind: http://freemind.sourceforge.net/
July 14th, 2009 at 3:07 am
I really like TiddlyWiki for my todo list and not takinging in general:
http://www.tiddlywiki.com/
July 14th, 2009 at 3:48 am
I use WIKI exclusively. I find TiddlyWiki to be a little cumbersome so I use NoteBook Wiki. When I have completed a task, I cut it and paste it into an appropriate archive with a chronologically ordered date. If the task is well written, it can ube used as a format when delegating, also.
July 14th, 2009 at 3:53 am
http://notebook.wjduquette.com
oops
July 14th, 2009 at 4:37 am
I find that omnifocus works great for this – http://www.omnigroup.com/applications/omnifocus/
(mac only, sadly.)
July 14th, 2009 at 5:45 am
Hobby software project + Trac (or Redmine) + User Stories as a Ticket Type = excellent way to digitize and track ‘to-dos’ as they relate to a project. Not to mention integrated Wiki functionality…
It works much better than note-cards, freemind, or task software IMHO. Only caveat is, setting that pipeline up is a project in an of itself!
July 14th, 2009 at 7:32 am
It’s terribly 20th century I know, but I have never managed to get an electronic method to work as well as a simple piece of paper. I write my tasks and cross them off when done (as you would expect). Once I run out of space I simply write out the ones I haven’t scored off onto a new piece of paper and start again. That way, I have a natural break point every day or two to reconnect with older tasks, review how much work I have outstanding and re-prioritise. Also, sometimes I find I don’t have very much space left after I have written the new task list – at which point I know I have taken on WAY too much (as I have a tendency to do) and it’s time to stop taking more on and/or let some low-priority stuff drop off the list.
July 14th, 2009 at 8:54 am
You can also combine the todo-list with a time management method by using a Pomodoro client, like this one: http://code.google.com/p/pomodairo/
July 14th, 2009 at 9:16 am
I like ToDoList (free from Abstract Spoon: http://www.abstractspoon.com/) for tracking things I need to do, and Tiddlywiki (as above) for general note-taking.
For those who use paper, I have one thing to say: Hyperlinks to bug entries and/or forum messages for follow-up. ToDoList also lets me attach extensive notes to each item, as well as breaking each task into arbitrarily many sub-task-levels…and I can prioritize them…and I can back them up… Well, it works for me. :)
For those who use Trac, I just cringe. I got that workflow set up, and it was close to being useful, but in the end it drove me nuts and I nuked the install. So close, and yet so far…
July 14th, 2009 at 10:04 am
A todo list should list what you have to do, not what you want to achieve. Not: Only authorized personel can use this functionality.
But: Check that user has role X.
One of those awful self-help/self-management books taught me this. For once they where right.
July 14th, 2009 at 10:07 am
GTD (http://www.davidco.com/) works for me. I wrote my own little web application that implements GTD tailored to the way I work.
July 14th, 2009 at 12:13 pm
Try pivotaltracker.com. It’s a free “agile” tool, but it works out to be a nice todo-list catering to software projects.
July 14th, 2009 at 12:14 pm
I have created a simple to-do list web application. It’s easy to use and you don’t need to register before trying
Check it out
http://www.todolistr.com
July 14th, 2009 at 2:53 pm
If you want to be a *real* programmer, here’s what I do:
http://www.vim.org/scripts/script.php?script_id=2027
Create a Todo.taskpaper file in an empty directory and run “git init && git add .” Voilà! Versioned, a syntax-highlighted Todo list that is 100% usable from just about anywhere. You could even put it up on Github and keep yourself honest.
July 14th, 2009 at 9:37 pm
“…but eventually just went back to a bulleted, indented Word document because I found it by far the quickest to work with.”
You should definitely try OneNote. It is quicker than Word and has a lot more features for managing your list(s). Not free, but those of you with an MSDN subscription already own it.
July 14th, 2009 at 11:32 pm
Can I suggest http://checkvist.com? It’s a rather simple online outliner and checklist. Creating lists is as easy as if you worked in a desktop editor, with all familiar keyboard shortcuts (Enter, Shift-Enter, etc.)
July 14th, 2009 at 11:56 pm
MyLifeOrganized or ToDoList.
I believe a Programmer who masters TODOs quickly becomes a project manager (or worse) :) .
July 15th, 2009 at 4:58 am
org-mode. Nothing better for organizing life :)
July 15th, 2009 at 7:00 pm
After reading this post, I’ve been trying out Todoist.
It’s worth noting that there is a great Launchy plugin available for Todoist, so I can go to or add to my different to-do categories at any time with a couple of shortcut keystrokes.
Love it!
July 16th, 2009 at 1:23 pm
I love using Stickies from http://www.zhornsoftware.co.uk/stickies
I use it for notes & for to do lists or long term running lists
You can manage your stickies & style them. The app is free =)
July 21st, 2009 at 4:20 am
I like using Mylyn with eclipse. I don’t use the task context / focus stuff, but the version that comes with Galileo has *every* feature I need for a to-do list – flexible scheduling (stuff that is overdue piles up on ‘today’ until rescheduled), nested tasks, all kinds of stuff. Being confined to eclipse isn’t a problem for me because I barely ever leave it – Java, C, PHP, Perl, all good.
August 24th, 2010 at 11:51 am
Great piece of work!!!