The best way of dealing with uncertainty is to iterate. To reduce uncertainty about what the product should be, work in short iterations, and show (or, ideally, give) working software to users every few weeks. Uncertainty about how to develop the product is similarly reduced by iterating.

Mike Cohn Agile Estimating and Planning

My dad has echoed this to me repeatedly over the last two years.  I think he (and Mike) are exactly right.