Let's not call it "tech debt," it's just "mess"

46 points by jdh


chrismorgan

I disagree with this article’s definitions and assumptions of the meaning of the word “debt”.

Oh, you think entities taking on debt always understand what they’re getting themselves into? Individuals definitely don’t—in fact, lots of debts arise where no decision was consciously made. I don’t see any reason to expect businesses are much wiser.

Many get into debts that they cannot reasonably understand (subtly different from “which cannot reasonably be understood”, though that’s often true too) at the time the decision is made, and many debts have unexpected consequences down the line. So “tech debt” doesn’t feel an unreasonable label to me.

The problem with saying "technical debt" in these situations is it makes you look unserious. If you use "technical debt" to mean "a problem we didn't realize would be there when we made this decision" it makes you look like you take on debt without reading term sheets.

By this definition the world is chock full of unseriousness. Individuals take on debt without reading term sheets all the time, and I’ve seen enough of small business to know that it’s much the same, and I doubt it’s fundamentally better at medium and large business from the snippets I’ve seen from outside.

When I first read that line, I thought immediately of Luke 11:45–46. Jesus criticised the scribes and Pharisees for their hypocrisy, and one of the lawyers responded “hey, you just insulted us too!” clearly expecting an apology, but he rather said “yes, I meant to!”

Perhaps saying “technical debt” in these situations does make you look unserious—and perhaps you are.

jdh

This reminds me of the talk Technical Debt as Theory Building and Practice, which makes the case that home repair is a useful metaphor for thinking about and discussing technical debt. It's been a while since I watched it, so I may be misremembering some of it, but that aspect really stuck with me at least.

adamshaylor

Technical debt simply doesn’t exist. Real debt has an interest rate, a principal balance, and terms—all finite, concrete things with measurable costs to maintain and pay off. Technical debt has none of them. Therefore, code cannot carry debt, only regret.

I grew up down the street from Ward Cunningham, the guy who coined the term “technical debt.” He’s a lovely and very smart fellow. I didn’t really absorb much about computing from him at the time. He and my dad mainly talked about PSK31. I mainly talked with his son about science fiction. I was still too much of a novice programmer to appreciate what a celebrity we had in our neighborhood. It was only much later as a software professional that I really appreciated his contributions (e.g. to Agile development and the wiki), and to respect and perhaps to an extent even idolize him. It’s with some trepidation that I criticize this term he coined. But, after two decades in industry, it never sat right with me, and not just because it’s often conflated with “mess.”

Those I’ve known who used “technical debt” most accurately did so to retroactively euphemize design decisions that, however cleanly they were implemented, later became obstacles to extending or maintaining a software project. I say “euphemize” because I have never known anyone to forecast future requirements perfectly and exceedingly few who understood the original requirements with 100% accuracy for anything much beyond a solo project. Therefore, to label code that no one predicted would later be regretted as an intentional act of an investor taking out a carefully calibrated loan is a tactic of conviction comparable to that of religious prophet.

Early on in my career, I when I found some code written by a senior dev that broke some maxim they taught me, they’d say, “I meant to do that. It’s technical debt. I took out a loan for us to pay off later.” It was nearly impossible to validate such claims—to distinguish between accidental debt and intentional debt. The scrupulous left comments in their code explaining what they anticipated might be surprising to its readers, but no one ever kept an exhaustive tally of all of this “debt” and no one seemed to know what would be required to pay it all off. The more maxims one learned, the more they contradicted each other: DRY versus the rule of three; premature optimization versus designing for performance; convention over configuration versus explicitness; do one thing well versus batteries included; self-documenting code versus literate code; fail fast versus the robustness principle; TDD versus BDD versus type-driven development and then back to TDD again with formal methods. It’s desirable for teams to consistently choose defaults from among these conflicting styles, but to cite them for the purpose of identifying debt has always smacked of hindsight to me.

Regrettable code is inherently paradoxical. A whole team of experienced professionals can agree that a piece of code is beautifully written one day and then come to regret it the next. Context is everything. It cannot be perfectly known, much less predicted. One can positively identify regrettable code in advance, but one can only negatively identify it (i.e. “we did not regret this code”) in retrospect; the only code anyone can say with certainty will never be regretted is the code that’s never run. Learning to write less regrettable code is more of an artistic practice than an economical one. It balances an intuition of the needs of humans—both for the present and in the near future—with a practical expertise in the tools used to build and run it.

dmcgrath

Other times people say "debt" to mean "this isn't to my taste." I've known teams that decided their proliferation of container images was "technical debt" and spent a few weeks consolidating them into one image. Then a year later and with some new personnel on the team, they decided that having a single container image for everything was "debt" and broke it up into a bunch of focused images.

I'm not against aesthetic judgements. They're underrated in our field. I don't even think either version of that team necessarily did the wrong thing. But "this work is organized in a certain way that has tradeoffs I don't like," isn't "debt."

I've seen this sort of advocacy for, essentially, pet projects at a lot of companies over the years and I do think it's made me skeptical any time I hear the phrase "tech debt" now.

pm

Well yes, that's what many of us always thought of it. But business does like it. The whole "agile" methodology has its merit for putting frequent customer input in the center. But other than that, it is essentially a culture created to accommodate lack of skill and competence.

You wouldn't need agile if projects were mostly delivered on time and properly planned/spec'ed. Of course management and business likes it too. Speculative markets go by company growth, often measured by how many employees a company has, or its budget.