Software maintenance is a part of Software Development Life Cycle. It is the process of modifying and updating software applications after it has been delivered in order to fix bugs and improve system performance.
IEEE defines maintenance as ‘a process of modifying a software system or component after delivery to correct faults, to improve performance or other attributes or to adapt the product to a changed environment.’Â
The primary goal of software maintenance is to modify and continuously update software applications after delivery to eliminate all possible errors, malfunctions, to improve work efficiency and better system performance.
Software maintenance denotes any changes made to a software product after it has been delivered to the customer. Over a period of time, the developed software system may need modifications according to the changing user requirements. Change will occur because errors have been encountered, because the software must be adapted to accommodate changes in its external environment (e.g., a change required because new operating system or peripheral device). Sometimes, maintenance also involves adding new features and functionalities (using latest technology) to the existing software system.
Software does not wear out or get tired. However, it needs to be upgraded and enhanced to meet new user requirements. For such modifications in the software system, software maintenance is performed.
Software maintenance is becoming an important activity of a large number of organizations. When the hardware platform changes and a software product perform some low-level functions, maintenance is necessary. Also, whenever the support environment of a software product changes, the software product requires rework to cop up with the newer interface. For instance, a software product may need to be maintained when the operating system changes. Thus, every software product continues to evolve after its development through maintenance efforts.
Maintaining software is not less important than software development. Maintenance has often taken a back seat where software development is concerned. However, once software is delivered, it gets maintained for the rest of its useful life. The maintenance of existing software can account for 70 percent of all effort expended by a software organization.
Though maintenance is not considered a part of software development, it is a very important activity in the life of a software product. Usually, the total cost of maintenance phase is much higher than the development cost of the software. Normally the maintenance-to-development cost ratio is suggested as 80:20, 70:30 or 60:40.
Maintenance work is based on existing software, as compared to development work that creates new software. In other words, maintenance revolves around understanding the existing software and maintainers spend most of their time trying to understand the software they have to modify. Understanding the software means that understanding not only the code but also the related documents. During the modification of the software, the change has to be clearly understood by the maintainer. To test whether those aspects of the system that are not supposed to be modified are operating as they were before modification, regression testing is done. In regression testing, we use old test cases to test whether new errors have been introduced or not.
Thus maintenance involves understanding the existing software, understanding the effect of change, making the changes to both code and documents, testing the new parts and retesting the old parts that were not changed. In order to make the maintainer job easier, it is necessary to prepare some supporting documents during software development.
Â
Â
Maintainability Factors: Â Â
 Maintainability of software refers to the degree to which software can:
·  Correct defects and the causes of defects
·   Repair the erroneous components without impacting the working components
·   Prevent occurrence of failure conditions
·   Maximize the useful life of software
·   Maximize the efficiency, reliability and safety of the software
·   Satisfy new requirements
·   Make future maintenance easier
·   Cope up with changes in the environment
Â
Maintainability also referred to as continuous improvement. IEEE Standard Glossary of Software Engineering Terminology defines maintainability as:
“The ease with which a software system or component can be modified to correct faults, improve performance or other attributes, or adapt to a changed environment.”
Â
Software maintainability requires more developer effort than any other phase of the development life cycle. The maintainability of software depends on a few different factors.  In general, it must be easy to understand the software (how it works, what it does, and the way it does), easy to find what needs to be change, easy to make changes and easy to check that the changes have not introduced any bugs.
Generally there are a lot of factors that affect the maintainability of any software. Some of these factors are:
Usability:Â The extent to which a software product is convenient, practical and easy to use. This refers to how convenient the software is to use by the end user.
Reliability:Â The extent to which a software product will perform without any failure. This refers to how durable the software is without likely running into failures.Â
Efficiency:Â The extent to which a software product performs its intended functions without wasting machine resources. This refers to how well a system manages resources and gives the required output.
Understandability:Â The extent to which the purpose of a software product is clear to a human observer. This refers to how the end users are able to understand the systems function and its environment.Â
Testability:The extent to which a software product facilitates the establishment of acceptance criteria and supports evaluation of its performance.
Modifiability:The extent to which a software product facilitates the incorporation of changes.
Portability:The extent to which a software product can be easily and effectively operated in a variety of computing environments.
Â
Importance of Software Maintenance:
Software maintenance enhances the growth of the software.  Maintaining software is not less important than software development. It is as important as the development itself.Software maintenance involves advancement in the existing solution as there are requirements of new software development as per the market shift. It enhances the software performance by eliminating errors, removing unusable development, and implementing advanced development strategies.
The long lifespan of software depends on its ability to be upgraded to run smoothly on the system. Software maintenance is needed for several reasons which are listed below:
Â
Bug Fixing:Â
The most important part of the service is the correction of errors or in other words ‘bugs’. It is very important that the software works without problems
In maintenance management, bug fixing comes at a priority to run the software seamlessly. This process contains the search for errors in code and correcting them. Problem can occur in hardware, operating systems, or any part of the software. This must be done without hurting the rest of the functionalities of existing software.
Â
Capability enhancement:
This comprises an improvement in features and functions to make solutions compatible with the varying market environment. It extends the capabilities of programs, work patterns, hardware upgrades, compilers, and all other aspects that affect the workflow of the system. Increase the performance of system using a technically updated solution and regularly using software maintenance services.
Â
Removal of outdated function:
Functionalities that are no longer used and unnecessarily occupy the space in the solution actually reduce the efficiency of the system. Therefore, the removal of obsolete functions is necessary. These user interface and coding elements are removed and replaced with new development using the latest tools and technologies. This elimination makes the system adaptive to cope with changing circumstances.
Â
Performance improvement:
To improve system performance, developers detect issues through testing and resolve them. Data and coding restricting as well as reengineering are part of software maintenance. It prevents the solution from vulnerabilities. This is not any functionality that performs in operations, but it develops to stop harmful activities like hacking.
Â
Â
Types of software maintenance:
There are four different types of software maintenance, which are defined for various reasons and purposes.  A software product may have to undergo one or more types of maintenance throughout the software maintenance life cycle.
Â
Corrective Maintenance:
Corrective maintenance is the correction of faults when the system does not behave according to its specification. It is concerned with fixing errors that are observed when the software is in use.
Corrective maintenance of a software product is necessary to identify errors in the existing solution and correcting them to make it works more accurately. This software maintenance activities aim to eliminate and fix bugs or issues in the software. Corrective maintenance deals with the repair of faults or defects found in day-today system functions. Â Corrective maintenance accounts for 20% of all the maintenance activities.
Â
Adaptive Maintenance:
Adaptive maintenance has to do with adjusting the application to changes in the environment, that is, a new release of the hardware or a new database system.
Adaptive software maintenance is about changing software in response to changes in its environment. A software product might need maintenance when the customers need the product to run on new platforms, on new operating systems, or when they require the product to work with new hardware or software. Adaptive maintenance accounts for 25% of all the maintenance activities.
Â
Perfective Maintenance:
Perfective maintenance is concerned with the change in the software that occurs while adding new functionalities in the software. A software product needs maintenance to support the new features that users want it to support, to change different functionalities of the system according to customer demands, or to enhance the performance of the system.
Perfective maintenance involves changing the software to improve some of its qualities. Here, changes are due to the need to modify the functions offered by the application, add new functions, improve the performance of the application, make it easier to use, etc. The requests to perform perfective maintenance may come directly from the software engineer to upgrade the status of the product on the market or they may come from the customer to meet some new requirements.
Perfective software maintenance focuses on functional enhancements to improve the user experience. The aim of perfective maintenance is to adjust software by adding new features that can enhance user experience and removing features that are not effective and functional. Perfective maintenance mainly deals with implementing new or changed user requirements. Perfective maintenance accounts for 50%, that is, the largest of all the maintenance activities.
Â
Preventive Maintenance:
Preventive maintenance involves implementing changes to prevent the occurrence of errors. Preventive maintenance defines improvements of the software, which is done to safeguard the software for the future. It is carried out to prevent the product from any potential software alteration.
Preventive software maintenance service helps in preventing the system from any forthcoming vulnerabilities. The focus of this maintenance is to prevent the deterioration of software as it continues to adapt and change. Preventative software maintenance is looking into the future so that the software can keep working as desired for as long as possible. Preventive maintenance accounts for only 5% of all the maintenance activities.