I've found (in any non-trivial but non-monstrous development) that the following works well (from dev perspective):
in reply to OT: Project clients
- Build a *minimally functional* app based on client specs. Plan to throw it away; you will anyway.
- Based on feedback, build a second minimally functional app, knowing it will evolve. Evolve it based on client priority list.
- Once everything has more-or-less settled down, redesign based on what you now know the client *really* wanted, and reimplement.
Much (most?) from step 2 ends up in step 3, so it's not really "wasted" time... :-)