Read this post by Alistair Cockburn on Design as Knowledge Acquisition.
Developing application software, which is what I’ve done for a decade, always involves learning — acquiring knowledge. We have to learn about the problem space (the ‘domain’), proposed solutions, the goals of the software, and design technical architectures that will support the goals. It is frequently the case that some areas are new, and involve lot of unknowns. The old fashioned waterfall approach tried to tackle the problem of these unknowns by a long period of study of the problems, prior to making attempts to design solutions. The idea was that more knowledge up front would lead to better designs, earlier. This is actually mistaken. Implementation design should begin with only just enough initial knowledge to get going. Assumptions can be tested against reality in a more rapid fashion. This leads more quickly to satisfactory solutions at lower costs. Alistair’s post describes it in more detail. Do read it!