Software maintenance

Last updated

Software maintenance is the modification of software after delivery. [1]

Contents

As per the IEEE standard glossary of software engineering terminology, software maintenance refers to the process of modifying and updating software after its initial development and deployment, to correct faults, improve performance or other attributes, add new features to meet evolving user requirements, or adapt to a changed environment. It is important to emphasize that software maintenance thus involves many activities that go beyond mere bug fixing. Software maintenance is an ongoing process that is essential for the longevity of a software system, to keep it effective, adaptable and relevant in an ever-evolving technological landscape.

Software maintenance is often considered lower skilled and less rewarding than new development. As such, it is a common target for outsourcing or offshoring. Usually, the team developing the software is different from those who will be maintaining it. The developers lack an incentive to write the code to be easily maintained. Software is often delivered incomplete and almost always contains some bugs that the maintenance team must fix. Software maintenance often initially includes the development of new functionality, but as the product nears the end of its lifespan, maintenance is reduced to the bare minimum and then cut off entirely before the product is withdrawn.

Each maintenance cycle begins with a change request typically originating from an end user. That request is evaluated and if it is decided to implement it, the programmer studies the existing code to understand how it works before implementing the change. Testing to make sure the existing functionality is retained and the desired new functionality is added often comprises the majority of the maintenance cost.

Software maintenance is not as well studied as other phases of the software life cycle, despite comprising the majority of costs. Understanding has not changed significantly since the 1980s. Software maintenance can be categorized into several types depending on whether it is preventive or reactive and whether it is seeking to add functionality or preserve existing functionality, the latter typically in the face of a changed environment.

History

In the early 1970s, companies began to separate out software maintenance with its own team of engineers to free up software development teams from support tasks. [2] In 1972, R. G. Canning published "The Maintenance 'Iceberg'", in which he contended that software maintenance was an extension of software development with an additional input: the existing system. [2] The discipline of software maintenance has changed little since then. [3] One twenty-first century innovation has been companies deliberately releasing incomplete software and planning to finish it post-release. This type of change, and others that expand functionality, is often called software evolution instead of maintenance. [3]

Software life cycle

Diagram for a traditional software development life cycle from 1988 Traditional software development life cycle diagram.png
Diagram for a traditional software development life cycle from 1988

Despite testing and quality assurance, virtually all software contains bugs where the system does not work as intended. Post-release maintenance is necessary to remediate these bugs when they are found. [4] Most software is a combination of pre-existing commercial off-the-shelf (COTS) and open-source software components with custom-written code. COTS and open-source software is typically updated over time, which can reduce the maintenance burden, but the modifications to these software components will need to be adjusted for in the final product. [5] Unlike software development, which is focused on meeting specified requirements, software maintenance is driven by events—such as user requests or detection of a bug. [6] Its main purpose is to preserve the usefulness of the software, usually in the face of changing requirements. [7]

If conceived of as part of the software development life cycle, maintenance is the last and typically the longest phase of the cycle, [8] [9] comprising 80 to 90 percent of the lifecycle cost. [10] Other models consider maintenance separate from software development, instead as part of the software maintenance life cycle (SMLC). [9] SMLC models typically include understanding the code, modifying it, and revalidating it. [9]

Transition from release to maintenance to end of the lifespan

Diagram showing the steps for software retirement Software retirement diagram.png
Diagram showing the steps for software retirement

Frequently, software is delivered in an incomplete state. Developers will test a product until running out of time or funding, because they face fewer consequences for an imperfect product than going over time or budget. [11] The transition from the development to the maintenance team is often inefficient, without lists of known issues or validation tests, which the maintenance team will likely recreate. [12] After release, members of the development team are likely to be reassigned or otherwise become unavailable. The maintenance team will require additional resources for the first year after release, both for technical support and fixing defects left over from development. [11]

Initially, software may go through a period of enhancements after release. New features are added according to user feedback. At some point, the company may decide that it is no longer profitable to make functional improvements, and restrict support to bug fixing and emergency updates. Changes become increasingly difficult and expensive due to lack of expertise or decaying architecture due to software aging. After a product is no longer maintained, and does not receive even this limited level of updating, some vendors will seek to extract revenue from the software as long as possible, even though the product is likely to become increasingly avoided. Eventually, the software will be withdrawn from the market, although it may remain in use. During this process, the software becomes a legacy system. [13]

Change cycle

The first step in the change cycle is receiving a change request from a customer and analyzing it to confirm the problem and decide whether to implement the change. [14] This may require input from multiple departments; for example, the marketing team can help evaluate whether the change is expected to bring more business. [15] Software development effort estimation is a difficult problem, including for maintenance change requests, [16] but the request is likely to be declined if it is too expensive or infeasible. [17] If it is decided to implement the request, it can be assigned to a scheduled release and implemented. [17] Although agile methodology does not have a maintenance phase, [18] the change cycle can be enacted as a scrum sprint. [19]

Understanding existing code is an essential step before modifying it. [3] The rate of understanding depends both on the code base as well as the skill of the programmer. [20] Following coding conventions such as using clear function and variable names that correspond to their purpose makes understanding easier. [21] Use of conditional loop statements only if the code could execute more than once, and eliminating code that will never execute can also increase understandability. [22] Experienced programmers have an easier time understanding what the code does at a high level. [23] Software visualization is sometimes used to speed up this process. [24]

Modification to the code may take place in any way. On the one hand, it is common to haphazardly apply a quick fix without being granted enough time to update the code documentation. [25] On the other hard structured iterative enhancement can begin by changing the top-level requirements document and propagating the change down to lower levels of the system. [26] Modification often includes code refactoring (improving the structure without changing functionality) and restructuring (improving structure and functionality at the same time). [27] Unlike commercial software, free and open source software change cycles are largely restricted to coding and testing, with minimal documentation. Open-source software projects instead rely on mailing lists and a large number of contributors to understand the code base and fix bugs efficiently. [28]

An additional problem with maintenance is that nearly every change to code will introduce new bugs or unexpected ripple effects, which require another round of fixes. [3] Testing can consume the majority of maintenance resource for safety-critical code, due to the need to revalidate the entire software if any changes are made. [29] Revalidation may include code review, regression testing with a subset of unit tests, integration tests, and system tests. [27] The goal of the testing is to verify that previous functionality is retained, and the new functionality has been added. [30]

Categories of software maintenance

The key purpose of software maintenance is ensuring that the product continues to meet usability requirements. At times, this may mean extending the product's capabilities beyond what was initially envisioned. [31]

According to the ISO/IEC 14764 specification, software maintenance can be classified into four types: [32]

According to some estimates, enhancement (the latter two categories) comprises some 80 percent of software maintenance. [36]

Maintainability

Maintainability is the quality of software enabling it to be easily modified without breaking existing functionality. [32] According to the ISO/IEC 14764 specification, activity to ensure software maintainability prior to release counts as part of software maintenance. [6] Many software development organizations neglect maintainability, even though doing so will increase long-term costs. [37] Technical debt is incurred when programmers, often out of laziness or urgency to meet a deadline, choose quick and dirty solutions rather than build maintainability into their code. [38] A common cause is underestimates in software development effort estimation, leading to insufficient resources allocated to development. [39] One important aspect is having a large amount of automated software tests that can detect if existing functionality is compromised by a change. [32]

A challenge with maintainability is that many software engineering courses do not emphasize it, and give out one-and-done assignments that have clear and unchanging specifications. [40] Software engineering courses do not cover systems as complex as occur in the real world. [41] Development engineers who know that they will not be responsible for maintaining the software do not have an incentive to build in maintainability. [3]

Workforce

Maintenance is often considered an unrewarding job for software engineers, who, if assigned to maintenance, were more likely to quit. [42] [43] It often pays less than a comparable job in software development. [43] The task is often assigned to temporary workers or lesser-skilled staff, [3] [44] although maintenance engineers are also typically older than developers, partly because they must be familiar with outdated technologies. [44] In 2008, around 900,000 of the 1.3 million software engineers and programmers working in the United States were doing maintenance. [45]

Companies started separate teams for maintenance, which led to outsourcing this work to a different company, and by the turn of the twenty-first century, sometimes offshoring the work to another country—whether as part of the original company or a separate entity. [46] [10] The typical sources of outsourcing are developed countries such as the United States, the United Kingdom, Japan, and Australia, while destinations are usually lower-cost countries such as China, India, Russia, and Ireland. [47] Reasons for offshoring include taking advantage of lower labor costs, enabling around-the-clock support, reducing time pressure on developers, and to move support closer to the market for the product. [48] Downsides of offshoring include communication barriers in the form of such factors as time zone and organizational disjunction and cultural differences. [10] Despite many employers considering maintenance lower-skilled work and the phase of software development most suited to offshoring, [10] [49] it requires close communication with the customer and rapid response, both of which are hampered by these communication difficulties. [10]

Alternatives to maintenance

In software engineering, the term legacy system does not have a fixed meaning, but often refers to older systems which are large, difficult to modify, and also necessary for current business needs. Often legacy systems are written in obsolete programming languages, lack documentation, have a deteriorating structure after years of changes, and depend on experts to keep it operational. [50] When dealing with these systems, at some point so much technical debt accumulates that maintenance is not practical or economical. [13] Other choices include:

Research

Despite taking up the lion's share of software development resources, maintenance is the least studied phase of software development. [57] [58] Much of the literature has focused on how to develop maintainable code from the outset, with less focus on motivating engineers to make maintainability a priority. [59] As of 2020, automated solutions for code refactoring to reduce maintenance effort are an active area of research, [60] as is machine-learning enhanced maintainability assessment. [61]

Related Research Articles

<span class="mw-page-title-main">Software</span> Instructions a computer can execute

Software consists of computer programs that instruct the execution of a computer. Software can be defined broadly to include design documents, specifications, and testing suites.

Computer programming or coding is the composition of sequences of instructions, called programs, that computers can follow to perform tasks. It involves designing and implementing algorithms, step-by-step specifications of procedures, by writing code in one or more programming languages. Programmers typically use high-level programming languages that are more easily intelligible to humans than machine code, which is directly executed by the central processing unit. Proficient programming usually requires expertise in several different subjects, including knowledge of the application domain, details of programming languages and generic code libraries, specialized algorithms, and formal logic.

<span class="mw-page-title-main">Legacy system</span> Old computing technology or system that remains in use

In computing, a legacy system is an old method, technology, computer system, or application program, "of, relating to, or being a previous or outdated computer system", yet still in use. Often referencing a system as "legacy" means that it paved the way for the standards that would follow it. This can also imply that the system is out of date or in need of replacement.

In computer programming and software design, code refactoring is the process of restructuring existing source code—changing the factoring—without changing its external behavior. Refactoring is intended to improve the design, structure, and/or implementation of the software, while preserving its functionality. Potential advantages of refactoring may include improved code readability and reduced complexity; these can improve the source code's maintainability and create a simpler, cleaner, or more expressive internal architecture or object model to improve extensibility. Another potential goal for refactoring is improved performance; software engineers face an ongoing challenge to write programs that perform faster or use less memory.

In computing, source code, or simply code or source, is a plain text computer program written in a programming language. A programmer writes the human readable source code to control the behavior of a computer.

<span class="mw-page-title-main">Software testing</span> Checking software against a standard

Software testing is the act of checking whether software satisfies expectations.

A software bug is a bug in computer software.

Regression testing is re-running functional and non-functional tests to ensure that previously developed and tested software still performs as expected after a change. If not, that would be called a regression.

A software company is an organisation — owned either by the state or private — established for profit whose primary products are various forms of software, software technology, distribution, and software product development. They make up the software industry.

Software development is the process used to create software. Programming and maintaining the source code is the central step of this process, but it also includes conceiving the project, evaluating its feasibility, analyzing the business requirements, software design, testing, to release. Software engineering, in addition to development, also includes project management, employee management, and other overhead functions. Software development may be sequential, in which each step is complete before the next begins, but iterative development methods where multiple steps can be executed at once and earlier steps can be revisited have also been devised to improve flexibility, efficiency, and scheduling.

Test-driven development (TDD) is a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case.

A patch is data that is intended to be used to modify an existing software resource such as a program or a file, often to fix bugs and security vulnerabilities. A patch may be created to improve functionality, usability, or performance. A patch is typically provided by a vendor for updating the software that they provide.

<span class="mw-page-title-main">Systems development life cycle</span> Systems engineering terms

In systems engineering, information systems and software engineering, the systems development life cycle (SDLC), also referred to as the application development life cycle, is a process for planning, creating, testing, and deploying an information system. The SDLC concept applies to a range of hardware and software configurations, as a system can be composed of hardware only, software only, or a combination of both. There are usually six stages in this cycle: requirement analysis, design, development and testing, implementation, documentation, and evaluation.

In software testing, test automation is the use of software separate from the software being tested to control the execution of tests and the comparison of actual outcomes with predicted outcomes. Test automation can automate some repetitive but necessary tasks in a formalized testing process already in place, or perform additional testing that would be difficult to do manually. Test automation is critical for continuous delivery and continuous testing.

Release notes are documents that are distributed with software products or hardware products, sometimes when the product is still in the development or test state. For products that have already been in use by clients, the release note is delivered to the customer when an update is released. Another abbreviation for Release notes is Changelog or Release logs or Software changes or Revision historyUpdates or README file. However, in some cases, the release notes and changelog are published separately. This split is for clarity and differentiation of feature-highlights from bugs, change requests (CRs) or improvements on the other side.

Extensibility is a software engineering and systems design principle that provides for future growth. Extensibility is a measure of the ability to extend a system and the level of effort required to implement the extension. Extensions can be through the addition of new functionality or through modification of existing functionality. The principle provides for enhancements without impairing existing system functions.

Custom software is software that is developed specifically for some specific organization or other user. As such, it can be contrasted with the use of out-of-the-box software packages developed for the mass market, such as commercial off-the-shelf software, or existing free software.

Software rot is the degradation, deterioration, or loss of the use or performance of software over time.

Software evolution is the continual development of a piece of software after its initial release to address changing stakeholder and/or market requirements. Software evolution is important because organizations invest large amounts of money in their software and are completely dependent on this software. Software evolution helps software adapt to changing businesses requirements, fix defects, and integrate with other changing systems in a software system environment.

In software engineering, a software development process or software development life cycle (SDLC) is a process of planning and managing software development. It typically involves dividing software development work into smaller, parallel, or sequential steps or sub-processes to improve design and/or product management. The methodology may include the pre-definition of specific deliverables and artifacts that are created and completed by a project team to develop or maintain an application.

References

  1. [IEEE Std 610.12-1990, IEEE Standard Gloassary of Software Engineering Terminology]
  2. 1 2 Tripathy & Naik 2014, p. 25.
  3. 1 2 3 4 5 6 Offutt, Jeff (January 2018). "Overview of Software Maintenance and Evolution". George Mason University Department of Computer Science. Retrieved 5 May 2024.
  4. Tripathy & Naik 2014, p. 4.
  5. Tripathy & Naik 2014, pp. 5–6.
  6. 1 2 Tripathy & Naik 2014, p. 26.
  7. Madhusudhan et al. 2017, p. 761.
  8. Varga 2018, p. 3.
  9. 1 2 3 Tripathy & Naik 2014, p. 7.
  10. 1 2 3 4 5 Ulziit et al. 2015, p. 764.
  11. 1 2 Reifer 2012, p. 22.
  12. Reifer 2012, p. 21.
  13. 1 2 3 Tripathy & Naik 2014, p. 89.
  14. Madhusudhan et al. 2017, p. 763.
  15. Tripathy & Naik 2014, p. 120.
  16. Madhusudhan et al. 2017, p. 762.
  17. 1 2 Tripathy & Naik 2014, p. 123.
  18. Ali et al. 2024, p. 126.
  19. Ali et al. 2024, p. 130.
  20. Tripathy & Naik 2014, p. 296.
  21. Tripathy & Naik 2014, pp. 296–297.
  22. Tripathy & Naik 2014, p. 309.
  23. Tripathy & Naik 2014, p. 297.
  24. Tripathy & Naik 2014, pp. 318–319.
  25. Tripathy & Naik 2014, pp. 85–86.
  26. Tripathy & Naik 2014, p. 86.
  27. 1 2 Tripathy & Naik 2014, p. 94.
  28. Tripathy & Naik 2014, p. 59.
  29. Reifer 2012, p. 5.
  30. Tripathy & Naik 2014, p. 98.
  31. Varga 2018, p. 4.
  32. 1 2 3 4 5 6 Varga 2018, p. 5.
  33. Tripathy & Naik 2014, pp. 26–27.
  34. 1 2 3 4 5 6 Tripathy & Naik 2014, p. 27.
  35. 1 2 Varga 2018, pp. 5–6.
  36. Varga 2018, p. 5 fn 4.
  37. Varga 2018, p. 12.
  38. Varga 2018, pp. 6–7.
  39. Varga 2018, p. 7.
  40. Varga 2018, pp. 7–8.
  41. Varga 2018, p. 9.
  42. Madhusudhan et al. 2017, p. 764.
  43. 1 2 Reifer 2012, p. 7.
  44. 1 2 Reifer 2012, p. 8.
  45. Reifer 2012, p. 1.
  46. Rahman et al. 2024, p. 1.
  47. Rahman et al. 2021, Research Background.
  48. Ulziit et al. 2015, p. 763.
  49. Reifer 2012, p. 2.
  50. Tripathy & Naik 2014, pp. 187–188.
  51. 1 2 3 4 5 Tripathy & Naik 2014, p. 188.
  52. Tripathy & Naik 2014, p. 189.
  53. Tripathy & Naik 2014, p. 191.
  54. Tripathy & Naik 2014, pp. 188–189.
  55. Tripathy & Naik 2014, p. 195.
  56. 1 2 Tripathy & Naik 2014, p. 196.
  57. Madhusudhan et al. 2017, p. 759.
  58. Ulziit et al. 2015, p. 766.
  59. Reifer 2012, pp. 4–5.
  60. Baqais & Alshayeb 2020, p. 459.
  61. Alsolai & Roper 2020, p. 106214.

Sources