In an ideal world, you shouldn’t have to choose between quality and timely delivery, but it happens more often than you might think.
In this guide, we’ll define technical debt, illustrate the concept with some examples, and list some common types of technical debt. We’ll also walk you through how to prioritize technical debt and offer some strategies to help you minimize it.
Technical debt is an accumulation of tasks left undone during development to expedite product delivery. When there is a need to prioritize speed over quality, the product owner and development team must come to an agreement on which tasks they’ll leave incomplete for the sake of delivering the product or feature on time.
These shortcuts create debts, which may increase costs if left unresolved. The expense can come in the form of additional time and resources required for maintenance and fixing bugs, poorly performing systems, bad customer experience due to errors, etc.
Here’s an example of technical debt: let’s say you need to launch a new consent block due to a change in privacy data storage regulations. You’re on a strict deadline to release the feature. As a result, the dev team doesn’t have time to adhere to the UX standards of the product, so it decides to create a pop-up as a quick fix to be compliant.
Because missing the deadline for compliance with data storage regulations can carry heavy fines, settling for the bare minimum is acceptable and the safest way forward. In this scenario, the cost of delay is higher than the cost of creating technical debt.
In this example, the team would then create a technical debt task to later fix the design parameter per the product’s user experience principles and requirements.
The reasons why a product development team might opt to forgo certain tasks in favor of speedy delivery are myriad. Let’s zoom in on some common types of technical debt.
Code debt is one of the most common types technical debt. Code debt occurs when developers take shortcuts instead of following code standards — for example, by duplicating code or hardcoding instead of fetching the content dynamically.
Failure to follow design principles creates design debt.
A typical example of design debt is when developers fail to adapt the design to different channels, such as mobile and web. Another example is when a design is not built according to accessibility parameters.
Outdated technology creates infrastructure debt.
For example, migrating a platform or upgrading a database to a new version can result in infrastructure debt. This is also known as maintenance debt because it pertains to keeping the product running.
Product teams do not incur infrastructure debt by choice; it is simply a fact of life during the lifecycle of a product. However, they can control how diligently they migrate to new platforms. Knowingly continuing to build new features on outdated platforms can result in a massive backlog of infrastructure debt.
Test debt occurs when the team neglects to follow test standards during development. Some reasons for test debt include failure to write proper unit tests and failure to implement automation or regression testing before delivery.
While prioritizing the product backlog, it’s important to distinguish between features that are nice to have and features that are hard requirements for release.
Due to time constrains, it’s common for some nice-to-have items to be deprioritized and deferred until the next delivery. Then, in the following delivery, it’s common for something else to be prioritized higher.
Continually letting items slide to the bottom of the backlog can create requirement debt.
In agile working methods, the second principle as outlined in the Agile Manifesto is working software over comprehensive documentation.
However, some documentation — for example, the solution design documentation and test summary report — is still necessary to deliver smooth-functioning products and to maintain the backlog. User stories are another example of critical documentation.
Without these resources, solving bugs and maintaining the system would be tedious. Any documentation gaps that could increase the amount of work required in the future creates documentation debt.
When the flow is built to handle a process but changes for some reason, it creates process debt.
An example of process debt is when the deployment pipeline requires changes to include a new quality assurance process.
People debt occurs when expertise lies in the hands of few. This is especially common in big organizations with legacy systems that newer team member can’t be bothered to learn.
Another common cause of people debt is insufficient documentation. When complex systems lack thorough documentation, these processes exist only in one or a few team members’ brain, resulting in people debt.
Teams incur architecture debt when they fail to build a solution according to the architectural design. This happens primarily due to tight deadlines and lack of resources. It can also occur when new developers are not properly onboarded.
Identified bugs that are deprioritized due to lower impact are eventually lost in the backlog.
The technical debts can create a massive black hole in the backlog. Over time it becomes impossible to manage and prioritize the backlog. It can also increase the cost of maintenance and result in poorly performing products, affecting user experience adversely.
Creating technical debt is not inherently wrong when it is intentional with a clear plan and the importance of attaining a deadline outweighs the cost of technical debt. However, those technical debts due to ignorance, lack of knowledge, and laziness can cost more in the future and currently have no or limited value.
Although technical debt is always impactful, some types of debt can be riskier and more consequential than others.
Technical debt can be either deliberate or inadvertent:
Martin Fowler’s technical debt quadrant breaks down deliberate vs. inadvertent technical debt further by measuring the recklessness or prudence of the tech debt:
There are many reasons for inadvertent technical debt.
If the technical debt exceeds the backlog, here are some steps you can take to avoid incurring further inadvertent debts:
Technical debt is inevitable in agile product development. However, if the team is aware of the debt and has a plan either to resolve or address it later, technical debt can be a valuable tool for prioritization.
Regardless of whether it’s deliberate or inadvertent, the team should strive to address tech debt as soon as it’s highlighted. The best way to prioritize the debt is to conduct a backlog refinement session for technical debt.
Evaluate and group the debt into the following categories:
Categorizing your technical debt this way makes it easier to prioritize. The team should proactively:
While working on new products and staring down deadlines and delivery dates, it‘s all too easy to ignore the technical debts your team accumulates along the way.
Understanding the cost of complexity is one of the most valuable lessons a product manager can learn. If you build complex solutions, you are building expensive, unmanageable products long-term. Complexity is also an outcome of favoring quick fixes, patches, and hardcoding over solving the code debt.
On the other hand, faster time to market, iterate, and learn is the basis of agile product development. Therefore, technical debt is inevitable and not inherently wrong.
To manage a successful product long-term, it’s essential to strike the right balance between quality and speed. Addressing your technical debt is the first step. Being open and transparent about the issue is always better than closing your eyes and hoping for the best.
Featured image source: IconScout
LogRocket identifies friction points in the user experience so you can make informed decisions about product and design changes that must happen to hit your goals.
With LogRocket, you can understand the scope of the issues affecting your product and prioritize the changes that need to be made. LogRocket simplifies workflows by allowing Engineering, Product, UX, and Design teams to work from the same data as you, eliminating any confusion about what needs to be done.
Get your teams on the same page — try LogRocket today.
A fractional product manager (FPM) is a part-time, contract-based product manager who works with organizations on a flexible basis.
As a product manager, you express customer needs to your development teams so that you can work together to build the best possible solution.
Karen Letendre talks about how she helps her team advance in their careers via mentorship, upskilling programs, and more.
An IPT isn’t just another team; it’s a strategic approach that breaks down unnecessary communication blockades for open communication.