My work has for a long time been based on part on the powerful model of iterative design. Here are some excerpts from Wikipedia:
Iterative design is a way of confronting the reality of unpredictable user needs and behaviors that can lead to sweeping and fundamental changes in a design. User testing will often show that even carefully evaluated ideas will be inadequate when confronted with a user test. Thus, it is important that the flexibility of the iterative design’s implementation approach extends as far into the system as it is able to. Designers must further recognize that user testing results may suggest radical change that requires the designers to be prepared to completely abandon old ideas in favor of new ideas that are more equip to suit user needs. Iterative design applies in many fields, from making knives to rockets. Benefits to iterative design include: 1. Serious misunderstandings are made evident early in the lifecycle, when it's possible to react to them. 2. It enables and encourages user feedback, so as to elicit the system's real requirements. 3. The development team is forced to focus on those issues that are most critical to the project, and team members are shielded from those issues that distract them from the project's real risks. 4. Continuous, iterative testing enables an objective assessment of the project's status. 5. Inconsistencies among requirements, designs, and implementations are detected early. 6. The workload of the team, especially the testing team, is spread out more evenly throughout the lifecycle. 7. This approach enables the team to leverage lessons learned, and therefore to continuously improve the process. 8. Stakeholders in the project can be given concrete evidence of the project's status throughout the lifecycle.
