What is Software Maintenance?

Unravel the dynamics of software maintenance.


 

Software maintenance is an integral part of the software life cycle that involves modifying and updating software after it has been deployed. The goal of maintenance is to correct faults, improve performance or other attributes, and adapt the software to a changing environment throughout its lifetime.

Maintenance begins after system deployment and commonly occupies over half of the total lifecycle costs. Maintenance is required to keep software operational and meet user needs over time. As requirements evolve and the software ages, maintenance activities become necessary to sustain satisfactory operation. There are several types of maintenance, including corrective (fixing defects), adaptive (adapting to the environment), perfective (enhancing attributes), and preventive (preventing problems). Maintenance also provides user support and training.

Effective maintenance relies on disciplined processes, proper planning, and skilled personnel. Careful management of changes is crucial to avoid introducing problems. Maintenance programmers must understand the existing system well enough to make appropriate modifications. Good comprehensive documentation created during development is invaluable to maintainers.

The maintenance phase may persist for years at significant expense. The majority of costs arise from evolutionary enhancements rather than defect repairs. Managing maintenance well and designing software for maintainability can help control lifetime costs.

 

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

 


 

Software Maintenance Fundamentals


The purpose of software maintenance is to modify an existing software system cost-effectively while preserving its overall integrity. Software maintenance sustains the operation of a software product throughout its lifetime, deals with changing user needs, and corrects problems discovered after the software has been put into use following initial development and implementation. Maintenance activities keep software relevant, reliable, and optimized over time. A key goal is to maximize the useful lifespan of software and delay the need for replacement for as long as possible. Maintenance engineering applies systematic software engineering disciplines to the modification of operational software throughout software implementation. Careful change control and regression testing ensure changes avoid degrading system quality overall. Maintenance also provides ongoing assistance and training to users and monitors customer satisfaction.

Several key needs drive maintenance. One is correcting latent defects that escape detection before release. Throughout the process of software implementation, the system is unpredictable in several ways. In some cases, bugs surface requiring correction. Another need is improving software quality attributes such as performance, usability, reliability, availability, modifiability, or security. Additionally, maintenance adapts software to new interfaces, platforms, regulations, or other changes in the operational environment. Maintenance also corrects technical debt such as architectural flaws that impede agility. Finally, users request enhancements to satisfy evolving requirements and add new capabilities.

Since repair costs escalate dramatically in later life cycle stages, maintenance demands rigorous software engineering. Disciplined change, control, and testing are vital to ensure modifications avoid degrading the system. Performing impact analysis minimizes ripple effects. Maintainability designed into software keeps modification efforts manageable.

Estimating maintenance cost begins early in development planning. Historical data calibrated to the type of system serves as an input. The software maintenance cost estimate gets refined as the project progresses and more information becomes available. Breaking down costs by maintenance category shows where resources are consumed. The majority is spent on enhancements versus repairs. Understanding cost drivers helps control expenses.

Recognizing how software evolves over time provides useful insights. Studies reveal systems are never complete but continuously change in response to new user needs and environmental shifts. Software implementation grows more complex unless complexity is actively managed. A feedback loop between users and the software maintenance team shapes the system’s growth trajectory. Following sound maintenance processes, much like agile development, helps guide viable evolution.

Back to Top


 

Key Issues


Several key technical and managerial issues arise in software maintenance that must be addressed. On the technical side, maintainers must thoroughly understand often large and complex existing programs well enough to properly analyze, design, and implement modifications without introducing unintended issues or consequences. Grasping unfamiliar and intricate code of a software system developed by others can consume up to half of the total maintenance effort. In software development, careful internal technical documentation of software architecture, control flows, and design rationale created during development can help alleviate the program’s potential issues. Additional techniques that can also facilitate understanding complex legacy programs include visualization, reverse engineering, static and dynamic analysis, information retrieval, and mining software repositories. However, quality documentation created during initial software development is invaluable to maintainers.

Another technical software problem is regression testing modified software. Maintenance changes can inadvertently introduce defects. Re-executing test cases checks for these regressions before release. This testing must be balanced against constraints of cost, schedule, and system availability. Automating regression testing helps address these challenges.

Conducting impact analysis is also essential for major changes. The scope, cost, and schedule of a modification get determined through impact analysis. All affected components are identified to minimize unintended side effects. Factors considered include change category, size, complexity, performance, and security impacts. Maintainability designed into the software simplifies analysis.

On the managerial side, aligning maintenance objectives with organizational goals and constraints is key. Maintenance competes for resources devoted to new software evolution. Regular planning reconciles near-term corrective needs with long-term improvements. Staffing maintainers separately from developers poses challenges as well. Combined responsibility fosters engineering excellence and maintainability.

To discover issues, operators should thoroughly execute extensive automated test suites during integration, deployment, and operations. Runtime monitoring using instrumentation and embedded assertions also helps proactively detect anomalies, performance degradation, and quality issues for further investigation. User-reported problems should undergo root cause analysis to determine if they originate from a defect in the software itself or from environmental factors. Longitudinal trend analysis of operational metrics provides insight into the stability and reliability characteristics of the software and can indicate when quality may be deteriorating. Prioritizing resolution of discovered defects, failures, and service requests by business impact guides efficient allocation of maintenance resources and helps ensure the most critical issues get addressed first. Applying machine learning techniques to past issue data can help predict future failures and reliability.

Back to Top


 

Maintenance Processes


The software maintenance process contains activities to operate and modify an existing system. The key steps are:

  • Preparation: Staffing, training, acquiring supporting tools and environments, and establishing procedures. Interfacing with users and developers to gain system knowledge.
  • Transition: Organized turnover of the system from development to maintenance. Developer support during initial operation and warranty period.
  • Operation: Activities to run the software and provide user assistance, monitoring performance, logging defect reports, and managing release versions.
  • Modification: Analyzing enhancement requests and problem reports, conducting impact analysis, designing and implementing changes, and regression testing.
  • Migration: Retiring, replacing, or porting the system due to obsolescence, reengineering, or a new platform.

Careful and thorough planning applies to business, transition, release, and modification levels of the maintenance process. High-level business planning covers budgeting, staffing, tools, and infrastructure needed to perform maintenance over the system lifetime. Detailed transition planning ensures an organized and gradual handoff of system responsibility from developers to maintainers. Structured release planning schedules approved enhancements and fixes into major or minor versions following change control procedures. Individual modification planning analyzes the impact, level of effort, and risks of each proposed change or reported defect before approval. Modification planning assigns tasks to maintainers and establishes schedules. Contingency planning for releases addresses potential defects or delayed features. Regular communication, coordination, and issue escalation across release, infrastructure, operations, and developer teams enables collaborative planning.

Validating each step in the maintenance process maintains controlled quality and mitigates risk. Thorough impact analysis identifies potentially affected components, processes, and documentation before approving proposed changes. This allows assessment of risks, effort, and schedule. Rigorous configuration management governs any maintenance task to code, data, or configurations according to approved change plans. Extensive regression testing at both unit and system levels follows changes to verify expected behavior and detect side effects before release. Dedicated quality assurance personnel monitor essential process disciplines and work products throughout maintenance. Technical reviews confirm maintenance artifacts and deliverables meet requirements, architecture, design, budget, schedule, and standards. Reviews also validate proper component functionality, interfaces, quality factors, and implementation of approved changes.

Conducting routine maintenance operations properly per established policies and procedures is crucial for preserving overall system integrity and user satisfaction over time. Help desk support and training resolves operational problems users encounter and aids using the system. Defect reports from operators get properly triaged, prioritized, reproduced, and assigned to maintainers. Major and minor release plans adhere to change schedules and back-out contingencies. User documentation like online help, manuals, and training materials stays current with incremental changes. Operators perform a variety of ongoing tasks like system backups, system performance tuning, outage investigations, license management, and capability upgrades to sustain smooth operations. Proper maintenance operations sustain productivity by avoiding unnecessary system disruptions.

 

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

 

Back to Top


 

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.

Back to Top


 

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.

Back to Top

 

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

 


 

Inside the Computer Society