In my experience of doing software development for non-developers, risk is one of the most difficult things to deal with. It’s so easy and tempting for customers to think and plan in terms of the definite “I will have feature X by date Y”, that the risk of X not being available by Y gets quietly ignored. Any such failures come as a complete surprise, even when the details of feature X were not even known at the time an estimate was made.
Several development project management methodologies try to cope with this, and Scrum is probably the most well known. Here’s an InfoQ article about risk and scrum.