Skip to content
Part IA Easter Term

Technical Debt and Professional Responsibility

What Is Technical Debt?

The term Technical Debt was coined by Ward Cunningham in 1992. It is a financial metaphor: you take out a loan when you write quick, messy code to meet a deadline.

  • Principal: the effort required to eventually rewrite the code properly.
  • Interest: the extra time it takes to add features or fix bugs in the meantime, because the messy code slows you down and introduces side effects.

Like financial debt, technical debt is not inherently bad. Taking on debt is a rational decision when the return on the borrowed capital exceeds the cost of the interest — e.g. launching a product to market before a competitor captures the audience. But like financial debt, technical debt that is never repaid accumulates interest that eventually consumes all productive capacity.

The Technical Debt Quadrant

Not all technical debt is the same. It falls into a 2×2 quadrant based on intent and care:

Deliberate (chosen knowingly)Inadvertent (unintentional)
Reckless (no plan to fix)“We must ship now and fix later” — but later never comes, and no one tracks the debt.”What’s pytest?” — the team simply does not know how to write clean code.
Prudent (informed, tracked)“We have no time for full design; we will hardcode the DB connection for Friday’s launch and refactor next sprint (ticket #142).""Now that we’ve built it, we understand the domain — and we know how we should have structured it.”

Prudent/Deliberate debt can be a valid business strategy. You knowingly accept a cost to hit a critical deadline, track the debt explicitly, and schedule repayment. Inadvertent debt is more dangerous: it accumulates silently because nobody realises it is there until it manifests as a production incident or an inability to ship new features.

The Iron Triangle

The Iron Triangle of project management (also known as the triple constraint):

Fast, Good, Cheap — pick two.

You can build something quickly and to a high standard — but it will be expensive (hire more engineers, buy better tooling). You can build something cheaply and quickly — but quality will suffer. You can build something cheaply to a high standard — but it will take a long time.

Every decision in software engineering is a negotiation among these three constraints. Perfect code shipped two years after the market has moved on is a business failure. Terrible code shipped tomorrow that bankrupts the company in technical debt is also a business failure. Balancing this — knowing when to accept debt and when to insist on quality — is what distinguishes an engineer from a programmer.

Professional Responsibility

Engineers hold specialised knowledge that managers, users, and clients do not. With that knowledge comes a professional obligation to push back against decisions that compromise safety or core quality.

“Management told me to do it” is not an acceptable defence against catastrophic failure. The engineers at AECL (Therac-25), Fujitsu (Horizon), and Boeing (737 MAX) all faced pressure to cut corners, ship on schedule, or downplay technical concerns. In each case, the failure to push back — to say “this is not safe and I will not sign off on it” — contributed to deaths.

The BCS Code of Conduct and other professional bodies explicitly require engineers to:

  • Have regard for public health, safety, and the environment.
  • Avoid any situation that may give rise to a conflict of interest.
  • Not misrepresent or withhold information.

This is not abstract ethics — it is a concrete engineering requirement. If your technical judgement says a system is unsafe, and management overrules you, you must escalate — and document that you did so.

The Economics of Refactoring

Technical debt is repaid through refactoring: restructuring existing code without changing its observable behaviour. Refactoring is a disciplined engineering technique, not just “cleaning up.”

The critical prerequisite for refactoring is a comprehensive automated test suite. If tests pass before and after a refactoring step, you have reasonable confidence that behaviour was preserved. Without tests, refactoring is indistinguishable from breaking changes — you cannot safely change structure without a way to verify correctness.

This is one reason the 80/20 rule of lifecycle cost matters: an investment in test suites at development time enables safe, fast refactoring over the decades of the system’s life, paying back its cost many times over.

Expected Learning

  • Define technical debt in terms of principal and interest, and name the four quadrants of the technical debt matrix.
  • Explain when deliberate/prudent debt can be a valid business decision, and why inadvertent debt is more dangerous.
  • State the Iron Triangle and apply it to trade-offs in a given scenario.
  • Articulate the professional responsibility of an engineer to push back against unsafe or unsustainable decisions, referencing specific case studies.
  • Explain why automated tests are a prerequisite for safe refactoring.

Past Paper Questions

Example Sheet 1, Question 4 directly addresses technical debt with a legacy system scenario. Example Sheet 1, Question 3(b) asks about the hidden costs of adding developers to a late project, which is a form of communication debt that compounds existing technical debt.