On a slightly different tact to most of the responses: there is a limit to how separated your design can be from your implementation. In theory, you can design all the details of an application, then build it exactly according to your spec, the details of the implementation being irrelevant. (Assuming, of course, your requirements don't change. They always do, but that's not my point here).
Time and again, however, I've found the design wasn't able to forsee all problems, or couldn't achieve the depth of understanding necessary to spec a full implementation. To actually do this requires the application to be implemented. Only then are all issues properly understood.
Except in very simple applications, your initial spec will almost always have to be altered, even if the requirements are static.