Software developers need to constantly nurture their product to enhance its functionality, reduce deterioration, satisfy users' needs, and ensure the success of their product. They can achieve these goals through software maintenance.
Software maintenance is a critical part of the software development lifecycle. Many companies are embracing DevOps principles and processes. These principles require shifting left, performing testing early in the development cycle to identify and respond to problems as soon as possible. But even when software is released, it's not a case of launch and forget.
You can classify software maintenance tasks under four types:
Let's have a look at each one in detail:
Corrective software maintenance is unsurprisingly about correcting software defects, errors and faults. These errors are typically observed while the software is in use and may indicate deeper flaws or errors in software design, logic, or code. They may come to your attention via bug or error reports from end-user feedback. This kind of maintenance is responsive. It’s about correcting errors that prevent software from working as expected.
Corrective maintenance should resolve the underlying problems impacting software, but there's also the temptation of a company opting for patching, which only solves the problem in this instance. Suppose corrective maintenance is a persistent, increasingly time-consuming task for developers. In that case, it could indicate wider problems with developer skills, code quality, testing practices, or the existence of a significant technical debt. You can automate corrective maintenance with automatic bug fixing.
Adaptive software maintenance is about changing software in response to changes in its environment. It occurs in situations such as changes to the operating system (or its software), software dependencies, hardware, or cloud storage.
You may also require adaptive software maintenance due to new company policies, changes in vendors, app stores, or payment processes. There might be things outside the company's control, such as a change of regulations such as GDPR or Tax regarding payment processes. However, it's not about simply fixing a specific problem but being able to anticipate change and thus making your software flexible enough to adapt to a plethora of changes.
A typical example is the infamous Y2K bug of 1999, where companies believed their software would no longer function as the date shifted from 31/12/1999 to 1/1/2000. In response, developers worked to prepare their software in anticipation of Y2K problems. If they failed to do so, they would be dealing with a corrective maintenance problem on January 1. (There's now talk of Y3K in 2030, so stay tuned…)
Perfective software maintenance focuses on features that improve the user experience through functional enhancements. It's about improving the system performance in ways that aren't in response to a fault or problem but instead in response to customer feedback.
Examples are code functionality enhancements, usability changes, or speed optimization. All of these improve the value of software and enhance the user experience.
Preventive Software Maintenance is about software changes and adaptations that reduce the risk of deterioration as software is operated for a long time by improving maintainability and stability through code optimization, restructuring, and documentation updates.
Examples include new features to improve software reliability and performance and refining software to reduce software complexity to make it easier to maintain and understand.
Software systems age. Preventive software is about future-proofing its longevity and efficacy by implementing good practices for long-term gain.
It can be beneficial to measure how much time developers spend on maintenance as a means to measure the maturity and skill of the software development team as well as the product and codebase.
It’s a fine balance between the different types. Even the best efforts to release bug-free code can require corrective maintenance but if this is a constant pain point that is impacting the quality of the software released, it suggests the need for improved bug testing practices. It also may signify processes that preference speed over efficacy - good code may take longer initially to produce but can result in less bug fixing and refactoring and remove the long-term pain of technical debt.
Good quality code makes long-term development and maintainability easier. An overall commitment to perfective tasks such as reducing technical debt and code refactoring helps to maintain a baseline that makes it easier to expand upon existing code and add new features faster.
Today’s software companies need to be agile and visionary. Software maintenance can signify growth as a company adds product features or responds to a vastly expanding customer base. It should also be emblematic of a company with a good knowledge of the ecosystem around its products including the customer and wider business challenges faced as well as the pace of competitor evolution.
It’s not enough to create a great product from the first release, but also to be able to support and nurture it in the wild throughout its lifespan.