Today, software professionals recognize that change in software systems is inevitable. There are many systems currently in operation, however, which were developed before the need for change was understood. Such systems are commonly referred to as "legacy systems," and were developed with relatively short lifetimes in mind. Software engineering is a relatively young discipline which is continually improving to provide better support for the development of software systems. What were once state-of-the-art techniques, tools, and processes are now dated, and have resulted in systems which are not responsive to change. For historical reasons, dated development practice traded maintainability for other system attributes, such as cost and performance. A significant number of legacy systems remain in operation because they are critical to the business processes which they support. The combination of extended lifetimes and poor maintainability means that legacy systems are expensive to change, and in many cases they cannot accommodate emerging requirements. This is clearly an undesirable situation, which, until recently, has been tackled by replacing the system or attempting to maintain it. Replacing a legacy system is dangerous, since you face the risk of losing vital business knowledge which is embedded in many old systems. In many cases, system replacement is not cost-effective. Conversely, if you attempt to maintain a legacy system, there is often little return on the investment in maintenance effort and the system remains difficult and expensive to change.