|Think about Loose Coupling|
I don't understand why software developers and customers keep insist on trying to fight each other tooth and nail. It's not as if they don't have the same goal.
Insisting that the customer come up with a comprehensive list of requirements before you start the project is silly. You might as well put "The customer can't ever change his mind, ha ha!" in the contract.
Insisting that changes to the scope of work can be fit in to the project as-is without changing the time, resources, or cost is silly. You might as well put "The developers can't ever change their estimates, ha ha!" in the contract.
Either way, trouble's brewing. I don't want to fight with people with whom I have a business relationship.
Aside from, say, the space shuttle, trying to gather requirements (as if they were ripe grapes, waiting to be plucked from verdant vines by barefoot virgins in billowy gauze wraps) up front, once and for all, looks like a recipe for disaster, yet, somehow, "software engineering" still promises it can make wine from unplanted seeds.
What would happen if you agreed to much smaller milestones, one every couple of weeks, letting the customer choose what to do and letting the developers decide how much time it would take?
Maybe it'd take a little more investment from the customer beforehand, but you could avoid the big thud of specifications and negotiations up front and start delivering actual, working code much faster.
Maybe customers and developers don't have to fight. Maybe you can both be happy.
(Yeah, I wrote a book about this.)