General Navigation Buttons - Home | Search | Contact Us | Site Map | Whats New
products graphic
white space
products
Software Technology Roadmap
What's New
Background & Overview
Technology Descriptions
Defining Software Technology
Technology Categories
Template for Technology Descriptions
Taxonomies
Glossary & Indexes
Feedback & Participation
Software Engineering Information Repository (SEIR)
white space
About SEI|Mgt|Eng|Acq|Collaboration|Prod.& Services|Pubs
pixel
Rollover Popup Hints for Topic Navigation Buttons above
pixel
Maintenance of Operational Systems--An Overview


Status

Complete

Note

This description provides background information for technologies for optimizing maintenance environments. We recommend Cyclomatic Complexity; Halstead Complexity Measures; Maintainability Index Technique for Measuring Program Maintainability; and Function Point Analysis as concurrent reading, as they contain information about specific technologies.

Purpose and Origin

Technologies specific to the maintenance of software evolved (and are still evolving) out of development-oriented technologies. As large systems have proliferated and aged, the special needs of the operational environment have begun to emerge. Maintenance is defined here as the modification of a software product after delivery to correct faults, improve performance or other attributes, or to adapt the product to a changed environment [IEEE 83]. Historically, the software lifecycle has usually focused on development. However, so much of a system's cost is incurred during its operational lifetime that maintenance issues have become more important and, arguably, this should be reflected in development practices. Systems are required to last longer than originally planned; inevitably, the percentage of costs going to maintenance has been steadily climbing. Hewlett-Packard estimates that 60% to 80% of its R&D personnel are involved in maintaining existing software, and that 40% to 60% of production costs were directly related to maintenance [Coleman 94]. There was a rule of thumb that eighty percent of a Department of Defense (DoD) system's cost is in maintenance; older Cheyenne Mountain Complex systems may have surpassed ninety percent. Yet software development practices still do not put much emphasis on making the product highly maintainable.

Cost and risk of maintenance of older systems are further exacerbated by a shortage of suitable maintenance skills; analysts and programmers are not trained to deal with these systems. Industry wide, it is claimed that 75%-80% of all operational software was written without the discipline of structured programming [Coleman 95]. Only a minuscule fraction of current operational systems were built using the object-oriented techniques taught today.

The purpose of this description is to provide a framework or a contextual reference for some of the maintenance and reengineering technologies described in this document.

Technical Detail

The operational system lifecycle. The operational environment has its own lifecycle that, while connected to the development lifecycle, has specific and unique characteristics and needs. As shown in Figure 15, a system's total lifecycle is defined as having four major phases:

Each of the phases has typical characteristics and problems. The operational phases are most of the lifecycle and cost. The narrative following describes each phase, and identifies specific technologies in (or planned for) this document that can be applied to correct or improve the situation. In almost every case, taking the proper action in a given phase can eliminate, or greatly reduce, problems in a later phase- at much less cost.

Figure 15: Total System Life Cycle

Terminology. To set a baseline for the descriptions of these phases, the following definitions are used:

Reengineering: rebuilding a piece of software to suit some new purpose (to work on another platform, to switch to another language, to make it more maintainable, etc.); often preceded by reverse engineering. Examination and alteration of a subject system to reconstitute it in a new form. Any activity that improves one's understanding of software, or prepares or improves the software itself for increased maintainability, reusability, or evolvability.

Restructuring: transformation of a program from one representation to another at the same relative abstraction level, usually to simplify or clarify it in some way (e.g., remove GOTOs, increase modularity), while preserving external behavior.

Reverse engineering: the process of analyzing a system's code, documentation, and behavior to identify its current components and their dependencies to extract and create system abstractions and design information. The subject system is not altered; however, additional knowledge about the system is produced. Redocumenting and design recovery are techniques associated with reverse engineering.

Software complexity: some measure of the mental effort required to understand a piece of software.

Software maintainability: some measure of the ease and/or risk of making a change to a piece of software. The measured complexity of the software is often used in quantifying maintainability.

Translation: conversion of a program from one language to another, often as a companion action to restructuring the program.

Phase 1: The development or pre-delivery phase, when the system is not yet operational. Most of the effort in this phase goes into making Version One of the system function. But if total lifecycle costs are to be minimized, planning and preparation for maintenance during the development phase are essential. Most currently operational systems did not receive this attention during development. Several areas should be addressed:

  • Requirements traceability to code. Requirements are the foundation of a system, and one of the most common faults of an operational system is that the relationship between its requirements and its code cannot be determined. Recovering this information for a system after it goes operational is a costly and time-consuming task. See Requirements Tracing, Feature-Based Design Rationale Capture Method for Requirements Tracing, and Argument-Based Design Rationale Capture Methods for Requirements Tracing for assistance in creating initial mappings from requirements to code.
  • Documentation and its usefulness in maintenance. The ostensible purpose of documentation is to aid in understanding what the system does, and (for the maintenance programmer) how the system does it. There is at least anecdotal evidence that
    • Classical specification-type documentation is not a good primary source of information for the maintenance programmer looking for a problem's origin, especially since the documentation is frequently inconsistent with the code.
    • The most useful maintenance information is derived directly and automatically from the code; examples include structure charts, program flow diagrams, and cross-reference lists. This suggests that tools that create and maintain these documentation forms should be used during development of the code, and delivered with it.
  • The complexity of the software. If the software is too complex to understand when it is first developed, it will only become more complex and brittle as it is changed. Measuring complexity during code development is useful for checking code condition, helps in quantifying testing costs, and aids in forecasting future maintenance costs (see Cyclomatic Complexity, Halstead Complexity Measures, and Maintainability Index Technique for Measuring Program Maintainability).
  • The maintainability of the software. This is perhaps the key issue for the maintainer. The ability to measure a system's maintainability directly affects the ability to predict future costs and risks. Maintainability Index Technique for Measuring Program Maintainability describes a practical approach to such a measurement, applicable throughout the lifecycle.
Phase 2: The early operational phase, when the delivered system is being maintained and changed to meet new needs and fix problems. Typically the tools and techniques used for maintenance are those that were used to develop the system. In this phase, the following issues are critical:

  • Complexity and maintainability must be measured and controlled in this phase if the major problems of Phase 3 are to be avoided. Ideally, this a continuation of the same effort that began in Phase 1, and it depends on the same tools and techniques (see Cyclomatic Complexity, Halstead Complexity Measures, and Maintainability Index Technique for Measuring Program Maintainability). In a preventative maintenance regime, use of these types of measures will help establish guidelines about how much complexity and/or deterioration of maintainability is tolerable. If a critical module becomes too complex under the guidelines, it should be considered for rework before it becomes a problem. Early detection of problems, such as risk due to increasing complexity of a module, is far cheaper than waiting until a serious problem arises.
  • A formal release-based maintenance process that suits the environment must be established. This process should always be subject to inspection, and should be revised when it does not meet the need.
  • The gathering of cost data must be part of the maintenance process if lifecycle costs are to be understood and controlled. The cost of each change (e.g., person-hours, computer-hours) should be known down to a suitable granularity such as phase within the release (e.g., design, code and unit test, integration testing). Without this detailed cost information, it is very hard to estimate future workload or the cost of a proposed change.
Phase 3: Mature operational phase, in which the system still meets the users' primary needs but is showing signs of age. For example

  • The incidence of bugs caused by changes or "day-one errors" (problems that existed at initial code delivery) is rising, and the documentation, especially higher-level specification material, is not trustworthy. Most analyses of changes to the software must be done by investigating the code itself.
  • Code "entropy" and complexity are increasing and, even by subjective measures, its maintainability is decreasing.
  • New requirements increasingly uncover limitations that were designed into the system.
  • Because of employee turnover, the programming staff may no longer be intimately familiar with the code, which increases both the cost of a change and the code's entropy.
  • A change may have a ripple effect: Because the true nature of the code is not well known, coupling across modules has increased and made it more likely that a change in one area will affect another area. It may be appropriate to restructure or reengineer selected parts of the system to lessen this problem.
  • Testing has become more time-consuming and/or risky because as code complexity increases, test path coverage also increases. It may be appropriate to consider more sophisticated test approaches (see Preventive Maintenance).
  • The platform is obsolete: The hardware is not supported by the manufacturer and parts are not readily available; the COTS software is not supported through new releases (or the new releases will not work with the application, and it is too risky to make the application changes needed to align with the COTS software).
At this point, the code has not been rewritten en masse or reverse engineered to recover design, but the risk and cost of evolution by modification of the system have increased significantly. The system has become brittle with age. It may be appropriate to assess the system's condition. Sittenauer describes a quick methodology for gauging the need for reengineering, and the entire approach for measuring maintainability (see Maintainability Index Technique for Measuring Program Maintainability) allows continuous or spot assessment of the system's maintainability [Sittenauer 92].

Phase 4: Evolution/Replacement Phase, in which the system is approaching or has reached insupportability. The software is no longer maintainable. It has become so "entropic" or brittle that the cost and/or risk of significant change is too high, and/or the host hardware/software environment is obsolete. Even if none of these is true, the cost of implementing a new requirement is not tolerable because it takes too long under the maintenance environment. It is time to consider reengineering (see Cleanroom Software Engineering and Graphical User Interface Builders).

Usage Considerations

Software maintainability factors. The characteristics influencing or determining a system's maintainability have been extensively studied, enumerated, and organized. One thorough study is described in Oman; such characteristics were analyzed and a simplified maintainability taxonomy was constructed [Oman 91]. Maintainability Index Technique for Measuring Program Maintainability describes an approach to measuring and controlling code maintainability that was founded on several years of work and analysis and includes analysis of commercial software maintenance. References to other maintainability research results also appear in that technology description.

Preventive maintenance approaches. The approaches listed below are a few of the ways current technology can help to enhance system maintainability.

  • Complexity analysis. Before attempting to reach a destination, it is essential to know where you are. For a software system, a good first step is measuring the complexity of the component modules (see Cyclomatic Complexity and Halstead Complexity Measures). Maintainability Index Technique for Measuring Program Maintainability describes a method of assessing maintainability of code using those complexity measures. Test path coverage can also be determined from complexity measures, which can help in optimizing system testing (see Test generation and optimization).
  • Functionality analysis. Function Point Analysis describes the uses and limitations of function point analysis (also known as functional size measurement) in measuring software. By measuring a program's functionality, one can arrive at some estimate of its value in a system, which is of use when making decisions about rewriting the program or reengineering the system. Measures of functionality can also guide decisions about where to put testing effort (see Test generation and optimization).
  • Reverse engineering / design recovery. Over time, a system's code diverges from the documentation; this is a well-known tendency of operational systems. Another phenomenon that is frequently underestimated or ignored is that (regardless of the divergence effect) the information required to make a given change is often found only in the code. Several approaches are possible here. Various tools offer the ability to construct program flow diagrams (PFDs) from code. More sophisticated techniques, often classified as program understanding, are emerging. These technologies are implemented as tools that act as agents for the human analyst to assist in gathering information about a program's function at higher levels of abstraction than a program flow diagram (e.g., retask a satellite).
  • Piecewise reengineering. If the system's known lifetime is sufficiently short, and if the evolutionary changes needed are sufficiently bounded, the system may benefit from a piecewise reengineering approach:
    • Brittle, high-risk modules that are likely to need changes are identified and reengineered to make them more maintainable. Techniques such as wrappers, an emerging technology, are expected to aid here.
    • For the sake of prudence, other risky modules are "locked," so that a prospective change to them can be made only after thoroughly assessing the risks involved.
    • For database systems, it may be possible to retrofit a modern relational or object-oriented database to the system; Common Object Request Broker Architecture and Graphic Tools for Legacy Database Migration describe technologies of possible use here. Piecewise reengineering can generally be done at a lower cost than complete reengineering of the system. If it is the right choice, it delays the inevitable obsolescence. The downsides of piecewise reengineering include the following:
    • Platform obsolescence is not reversed. Risks arising from the platform's software are unchanged; if the original database or operating system has risks, the application using them will also.
    • Unforeseen requirements changes still carry high risk if they affect the old parts of the system.
    • Performance may suffer because of the interface structures added to splice reengineered functions to old ones.
  • Translation/restructuring/modularizing. Translation and/or restructuring of code are often of interest when migrating software to a new platform. Frequently the new environment will not support the old language or dialect. Restructuring/modularizing, or rebuilding the code to reduce complexity, can be done simply to improve the code's maintainability, but code to be translated is often restructured first so that the result will be less complex and more easily understood. There are several commercial tools that do one or more of these operations, and energetic research to achieve more automated approaches is being done. Welker cites evidence that translation does little or nothing to enhance maintainability [Welker 95]. Most often, it simply continues the existing problem in a different syntactical form; the mechanical forms output by translators decrease understandability, which is a key component of maintainability. None of these technologies is a cure-all, and none of them should be applied without first assessing the quality of the output and the amount of programmer resources required.
Test generation and optimization. Mission criticality of many DoD systems drives the maintenance activity to test very thoroughly. Boehm reported integration testing activities consuming only 16-34% of project totals [Boehm 81], but other evidence is available to show that commercial systems testing activity can take half of a development effort's resources [Alberts 76, DeMillo 87, Myers 79]. Recent composite post-release reviews of operational Cheyenne Mountain Complex system releases show that testing consumed 60-70% of the total release effort.1 Any technology that can improve testing efficiency will have high leverage on the system's life-cycle costs. Technologies that can possibly help include: automatic test case generation; generation of test and analysis tools; redundant test case elimination; test data generation by chaining; techniques for software regression testing; and techniques for statistical test plan generation and coverage analysis.

Index Categories

This technology is classified under the following categories. Select a category for a list of related topics.

Name of technology

Maintenance of Operational Systems--An Overview

Application category

Requirements Tracing (AP.1.2.3)
Cost Estimation (AP.1.3.7)
Test (AP.1.4.3)
System Testing (AP.1.5.3.1)
Regression Testing (AP.1.5.3.4)
Reapply Software Lifecycle (AP.1.9.3)
Reverse Engineering (AP.1.9.4)
Reengineering (AP.1.9.5)

Quality measures category

Maintainability (QM.3.1)

Computing reviews category

Software Engineering Distribution and Maintenance (D.2.7)
Software Engineering Metrics (D.2.8)
Software Engineering Management (D.2.9)

References and Information Sources

[Alberts 76] Alberts, D. "The Economics of Software Quality Assurance." National Computer Conference. New York, NY, June 7-10, 1976. Montvale, NJ: American Federation of Information Processing Societies Press, 1976.
[Boehm 81] Boehm, Barry W. Software Engineering Economics. Englewood Cliffs, NJ: Prentice-Hall, 1981.
[Coleman 94] Coleman, Don, et al. "Using Metrics to Evaluate Software System Maintainability." Computer 27, 8 (August 1994): 44-49.
[Coleman 95] Coleman, Don; Lowther, Bruce; & Oman, Paul. "The Application of Software Maintainability Models in Industrial Software Systems." Journal of Systems Software 29, 1 (April 1995): 3-16.
[DeMillo 87] DeMillo, R., et al. Software Testing and Evaluation. Menlo Park, CA: Benjamin/Cummings, 1987.
[IEEE 83] IEEE Standard Glossary of Software Engineering Terminology. New York, NY: Institute of Electrical and Electronic Engineers, 1983.
[Myers 79] Myers, G. The Art of Software Testing. New York, NY: John Wiley and Sons, 1979.
[Oman 91] Oman, P.; Hagermeister, J.; & Ash, D. A Definition and Taxonomy for Software Maintainability (91-08-TR). Moscow, ID: Software Engineering Test Laboratory, University of Idaho, 1991.
[Sittenauer 92] Sittenauer, Chris & Olsem, Mike. "Time to Reengineer?" Crosstalk, Journal of Defense Software Engineering 32 (March 1992): 7-10.
[Welker 95] Welker, Kurt D. & Oman, Paul W. "Software Maintainability Metrics Models in Practice." Crosstalk, Journal of Defense Software Engineering 8, 11 (November/December 1995): 19-23.

Current Author/Maintainer

Edmond VanDoren, Kaman Sciences, Colorado Springs

External Reviewers

Brian Gallagher, SEI
Ed Morris, SEI
Dennis Smith, SEI

Modifications

10 Jan 97 (original)

Footnotes

1 Source: Kaman Sciences Corp. Minutes of the 96-1 Composite Post-Release Review (CPRR), Combined CSS/CSSR and ATAMS Post-Release Review and Software Engineering Post-Release Review KSWENG Memo # 96-03, 26 July, 1996.



The Software Engineering Institute (SEI) is a federally funded research and development center sponsored by the U.S. Department of Defense and operated by Carnegie Mellon University.

Copyright 2007 by Carnegie Mellon University
Terms of Use
URL: http://www.sei.cmu.edu/str/descriptions/mos_body.html
Last Modified: 11 January 2007