Software Maintenance and Reengineering Overview
Software Maintenance and Reengineering Overview
Software reengineering addresses challenges in maintaining legacy systems by modernizing, enhancing, and optimizing them through reverse and forward engineering processes. This involves abstracting old code to extract module specifications, which are then used to produce a design and original requirements. Changes are applied to these requirements to address new specifications, thus improving maintainability and functionality .
The primary objectives of software reengineering are modernizing software systems, enhancing maintainability, optimizing functionality, and improving performance. Achieving these objectives ensures that companies can leverage their existing software assets more effectively, leading to improved efficiency, innovation capabilities, and, consequently, a competitive advantage in the market .
Adaptive maintenance involves modifying a software product so that it continues to work in a changed environment, such as a new platform or interface, while perfective maintenance focuses on enhancing performance or adding requested features to improve the software. Adaptive maintenance is applied when external dependencies such as hardware changes occur, whereas perfective maintenance is chosen when user feedback suggests feature enhancements .
Cost efficiency drives the choice for software maintenance as it is often cheaper to modify and enhance existing software than develop a new system from the ground up. Maintenance allows companies to leverage previous investments in software assets, avoiding the steep costs and risks associated with developing entirely new systems, while still aligning with current business needs .
Boehm's linear model for estimating software maintenance costs is limited by its simplicity which might not account for the nuanced and variable factors influencing maintenance cost. Although it provides a straightforward approach, it may not accurately reflect the complexity of modern projects or align with the actual resource variations due to its linear assumptions, leading to potential inaccuracies .
Reverse engineering in software reengineering involves analyzing old code to create module specifications, which guide re-designing and understanding the original requirements of the software. This process is beneficial in the maintenance phase as it helps extract valuable insights from legacy systems, enabling necessary updates, improvements, and ensuring the alignment with current requirements without starting from scratch .
COCOMO's intermediate model aids software maintenance by providing a structured framework for estimating development efforts with deviations from actual effort needed averaging only about 20%. However, it is limited by its reliance on historical data and assumptions that may not capture the unique conditions of newer projects or the dynamics of technological advancements .
Even with proper planning and management, software reengineering poses challenges such as complexity in redesign processes, resource intensity, potential for introducing new bugs or mismatches, and the difficulty of accurately predicting system behaviour after reengineering. These challenges necessitate careful strategy and risk management .
Key motivations for software maintenance include fixing bugs, adapting to changing user or business requirements, ensuring compatibility with newer systems and hardware, and cost efficiency by enhancing existing software rather than developing new systems. These motivations influence whether a direct code change or a reengineering process is more appropriate, depending on factors like the extent of required rework and project scope .
The two broad categories of process models for software maintenance are: 1) the direct code change model, which is preferred for projects involving small reworks where changes are reflected in documents later; and 2) the software reengineering model, which is suited for projects that require significant rework and is represented by a reverse engineering cycle followed by a forward engineering cycle .