The Kaizen way is to plan for change. In software development
this can be a bit of a problem because changing software is usually
exponentially more expensive than it was to write in the first place. To make software development lean, one must
counteract this exponential change curve. This is accomplished by using
refactoring, automated testing and continuous integration in order of priority. Once this is in place, change and quality becomes cheap.
From my experience I cannot remember any projects where a heavy up front design has produced a working
project, I can however remember many projects where the principles of refactoring
has saved a failing project. The most successfull projects used refactoring as a way of coding, from the start new features are refactored into existence.
For more information read Martin Fowler's excelent article on the same topic: