Poor requirements – if requirements are unclear, incomplete, too general, or not testable, there will be problems.

Unrealistic schedule – if too much work is crammed in too little time, problems are inevitable.

Inadequate testing – no one will know whether or not the program is any good until the customer complains or systems crash.

Featuritis – requests to pile on new features after development is underway; extremely common.

Miscommunication – if developers don’t know what’s needed or customer’s have erroneous expectations, problems are guaranteed.