7.3 Complete analysis, design, build and test at each step
One of the great time-wasters in software projects is detailed requirements analysis, followed by detailed design, followed by full coding and testing phases. If only we had the intellectual capacity, and the necessary knowledge, to do those things accurately! In reality, we have to admit that we cannot tackle such tasks adequately for any but trivially small projects. There are too many unknowns, too many dynamic changes, and too complex a set of interrelationships in the systems we build. We must take a more humble approach.
Even a large system development effort should be viewed only as an evolutionary increment in the life of the system. The introduction of the new system will change the environment. Such considerations point to the need for and open architectural framework, to be able to be open for change at all times.
We must set initial measurable objectives as far as we can reasonably have an opinion about the future. We must be prepared to modify these objectives as soon as experience (of partial delivery) dictates it. We must design a suitable general architectural framework (I call it the softecture, which is a short expression for software architecture) for enabling us to meet these objectives in spite of unexpected negative factors along the way.