Skip to content
DevMeme
2181 of 7435
The Peril of Permanent Temporary Fixes in Legacy Code
TechDebt Post #2433, on Dec 9, 2020 in TG

The Peril of Permanent Temporary Fixes in Legacy Code

Why is this TechDebt meme funny?

Level 1: Wobbly Table Leg

Imagine a kitchen table with one leg shorter than the others. It wobbles a lot, so someone slips a big book (and maybe a couple of magazines) under that short leg to prop it up. This quick fix was only meant to be there for a day or two until the leg could be repaired, but then it ends up staying there for years! Eventually, everyone in the house gets used to seeing those books under the table. One day, a child notices this odd setup and exclaims, "We should really fix that table leg properly!" But all the adults immediately wave their hands and say, "No, no — don't touch it!" They're worried that if you pull the books out now, the whole table might collapse and all the dishes on top could crash down. So the "temporary" solution stays there, basically forever. It’s funny because the child is right that the table needs a real fix, but by this point the grown-ups are too scared to change anything since the table hasn’t fallen yet. This is exactly like what’s happening in the meme: the junior developer is like that eager child who wants to fix the problem properly, and the senior developer is like the cautious adult who doesn’t want to disturb the only thing holding everything up (in the meme’s case, a shaky pile of rocks under a shed).

Level 2: Temporary Fix, Permanent Problem

In simpler terms, this meme highlights technical debt and caution born from experience. The red shed propped up by a pile of stones is like an old program being supported by a quick workaround. A temporary fix is a change made under pressure to solve an immediate problem, with the intention to replace it later with a proper solution. But sometimes "later" never comes. Over the years, that quick fix becomes part of the system’s legacy code – the old code that’s still in use, often poorly documented or understood by current developers.

For a junior developer, spotting a clumsy, makeshift solution in the code can be surprising. They might think, "This is clearly a bad way to do it; I can rewrite it correctly." This enthusiasm is great for improving code quality, and it’s true that the code likely has a code smell (a sign that something is off, like a function literally named quickFix() or a comment reading // TEMPORARY HACK). However, senior developers often react cautiously because they've seen how fragile these workarounds can be. The meme captures that with the senior saying no one dares touch the fix now. This reaction comes from experience: when a fix is holding up something important (like those stones holding up the shed), changing it without a solid plan could break things unexpectedly.

Refactoring is the process of cleaning up and restructuring code without changing what it does, in order to improve its design and readability. In a healthy project, teams refactor regularly to pay down technical debt and keep the code maintainable. But in some aging legacy systems, parts of the code become so delicate or critical that everyone grows afraid to change them. This is sometimes jokingly called a "frozen" code area – it's working, and no one wants to risk melting it. That fear comes from not knowing all the side effects the "temporary" fix has accumulated. Perhaps the original problem that led to the quick fix is long forgotten, or the person who wrote the fix has since left the company. There might not be good tests to ensure nothing else breaks if we tweak it. It’s a bit of a maintenance nightmare: the code is messy, but it’s also crucial, so you're stuck with it until you can safely overhaul it.

So, when the junior dev in the meme asks "What’s that? I think I can do better!", they’re seeing the obvious issue (just like noticing a wobbly support under a shed) and they want to fix it. The senior dev responds with a mix of humor and warning: "It's been like that for so long, touching it is scary now." This highlights a common dynamic in software teams: the Junior vs Senior perspective. The junior sees an opportunity for improvement, and the senior sees a risk of breaking something that currently works. Neither side is wrong – the code should be fixed eventually, but it has to be done very carefully, with lots of testing and understanding. Until then, that goofy workaround – represented by the stack of rocks in the meme – stays in place, doing its job while everyone keeps an eye on it, hoping it doesn’t all come tumbling down.

Level 3: Load-Bearing Hack

Picture an ancient codebase where a critical piece of logic is held together by a quick hack thrown in years ago under pressure. The meme’s sagging red shed, propped up by an uneven stack of stones in place of a missing beam, is a perfect metaphor for this kind of brittle workaround in software. This so-called temporary fix has quietly become an ugly but essential part of the system’s structure – a load-bearing hack that everyone depends on, but nobody wants to touch.

In the image, the junior developer’s line “I think I can do better!” is the hallmark optimism of someone who hasn’t been burned by such legacy code yet. They see that shaky stone pillar and immediately want to replace it with a sturdy solution. The seasoned senior dev, however, has that 3 A.M. wariness: “That's been temporary so long that nobody dares touch it now.” Every senior on the team recognizes a long-term "temporary" fix when they see one – it's the kind of code that was supposed to be a stopgap for a week but somehow survived a decade of production updates. Over time, other features accidentally started relying on that quirky behavior, and now it's effectively holding up the entire shed (or system).

Why is this scenario so scary to experienced engineers? Because they've learned the hard way that touching a makeshift solution like this can unleash an avalanche of unexpected bugs. It's the software equivalent of pulling one rock from the bottom of a Jenga tower: the whole structure might collapse. Chances are, the original hack was put in place to quickly patch a severe production issue, perhaps during an on-call firefight at 3 AM. There was likely a // TODO: replace with proper fix comment left in the code, a ticket in the backlog titled “Refactor shaky workaround,” and solemn promises that refactoring would happen after the next release. But as deadlines passed, that patch became part of the foundation. Everyone who remembers how it got there has either left or moved on, and the technical debt interest on that hack has been compounding ever since.

In an ideal world, the team would replace the stone pile with a solid beam – rewrite the hacky code into a clean, robust solution. But in reality, the seniors know that “fixing” these kinds of entrenched code smells often unearths a nest of other problems. Perhaps that stone stack is also plugging another unseen crack in the wall. The legacy system might have zero automated tests around this area, so nobody is quite sure what will break if it’s removed. The code might be so tangled (spaghetti-like) that this hack has unintended side effects which have strangely become features over time. A fearless new dev might insist, "Let's rip out this kludge and do it right," but a battle-scarred engineer recalls the last attempt to do that, which ended in an emergency rollback on a Saturday night. It's a classic maintenance nightmare: the fear of refactoring is real, because when a "temporary" fix lasts this long, it's usually tightly coupled to many other fragile pieces.

In short, the humor (and horror) here comes from how a one-off workaround meant for a day becomes the permanent linchpin of a project. Every senior engineer has that one story of a kludgy fix living far beyond its intended lifespan. That precarious stone column in the picture is basically a shrine to technical debt: it does the job, but no one's proud of it, and everyone is terrified of being the one who knocks it over. Better to tip-toe around it, gently warning newcomers, "yeah... don't mess with that part."

To illustrate, we might even imagine a snippet from that legacy code:

# Temporary hotfix applied in 2010:
try:
    critical_operation()
except Exception:
    # TODO: Remove this hack once the real issue is resolved (Target: Q1 2011)
    handle_error_quietly()  # swallow the error and keep going

This comment has aged like milk. By now, that "real issue" might be long forgotten, and this hacky handle_error_quietly() call is now mission-critical. The senior devs treat it with a mix of respect and dread – it's the "stack of rocks" bugfix propping up their world. They all know that code’s unofficial motto by heart: “If it ain’t broke (even if it’s held together by rocks and duct tape), don’t fix it.”

Description

A two-panel meme contrasting the perspectives of a junior and senior developer. The top panel has text that reads, 'Junior Dev: What's that? I think I can do better!'. Below the text is an image of a red wooden building's foundation being propped up by a precarious and haphazard stack of large, weathered stones. The bottom panel contains the text, 'Senior Dev: That's been temporary so long that nobody dares touch it, now.' The meme humorously illustrates the concept of technical debt and the danger of 'temporary' solutions becoming permanent, critical fixtures in a system. For experienced developers, it's a relatable scenario where a junior's well-intentioned desire to refactor and improve code is met with a senior's hard-won wisdom about the risks of touching a fragile, undocumented, but mission-critical part of a legacy application

Comments

7
Anonymous ★ Top Pick We call that 'Jenga Driven Development'. The source code comment just says 'DO NOT TOUCH', which also serves as its only unit test
  1. Anonymous ★ Top Pick

    We call that 'Jenga Driven Development'. The source code comment just says 'DO NOT TOUCH', which also serves as its only unit test

  2. Anonymous

    That wobbly stone pillar is basically our TemporarySupportFactoryImpl - so load-bearing in the call graph that the architecture diagram just says “here be dragons,” and the incident playbook’s only step is “back away slowly.”

  3. Anonymous

    The only difference between a temporary workaround and permanent infrastructure is whether the original developer still works there to explain why touching it will bring down production, three microservices, and somehow the office coffee machine

  4. Anonymous

    Ah yes, the legendary 'temporary' fix from 2003 that's now load-bearing infrastructure. The junior dev sees a house of cards and thinks 'I can rebuild this properly in a weekend.' The senior dev knows that rock stack is actually holding up three microservices, two legacy APIs, and someone's quarterly bonus - and the original developer who understood why it's stacked that way left the company seven years ago. Touch it and you'll spend the next month in incident reviews explaining why you thought refactoring the authentication layer during Black Friday was a good idea

  5. Anonymous

    Junior sees tech debt; senior sees a load-bearing monolith that's survived three tech stacks and two layoffs

  6. Anonymous

    That hotfix outlived three release trains - so it got a CMDB entry, an SLA, and a recurring change freeze

  7. Anonymous

    Rule of thumb: if a “temporary” fix survives two quarters, it’s part of the architecture - this rock pile is our cron job with SLOs; touch it and prod relearns gravity

Use J and K for navigation