Maintenance Techniques


Thorough program comprehension enables safe, effective modifications that preserve integrity of the system. Maintenance engineers must thoroughly read, analyze, and understand the often unfamiliar code of complex software systems to accurately assess the feasibility, scope, impact, and risks of proposed changes. This can be very challenging. Essential activities aiding program comprehension include reviewing available documentation like requirements, architecture, design, code structure, and inline comments; constructing control flow graphs; analyzing data flows across components; tracing multi-procedure execution paths; visualizing key static and dynamic relationships; and creating architectural diagrams. Software systems that are effectively designed, documented, structured, and factored to minimize unnecessary dependencies generally require much less upfront effort for maintainers to sufficiently understand the code to implement modifications properly.

When internal code quality, understandability, and modularity erode over time due to potential issues like technical debt accumulation or unmanaged complexity growth, software reengineering can reconstruct and restructure the operating system to improve long-term maintainability. Restructuring clarifies semantics, reduces or isolates dependencies, and extracts reusable components. Refactoring methods applied incrementally improve internal program structure without changing external behavior. However, major reengineering efforts can also involve extensive re-coding and re-architect to significantly modernize language, framework, or platform technology. Such invasive re-engineering initiatives require meticulously regression testing the entire system to validate that all required functionality and behavior has been preserved correctly after migration.

Reverse engineering analyzes existing software artifacts and systems to try and recover higher level abstractions like requirements, architecture, design, and data models that may be ambiguous, outdated or missing. Examining and analyzing code yields useful models like call graphs and control flows that aid program understanding essential for maintenance. Data mining techniques can help reconstruct data schemas from database implementations. Knowledge recovered through reverse engineering makes software more maintainable, extensible, portable, and reusable. It also helps identify technical debt, dependencies, and areas needing re-engineering.

Continuous integration and continuous delivery automation assist maintenance by enabling rapid incremental evolution. Integrating code changes frequently spots integration errors early when less expensive to repair. Comprehensive test automation and continuous deployment accelerate delivery of modifications directly into production operation with improved reliability. DevOps merges development, QA, and operations capabilities, enabling continuous incremental improvement as well as rapid updates in response to issues. However, feature flags and canary testing may be prudent when deploying less mature capabilities directly into critical production environments.

Specialized static and dynamic analysis maintenance techniques help overcome key technical issues like program understanding, minimizing side effects, and assessing change impacts. Program slicing extracts only statements related to a variable or computation, simplifying understanding and testing. Static analysis summarizes code structure, dependencies, and defects. Dynamic analysis traces and logs detailed execution paths supporting impact analysis. Data flow analysis tracks variable definition, usage across procedures, and mutation effects. Cross referencing indexes variables, functions, classes, and directives to facilitate navigation. Such techniques improve software analyzability, testability, and modifiability.

Conclusion


Software maintenance sustains operation, value, and evolution of software over its entire lifecycle. Maintenance activities become necessary after deployment to correct problems, meet changing needs, and keep systems operational. Key technical issues like limited system understanding and assessing change impacts pose challenges. Managerial aspects like planning, staffing, and aligning with organizational objectives also require attention. However, following disciplined maintenance processes, investing in maintainability, and applying proven techniques can help control costs and quality. The maintenance phase extends for years so optimized life cycle management is crucial for long-term software success.

Read more about software maintenance in the Software Engineer Book of Knowledge (SWEBOK)

DOWNLOAD SWEBOK