Steve Yegge's wisdom notwithstanding, most developers are faced with requirements which were gathered from non-technical customers. Sometimes there are project managers who deal with the customers and translate their requirements, other times not. In any event, the fact that the requirements will change is an inevitability.
Most of what consititues "good programming practice" has to do with developing systems which are adaptable so that they can withstand changing requirements. Principles like YAGNI, DRY, loose coupling, etc. contribute to this. Iterative development processes such as Agile also attempt to address the concern of trying to hit a moving target, and of course having a system under test makes it infinitely more feasible to make changes.
Nonetheless, it seems that for many of us changing requirements can not only hurt the quality of our software, but can also drain our motivation and make us want to stab someone.
This question is about how to manage the customer to make it possible for them to change their requirements in the ways that they need, while discouraging arbitrary or frivolous changes. How do you do it?
- Do you have project managers to insulate the devs from the customer?
- Do you have a formal change management process? Change managers?
- How difficult is it for the customer to get a change when they really need it?
- Conversely, how easy is it for a customer to get a change when it's "frivolous"?
- How much detail do you give the customer when explaining the cost of a change?
- How quickly are you able to give the customer this information after receiving a request for change?
- What factors can torpedo the process (e.g. PM's who can't say no to the customer?)
- What works for you?