I can't tell you how many times over the years I've heard some version of this: "Let's just do this for now, and we'll come back and clean it up later."
I've probably said it myself more times than I'd care to admit. And sometimes that's exactly the right decision. You're trying to get a release out, a customer has a legitimate problem, production is down, or there's a deadline that simply can't move.
The business needs something now, and the perfect solution might take three weeks when a perfectly acceptable solution can be done in three days. So you make the practical decision. You fix it, ship it, and move on.
Then something funny happens.
Nobody comes back.
The Problem Isn't Taking Shortcuts
I don't believe technical shortcuts are automatically bad. I've spent too many years working in technology to believe everything can always be designed perfectly from the beginning.
Sometimes you simply don't know enough yet. Sometimes the business can't wait. Sometimes you have to make a reasonable tradeoff between what you'd like to build and what you can realistically build today.
That's business. The problem isn't the shortcut. The problem is forgetting that you took one.
Six months later, the temporary solution is still there. A year later, somebody builds something else on top of it. Two years later, the developer who originally created it has moved on.
Now a new developer finds it and asks the obvious question: "Why does this work this way?"
And nobody really knows.
The temporary fix has become architecture.
"We'll Come Back to It" Needs a Date
This is where I think organizations can do better. If we're knowingly making a compromise, there should be some recognition that we're borrowing against the future.
Maybe we put it into the backlog. Maybe we document why the decision was made. Maybe we identify what the better long-term solution should look like.
It doesn't need to become a 40-page technical document. Sometimes a few sentences are enough: Here's what we did. Here's why we did it. Here's what we should eventually change.
That little bit of context can be incredibly valuable two years later when someone is staring at the code wondering what the heck we were thinking. Without it, the next person has to reverse-engineer not only the software, but also the decision behind it.
Success Can Actually Make This Worse
This is one of the strange things about successful products. If the temporary solution works, there's less pressure to replace it.
The customer is happy. Production is stable. The next opportunity arrives. Engineering moves on.
Why spend two weeks improving something that's working when Sales has a new customer waiting for a feature? That's a perfectly reasonable question.
But ask it enough times, and eventually the platform becomes a collection of things that were all supposed to be cleaned up later.
That's when technical debt stops being a few isolated compromises and starts becoming the way the organization operates.
Then the Firefighting Starts
Eventually those old decisions begin interacting with one another. Changing one thing unexpectedly affects another. Developers become cautious about certain areas of the application. Testing takes longer because there are more scenarios nobody wants to accidentally break.
Then something fails in production. Everyone jumps on a call. The team investigates. Somebody finds the problem and patches it.
Great. Crisis over.
But here's the question I think we need to ask more often:
Did we fix the problem, or did we create another temporary fix?
There's a big difference. If every production issue results in another patch layered on top of the previous patch, we're not really reducing technical debt.
We're refinancing it.
The Backlog Can Become a Graveyard
Most technology organizations have a backlog filled with good intentions. Refactor this. Improve that. Replace this old process. Add automated testing here. Clean up that integration.
Everyone agrees the work should happen. It just never becomes more important than the next customer request, production issue, deadline, or revenue opportunity.
Eventually the backlog becomes less of a plan and more of a historical record of things everyone agreed were important but nobody ever prioritized.
That's not really an Engineering problem. It's a leadership problem.
If we tell Engineering to address technical debt but allocate 100% of their time to everything else, we've already made the decision for them.
Some Debt Is Worth Carrying
I also don't think every shortcut needs to be revisited. Sometimes the temporary solution turns out to be perfectly adequate.
If it's stable, understandable, secure, supportable, and isn't preventing the platform from moving forward, maybe there are better places to spend the time.
That's another lesson experience teaches you. Not every ugly piece of code needs to be beautiful. Not every old component needs to be modernized. And not every technical debt item deserves to be paid off.
The trick is knowing the difference between debt that's harmless and debt that's quietly accumulating interest.
Leave Breadcrumbs for the Next Person
If I could change one thing about how organizations handle these decisions, it would probably be this: leave breadcrumbs.
Document why. Create the ticket. Write the comment. Explain the tradeoff. And if something really is temporary, give somebody ownership of deciding when it stops being temporary.
Because two years from now, the person trying to understand that decision might not be you.
I've been that person plenty of times. You stare at something and think, "Who would possibly build it this way?"
Then you dig a little deeper and discover there actually was a pretty good reason. Or worse, you discover the reason was simply: "We were going to come back and fix it later."
Later has a funny way of never showing up.
And that's how temporary fixes become permanent platforms.
Thanks,
Michael Cronin
Website: https://www.michaelcronin.info
LinkedIn: https://www.linkedin.com/in/michaeltcronin/details/experience/