I’ve just noticed that one of my practices has changed subtly, probably sometime during the last six months or so:
I’ve always (ie. at least for the last twenty-five years) kept a to-do list during each programming episode. The list begins with one entry, describing the goal I’m working towards. And as I read and write code, new entries are added to make sure I go back and fix or refactor everything I see along the way. Until recently, those additional entries tended to describe an outcome – “split class Foo to create Bar and Xyzzy”, or “wrap x and y into a Mouse class”, for example. But recently I’ve noticed myself tending to write entries that describe the problem – “class Foo too large”, “x,y travel around together”.
I have no idea how, why or when this change happened, but I’m pleased it did. Between the time I write a particular to-do item and the time I finally get around to executing it, I may significantly change the code in that area. Or I may learn something about the code and where it wants to go next. Or the problem may disappear, as a side-effect of some other change. Either way, the solution I might have on my to-do list has a chance of being inappropriate now that the code and I have moved on. So by listing the problem as I originally saw it, I’m giving myself a much better chance of creating the right solution for it – because I’m deciding on that solution in the presence of the full facts.
I’ve recently been re-doing a few kata that I first tried a couple of years ago. I’ve noticed that my results are dramatically better now, mostly I think due to delaying the moment at which I decide how to solve each micro-problem. This effect is an example of Mary Poppendieck’s “decide as late as possible” maxim. There are clear benefits in terms of the quality of my designs; and there are psychological benefits too, because I don’t have to spend time trying to remember why I wanted to do each item on the list. Everyone wins.
May 12, 2007 at 1:59 am
Firstly Kevin, thank you for your blog, I enjoy your writings a great deal.
I have noticed a similar trend towards a to-do list of problems rather than tasks. My realization has come at a time in my career when I have just recently gone over the waterfall into the agile pool :)
It does seem to be very “agile”; a focus on what needs to be achieved rather than how we feel it should get done.
Kindness and please keep posting,
Dan
May 17, 2007 at 3:40 pm
Thanks for the kind words Dan – and good luck swimming in new waters!
May 30, 2007 at 6:25 am
Great idea! And very agile! I will try to implement it right away. I think I will change the name of my to-do list into to-solve, just as a reminder.
August 6, 2007 at 7:38 pm
I totally agree with this approach, I use a similar technique:
http://yandleblog.com/2006/11/flie-based-bug-management.html