Software Maintenance
Software Maintenance
Types of maintenance
In a software lifetime, type of maintenance may vary based on its nature. It may be
just a routine maintenance tasks as some bug discovered by some user or it may be
a large event in itself based on maintenance size or nature. Following are some types
of maintenance based on their characteristics:
Corrective Maintenance - This includes modifications and updations done in
order to correct or fix problems, which are either discovered by user or
concluded by user error reports.
Adaptive Maintenance - This includes modifications and updations applied to
keep the software product up-to date and tuned to the ever changing world of
technology and business environment.
Perfective Maintenance - This includes modifications and updates done in
order to keep the software usable over long period of time. It includes new
features, new user requirements for refining the software and improve its
reliability and performance.
Preventive Maintenance - This includes modifications and updations to
prevent future problems of the software. It aims to attend problems, which are
not significant at this moment but may cause serious issues in future.
Cost of Maintenance
Reports suggest that the cost of maintenance is high. A study on estimating software
maintenance found that the cost of maintenance is as high as 67% of the cost of
entire software process cycle.
On an average, the cost of software maintenance is more than 50% of all SDLC
phases. There are various factors, which trigger maintenance cost go high, such as:
Real-world factors affecting Maintenance Cost
Maintenance Activities
IEEE provides a framework for sequential maintenance process activities. It can be
used in iterative manner and can be extended so that customized items and
processes can be included.
These activities go hand-in-hand with each of the following phase:
Identification & Tracing - It involves activities pertaining to identification of
requirement of modification or maintenance. It is generated by user or system
may itself report via logs or error messages.Here, the maintenance type is
classified also.
Analysis - The modification is analyzed for its impact on the system including
safety and security implications. If probable impact is severe, alternative
solution is looked for. A set of required modifications is then materialized into
requirement specifications. The cost of modification/maintenance is analyzed
and estimation is concluded.
Design - New modules, which need to be replaced or modified, are designed
against requirement specifications set in the previous stage. Test cases are
created for validation and verification.
Implementation - The new modules are coded with the help of structured
design created in the design step.Every programmer is expected to do unit
testing in parallel.
System Testing - Integration testing is done among newly created modules.
Integration testing is also carried out between new modules and the system.
Finally the system is tested as a whole, following regressive testing
procedures.
Acceptance Testing - After testing the system internally, it is tested for
acceptance with the help of users. If at this state, user complaints some issues
they are addressed or noted to address in next iteration.
Delivery - After acceptance test, the system is deployed all over the
organization either by small update package or fresh installation of the system.
The final testing takes place at client end after the software is delivered.
Training facility is provided if required, in addition to the hard copy of user
manual.
Maintenance management - Configuration management is an essential part
of system maintenance. It is aided with version control tools to control versions,
semi-version or patch management.
Software Re-engineering
When we need to update the software to keep it to the current market, without
impacting its functionality, it is called software re-engineering. It is a thorough process
where the design of software is changed and programs are re-written.
Legacy software cannot keep tuning with the latest technology available in the
market. As the hardware become obsolete, updating of software becomes a
headache. Even if software grows old with time, its functionality does not.
For example, initially Unix was developed in assembly language. When language C
came into existence, Unix was re-engineered in C, because working in assembly
language was difficult.
Other than this, sometimes programmers notice that few parts of software need more
maintenance than others and they also need re-engineering.
Re-Engineering Process
Program Restructuring
It is a process to re-structure and re-construct the existing software. It is all about re-
arranging the source code, either in same programming language or from one
programming language to a different one. Restructuring can have either source code-
restructuring and data-restructuring or both.
Re-structuring does not impact the functionality of the software but enhance reliability
and maintainability. Program components, which cause errors very frequently can be
changed, or updated with re-structuring.
The dependability of software on obsolete hardware platform can be removed via re-
structuring.
Forward Engineering
Forward engineering is a process of obtaining desired software from the
specifications in hand which were brought down by means of reverse engineering. It
assumes that there was some software engineering already done in the past.
Forward engineering is same as software engineering process with only one
difference – it is carried out always after reverse engineering.
Component reusability
A component is a part of software program code, which executes an independent
task in the system. It can be a small module or sub-system itself.
Example
The login procedures used on the web can be considered as components, printing
system in software can be seen as a component of the software.
Components have high cohesion of functionality and lower rate of coupling, i.e. they
work independently and can perform tasks without depending on other modules.
In OOP, the objects are designed are very specific to their concern and have fewer
chances to be used in some other software.
In modular programming, the modules are coded to perform specific tasks which can
be used across number of other software programs.
There is a whole new vertical, which is based on re-use of software component, and
is known as Component Based Software Engineering (CBSE).