Software Maintenance is defined by the IEEE as the process of modifying the software system or component after delivery to correct faults, improve performance or other attributes, or adapt to a change in the environment.

To illustrate feature development and the following types of maintenance as defined by the IEEE, we will use the example of an electric car, which we developed to carry four passengers over a maximum distance of 600 km.

Feature development

A feature is defined by the IEEE as a distinguished characteristic of a software item like performance, portability or functionality. For our electric car, this is the ability to transport four passengers for 600 km without recharging.

Feature development therefore describes the creation of new features for a software, such as  a navigation system which directs us to the next charger.

Corrective maintenance

Corrective maintenance describes maintenance performed to correct faults in hardware or software, this is the classic bug we all have seen before. In our example, this could be the car not charging in some cases or the navigation system crashing.

Adaptive maintenance

Adaptive maintenance is performed to make a computer program usable in a changed environment, such as a different cloud provider or because a downstream service changed. For our electric car example, this could mean that the condition of all asphalt roads is so degraded that they turn into gravel roads, therefore we have to replace the tires and suspension to continue driving on the same roads as before.

Perfective maintenance

Perfective maintenance describes software maintenance with the intention to improve the performance, maintainability or other attributes of a computer program. In our example, this could mean making our car more energy efficient, allowing us to transport four people 100 km further with the same charge.

This type of maintenance is  complicated, because perfection can be endless. For example, when optimizing for performance, you can invest vast amounts of money to achieve an even better performance without a real return on invest. Therefore, perfective maintenance should always have a clearly defined target, service level objectives (SLO’s) can support this.

If the required improvements are diverging too much from the original requirements and therefore fundamental changes are required, developing a new system or some components based on the new requirements can be a better idea.

Preventative maintenance

Preventative maintenance is performed to prevent problems before they occur. Looking at our example of the electric car, this would be changing the brake pads before they are so worn out that we are unable to break.

Feature development vs. maintenance

Both feature development and maintenance have their importance in the creation and operation of a software system, but they must be in a healthy balance.

While users might ask for new features and would be happy to have additional functionality which makes their life easier and the product more valuable to them, they will be happy as well to not hit the next wall because their brakes are broken (preventive maintenance). Also, and this is especially in a software as a service system the case, even though your user base is growing, individual users still expect the same level of service which requires perfective maintenance. Especially when doing improvements based on your user’s expectations, they will notice the improvement positively in a similar way as a feature.

Measuring different types of maintenance can give you valuable insights into your application and help you keep track of a healthy balance with feature development. For example, a lot of corrective maintenance can indicate problems with the quality of your software, while frequent adaptive maintenance might indicate an uncertain, and often changing environment.

I’m interested in your opinion on this topic, if you want to share it, contact me on Twitter.

Update (16.02.2022): Improved adaptive and perfective maintenance examples