[someone asked this on Programmers.stackexchange.com - my response]
Most important thing to do: review the specs, interact with customer to get more refined specs.
The requirements are undoubtedly incomplete, vague, or incorrect. The biggest waste of time is doing the wrong thing. Customers are not professional software engineeers, and cannot be expected to be good at developing a good set of requirements.
So, you should review the specs, interview the customer and find out if this is what he/she really needs and wants, and can afford, etc.
Develop test/use cases and review with customer. If a requirement isn't testable, throw it out.
Develop the design and make sure if all the pieces function correctly that it would in theory do what you need.
Develop an architecture prototype that tests all of the technology to be used in every layer but ignore functionality. You are testing the architecture, not the functional specification. Having the wrong architecture will mean you have to rewrite everything, so getting the right architecture is important. Make sure it can meet your requiremenets for speed, efficiency, security, etc.