Pulse
7 7IT Solutions
Custom Software

Technical Debt, Explained for Business Owners (What It Is and When It Hurts)

Lior Aharonov Lior Aharonov 15 min read

Technical debt is the sum of shortcuts your software took on the way to today. Each shortcut was a loan: it bought speed when speed mattered, and it charges interest, because every shortcut makes the next change to the system a little slower and a little riskier. You never see the debt itself on any invoice. You see the interest: the two-line change that takes two weeks, the estimate that keeps growing for "unrelated" reasons, the one developer who is the only person willing to touch the billing code.

Like financial debt, technical debt is not automatically bad. Taken deliberately, it is often the smartest move available. The danger is not carrying debt. The danger is not knowing where it is, which is why the useful owner question is never "why is my team so slow?" but "what is my team paying interest on?"

The short version

  • Debt is invisible, interest is not. You experience technical debt as slowness, fragility, and estimates that no longer make sense, never as a line item.
  • It accumulates innocently. Reasonable shortcuts under real deadlines, plus staff turnover, plus aging dependencies, plus the prototype that never got rebuilt. Nobody has to be incompetent.
  • The price is documented and large. Stripe's Developer Coefficient study put developer time spent on technical debt at roughly 13.5 hours per week, about a third of the working week.
  • Some debt is smart. Early on, before you know what the business needs, shortcuts are cheap tuition. Debt taken knowingly, and written down, is a tool.
  • Strangulation has recognizable symptoms. Feature delivery slowing quarter over quarter, "fragile" entering the vocabulary, key-person risk around one module, and fear of deploys.
  • You pay it down where you are about to build, not everywhere at once, and a rewrite is the last resort, not the first proposal.

What is technical debt in plain terms?

The metaphor comes from inside your world, not ours. In 1992 the programmer Ward Cunningham, working on financial software, needed to explain to his industry colleagues why shipping quickly now could mean moving slower later, and he reached for the language of the loan: shipping the first version fast is like taking on debt. A little debt speeds things up, as long as you pay it back promptly. Leave it unpaid, and every minute spent working around the shortcut counts as interest.

Here is what a shortcut looks like in practice. Your developer needs order data to reach the accounting system. The correct version handles every case: refunds, partial shipments, currency edge cases, the customer with two accounts. The fast version handles the normal case and quietly assumes the weird ones will not happen this month. Under a real deadline, the fast version ships. That was the loan. The interest starts later: every future change to orders must first rediscover the assumption, work around it, and test that the workaround did not wake anything up. One shortcut costs minutes. Eight years of them, layered on top of each other by different people under different deadlines, is why a "small change" to a mature system can cost more than the whole system cost in year one.

The essential point for an owner: no one has to do bad work for this to happen. Technical debt is the natural byproduct of software surviving contact with a real business. The only systems with no debt are the ones nobody uses.

How does technical debt accumulate?

Four sources produce most of it, and only the first is a choice.

Deliberate shortcuts. "Ship it now, clean it up later" is sometimes exactly right, and later never gets scheduled because later has its own deadlines. This is the classic loan, and it is fine when it is written down and wrong when it is silent.

Vanished context. The developer who built the inventory module leaves, and the reasons behind a hundred small decisions leave with them. Code without its context becomes code nobody dares refactor, which means every future change gets bolted on beside it rather than built into it. Turnover converts even good code into debt.

Rot you did nothing to cause. Software sits on a stack of other people's software: frameworks, libraries, payment APIs, operating systems. All of it moves. Skip the small, boring updates for three years and you owe one giant, risky update instead, and until you pay it you are locked out of security patches and modern tools. This is the maintenance debt we broke down in your software maintenance budget, explained, and it accrues even while the code sits untouched.

Success itself. The most common origin story we see in audits: a prototype built to test an idea works, customers arrive, and the prototype quietly becomes the production system, carrying design decisions made for a demo into a business ten times the size. The same thing happens with no-code tools stretched years past their honest limits, a pattern we mapped in the limits of no-code. Nothing failed. The business simply outgrew the assumptions, and the gap between the assumptions and the reality is debt.

What does technical debt actually cost?

The best-documented number comes from Stripe's Developer Coefficient study, which surveyed roughly a thousand developers and executives about where the engineering week goes. Developers put the time spent dealing with technical debt at about 13.5 hours per week, and spent roughly 17 hours a week on maintenance work overall, out of a 41-hour week. Stripe priced the global drag of bad code at around 85 billion dollars a year. The full report is worth ten minutes of any owner's time, because the numbers explain a mystery many owners privately carry: why a full-time developer, or an agency on retainer, seems to produce so much less new capability than the hours suggest. A third of the week is going to interest payments before any new work starts.

But the spreadsheet cost is the smaller half. The strategic cost is speed. The competitor whose system is cheap to change ships the customer request in two weeks; your team quotes six, and the quote grows. Prices you could test, integrations you could offer, reports you could give customers: each one is priced not on its own merits but on the interest surcharge of the code it must touch. High technical debt is a tax on every future idea, and unlike most taxes, it compounds quietly until someone measures it.

There is a cultural cost, too, and owners feel it before they can name it. Estimates stop being believed. Deploys happen only on Fridays with held breath, because nobody is quite sure what a release will break, the same fear of change that shows up in projects heading toward the cliff, as we cataloged in why custom software projects fail. Your best developer spends their genius keeping the old thing alive instead of building the next thing. None of that appears in any report, and all of it is interest.

When is technical debt fine?

Here is the part of the conversation most owners never hear, because it is against the interest of anyone selling rewrites: sometimes taking on technical debt is the correct business decision, and we say so in our own projects.

Debt is smart when you do not yet know if the thing should exist. Before an idea is validated, pristine engineering is money spent polishing assumptions. The first phase of a new product should take shortcuts, deliberately, in the parts most likely to change, because half of them will be thrown away when reality reports back, and you cannot owe interest on code you deleted.

Debt is smart when a real deadline is worth more than clean code. The trade-show demo, the season you must not miss, the contract that needs one feature by March. Speed has real business value, and a shortcut that wins the contract paid for itself, whatever it costs to clean up.

Debt is even fine when it lives in code you will never touch again. A stable internal tool that does its one job and never needs to change can be held together with tape indefinitely. Interest is only charged on change; where there is no change, ugly code is free.

The condition on all three: the debt must be taken knowingly and written down. One shared list, in plain language: "orders assume a single warehouse," "the reporting job is a manual script," "the customer merge is done by hand." Ten lines like that, kept honest, is the difference between debt as a tool and debt as a trap, because the trap is never the shortcut itself. It is the shortcut nobody remembers taking.

When does technical debt start to strangle?

The interest becomes the story when you see these symptoms cluster:

  • Delivery is slowing quarter over quarter on the same kind of request, with the same team. Features that took two weeks last year take six now.
  • Estimates grow after work starts, repeatedly, for "things we found." The unknowns inside the code now outweigh the knowns.
  • One module has a single keeper. Only one person touches billing, or inventory, or the integration, and their vacations are scheduled around releases. That is not expertise, that is the interest on vanished context.
  • The word "fragile" shows up in meetings, and small changes are batched into rare, tense releases because every deploy feels like surgery.
  • Bugs return. The same class of problem, fixed again and again in different costumes, means the fix keeps being applied to the symptom because the cause is too expensive to reach.
  • Good people get frustrated. Developers want to build. When the honest ones start saying "I can't do this cleanly in there" or quietly leave, the debt has started charging interest in salaries and turnover.

Any one of these can have another cause. Three or more, persisting across quarters, is a balance sheet problem wearing an engineering costume.

How do you find out where your debt is?

You do not need to read code to map your debt; you need to ask the system and the team the right questions. When we run a technical audit at 7IT, the surfacing steps look like this:

  1. Ask each developer the one question. "Which part of the system would you least like to change, and why?" The answers map the debt better than any tool. If everyone names the same module, you have found where the interest payments go.
  2. Trace the money paths. Orders, invoicing, payouts. Debt in a rarely-used admin screen is trivia; debt in the code that touches revenue is risk. We rank findings by the money they sit next to, not by how offensive the code is.
  3. Audit the foundations. Framework and library versions against their support windows, security patches pending, services running on unsupported platforms. This is the objective, countable layer of debt, and it often carries the most urgent items.
  4. Measure the change history. The files that change most often, combined with where bugs cluster, show where the system fights back. High churn plus high bug density is interest you can point at.
  5. Check the safety nets. Can the team rehearse a change safely outside production? Does anyone find out about failures before customers do? A system with no visibility into its own behavior hides its debt until the worst moment, which is why we treat the basics in observability for small apps as part of the debt picture, not a separate topic.
  6. Write the owner's version. The deliverable that matters is one page in business language: here are the five debts, here is the interest each one charges you today, here is what each costs to retire, and here are the two that are fine to keep carrying. Debt you can see is a decision. Debt you cannot see is a fate.

How do you pay it down without stopping the business?

Not with a grand pause, and almost never with the full rewrite that gets proposed first. "Stop everything and rebuild" replaces a known system with a two-year bet, and the new system starts accumulating its own debt on day one.

The strategy that works is interest-first: pay down debt exactly where you are about to build. Next quarter's feature touches the order flow? The order flow's worst shortcut gets retired as part of that work, priced into the phase, so the cleanup rides on the back of something the business already wants. Debt in code no roadmap touches keeps its low priority, politely, forever. Alongside that, a standing slice of every phase, we typically hold ten to twenty percent, goes to the foundations: updates, the worst fragility, the missing safety nets. Structured this way, each phase leaves the system slightly healthier than it found it, and the debt curve bends without the business ever standing still. It is the same fixed-scope, milestone-by-milestone shape we use for all our work, laid out in how we build custom software, step by step, because a cleanup deserves the same discipline as a feature: agreed price, visible finish line, working software at the boundary.

If your system has developed a room nobody wants to enter, or your estimates have quietly tripled over two years, tell me what change scares your team most and I'll tell you what an audit would look for in your case, and whether your debt sounds like the kind to retire or the kind to keep calmly carrying.

Common pitfalls

Owners tend to mishandle debt in a handful of consistent ways, most of them well-intentioned.

  • Cleaning the ugliest code instead of the riskiest. Refactoring whatever offends the eye, rather than the code your revenue actually flows through, spends the budget where nothing was accruing and leaves the dangerous parts untouched.
  • Replacing the one keeper. Removing or reassigning the sole person who understands a fragile module to "reduce key-person risk" detonates the hidden context instead of defusing it, and delivery in that area stops cold.
  • Cleanup with nothing to show. Booking a pure refactor quarter that ships no visible result burns the goodwill you needed, so the business loses its appetite and cancels the very paydown that was working.
  • Carrying debt on a mental note. Shortcuts everyone "remembers" are shortcuts no one has written down, so the list that would have made the debt a deliberate choice never exists when it matters.

A company decided its fragile billing module was too dependent on one engineer, so it moved her onto other work to spread the knowledge around. No one else could safely touch the code, billing delivery froze for a quarter, and the well-meant "risk reduction" converted a slow but understood area into a locked one. The cheaper move was the opposite: keep her on it long enough to document and dismantle the single worst shortcut, retiring the danger rather than the only person who could see it.

FAQ

What is technical debt in simple terms?

It is the built-up cost of every shortcut your software has taken: the quick fixes, the assumptions that stopped matching the business, the updates put off for another day. You never get an invoice for it. You pay it as friction instead, work that should take a day taking a week, estimates that swell for reasons nobody can quite name, and a codebase fewer and fewer people are willing to touch.

Is technical debt always bad?

No. Debt taken deliberately is often the right business call: before an idea is validated, when a deadline is worth real money, or in stable code that will never need to change again. Early-stage shortcuts are cheap tuition, and interest is only charged on code you keep changing. Debt becomes dangerous when it is invisible, when nobody remembers the shortcuts exist, and when it sits in the code your revenue flows through.

How do I know if my business has a technical debt problem?

Look for clustered symptoms across quarters: the same kinds of features taking visibly longer than a year ago, estimates that grow after work begins, one irreplaceable person guarding one module, rare and tense releases, and recurring bugs. Any single symptom can have other causes; three or more that persist mean your team is spending a large share of its week paying interest, in line with the roughly 13.5 hours per week Stripe's research documented.

How much does technical debt cost companies?

Stripe's Developer Coefficient study, which surveyed about a thousand developers and executives, found developers spend roughly 13.5 hours of every working week dealing with technical debt, around a third of their time, and estimated the global cost of maintaining bad code at about 85 billion dollars a year. For a small business the practical cost is speed: every feature is priced at its true cost plus the interest surcharge of the code it has to touch.

Should we rewrite our software from scratch to eliminate technical debt?

Almost never as the first move. A full rewrite trades a known, working system for a long, expensive bet, loses years of embedded edge-case knowledge, and starts accruing its own debt immediately. The better default is interest-first paydown: retire debt in the exact areas the roadmap is about to touch, reserve a fixed slice of each phase for foundations, and consider a rebuild only for components where an audit shows the interest genuinely exceeds the rebuild cost.

Have a project in mind?

Let's turn it into custom software that moves your business forward.