In Lean Software Development: An Agile Toolkit, Mary and Tom Poppendieck describe a counter-intuitive technique for making better decisions:
Concurrent software development means starting development when only
partial requirements are known and developing in short iterations that
provide the feedback that causes the system to emerge. Concurrent
development makes it possible to delay commitment until the last
responsible moment, that is, the moment at which failing to make a
decision eliminates an important alternative. If commitments are
delayed beyond the last responsible moment, then decisions are made by
default, which is generally not a good approach to making decisions.
Paradoxically, it's possible to make better decisions by
not deciding.
I'm a world class procrastinator, so what's to stop me from reading
this as carte blanche? Why do today what I can put off until tomorrow?
Making decisions at the Last Responsible Moment isn't procrastination; it's inspired laziness. It's a solid, fundamental risk avoidance strategy.
Decisions made too early in a project are hugely risky.
Early decisions often result in work that has to be thrown away. Even
worse, those early decisions can have crippling and unavoidable
consequences for the entire future of the project.
Early in a project, you should make as few binding decisions as you can
get away with. This doesn't mean you stop working, of course-- you adapt
to the highly variable nature of software development. Often, having the guts to say "I don't know" is your best decision. Immediately followed by "..but we're working on it."
Jeremy Miller participated in a TDD panel with Mary Poppendieck last year, and he logically connects the dots between the Last Responsible Moment and YAGNI:
The key is to make decisions as late as you can responsibly wait
because that is the point at which you have the most information on
which to base the decision. In software design it means you forgo
creating generalized solutions or class structures until you know that
they're justified or necessary.
I think there's a natural human tendency to build or buy things in
anticipation of future needs, however unlikely. Isn't that the Boy Scout motto-- Be Prepared?
I think we should resist our natural tendency
to prepare too far in advance. My workshop is chock full of unused tools
I thought I
might need. Why do I have this air compressor? When was the last time I used my wet/dry vac? Have I
ever
used that metric socket set? It's a complete waste of money and garage
space. Plus all the time I spent agonizing over the selection of these
tools I don't use. I've adopted the Last Responsible Moment approach for
my workshop. I force myself to only buy tools that I've used before, or
tools that I have a very specific need for on a project I'm about to
start.
Be prepared. But for tomorrow, not next year. Deciding too late is
dangerous, but deciding too early in the rapidly changing world of
software development is arguably even
more dangerous. Let the principle of Last Responsible Moment be your guide.