Software maintenance is a critical part of the software development lifecycle. Many companies are embracing DevOps principles and processes. This includes shifting left, performing testing early in the development cycle to be able 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.
Software developers need to constantly nurture their product to enhance its functionality, and reduce deterioration, satisfy the needs of users and ensure the continued success of their product. This is achieved through software maintenance.
Software maintenance tasks can be classified under four types:
This article takes 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 be about resolving 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. If corrective maintenance is a persistent, increasingly time-consuming task for developers, it could indicate wider problems with developer skills, code quality, testing practices, or the existence of significant technical debt. Corrective maintenance can be automated 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.
Adaptive software maintenance may also be a result of new company policies, changes in vendors, app stores, or payment processes. It may be caused by things outside the company’s control such as a change of regulations such as GDPR or Tax in regard to 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 common 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 may be in response to customer feedback.
Examples are code functionality enhancements, usability changes, or speed optimisation. All of these improve the value of software and enhance the user experience.
Perfective changes also include removing features from a system that are not effective and functional to the end goal of the system.
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 tasks such as code optimisation, 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. A company that makes the effort to continuously track and prioritise technical debt increases not only the quality of its offering but its health over the years to come.
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.