In which I collect my thoughts on many topics but mainly about systems engineering, software engineering, and system/software architecture

Technical Debt Is Not Deferred Effort: Total Technical Debt, Architecture, Options, and the Cost of the Future

From Technical Debt to Total Technical Debt

Technical debt is often described as deferred effort and used primarily with respect to software engineering. This terminology is not wrong, but it is not enough for describing the true situation. The common term technical debt is useful as an entry point, but for systems engineering it is too narrow to be useful unless extended.

In this post, I introduce the term Total Technical Debt (TTD) as a means to represent the accumulated technical, semantic, verification, organizational, governance, and cognitive constraints that shape the future of the system.

If debt were only deferred implementation effort, then the problem would be simple: do the work later. Clean up the code. Fix the documentation. Improve the tests. Retire the duplicated interface. Pay down the backlog. However, anyone who has lived with a large engineered system knows that this is not how TTD actually behaves.

By the time the organization decides to “pay down” the debt, the situation has usually changed.

  • Interfaces have hardened
  • Workarounds have become dependencies
  • Teams have reorganized around the current structure
  • Test evidence has accumulated around the wrong assumptions
  • Certification or governance commitments have been made
  • The people who understood the original rationale for the decisions may have moved on

The system still works, but some futures have quietly become more expensive, less plausible, or unavailable. This is why I believe technical debt, in the ordinary sense, must be lifted into TTD.

TTD is accumulated and unresolved architectural constraint across different channels that affect system evolution. Its real cost is not just the cleanup task. Its real cost is the way it deforms the future.

Ward Cunningham’s original technical debt metaphor was about the relationship between present progress and future cost, not merely about bad code [Cun92]. Later work on software evolution and code decay showed that systems accumulate structural consequences as they change [Leh80, EGK+01]. In software architecture and systems engineering, the same issue appears across more than code. It appears in interfaces, data meanings, verification assumptions, ownership boundaries, governance commitments, and architectural representations.

In this sense, TTD is not just a larger pile of ordinary technical-debt items. It is a system-level construct. It includes the debt-like constraints that arise when meaning, verification evidence, governance commitments, organizational structure, architecture knowledge, and implementation structure become misaligned.

So the question is not “What work did we defer?” The better question is “What future options have we made harder, less plausible, or unavailable?”

Architecture Shapes the Space of Possible Futures

As I’ve stated in previous posts, an architecture is not merely a diagram, a module structure, or a set of interfaces. These are representations of architecture. Poor representational fidelity can contribute to TTD. Architecture itself is a constraint structure. It shapes what can happen next.

At any architectural state A, there exists a set of possible future architectural paths J^+(A) = \{ p_1, p_2, \dots , p_n \}. We call this set the future cone of the architecture. Each path p_i represents a possible way the system could evolve.

  • Some paths are technically admissible but expensive
  • Some are possible in principle but implausible in practice
  • Some are blocked not by code, but by certification, organizational structure, contractual commitments, safety evidence, governance rules, or loss of knowledge

The important point is that the architecture does not merely describe the present system. It also shapes the reachable future.

TTD changes that future cone. It can remove paths. It can make paths more expensive. It can reduce confidence in paths. It can force many distinct paths through the same bottleneck. This is the architectural meaning of Total Technical Debt.

TTD : J^+(A_t) \to J^+(A_t+\Delta t)

This expression is a compact way of saying that TTD transforms the future option structure of the architecture.

What Makes TTD Total?

The word total is important. TTD is not merely conventional technical debt scaled up. It includes multiple coupled channels

  • Technical debt: implementation structure, dependencies, interfaces, data models, and integration mechanisms
  • Semantic debt: mismatched meanings, overloaded terms, inconsistent domain models, and translation ambiguity
  • Verification debt: missing evidence, fragile tests, certification burden, and validation assumptions that no longer match the architecture
  • Organizational debt: ownership gaps, handoff friction, incentive misalignment, and team structures that no longer fit the system
  • Governance debt: approval friction, compliance exposure, control mechanisms, and regulatory commitments constraining future change
  • Cognitive or representational debt: lost rationale, stale diagrams, unreadable architecture descriptions, and reduced ability to communicate the architecture.

These channels interact. A technical shortcut can become verification debt. A semantic mismatch can become organizational friction. A governance response can create technical workaround debt.

This is why the framework requires TTD rather than the narrower conventional term.

The Architectural Frontier

At any moment, the architecture has a frontier of possible next commitments. We can think of this frontier as a set of mutually distinct next moves or

F_t = \{ a_1, a_2, \dots , a_m \}

For example, a system development may concurrently choose options such as

  • Replace a subsystem behind a stable interface
  • Introduce a new product variant through a modular extension
  • Certify the next release incrementally
  • Migrate to a new platform
  • Preserve compatibility with legacy users
  • Add new capability without disrupting the verification basis

These are not merely tasks. They are architectural futures. TTD acts on these potential futures (frontier) in several ways.

  • It can delete an option. A migration path that was once feasible may become practically unavailable.
  • It can collapse options. Several plans may still appear distinct, but all of them now require solving the same integration problem.
  • It can reweight options. A path may remain technically possible but lose credibility, funding, schedule confidence, or governance support.
  • It can distort options. A path may survive, but with increased reintegration cost, verification burden, semantic ambiguity, or organizational friction.
  • It can also create false options. Local teams may gain apparent flexibility while the system as a whole loses coherence.

This is why option count alone is misleading. More local choices do not necessarily mean a healthier architecture.

Debt Interest Is a Rate, Not Just a Balance

The debt metaphor becomes more useful when we distinguish the principal from the interest. The TTD principal is the accumulated unresolved constraint. Interest is the rate at which that constraint damages future cost, risk, delay, and optionality.

One practical proxy for this effect is the notion of Complexity Change Cost, or CCC, introduced in the previous post. The detailed form of CCC depends on the system, but conceptually it estimates how difficult it is to make a change at a location in the architecture, given that location’s complexity, coupling, criticality, verification burden, and interaction surface.

For a future path p, we can think of cumulative change cost as I_{CCC}[p]. Paths with high cumulative CCC become less plausible, even if they remain technically admissible.

A compact way to express this is

    \begin{equation*}   \mbox{Pr}(p_i) = \frac{e^{-\beta I_{CCC}[p_i]}}{Z_A},   \qquad   Z_A=\sum_{p_i\in J^+(A)}e^{-\beta I_{CCC}[p_i]} \end{equation*}

This is not meant as a universal law of architecture. Rather, it is a disciplined way to express a common engineering reality, that is, as the cost of a path rises, the organization becomes less likely to take it.

The most important signal, however, is often not the absolute amount of debt. It is the rate of change or \frac{d(CCC)}{dt}. Even more concerning is acceleration or \frac{d^2(CCC)}{dt^2}. A system can be expensive but stable. That is not ideal, but it may be manageable. A system whose change cost is accelerating is more dangerous. That means intervention capacity is deteriorating.

Debt Reduction, Interest Reduction, and Investment Are Different

This distinction is essential.

Debt reduction lowers accumulated unresolved constraint. It removes obsolete dependencies, simplifies overgrown interfaces, resolves semantic mismatches, or eliminates duplicated mechanisms.

Interest reduction lowers the future rate at which remaining constraint creates cost, delay, risk, or option loss. Better test automation, clearer ownership, reusable verification evidence, stable interface contracts, and architectural rationale recovery can all reduce interest even before every debt item is removed.

Architectural investment is different again. Investment is not just effort. Investment is effort that improves the future cone. An intervention is architectural investment when it preserves valuable options, lowers future CCC, reduces basin exit cost, improves recoverability, or creates governable variability.

This matters because not all cleanup is investment. A team can simplify its local implementation while damaging global option structure. Conversely, a platform or integration layer may become locally more complex because it is intentionally absorbing variation on behalf of the system. That local complexity increase may be good architecture.

Architectural investment is effort that buys back the future.

Local Simplification Can Create Global Debt

One of the most common architectural traps is local rationality.

A team has a deadline. A direct dependency is faster than using the intended abstraction. A one-off data translation is faster than repairing the shared semantic model. A local test workaround is faster than fixing the verification architecture. Each decision is defensible. Each may even reduce local effort. Note that these “deferred decisions” are debt and while they may be defensible from a schedule viewpoint, they may well be indefensible from an overall system viewpoint because the system-level effect can be option collapse.

A local team may reduce its own cost while increasing the global cost of integration, certification, recovery, or replacement. The architecture has not become more flexible. It has become more brittle.

This is why architectural option space is not additive

    \begin{equation*}   \sum_i S(F_i)\uparrow \centernot\implies S(F_{\text{system}})\uparrow \end{equation*}

More local options do not automatically create more system options. In fact, unmanaged local freedom can destroy global option structure. Good architecture deliberately creates locations where variation is cheap, bounded, testable, and integrable. It also protects locations where uncontrolled variation would damage system-level invariants. This is the architectural logic behind modularity and information hiding [Par72, BC00].

This local vs. global perspective is also why design structure matrix methods are useful for seeing how coupling and change propagation accumulate [EB12].

A Simple Diagnostic: Which Options Survive?

If TTD damages the future, then an architecture review should have a goal to examine the survival of future options.

Let the current frontier be

F_t = \{ a_1, a_2, \dots, a_m \}

After some period of change, the frontier becomes F(t+\Delta t). Some options survive cleanly. Some survive in degraded form. Some collapse into bottlenecks. Some disappear completely.

We can define a survival mapping

\phi: F_t \to F_{t+\Delta t} \cup \, \{\bot\}

If \phi(a_i) = \bot, then option a_i has disappeared. If \phi(a_i) = b_j , it survives as a later option b_j.

Now, let q(a_i, \phi(a_i)) \in [0, 1] measure the fidelity of survival. Let V(a_i) be the architectural value of the option. Then a valuation-weighted survival score is

    \begin{equation*}   S_V(F_t,F_{t+\Delta t}) = \frac{\sum_{a_i\in F_t}V(a_i)q(a_i,\phi(a_i)) }{\sum_{a_i\in F_t}V(a_i)} \end{equation*}

This is not intended to create a false sense of precision. Its value is purely diagnostic. It forces the architecture review process to ask “Which valuable futures survived the change?”

That is often a better debt question than asking whether the codebase looks cleaner.

Basins: When Continuation Becomes Too Easy

Debt also creates basins which are regions in the option space requiring little energy or effort to enter but may require significant energy or effort to exit, depending on the depth of the basin.

A basin forms when continuation along the current path becomes much cheaper, easier, or more plausible than exit. The system may still be functioning, and local decisions may still be rational, but the architecture is becoming trapped.

Let p_c be the continuation path and p_e be an exit path. A simple basin-depth measure is

D_B=I_{CCC}(p_e)-I_{CCC}(p_c)

If the exit path becomes much more expensive than continuation, the basin deepens.

A richer version also includes plausibility and governance friction

DB=α[ICCC(pe)ICCC(pc)]+βlogPr(pc)Pr(pe)+γGeD_B^{*} = \alpha[I_{CCC}(p_e)-I_{CCC}(p_c)] + \beta\log\frac{\Pr(p_c)}{\Pr(p_e)} + \gamma G_e

The warning sign is not merely that the current path is cheap. The warning sign is that the exit path is becoming disproportionately expensive.

This is how systems become trapped without anyone explicitly choosing to be trapped. Each local decision may be reasonable. The accumulated effect is basin formation.

What Systems Engineering Should Ask

Systems engineering should not treat TTD as merely an implementation hygiene issue. TTD is also an architecture, verification, governance, and option-preservation issue.

A useful architecture review should ask

  • What valuable future options currently exist?
  • Which options are becoming more expensive?
  • Which options are losing plausibility?
  • Which distinct options are collapsing into the same bottleneck?
  • Where are CCC gradients rising?
  • Where is local simplification increasing global cost?
  • Where is local complexity justified because it preserves global optionality?
  • Is debt being reduced, or merely converted into verification, governance, organizational, or cognitive burden?
  • Is basin exit cost increasing?

These questions shift TTD from a vague complaint to an architectural diagnosis. They also reconnect technical debt to systems engineering. Systems engineering is concerned with the whole system over time: mission, constraints, interfaces, verification, stakeholders, governance, and lifecycle consequences. TTD belongs in that conversation because it changes the future behavior of the system-of-interest and the organization that must sustain it.

Conclusion

All real systems accumulate constraint. The question is whether those constraints are being converted into useful structure or silently narrowing the future.

Technical debt is not primarily deferred effort. More precisely, TTD is accumulated unresolved architectural constraint that deforms the future cone of the system. Its interest is paid through rising change cost, reduced recoverability, collapsed options, and deepening basins.

The practical question is not simply “How much cleanup do we owe?” but a deeper “Which futures are still available to us, and which ones are we losing?” This is why architectural investment matters. It is not just work. It is the disciplined act of preserving valuable futures before they disappear.

References

[BC00] Carliss Y. Baldwin and Kim B. Clark. Design Rules, Volume 1: The Power of Modularity. MIT Press, Cambridge, MA, 2000.

[Cun92] Ward Cunningham. The wycash portfolio management system. ACM SIGPLAN OOPS Messenger, 4(2):29–30, 1992.

[EB12] Steven D. Eppinger and Tyson R. Browning. Design Structure Matrix Methods and Applications. MIT Press, Cambridge, MA, 2012.

[EGK+01] Stephen G. Eick, Todd L. Graves, Alan F. Karr, J. S. Marron, and Audris Mockus. Does code decay? Assessing the evidence from change management data. IEEE Transactions on Software Engineering, 27(1):1–12, 2001.

[Leh80] Meir M. Lehman. Programs, life cycles, and laws of software evolution. Proceedings of the IEEE, 68(9):1060–1076, 1980.

[Par72] David Lorge Parnas. On the criteria to be used in decomposing systems into modules. Communications of the ACM, 15(12):1053–1058, 1972.

Leave a Reply

Discover more from System Architecture, Systems Engineering, and Other Thoughts

Subscribe now to keep reading and get access to the full archive.

Continue reading