HOME

TheInfoList



OR:

In
software development Software development is the process of conceiving, specifying, designing, programming, documenting, testing, and bug fixing involved in creating and maintaining applications, frameworks, or other software components. Software development invo ...
, technical debt (also known as design debt or code debt) is the implied cost of additional rework caused by choosing an easy (limited) solution now instead of using a better approach that would take longer. Analogous with monetary
debt Debt is an obligation that requires one party, the debtor, to pay money or other agreed-upon value to another party, the creditor. Debt is a deferred payment, or series of payments, which differentiates it from an immediate purchase. The ...
, if technical debt is not repaid, it can accumulate "interest", making it harder to implement changes. Unaddressed technical debt increases software entropy and cost of further rework. Similarly to monetary debt, technical debt is not necessarily a bad thing, and sometimes (e.g. as a proof-of-concept) is required to move projects forward. On the other hand, some experts claim that the "technical debt" metaphor tends to minimize the ramifications, which results in insufficient prioritization of the necessary work to correct it. As a change is started on a codebase, there is often the need to make other coordinated changes in other parts of the codebase or documentation. Changes required that are not completed are considered debt, and until paid, will incur interest on top of interest, making it cumbersome to build a project. Although the term is primarily used in software development, it can also be applied to other professions.


Causes

Common causes of technical debt include: * Ongoing development, long series of project enhancements over time renders old solutions sub-optimal. * Insufficient up-front definition, where
requirements In product development and process optimization, a requirement is a singular documented physical or functional need that a particular design, product or process aims to satisfy. It is commonly used in a formal sense in engineering design, inclu ...
are still being defined during development, development starts before any design takes place. This is done to save time but often has to be reworked later. * Business pressures, where the business considers getting something released sooner before the necessary changes are complete, builds up technical debt involving those uncompleted changes. * Lack of process or understanding, where businesses are blind to the concept of technical debt, and make decisions without considering the implications. * Tightly coupled components, where functions are not
modular Broadly speaking, modularity is the degree to which a system's components may be separated and recombined, often with the benefit of flexibility and variety in use. The concept of modularity is used primarily to reduce complexity by breaking a s ...
, the software is not flexible enough to adapt to changes in business needs. * Lack of a test suite, which encourages quick and risky band-aid bug fixes. * Lack of software documentation, where code is created without supporting documentation. The work to create documentation represents debt. * Lack of collaboration, where knowledge isn't shared around the organization and business efficiency suffers, or junior developers are not properly mentored. * Parallel development on multiple branches accrues technical debt because of the work required to merge the changes into a single source base. The more changes done in isolation, the more debt. * Deferred
refactoring In computer programming and software design, code refactoring is the process of restructuring existing computer code—changing the '' factoring''—without changing its external behavior. Refactoring is intended to improve the design, structu ...
; As the requirements for a project evolve, it may become clear that parts of the code have become inefficient or difficult to edit and must be refactored in order to support future requirements. The longer refactoring is delayed, and the more code is added, the bigger the debt. * Lack of alignment to standards, where industry standard features,
frameworks A framework is a generic term commonly referring to an essential supporting structure which other things are built on top of. Framework may refer to: Computing * Application framework, used to implement the structure of an application for an op ...
, and technologies are ignored. Eventually integration with standards will come and doing so sooner will cost less (similar to "delayed refactoring"). * Lack of knowledge, when the developer doesn't know how to write elegant code. * Lack of ownership, when outsourced software efforts result in in-house engineering being required to refactor or rewrite outsourced code. * Poor technological leadership, where poorly thought out commands are handed down the chain of command. * Last minute specification changes. These have potential to percolate throughout a project, but there is insufficient time or budget to document and test the changes.


Service or repay the technical debt

Kenny Rubin uses the following status categories: * Happened-upon technical debt—debt that the development team was unaware 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 technical debt—debt that is known to the development team and has been made visible using one of many approaches. * Targeted technical debt—debt that is known and has been targeted for servicing by the development team.


Consequences

"Interest payments" are caused by both the necessary local maintenance and the absence of maintenance by other users of the project. Ongoing development in the
upstream Upstream may refer to: * Upstream (bioprocess) * ''Upstream'' (film), a 1927 film by John Ford * Upstream (networking) * ''Upstream'' (newspaper), a newspaper covering the oil and gas industry * Upstream (petroleum industry) * Upstream (software ...
project can increase the cost of "paying off the debt" in the future. One pays off the debt by simply completing the uncompleted work. The buildup of technical debt is a major cause for projects to miss deadlines. It is difficult to
estimate Estimation (or estimating) is the process of finding an estimate or approximation, which is a value that is usable for some purpose even if input data may be incomplete, uncertain, or unstable. The value is nonetheless usable because it is de ...
exactly how much work is necessary to pay off the debt. For each change that is initiated, an uncertain amount of uncompleted work is committed to the project. The deadline is missed when the project realizes that there is more uncompleted work (debt) than there is time to complete it in. To have predictable release schedules, a development team should limit the amount of work in progress in order to keep the amount of uncompleted work (or debt) small at all times. If enough work is completed on a project to not present a barrier to submission, then a project will be released which still carries a substantial amount of technical debt. If this software reaches production, then the risks of implementing any future refactors which might address the technical debt increase dramatically. Modifying production code carries the risk of outages, actual financial losses and possibly legal repercussions if contracts involve service-level agreements (SLA). For this reason we can view the carrying of technical debt to production almost as if it were an ''increase in interest rate'' and the only time this decreases is when deployments are turned down and retired. While Manny Lehman's Law already indicated that evolving programs continually add to their complexity and deteriorating structure unless work is done to maintain them, Ward Cunningham first drew the comparison between technical complexity and
debt Debt is an obligation that requires one party, the debtor, to pay money or other agreed-upon value to another party, the creditor. Debt is a deferred payment, or series of payments, which differentiates it from an immediate purchase. The ...
in a 1992 experience report: In his 2004 text, ''Refactoring to Patterns'', Joshua Kerievsky presents a comparable argument concerning the costs associated with architectural negligence, which he describes as "design debt". Activities that might be postponed include
documentation Documentation is any communicable material that is used to describe, explain or instruct regarding some attributes of an object, system or procedure, such as its parts, assembly, installation, maintenance and use. As a form of knowledge manageme ...
, writing
tests Test(s), testing, or TEST may refer to: * Test (assessment), an educational assessment intended to measure the respondents' knowledge or other abilities Arts and entertainment * ''Test'' (2013 film), an American film * ''Test'' (2014 film), ...
, attending to TODO comments and tackling compiler and static code analysis warnings. Other instances of technical debt include knowledge that isn't shared around the organization and code that is too confusing to be modified easily. Writing about PHP development in 2014, Junade Ali said: Grady Booch compares how evolving cities is similar to evolving software-intensive systems and how lack of refactoring can lead to technical debt. In
open source software Open-source software (OSS) is computer software that is released under a license in which the copyright holder grants users the rights to use, study, change, and distribute the software and its source code to anyone and for any purpose. Open ...
, postponing sending local changes to the upstream project is a form of technical debt.{{Citation needed, date=May 2018


See also

* Code smell (symptoms of inferior code quality that can contribute to technical debt) * Big ball of mud * Bus factor * Escalation of commitment * Manumation *
Overengineering Overengineering (or over-engineering), is the act of designing a product or providing a solution to a problem in an elaborate or complicated manner, where a simpler solution can be demonstrated to exist with the same efficiency and effectiveness as ...
* Shotgun surgery * Software entropy *
Software rot Software rot (bit rot, code rot, software erosion, software decay, or software entropy) is either a slow deterioration of software quality over time or its diminishing responsiveness that will eventually lead to software becoming faulty, unusabl ...
* Spaghetti code * SQALE * Sunk cost * TODO, FIXME, XXX


References


External links


''Ward Explains Debt Metaphor''
video from Ward Cunningham
OnTechnicalDebt
The online community for discussing technical debt * Experts interviews on Technical Debt
Ward CunninghamPhilippe KRUCHTENIpek OZKAYAJean-Louis LETOUZEY

Steve McConnell discusses technical debt


from Martin Fowler Bliki
Averting a "Technical Debt" Crisis
by Doug Knesek
"Get out of Technical Debt Now!"
a talk by Andy Lester
Lehman's Law

Managing Technical Debt Webinar by Steve McConnell
* Boundy, David
Software cancer: the seven early warning signs
o
here
ACM SIGSOFT Software Engineering Notes, Vol. 18 No. 2 (April 1993), Association for Computing Machinery, New York, New York, US
Technical debt: investeer en voorkom faillissement
by Colin Spoel
Technical debts: Everything you need to know

What is technical debt?
from DeepSource blog Anti-patterns Metaphors Software architecture Software engineering terminology Software maintenance