About TechDebt.guru
Last updated . Sources are named and dated inline - how we source claims.
Built by developers, for developers - writing code since 1994, leading engineering teams since 2004

RJ Lindelof
Creator & Technical Debt Survivor
I've been writing code professionally since 1994 and leading engineering teams globally since 2004. If there's one thing I've learned in that time, it's this: every team underestimates tech debt until it's too late.
I've seen tech debt kill products, burn out teams, and tank companies. I've also seen it conquered - not through heroic rewrites or infinite refactoring time, but through smart, incremental strategies that balance business needs with engineering reality.
TechDebt.guru exists because I got tired of having the same conversations over and over:
- "How do I convince my manager we need to fix this?"
- "When is the right time to pay down tech debt?"
- "How do I measure if we're improving?"
- "Is a rewrite really the answer?" (Spoiler: usually not)
This site is the resource I wish existed when I was starting out - practical, no-BS guidance for developers and leaders dealing with the reality of technical debt.
Connect with RJ
Why Listen to Me?
32 Years in the Trenches
From C++ to Java, from monoliths to microservices, from Waterfall to DevOps. I've written (and refactored) millions of lines of code across dozens of languages and frameworks.
22 Years of Leadership
As a VP/Director of Engineering and CTO across many companies, I've managed teams from 5 to 175+ engineers. I've fought (and won) the battles for tech debt budgets.
Global Scale Operations
Built and managed Remote Teams distributed engineering teams across North America, Europe, and Asia. Tech debt problems are the same everywhere - just in different timezones.
Battle Scars & Victories
I've survived (and learned from) catastrophic tech debt failures, successful migrations, rewrites that worked, and rewrites that didn't. Every lesson on this site cost me sleep.
The Work Behind the Advice
Two jobs sit behind everything on this site, and they disagree with each other. One is the developer asking for time to fix something that is quietly costing the team a day a week. The other is the executive deciding whether that time comes out of a roadmap that has already been committed to somebody else. Both positions look obvious from the inside and unreasonable from the outside, which is most of why the conversation goes badly.
The code side started with C++ and Java, on systems that predated most of the vocabulary now used to describe them. Then monoliths, back when a monolith was simply what software was, and later the move to services - along with the discovery that distributing a tangled system mostly distributes the tangle and adds a network hop to every place it hurts. Delivery practice moved the same distance, from release trains planned quarters ahead to pipelines that ship on merge. Each of those transitions was sold as a fix for the previous one, and each of them created a fresh category of debt that nobody had a name for yet.
The leadership side ran from teams of five to organizations well past a hundred engineers, spread across North America, Europe, and Asia. Scale changes almost nothing about what debt is and almost everything about how long it takes to notice. On a small team, the person who took the shortcut is sitting next to the person who hits it. Across timezones, the shortcut and its consequence never meet - the question gets asked while the only person who knows the answer is asleep, and the team works around it instead of asking again.
The pattern that shows up in all of it: the code is not usually the problem. The code is the residue of decisions, and the decisions were usually reasonable at the time and never written down. That is why so much of this site is about conversations, records, and priorities rather than refactoring patterns. The refactoring patterns are the easy part, and they are already well documented by people who do nothing else.
Failure Modes Learned the Hard Way
These are the ones that recur. Not the dramatic outages - those get postmortems and everybody learns from them. These are the slow ones that never produce a single incident to point at, which is exactly why they survive.
The rewrite with no specification
The replacement system implemented what the old system was documented to do. The old system's real behavior lived in its edge cases, and those had never been written down anywhere except the code itself. Customers had built their own processes on top of some of those edge cases, including the ones that looked like bugs. Before replacing anything, the first weeks belong to writing down what the current system actually does - not what it was designed to do. Some of the behavior that looks accidental is load-bearing, and the only way to find out is to enumerate it while the old system is still running.
Debt spread evenly is invisible
Concentrated debt gets fixed, because it produces a module everybody can name and a recurring incident with an owner. Debt spread thinly across every file produces neither. Nothing is bad enough to prioritize, so the whole system just runs slightly slower every quarter and everyone adjusts their expectations to match. Teams in this state describe themselves as having no major tech debt, and they are telling the truth as they see it. The tell is not a bad module - it is estimates that have quietly doubled for work that has not changed.
The team that stopped proposing things
This is the quietest one and the most expensive. After enough proposals go nowhere, engineers stop making them. The debt backlog stops growing. Retros get shorter and more agreeable. From a management dashboard it reads as a team that has finally settled down, and it is actually a team that has concluded that raising things is a waste of effort. Nothing got better - the reporting stopped. A backlog that has not gained an item in two quarters is a signal, not an achievement.
The shortcut that was approved and never recorded
Taking the shortcut was the right call. The deadline was real, the trade was understood, and the decision was correct with the information available. The failure was that it was agreed in a corridor and written down nowhere. Months later the code looks like carelessness rather than a decision, the people who made it have moved on, and nobody remembers the condition under which it was supposed to be revisited. A shortcut with a recorded reason and a trigger is managed debt. The identical shortcut with no record is just a defect with a longer fuse.
The metric that turned into the target
Pick a coverage number, attach it to a team goal, and within a quarter you will have tests that execute code and assert nothing. The measurement was fine as a diagnostic and became worthless the moment it started deciding who looked good. Every metric on this site is offered for that first purpose. When you hand one to a performance review, expect the people being measured to optimize it, because that is what you asked them to do.
And the one that worked
The migrations that succeeded were the boring ones. Old system and new system ran side by side for far longer than anybody wanted, traffic moved across in slices small enough that a bad slice was reversible, and there was never a date on which everything changed at once. They were allowed to be slow, which meant nobody ever had to choose between shipping something broken and admitting the plan had slipped. That is the whole trick, and it is unglamorous enough that it loses most arguments against a rewrite with a launch date.
The Philosophy Behind TechDebt.guru
1. Tech debt is inevitable. Perfect code doesn't exist. Every decision is a tradeoff. The goal isn't zero debt - it's managed, intentional debt.
2. Business value matters. Code quality isn't an end in itself. Clean code enables faster delivery, fewer bugs, and happier developers - THOSE are the goals.
3. Small wins compound. You don't need a 6-month refactoring project. The Boy Scout Rule - leaving code slightly better than you found it - is often more effective than big-bang rewrites.
4. Metrics beat feelings. "The code is bad" doesn't get budget. "Velocity dropped 50% and bugs cost us $40K/month" does. Measure everything.
5. Developers and managers need each other. Engineers can't fix tech debt without time and support. Managers can't ship products without engineering effectiveness. This is a partnership, not a war.
What Makes TechDebt.guru Different
Dual Perspective
I've been both the developer begging for refactoring time AND the executive trying to justify tech investments to the board. I speak both languages fluently.
Practical, Not Theoretical
Every technique on this site has been used in real production environments. No ivory tower advice - just battle-tested strategies that actually work.
Developer-First
This site is made BY developers FOR developers. No corporate jargon, no vendor pitches, no $50K enterprise solutions. Just honest advice from someone who's been there.
Balanced Approach
I won't tell you to fight for 6 months of refactoring time (unrealistic) or to just "ship faster and ignore quality" (unsustainable). The answer is always somewhere in between.
What This Site Refuses To Do
A site arguing that real numbers get budget has no business shipping invented ones. These are the rules, and they are enforced by build gates rather than by good intentions - a rule that lives only in a style guide is a rule that gets broken quietly.
No invented statistics
Every figure resolves to a named publication with a publication year, both visible in the text so you can check the claim without following a link. Not "studies show". Not "research suggests". A build gate fails if a number appears without a source that resolves, which means the rule cannot be forgotten during a rushed edit.
No case study pretending to be something else
The case studies here are composite scenarios built from real-world patterns, with fictional companies and illustrative figures. Every one of them says so on the page itself, in a banner the build inserts rather than an author remembers. The playbook and the arithmetic are the reusable parts; the company is not real and is never presented as real.
No claim rescued by reattribution
When a figure cannot be traced to a real publication, the sentence is deleted - not the footnote. Stripping a bad citation and leaving the assertion standing as a bare claim hides the problem instead of fixing it. An internal audit found roughly three dozen attribution failures on this site, and the remedy was deletion in almost every case.
No unlabelled vendor research
A tool vendor measuring the benefit of its own tool is a legitimate data point and a conflicted one. Both facts get stated. Surveys carry their sample and their fielding date, because a percentage means nothing without knowing who was asked, how many, and when - and in a field moving this fast, when matters enormously.
No gates, no lead capture, no pitch
Nothing here sits behind an email address. The checklists, templates, and spreadsheets download without a form. There is no tool being sold under the cover of advice, which is the main reason this site can say that a given tool will not fix your problem.
No pretending refactoring is always the answer
Sometimes the correct engineering decision is to ship the shortcut, record why, and move on. Advice that always concludes "clean it up" is not advice, it is a preference wearing a lab coat. Where the honest answer is that it depends, this site says so and then says what it depends on.
How Claims Are Sourced
Every source cited anywhere on this site lives in one shared registry file. Each entry records the publisher, the exact title, the year, an absolute link, the date the page was accessed, and a quotation actually read at that link. That last field is the one that does the work: a source nobody can quote is a source nobody read, and requiring the quote makes it impossible to cite a report from its abstract or from somebody else's summary of it.
Because the registry is shared, a correction applied once propagates to every page drawing on the same entry, instead of being patched on the one page where somebody noticed. The build refuses to complete if a citation reference points at an entry that does not exist, or if an entry is missing any of those fields. It also flags large, bold, screenshot-friendly numbers that carry no source at all, since those are the most persuasive elements on any page and were historically the least checked.
The full bibliography, what each source actually argues, and the list of sources this site deliberately refuses to cite are all on the research and citations page. That page also explains why the rules are written this specifically, which is a less flattering story than the rules themselves.
How to Challenge Something on This Site
Corrections are wanted, not tolerated. Use the contact page and send three things: the page URL, the exact sentence you are challenging, and what you believe is correct. If there is a source behind your version, name it. Those three items are enough to act on immediately; a general note that a page seems wrong usually is not.
Factual errors get handled at the registry rather than on the page, so the fix reaches every page using the same source. If a figure turns out to be untraceable, the sentence goes rather than being softened into a vaguer version of the same claim. Dead links and superseded reports count too - a citation that was accurate when it was written and is now pointing at a removed PDF is still a broken claim, and those are easy to miss from the inside.
Disagreements about judgement rather than fact are equally welcome and handled differently, because there is nothing to correct. Advice that works in one context is genuinely wrong in another, and this site tries to say which context it is describing. If you tried something here and it failed, the useful message says what your situation was, what you did, and what happened. A concrete counter-example changes the page. A general objection to the framing usually just gets agreed with, which helps nobody.
The one thing that will not happen is a quiet edit. When a claim is wrong enough to remove, it gets removed, and the site does not pretend it was never there.
Frequently Asked Questions
TechDebt.guru was created by RJ Lindelof, a software engineer and technical leader with extensive experience helping teams measure, communicate, and reduce technical debt. The site draws on real-world experience across startups, enterprises, and everything in between.
Yes. All articles, guides, and frameworks on TechDebt.guru are free to read and reference. Downloads like templates and checklists are also free. If you find the content useful, sharing it with your team or linking to it from your blog is the best way to support the project.
Content is updated regularly to reflect current industry practices, new tools, and emerging debt categories like AI-generated debt. Major articles are reviewed quarterly. The site aims to be the most current and comprehensive resource for technical debt management available.
Absolutely. Reach out through the contact page with topic suggestions, corrections, or proposals for guest content. Practitioners with real-world case studies and hard-won lessons are especially welcome.
Yes. For teams that need hands-on help with technical debt assessment, remediation planning, or developer training, consulting engagements are available. Visit the contact page or reach out directly to discuss your specific needs.
Send it in. Use the contact page with the page URL, the exact sentence, and the source you believe is correct. Factual corrections are applied to the shared citation registry, so the fix propagates to every page that draws on the same source instead of being patched in one place. When a figure cannot be traced to a real publication, the sentence is deleted rather than reattributed to a better-sounding source. Disagreements about judgement rather than fact are welcome too - a concrete counter-example from your own team is far more useful than a general objection.
Related Resources
Get in Touch
Have questions about technical debt or want to discuss consulting? Reach out directly.
For Developers
Practical strategies and techniques for developers dealing with technical debt every day.
What Is Tech Debt?
Start with the fundamentals -- understand what technical debt is and why it matters.
Get In Touch
Questions? War stories to share? Just want to vent about legacy code?
Tech debt doesn't have to be a crisis. With the right strategies, it's just another engineering challenge - one we can solve together.
- RJ Lindelof