Looking at Chad Dickerson's article "Code Warrior" shows that even when you are on both sides, the customer and the coder, it is hard to get all of the requirements up front. I think one of the pluses to Extreme Programming (XP) methodology is that it is not so rigid. It doesn't say I need to know everything up front then go away and come back with a solution to what was asked for 2 years ago. It accepts change as part of the process.
We are all human. As the abstract theory of what one asks for becomes more tangible, it is only then that one can see more clearly what is possible and have the realization of what could be.
You can find more on the Extreme Programming site, or you might check out an article by Duffbert (Thanks Duffbert for adding my first comment from the real world.) that I mentioned in a previous post.