Technical Debt (or tech debt) is when you defer work that needs doing in your code. And, just like when you defer a payment and accrue financial debt, Technical Debt must be repaid, and it accumulates interest (in the form of reduced velocity) while it remains unpaid.
Technical Debt can occur for all kinds of reasons, for example:
Systems need to have features added to them to continually remain useful (or competitive). As new features are added to the system, often more Technical Debt will be introduced. But as any system ages, it will accumulate Technical Debt.
IMPORTANT: When you become aware of Technical Debt in a product, you must add it to the backlog. Whether you have discovered the Technical Debt or added it intentionally, either way the discussion and decision must be recorded in a PBI. This allows the team to factor paying it back into their Sprint planning.
It also helps to add a TODO comment in the relevant code with a link to the PBI. This will help other developers understand that it is a known issue. See Do you document "TODO" tasks?
Example: A developer takes a shortcut to get some early feedback on a new feature
✅ Figure: Good example - Technical Debt is very visible to the Product Owner
Figure: Professional Developers survey
Sometimes you want to quickly implement a new feature to get it out and receive some feedback.
PBI: {{ FeatureName }} – Technical Debt - Planned
Note: Martin Fowler calls this "Deliberate Technical Debt".
During a code review, you or the team notice something as part of the system that is clearly Technical Debt. This code is hindering the ability to add new features or is hard to read/understand.
PBI: {{ FeatureName }} – Technical Debt - Discovered
Note: Martin Fowler calls this "Inadvertent Technical Debt".
Every system will accumulate Technical Debt over time. For example, if you built an API with ASP.NET Core 2.0 (which is now out of support), you have Technical Debt because that version is no longer supported. This kind of Technical Debt cannot only negatively impact the productivity of the team, but it can also introduce a security risk. Another example is that the architecture you selected may have been right based on the original spec, but as requirements change or new requriements emerge, this may no longer be the case. The team can choose to refactor now, or accept the Technical Debt and continue to deliver features on the current architecture.
PBI: {{ FeatureName }} - Technical Debt - Unavoidable
Note: Martin Fowler would also classify this as "Inadvertent Technical Debt".
Just like a business that receives pre-payment from customers, a software team should be reviewing the size of their liabilities (being the list of PBIs with Technical Debt).
At the Sprint Planning:
Figure: Screenshot of code with Technical Debt comment and link to GitHub Issue
Figure: Screenshot of Technical Debt on backlog
Figure: SugarLearning architecture diagram