Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

// request.cf · coarse context

A page that knows where it met you.

Only coarse request metadata is shown. This demo does not display or persist visitor IP addresses.

Country
US
Cloudflare location
CMH
Connection
HTTP/2
Language
Not provided

Ray ID: a40ac2ce683f386c

Jump to content

Technical debt

From Wikipedia, the free encyclopedia

Technical debt (also known as design debt[1] or code debt) is a qualitative description of the cost to maintain a system that is attributable to choosing an expedient solution for its development.[2] While an expedited solution can accelerate development in the short term, the resulting low quality may increase future costs if left unresolved.[3] The term is often used in the context of information technology and especially software development.

Technical debt is similar to yet differs significantly from monetary debt. Incurring either generally makes future goals more challenging to attain. But unlike monetary debt, technical debt is often incurred without intention. The choice to minimize development time and cost, an ever-present aspect of business, is the primary factor. Technical debt is generally only assessed retroactively (after a development effort).

Properly managing technical debt is essential for maintaining software quality and long-term sustainability. In some cases, taking on technical debt is a strategic choice to meet immediate goals, such as delivering a proof of concept or a quick release. However, failure to prioritize and address the debt can result in reduced maintainability, increased development costs, and risk to production systems.[4][5]

Technical debt results from design and implementation decisions that may optimize for the short term, but at the expense of future adaptability and maintainability. System aspects that incur technical debt can be described as a collection of design or implementation constructs that make future changes more costly or impossible, primarily impacting internal system qualities such as maintainability and evolvability.[6]

Origin

[edit]

Ward Cunningham coined the term technical debt in 1992.[7] After reading Metaphors We Live By, Cunningham devised this debt metaphor to explain to his boss the need to refactor the financial product they were working on:[8][9]

Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite.... The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.[10]

Similar concepts had existed before this. In 1980, Meir "Manny" Lehman had published a similar law using an "architectural metaphor" for the deteriorating nature of software. Manny's Law states: "As an evolving program is continually changed, its complexity, reflecting deteriorating structure, increases unless work is done to maintain or reduce it."[11]

Causes

[edit]

Common causes of technical debt include:

Pressure to minimize development time
An ever-present aspect of business.
Unexpected and ill-defined features and changes
The implementation of last-minute specification changes or changes that are insufficiently documented or tested.[12]: 4 [13]: 22 [14]
Gaps in knowledge or skills
May manifest as a lack of process understanding, insufficient knowledge, poor technological leadership, or inadequate mentoring or knowledge sharing practices.[13][13]: 17 
Issues in the development process
Such as sub-optimal solutions, insufficient requirements (from process inefficiencies), conflicting requirements on parallel branches, deferred refactoring, or delayed upstream contributions.[14][13]: 29 
Non-compliance with best practice
Technical debt can be hit deliberately or inadvertently. Deliberate debt happens when a team knowingly accepts a short term compromise, for example to meet a release deadline, with the expectation that the affected code or design will later improve. Inadvertent debt happens when a team doesn't have enough information, experience, or understanding of the system to realize that a choice will create future maintenance work. The consequences of either type depend on whether the decision was made carefully, with an assessment of trade-offs and a remediation plan, or recklessly, without enough consideration for its long-term effects.[15] Examples of the latter include insufficient software documentation, poor collaboration practices, lack of ownership, rewrites for outsourced software, inadequate attention to code quality, tightly coupled components, lack of a test suite, or failure to align to standards (including ignoring industry standard frameworks).[12][12]: 7 [13]

Consequences

[edit]

By increasing the cost of ongoing maintenance, technical debt makes it harder to predict release schedules. "Interest payments" result from incomplete work and escalating integration costs due to changes in the upstream project. Increases in complexity and the amount of uncompleted work make it increasingly difficult to accurately estimate effort, resulting in delays, missed deadlines, and stress on engineering teams, which can result in higher staff turnover, compounding the problem.[16] Carrying technical debt into production increases the risk of outages, financial losses, and potential legal issues due to breached service-level agreements. Future refactoring becomes riskier and costlier, with modifications to production code introducing greater chances of disruption.[17]

Failure to address technical debt can cause productivity to decline and slow down the delivery of features. The cumulative effects of technical debt result in increasingly fragile systems that can make bold improvements difficult. The domination of incremental changes, along with delays to critical refactoring, can result in stressed systems with inconsistent design, causing users to suffer from degraded performance and limited functionality while developers struggle to maintain quality.[1][18]

Empirical studies have shown delivery delay, reduced maintainability, and rework as the most frequently reported effects of technical debt. Debt can also increase the effort needed to understand dependencies, test changes, correct defects, and integrate work across a system. Its effects, then, can probably go beyond individual code modules, influencing planning accuracy, development throughput, and the ability of an organization to respond to changing requirements.[19]

Planning

[edit]

Kenny Rubin uses the following categories to help manage technical debt:[20]

Happened-upon
The development team was unaware it existed until it was exposed during the normal course of performing work on the product. For example, the team is adding a new feature to the product and in doing so it realizes that a work-around had been built into the code years before by someone who has long since departed.
Known
Known to the development team and has been made visible using one of many approaches.
Targeted
Technical-debt management involves identifying debt items, recording them in an issue tracker of backlog, assessing their effects and remediation cost, and prioritizing them with feature work. Teams can review debt during design, architecture, sprint, and release reviews, and assign portions of development capacity to remediation. Measures like the number of open debt items, the proportion of backlog for debt, and the resources spent for quality improvement can make accumulated debt visible.[21]

Limitations

[edit]

The concept of technical debt presumes that an overly expedient development effort results in additional future costs and that the costs would be avoided if different decisions were made during the effort. While true, other considerations impact the potential cost of expedient development decisions. For example, if the system does not survive long enough to be modified for a subsequent release, then the savings due to the expedient development choices are true savings since there is no future development cost.[22] Future events may render expedient "long-term" designs obsolete.[23] New tools and techniques might reduce the cost of future rework, challenging current debt assumptions.[23]

See also

[edit]

References

[edit]
  1. 1 2 Suryanarayana, Girish (November 2014). Refactoring for Software Design Smells (1st ed.). Morgan Kaufmann. p. 258. ISBN 978-0128013977.
  2. ↑ "Definition of the term "Technical Debt" (plus, some background information and an "explanation")". Techopedia. Retrieved August 11, 2016.
  3. ↑ Allman, Eric (May 2012). "Managing Technical Debt". Communications of the ACM. 55 (5): 50–55. doi:10.1145/2160718.2160733. S2CID 53246391.
  4. ↑ Jeffries, Ron. "Technical Debt – Bad metaphor or worst metaphor?". Archived from the original on November 11, 2015. Retrieved November 10, 2015.
  5. ↑ Knesek, Doug. "Averting a 'Technical Debt' Crisis". Retrieved April 7, 2016.
  6. ↑ Avgeriou, Paris; Kruchten, Philippe; Ozkaya, Ipek; Seaman, Carolyn (2016). "Managing technical debt in software engineering (Dagstuhl seminar 16162)" (PDF). Dagstuhl Reports. 6 (4).
  7. ↑ "Technical Debt". Techopedia. 2024-06-13. Retrieved 2025-02-06.
  8. ↑ Ward Cunningham (2009-02-14). Debt Metaphor. Retrieved 2025-02-06 – via YouTube.
  9. ↑ "Ward Explains Debt Metaphor". wiki.c2.com. Retrieved 2025-02-06. The explanation I gave to my boss, and this was financial software, was a financial analogy I called "the debt metaphor". And that said that if we failed to make our program align with what we then understood to be the proper way to think about our financial objects, then we were gonna continually stumble over that disagreement and that would slow us down which was like paying interest on a loan.
  10. ↑ Cunningham, Ward (1992-03-26). "The WyCash Portfolio Management System". Retrieved 2008-09-26.
  11. ↑ Lehman, MM (1996). "Laws of Software Evolution Revisited". EWSPT '96 Proceedings of the 5th European Workshop on Software Process Technology: 108–24. ISBN 9783540617716. Retrieved 19 November 2014.{{cite journal}}: CS1 maint: periodical has ISBN (link)
  12. 1 2 3 Girish Suryanarayana; Ganesh Samarthyam; Tushar Sharma (11 November 2014). Refactoring for Software Design Smells: Managing Technical Debt. Elsevier Science. p. 3. ISBN 978-0-12-801646-6.
  13. 1 2 3 4 5 Chris Sterling (10 December 2010). Managing Software Debt: Building for Inevitable Change (Adobe Reader). Addison-Wesley Professional. p. 17. ISBN 978-0-321-70055-1.
  14. 1 2 Rios, Nicolli; Spínola, Rodrigo Oliveira; Mendonça, Manoel; Seaman, Carolyn (2018-10-11). "The most common causes and effects of technical debt: First results from a global family of industrial surveys". Proceedings of the 12th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement. ESEM '18. New York, NY, USA: Association for Computing Machinery. pp. 1–10. doi:10.1145/3239235.3268917. ISBN 978-1-4503-5823-1.
  15. ↑ Fowler, Martin. "bliki: Technical Debt Quadrant". martinfowler.com. Retrieved 2026-09-14.
  16. ↑ Ali, Junade (September 2016). Mastering PHP Design Patterns | PACKT Books (1 ed.). Birmingham, England, UK: Packt Publishing Limited. p. 11. ISBN 978-1-78588-713-0. Archived from the original on 1 June 2020. Retrieved 11 December 2017.
  17. ↑ "Characteristics, causes, and consequences of technical debt in the automation domain". Journal of Systems and Software. 204. 2023-10-01. doi:10.1016/j.j. ISSN 0164-1212. Archived from the original on 2024-04-15.
  18. ↑ Kerievsky, Joshua (2004). Refactoring to Patterns. Addison-Wesley. ISBN 978-0-321-21335-8.
  19. ↑ "Prevalence, common causes and effects of technical debt: Results from a family of surveys with the IT industry". Journal of Systems and Software. 184. 2022-02-01. doi:10.1016/j.j. ISSN 0164-1212. Archived from the original on 2025-11-19.
  20. ↑ Rubin, Kenneth (2013), Essential Scrum. A Practical Guide to the Most Popular Agile Process, Addison-Wesley, p. 155, ISBN 978-0-13-704329-3
  21. ↑ "5 Recommendations to Help Your Organization Manage Technical Debt | CMU Software Engineering Institute". www.sei.cmu.edu. 2024-03-25. Retrieved 2026-09-14.
  22. ↑ Fowler, Martin. "Technical Debt". martinfowler.com.
  23. 1 2 Fowler, Martin. "Technical Debt Quadrant". martinfowler.com.
[edit]