For some time I have been looking for the time to post a general picture of the design and programming approach I have been trying in several projects, the life-cycle for a single feature would be depicted like this:
The main points here are:
Functional capacity is accumulated and maintained in time as iterations are done.
Each iteration ends with a releasable, production-grade slice of functionality from each feature selected for version N.
Each iteration ends with a useful version from the customer perspective so that if the project ends at that time, there is an up and running subset of capacity.
RTM date planned accordingly to a chosen capacity level.
The design is always in flux, even after RTM N. Actually at RTM timepoint there is a frozen branch in the version control system for the shipped bits, but the mainline version continues in flow.
Part of the background of this life-cycle is explained by the following post:
Organic and evolutionary software design – a metaphor http://blogs.msdn.com/marcod/archive/2005/04/14/TheEmbryo.aspx
It's not quite the same as growing plants, (project running late? use some miracle grow!) but feature
When agile development still was not called agile development, there were planning-oriented technicians