Schedule slip, quality deterioration, and irrelevant software are three common risk factor in any software development.
There could be many causes to schedule slips, but lack of requirements and cow boy coding (developer codes what he/she feels right) could usually do the trick.
Case 1.
If the requirements are not bound to domain expert's knowledge, the perceived progress would be made initially as the developers make things up as they go. Later when the software actually start to work, the users and experts realize that it's not doing what they wanted.
Case 2.
Feature creep. In the middle of the project when things start to work, either developers or the stakeholders start to add features that was not initially planned.
Case 3.
Modifiability and maintainability of the system/code was neglected. When the system/code is relatively simple and small things move along, but when it reaches some point rate of bug growth exceed rate of actual development.
All cases can co-exist simultaneously. There are certain things you can do to alleviate the risk factors, but they first need to be acknowledged as possible risk.
First, the requirements. Both the developers and stakeholder (business domain experts, users, and/or user surrogate) must agree on what are being developed before the coding starts. Of course, it doesn't have to be complicated or be done all at once up front, but it should be a document that could be reviewed to correct misunderstands. At the least the document should specify the expected input and output that could be used for the domain experts to determine whether the system succeeded a task or failed. The document should not mention anything about "how" the system is implemented.
Second, to avoid feature creep, let the stakeholder pick the must have tasks for a given iteration.
Finally, invest time and resource and refactoring and unit tests to maintain high modifiability.
These are some suggestions, and not a silver bullet.