Some combination of these techniques will be the ultimate answer, if there is one. What is commonly accepted today is a need for a new paradigm that focuses on software evolution. The pace of change in hardware technology is so fast that using traditional techniques to build software is insufficient to keep up. In order to take advantage of increasing hardware capabilities, even large software systems must be designed, built, and delivered in less than twelve months. Additionally, this software must be evolvable to take advantage of new hardware and software innovations.
Any software is difficult to maintain.
Evolutionary changes are made constantly, and those changes must be applied to whatever versions of the software are currently in use. It is common practice in the industry today to allow customers to download updates from a company website, and install them themselves. The answer is to build the software initially with the knowledge that it will be customized, and that the base version will evolve. In this way, the software can be built evolvable. To do this effectively, tools are needed that will allow changes made to the base version of the system to be integrated automatically into each version that has been delivered and customized.