Monday Morning CTO

Reflections on a life in tech


Introduction to Technical Debt: A CTO’s Perspective

One of the most significant challenges faced by software companies (and as Watts S. Humphrey, the father of quality in software and CMMI, said two decades ago “Every business is a software business”) is managing technical debt. Adding to the complexity of the problem is the need to make the rest of the business understand what technical debt is, and how the business itself needs to own a significant role in its management..

In this blog post, which is the first in a series, we’ll dive into the definition of technical debt, explore its types and sources, and discuss why it’s essential to manage technical debt effectively. 

The goal here is not to explain Technical Debt to CTOs or other people in the technology group(s). I want to try to give you tools and language to help explain technical debt to the business, including the executive team, product management, etc.

What is Technical Debt?

Technical debt, a term first coined by Ward Cunningham in the early 1990s, is a metaphor that represents the additional work and costs incurred by opting for short-term solutions or compromises during software development. These decisions, while perhaps solving an immediate need or meeting a deadline, often lead to long-term inefficiencies and difficulties in maintaining or enhancing the software. Technical debt can be thought of as a metaphor for monetary debt, where borrowing money can help solve immediate financial problems but will incur interest and additional costs in the future

Martin Fowler also has a great description of Technical Debt, or check out Wikipedia.

Types of Technical Debt

1. Code Debt: This type of debt arises from poor coding practices, such as lack of documentation, inconsistent naming conventions, and overly complex or redundant code.

2. Design Debt: Design debt occurs when the software’s architecture and structure are not well thought out or implemented, leading to an inflexible or inefficient system. Note that Design Debt is not always due to badly executed or poorly selected design – often it can be traced to other problems like poorly defined requirements or time pressure. 

3. Testing Debt: Insufficient or ineffective testing can result in undetected issues or vulnerabilities, which become more expensive and time-consuming to address as the software evolves.

4. Documentation Debt: This form of debt is the result of inadequate or outdated documentation, making it difficult for developers to understand, maintain, or expand the system.

Sources of Technical Debt

There are several common sources of technical debt, including:

1. Time Pressure: The need to meet tight deadlines often leads to compromises in code quality and design.

2. Lack of Experience or Skill: Inexperienced or unskilled developers may introduce technical debt through poor coding practices or suboptimal design choices.

3. Changing Requirements: As software requirements evolve, previously sound decisions may become outdated or no longer align with the project’s goals, creating technical debt. As well, efforts to make the system fulfill new and changing requirements can lead to Code and/or Design Debt

4. Legacy Systems: Older systems often accumulate technical debt over time due to outdated technology, deprecated dependencies, or unsupported features. In addition, Legacy Systems can accrue technical debt merely by ignoring ongoing maintenance.  

Why Technical Debt Needs to Be Managed

Technical Debt needs to be managed, just as fiscal debt must be. Far too often I see Technical Debt treated as a purely technological problem which it is not. It is a problem which needs to be managed at an organizational level including all departments.

There are valid reasons for taking on Technical Debt. Time to market is often one. Sometimes you have to “do what is necessary” and an 80% solution now is better than a 99% solution 6 months from now. This should be a conscious decision by the business however, not something that is hidden inside the Technology group and complained about by developers.

Taking on Technical Debt without thought simply to achieve what are often arbitrarily defined timelines is not a good strategy. Doing so is like living your whole life on Credit Cards with no thought to how you are going to pay that debt off.

I like to think of any Technical Debt decision in terms of risk and reward:

  • What are the business benefits or business value we are going to see from this choice (and over what timeline)?
  • What are the risks we are accepting by taking on this debt?

In addition, no Technical Debt should be accepted without a plan for paying it off.

Unmanaged Technical Debt has a number of impacts (and the longer it is left, the more it compounds, just like your credit cards):

  1. Maintainability: A codebase burdened with technical debt becomes increasingly challenging to maintain, leading to slower development cycles and higher costs.
  2. Scalability: Unmanaged technical debt can limit a software’s ability to scale or adapt to new requirements, stifling growth and innovation.
  3. Quality & Stability: High levels of technical debt increase the risk of defects and vulnerabilities, impacting the software’s overall stability and reliability.
  4. Team Morale: Continually working with a codebase riddled with technical debt can be frustrating and demotivating for developers, leading to reduced productivity and even attrition. Forcing developers to always do sub-par work just to make timelines is a sure way to break their spirits. 

In the upcoming series of blog posts, we will delve deeper into the world of technical debt, covering how to identify, assess, and quantify it, as well as addressing it through development processes and cultivating a technical debt-aware culture. Additionally, we’ll discuss aligning technical debt management with business strategy and leveraging it for growth.

Stay tuned for our next post on identifying, assessing, and quantifying technical debt, as we continue to explore this critical aspect of software development.



One response to “Introduction to Technical Debt: A CTO’s Perspective”

  1. […] back, readers! If you’ve been following our series, you’ll recall that in my previous post, we embarked on a journey to explore the complex world of software technical debt. We discussed […]

    Like

Leave a comment

Obligatory Disclaimer

Please keep in mind that any opinions, points-of-view, comments, or other content which I post to this site are mine and mine alone. They in no way reflect the views of my employer, my country, my dog, my cat, or anyone else you can think of. To paraphrase Monty Python, “That is the theory that I have and which is mine, and what it is, too.”

Also please note that some content published on this blog may be generated with the help of AI tools.

Newsletter