Skip to main content

Managing technical debt like financial debt

Yesterday on my way home, I was listening to the SoftwareCaptains podcast episode with Mathias Verraes (sorry, the episode is in Dutch). One of the topics discussed was technical debt and the  question was raised why (most) organizations manage very carefully their financial debt, they don’t apply the same rigor for their technical debt.

This triggered a train-of-thought that resulted in this post. Financial debt is meticulously tracked, reported, and managed. CFOs provide regular updates to boards about debt levels, leveraging ratios, and debt servicing costs. Detailed financial statements outline current liabilities, long-term obligations, and repayment schedules. Financial debt is visible, quantified, and actively managed.

Yet technical debt—which can be just as crippling to an organization's future—often exists as an invisible, unquantified burden until it's too late.

What if we managed technical debt with the same rigor as financial debt?

The hidden cost of technical debt

Technical debt accumulates when development teams make implementation choices that prioritize short-term goals over long-term system health. Like financial debt, technical debt isn't inherently bad—it can be strategically leveraged to deliver value quickly. The problem arises when it remains invisible, unmanaged, and ultimately unpaid.

 

The consequences are real and severe:

  • Decreased development velocity as teams navigate increasingly complex systems

  • Rising maintenance costs that steadily eat into innovation budgets

  • Increased system failures and outages impacting customer experience

  • Higher employee turnover as engineers burn out working with problematic codebases

  • Inability to respond quickly to market changes or competitive threats

Yet unlike financial debt, technical debt rarely appears on executive dashboards or board reports. It accumulates silently until it reaches crisis levels that can no longer be ignored.

As a venture capitalist you will probably not invest in a company that is knee deep in financial debt. But can you just ignore the accumulated technical debt?

The role of the CTO

Every company has a CFO who tracks financial obligations and ensures they remain manageable. Where is the equivalent role for technical debt?

I think this should be a responsibility of the Chief Technical Officer (CTO). He or she should be accountable for:

  1. Quantifying existing technical debt across systems and applications
  2. Tracking debt accumulation through development activities
  3. Establishing repayment strategies and prioritizing debt reduction efforts
  4. Reporting technical debt metrics to executive leadership
  5. Setting sustainable "debt policies” for the organization

The CTO shouldn't prevent all technical debt—just as CFOs don't prevent all financial debt. Rather, they would ensure debt is intentional, visible, and managed within sustainable boundaries.

Making technical debt visible and manageable

Financial debt isn't managed through vague conversations or individual awareness—it's tracked through formal processes, reported regularly, and managed strategically. Technical debt deserves the same treatment.

By establishing explicit technical debt management practices and assigning clear accountability through expanded CTO responsibilities, organizations can transform technical debt from an invisible threat to a managed resource.

The companies that thrive in the coming decade won't be those that avoid technical debt entirely—that's unrealistic. The winners will be those that make technical debt visible, intentional, and strategically managed just like any other business liability.

More information

Podcast: Mathias Verraes: software design voor startups en scaleups — SoftwareCaptains — Lead your tech team through your growth

Understanding Technical Debt

Popular posts from this blog

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

Kubernetes–Limit your environmental impact

Reducing the carbon footprint and CO2 emission of our (cloud) workloads, is a responsibility of all of us. If you are running a Kubernetes cluster, have a look at Kube-Green . kube-green is a simple Kubernetes operator that automatically shuts down (some of) your pods when you don't need them. A single pod produces about 11 Kg CO2eq per year( here the calculation). Reason enough to give it a try! Installing kube-green in your cluster The easiest way to install the operator in your cluster is through kubectl. We first need to install a cert-manager: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml Remark: Wait a minute before you continue as it can take some time before the cert-manager is up & running inside your cluster. Now we can install the kube-green operator: kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml Now in the namespace where we want t...

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...