Blog>>Software development>>What is technical debt and how much is acceptable?

What is technical debt and how much is acceptable?

For most businesses in the software industry, the concept of technical debt has come up at some point. According to a report      link-icon, 23- 42% of the average organization's development time is wasted because of technical debt. Constant competition, the need to meet more and more customer expectations, adding new features to software products – there are many technological choices that can lead to budget losses and disruption of productivity. Some of them cause a so-called technical debt. Here we give a technical debt definition and discuss what the best techniques of technical debt management are.

What is technical debt?

Ward Cunningham, the co-author of the Agile Manifesto, described technical debt      link-icon as the practice of relying on temporary (usually easy to implement) solutions to achieve short-term results at the expense of efficiency in the long run. In other words, tech debt is the consequence of developers taking measures to speed up the delivery of a project (or just a part of the project) that will later need to be refactored, or the result of prioritizing speed of delivery over functionality and quality. Such a practice may lead to errors and deficiencies in the code. Of course, the quicker path doesn’t always have to be bad – it can be used to ensure you’ve got a product that works and meets the deadline.

Examples of technical debt

Examples of technical debt include the following:

Untested code

When developers skip writing tests or fail to update existing ones, it creates technical debt. This debt can lead to increased maintenance efforts and a higher chance of introducing bugs in the future.

By neglecting testing, the team might not catch critical issues early on, which can cascade into more significant problems during the development life cycle.

Unreadable or dead code

Unreadable code is poorly structured and difficult to understand. As a result, the code becomes convoluted, making it challenging for other team members to comprehend or modify.

Additionally, dead code refers to segments of the program that are no longer in use but remain in the codebase. Such code clutters the project and increases the risk of misunderstandings and unintended consequences during future development or updates. 

Duplicated code

When developers copy and paste code instead of creating reusable components or functions, it can lead to code duplication. This makes the codebase harder to maintain and increases the risk of introducing bugs or inconsistencies.

Brittle or tightly-coupled code

Writing code that is tightly coupled or difficult to modify can create technical debt. It becomes harder to introduce changes or new features without causing unintended side effects or breaking existing functionality.

Lack of scalability considerations

Failing to design and implement a system that can scale with increasing usage or data volumes can lead to technical debt. The software may experience performance issues, bottlenecks, or require significant rework to accommodate growth.

Poor or out of date documentation 

Inadequate or outdated documentation can make it challenging for developers to understand and work with the codebase. Lack of clear documentation hinders knowledge transfer, slows down onboarding of new team members, and increases the chances of introducing errors during maintenance or enhancements.

Suboptimal database design

Poorly designed database schemas, such as denormalized tables or lack of proper indexing, can impact performance and scalability. Over time, this can lead to slower query times, data integrity issues, and difficulty in making changes to the database structure.

Technical debt in agile projects

In agile software development, technical debt usually occurs when the product owner (or product manager) decides to launch a new feature or product and defines a very short time to market. This often leads to bugs in the code. Even if the new feature or product is launched on time, there are accumulated bugs and messy code.

This leaves the team with unwanted agile technical debt, which is the implied cost of additional work. Iterative development in agile is ignored, whereas incremental development is preferred. Changes and fixtures that should be implemented in the consecutive sprint cycles are often just left behind.

What causes technical debt?

Some people incorrectly think that the causes of technical debt are inexperienced or below-average developers who don’t know the best programming practices. However, there are other causes:

Lack of time

When you work under tight deadlines, your team may decide to cut corners. Very often, especially when a faster time to market is a priority, companies opt for a ‘just ship it’ philosophy. This leads to inconsistencies and bugs in the code and, in consequence, increases technical debt.

Lack of planning and design

Inadequate planning or rushed design phases can result in suboptimal architectural decisions or poorly thought-out code structures, leading to technical debt further down the line.

Neglecting code maintenance

Failing to allocate time for regular code reviews, refactoring, and documentation can lead to the accumulation of technical debt over time. Ignoring the need for code maintenance can make it harder to maintain and enhance the software in the future.

Putting product-market fit first

An obsession with product-market fit is common. Ignoring unresolved issues and messy code can be costly in the long run and can harm the ROI, even though the product-market fit is in place.

Change of priorities

This happens when software requirements increase in the middle of the development process. Plans change and so do sprint priorities. Bugs are left for tomorrow and the technical debt increases.

Lack of collaboration and communication

Poor communication between team members or siloed development practices can result in a lack of shared understanding and inconsistent code quality. This can increase the likelihood of technical debt accumulating.

Inexperienced or underqualified developers

Teams that include developers with limited experience or inadequate training may inadvertently introduce technical debt due to a lack of knowledge about best practices and efficient coding techniques.

Services Software outsourcing

How much technical debt is acceptable?

So, is technical debt bad or good? The truth is, there is no simple answer. Accruing technical issues can cause serious problems and is bad in general. However, tech debt may bring savings if you implement a good technical debt management strategy. It becomes an issue when business managers ignore it. In fact, it all depends on the context and project needs.

In some cases, such as when developing a minimum viable product, startups choose tech debt deliberately. The challenge is to balance it in a way that benefits your company in the long run. A well-understood debt should be managed with informed decisions. The amount of ‘acceptable’ technical debt is fully dependent on the project you’re working on. 

Consequences of technical debt 

Like any other debt, technical debt will have to be paid back in the future and the costs can sometimes be significant.

A decline in value and productivity

 First, as technical debt increases, the value you deliver declines. You need more resources and effort to maintain the project’s forward momentum, which reduces the productivity of your team. They have less time to develop new functionalities so the value you deliver is lower. At the same time, the number of bugs and defects in your software product increases which causes further product maintenance costs. 

Poor performance, malfunctions, data leaks, and security issues – these are just a few examples of possible issues. 

Growing frustration

Another issue arises when the development team is aware of the agile technical debt but doesn’t have the time and resources to fix it: frustration grows and morale decreases. The team is stuck working with a flawed system and completing lots of manual tasks. Thus, they become frustrated. Transparency is reduced and it becomes more difficult to understand the current state of the process. 

Finally, if technical debt keeps growing, it may turn out that the development cannot be continued any further. This is the most harmful possible consequence of tech debt.

Types of technical debt 

types of technical debt

Technically, there are two types of technical debt:

Intentional tech debt

Intentional tech debt involves a premeditated choice. The team that needs to get its product to the market as quickly as possible or release the update faster creates it deliberately. It represents a known risk that the team can document, track, and remedy.

Unintentional tech debt

Unintentional tech debt happens when the team works in a way that leads to accruing technical debt without even realizing it. Such a debt can still be remedied but it will take some time to adjust the development process and revisit the code. 

Environmental debt

Sometimes, environmental debt can also occur. This is accrued over time and without active effort, e.g. when you fail to keep up with fixing capability issues or when the system is patched. 

The technical debt quadrant

Fig.1: Technical debt quadrant by Martin Fowler
Technical debt quadrant by Martin Fowler

To better understand technical debt, let’s also explain the technical debt quadrant created by Martin Fowler (Fig. 1).

According to the quadrant, there are four types of tech debt depending on intent and context: deliberate, inadvertent, prudent, and reckless. Here is what they imply:

Deliberate and reckless

Deliberate and reckless tech debt is a result of bad software architecture. The team focuses on shipping the software product as quickly as possible, believing that they don’t have time to build a better code. The built solution is of poor quality. However, in some cases, it is better to launch a product with technical issues than to allocate time and money to developing the perfect product.

Deliberate and prudent

Deliberate and prudent debt occurs when you cut corners in terms of quality, but you control the process through technical debt management. Such debt is small as it is mostly related to code that rarely needs modification. The team is fully aware of potential problems they will need to handle later on.

Inadvertent and reckless

Inadvertent and reckless debt happens when the team doesn’t have enough knowledge and experience. Thus, they cannot manage the agile technical debt. This is probably the worst type of tech debt. The team doesn’t recognize it the moment they incur it.

Inadvertent and prudent

Inadvertent and prudent debt is not a result of neglect as it occurs when the team realizes that they could have built a better product after the product is delivered. Such debt happens despite caring about quality.

Technical debt management 

Technical debt management

Some amount of tech debt always exists. In most cases, accepting it is better than wasting resources fixing it. Tech debt can be okay when you are building an MVP, or you have an experienced team of developers who understand tech debt management. Below you will find the most popular strategies for managing technical debt: 

The whole team is up-to-date

Make sure that the entire team is on the same page when it comes to technical debt – developers, managers, and stakeholders have contrasting viewpoints. To manage technical debt, everyone should understand that the debt has negative effects such as higher costs and a slower time to market.

What is more, a timeframe and activities to mitigate the technical debt should be clearly defined so that everyone can collaborate and resolve conflicts of interest easier. This may require some changes in an organizational culture to encourage teams to talk about challenges.

Introduce code standards and reviews 

Create a collection of programming rules and best practices. Putting quality over speed in most cases pays off. Programming standards reduce tech debt in the long run. You can also ‘pay the debt off’ regularly every single sprint. This is a great way to mitigate it. To do that, embrace agile software development practices. 

Balance the sprints

Try to keep a day in the week (or more) for managing pending tasks. An ‘extra’ day for big fixes in existing features increases effectiveness and mitigates tech debt.

Refactor the problematic code 

Refactoring enhances maintainability and understandability by restructuring and improving the codebase without altering its external behavior, thus reducing technical debt. The process leads to better code quality, fewer defects, and more efficient bug fixing and feature implementation.

Additionally, refactoring paves the way for a healthier and more sustainable software project in the long run by fostering a culture of continuous improvement and collaboration within the development team.

Implement automated testing 

Especially, where we are talking about agile projects - this makes it much easier to detect bugs and errors. Automated testing can be a great help in validating the quality of the code and end product.

It’s also a chance to eliminate manual testing. Implementing automated testing also includes introducing CI/CD into the process. Do you want to know more about automation testing? Check our recent article about QA automation for more details. 

Conclusion

Most startups and software companies at some point have to make some suboptimal decisions. Such decisions often contribute to technical debt. Even if you cannot avoid it, it is crucial to learn how to proactively manage it.

Start with checking code quality on a regular basis. Make sure your development team is aware of what technical debt is and show them how to manage it effectively. Short-term wins are easy to have but long-term work involves much more effort. And finally, especially when it comes to agile technical debt, focus on automated testing – a part of the process that is extremely important and often skipped over.

Mika Tomasz

Tomasz Mika

Business Development Manager

As a seasoned Business Development Manager, Tomasz specializes in facilitating connections between global organizational leaders, startup founders, and engineering teams that possess unparalleled expertise in cloud and network engineering. With over five years in IT, he has a proven track record of forging...Read about author >

Read also

Get your project estimate

For businesses that need support in their software or network engineering projects, please fill in the form and we'll get back to you within one business day.