Software Engineering: Maintenance
1. Software Maintenance
Software Maintenance in software engineering is the modification of a software product after delivery to
correct faults, to improve performance or other attributes. After the product has been released, the
maintenance phase keeps the software up to date with environment changes and changing user
requirements.
According IEE maintenance is the modification of a software product after delivery to correct faults, to
improve performance or other attributes, or to adapt the product to a modified environment.
1.1 Types of maintenance:
Corrective maintenance: Corrective maintenance deals with the repair of faults or defects
found. A defect can result from design errors, logic errors and coding errors.
Adaptive maintenance: Adaptive maintenance consists of adapting software to changes in
the environment, such as the hardware or the operating system.
Perfective maintenance: Perfective maintenance mainly deals with accommodating to new
or changed user requirements. Perfective maintenance concerns functional enhancements to
the system and activities to increase the system’s performance or to enhance its user
interface.
Preventive maintenance: Preventive maintenance concerns activities aimed at increasing
the system’s maintainability, such as updating documentation, adding comments, and
improving the modular structure of the system.
All changes to the system can be characterized by these four types of maintenance. Corrective maintenance
is ‘traditional maintenance’ while the other types are considered as ‘software evolution.’
1.2 Software characteristics that affect software maintenance effort
In order to increase the maintainability of software, we need to know what characteristics of a product
affect its maintainability. These include system size, system age, number of input/output data items,
application type, programming language, and the degree of structure.
Size: Larger systems require more maintenance effort than do smaller systems, because
there is a greater learning curve associated with larger systems, and larger systems are more
complex in terms of the variety of functions they perform.
Age: Older systems require more maintenance effort than do younger systems, because
software systems tend to grow larger with age, become less organized with changes, and
become less understandable with staff turnover.
Code: Less maintenance is needed when less code is written. For example, a 10% change in
a module of 200 lines of code is more expensive than a 20% change in a module of 100 lines
of code.
Structure: Usage of structured techniques, modern software, automated tools, and data-
base techniques can decrease maintenance efforts. Good data administration and
experienced maintainer can ease maintenance.
Page 1 of 4
Software Engineering: Maintenance
1.3 Maintenance task
Maintenance tasks can be grouped into five categories: analysis/ isolation, design, implementation, testing,
and documentation.
1. Analysis/isolation tasks consist of impact analysis, cost benefit analysis, and isolation.
Impact analysis and cost benefit analysis consist of analyzing different implementation
alternatives and comparing their effect on schedule, cost, and operation. Isolation refers to
the time spent trying to understand the problem or the proposed enhancements to the system.
2. Design consists of redesigning the system based on the understanding of the necessary
changes. It also entails semiformal documentation, like release review documents.
3. Implementation entails code and unit testing. Code and unit testing refer to the time spent
coding and testing the changes. It also consists of semiformal documentation, like the
software modification test plan. Unit testing is performed by the maintainer who has made
the changes. Unit testing is usually done locally on the user’s workstation.
4. Testing consists of integration, acceptance and regression testing. Integration testing refers
to the time spent on the integration of the components, while acceptance testing entails
verifying that the changed system adheres to the user requirements. Acceptance testing is
performed by the end users to ensure that the desired changes have been implemented
successfully. Regression testing refers to the time spent ensuring that the changes did not
affect the functionality of the other parts of the software.
5. Documentation consists of system, user and other documentation. System documentation
refers to the time spent writing or revising the system description document. User
documentation entails writing or revising the user’s guide and other formal documentation,
excluding system documentation. Documentation is very important since the future changes
will rely on the documentation of the previous changes/modifications.
1.4 Maintainability during Development
Many activities performed during software development enhance the maintainability of software. Some of
these activities are listed below:
1. Analysis activities
1. Develop standards and guidelines
2. Set milestones for the supporting documents
3. Specify quality assurance procedures
4. Identify likely product enhancement
5. Determine resources required for maintenance
6. Estimate maintenance cost
2. Architectural design activities
1. Emphasize clarity and modularity as design criteria
2. Design to ease likely enhancement
3. Use standardized notations to document data flow, functions, structures, and
interconnections
4. Observe the principle of information hiding, data abstraction, and top down
hierarchical decomposition
3. Detailed Design activities
Page 2 of 4
Software Engineering: Maintenance
1. Use standardized notations to specify algorithms, data structures, and procedure
interface specification
2. Specify side effects and exception handling for each routine
3. Provide cross reference directories
4. Implementation activities
1. Use single entry single exit constructs
2. Use standard indentation of construct
3. Use simple and clear coding style
4. Use symbolic constants to parameterize routines
5. Provide margin on resources
6. Provide standard documentation prologues for each routine
7. Follow standard internal commenting guidelines
5. Other activities
1. Develop a maintenance guide
2. Develop a test suit
3. Provide test suit documentation
1.5 Managerial aspect of software maintenance
Larger and complex software projects require significant management control. They also introduce
challenges to management as complex software systems are a crucial part of the organization. Also, the
maintenance of large software systems requires a large numbers of employees. Therefore, management
needs to find ways to increase productivity and ensure job satisfaction, which can be achieved by
employing the right people, as well as motivating and training employees. Another factor that affects
maintenance is selecting an appropriate way to organize maintenance tasks. This will increase productivity,
control cost and deliver a quality system to the customer.
1.6 Maintenance tools and techniques
A software maintenance tool is an artifact that supports a software maintainer in performing a task. The
use of tools for software maintenance simplifies the tasks and increases efficiency and productivity. The
chosen tools must support program understanding and reverse engineering, testing, configuration
management, and documentation. There are several criteria for selecting the right tool for the task. These
criteria are capability, features, cost/benefit, platform, programming language, ease of use, openness of
architecture, stability of vendor, and organizational culture.
1. Capability: Capability decides whether the tool is capable of fulfilling the task.
2. Features: Once it has been decided that a method can benefit from being automated, then
the features of the tool need to be considered for the job.
3. Cost/benefit: The tool must be analyzed for the benefits it brings against its cost. The
benefit indicators of a tool are quality, productivity, responsiveness, and cost reduction.
4. Platform: The environment that the tool runs on is called the platform.
5. Programming language: The language of the source code is called the programming
language. It’s important to select a tool that supports a language that is an industry standard.
6. Ease of use: The tool should have a similar feel to the ones that the users are already
familiar with.
7. Openness of architecture: The tool should have the ability to be integrated with different
vendors’ tools. This will help when a tool will need to run with other tools. The openness of
the architecture plays an important role when the maintenance problem is complex.
Page 3 of 4
Software Engineering: Maintenance
Therefore, it is not always sufficient to use only one tool. There may need to be multiple
tools running together.
8. Stability of vendor: It is also important to consider the vendor’s credibility. The vendor
should be capable of supporting the tool in the future. If the vendor is not stable, the vendor
could run out of business and not be able to support the tool.
9. Organizational culture: Another important factor is the culture of the organization. Every
culture has its own work pattern. Therefore, it is important to take into consideration
whether the tool is going to be accepted by the target users.
Automated tools to support software maintenance, includes technical support tools and managerial
support tools. Some important tools are:
1. Text editors: permits rapid, efficient modification of source programs, test data and
supporting documents.
2. Debugging aids: provide traps, dumps, traces, assertion checking, and history files to help
in locating the cause of known error.
3. Cross reference generators: provide cross reference listings of procedures call, statement
usage, and data references.
4. Linkage editors: link together compiled modules to produce working software.
5. Comparators: compares two files of information and reports the differences.
6. Configuration management data bases: provide information concerning product
structure, current version number, current status, and change history for each product
version.
7. Version Control Systems: it controls the various files that constitute the various versions of
a software product. It contains source code, job control commands, data files, and supporting
documents.
8. Slicer: Program slicing helps the programmers select and view only the parts of the program
that are affected by the changes.
9. Static analyzer: used in analyzing the different parts if the program such as modules,
procedures, variables, data elements, objects and classes.
10. Dynamic analyzer: used to analyze the program while it is executing.
11. Dependency analyzer: assists the maintainer to analyze and understand the
interrelationships between entities in a program. It also provides graphical representations of
the dependencies.
12. Test simulator tool: helps the maintainer to test the effects of the change in a controlled
environment before implementing the change on the actual system.
13. Test case generator: produces test data that is used to test the functionality of the modified
system, while a test path generator helps the maintainer to find all the data flow and control
flow paths affected by the changes.
Page 4 of 4