The correct answer, of course, is that there is no correct answer. Software engineering is frequently used to solve so-called wicked problems where it's impossible to visualize all the problems you'll run into without.. actually building the software. In other words, paradoxically, writing code doesn't kill projects: too much planning does!

Failure to recognize wicked projects has given Software Development a bad name. A 1994 Standish Group Report found, for example, that about a third of software development projects get canceled and half do not meet their original cost projections. Some have taken this to indicate that the state of software development is in disarray. However, it can also be read as strong evidence that there are a large number of wicked software development projects out there, trying to address wicked problems with the wrong approach.

A typical management reaction to a failed software development project is to conclude that the organization is immature and to aim for more maturity. This usually means imposing more requirements documentation, more analysis, more planning and tracking against the plan. Managers feel that more use of the classic project management processes will avert future disasters. If the failed project was addressing a tame problem, this approach will probably be beneficial.

However, classic project management practices simply do not work for wicked projects. In fact, referring again to Rittel and Webber, attempting to baseline requirements and then use an analytical approach to reach a solution is a recipe for disaster with wicked problems. These problems are resolved through discussion, consensus, iterations, and accepting change as a normal part of the process.

That article goes on to recommend the iterative development process Scrum. Any iterative process is clearly a step in the right direction. The customer really needed a tire swing but couldn't articulate that. Since we're software developers, not mind readers, the only answer is to quickly put a solution in front of the customer and keep evolving that solution based on real usage.