Confession Booth: The Shameful Production Code British Developers Refuse to Delete
Let's establish something upfront: every development team in Britain has it. The file nobody opens unless absolutely forced to. The function with a name like doTheThing_v3_FINAL_actuallyFinal. The commented-out block that's been sitting there since the Obama administration with a note that says // not sure if we still need this — Dave.
Dave left in 2017. Nobody has contacted Dave.
Technical debt is the polite term for this. 'Legacy code' is another favourite, deployed in the same tone of voice one might use to describe a relative who makes scenes at weddings. The more honest term — the one developers use amongst themselves, in hushed tones, after the second pint — is 'the shame pile.'
And the shame pile is everywhere.
The Taxonomy of British Technical Embarrassment
Not all shameful code is created equal. In the course of researching this piece, we spoke to a number of UK developers who were willing to confess their worst production sins on condition of anonymity, which tells you everything you need to know about the psychological weight of this stuff.
What emerged was a rough taxonomy of technical shame, which we present here as a public service.
The Temporary Solution That Outlived Everyone Who Knew It Was Temporary. One backend developer at a mid-sized Manchester fintech described a date-parsing workaround introduced as a 'quick fix' before a product launch in 2016. It was, he explained, 'technically wrong in a way that only mattered in edge cases.' Those edge cases have since occurred approximately eleven thousand times. The workaround handles them. Nobody knows why. Nobody is touching it.
The Comment That Became Load-Bearing. A frontend developer in Bristol told us about a block of commented-out CSS that, when a junior dev removed it during a tidy-up, caused the checkout button to disappear on mobile Safari. The commented-out code was, as far as anyone could tell, doing nothing. Except it clearly was doing something. It went back in. It remains.
The Function Nobody Can Name Correctly. Several respondents mentioned functions with names that had ceased to reflect their actual behaviour at some point in the distant past. One particularly poetic example: a function called calculateShipping that, through a series of incremental modifications, now also handles VAT, promotional discounts, and — for reasons that were described to us as 'historical' — sends a Slack notification when orders exceed £500.
The Tribal Knowledge Timebomb. This is the most dangerous category, and the one that generates the least visible shame because it isn't in the code at all. It's in one person's head. One senior developer at a London SaaS company described a deployment process that required a specific sequence of manual steps, known only to herself, because 'the pipeline breaks if you don't do it in the right order and I've never had time to document why.' She had been meaning to write it up for three years. The company had scaled to sixty people. She was, she noted, 'the single point of failure for the entire release process.'
Why Nobody Talks About It
The silence around technical debt in British dev teams is partly cultural — there's a very British instinct to not make a fuss, to quietly carry the burden rather than announce that something is broken — and partly structural. Admitting the shame pile exists requires explaining how it got there, which means implicitly criticising past decisions, which means potentially criticising past colleagues, which is uncomfortable, which means it doesn't happen.
There's also a perverse incentive at work. The developer who built the terrible thing is often also the only person who understands it, which gives them a kind of job security that nobody will openly acknowledge. This is not a conspiracy. It's just how things calcify.
The result is that shame piles grow quietly, in the dark, like very expensive mould.
The Shame Spiral and How to Break It
Here is the thing about technical debt that the shame around it obscures: having it is not the problem. Every codebase of any meaningful age has it. The problem is the silence. The problem is the fixThisLater comment that never gets a ticket raised against it, the workaround that never makes it into the post-mortem, the tribal knowledge that lives in one person's head and nowhere else.
The shame spiral works like this: the code is embarrassing, so nobody talks about it; because nobody talks about it, it never gets prioritised; because it never gets prioritised, it gets worse; because it gets worse, it becomes more embarrassing; and so the cycle continues until something breaks in production at 11pm on a Friday and everyone is suddenly very interested in Dave's commented-out function.
Breaking the spiral requires, above all else, normalising the conversation. Not in a corporate 'psychological safety' way that involves a workshop and a feelings chart, but in a practical, matter-of-fact way. The shame pile exists. Everyone knows it exists. The question is what to do about it.
Practical Steps for the Genuinely Mortified
A few things that actually work, drawn from teams that have successfully surfaced their shame piles without the whole thing descending into a blame festival:
The amnesty ticket. Create a Jira label — or whatever you use, we're not here to judge — called something neutral like 'legacy concern' or 'technical note'. Give the team permission, explicitly and publicly, to raise tickets under this label without any expectation that they'll be fixed immediately. The goal is visibility, not immediate action. You cannot prioritise what you cannot see.
The shame-free retro. Run a retrospective specifically about technical debt, with a ground rule that no ticket can be attributed to a named individual. 'This workaround was introduced because of a tight deadline' is a system problem. It is not Dave's fault. Dave did his best.
The documentation sprint. Pick one piece of tribal knowledge per quarter and write it down. Not a full wiki page. A paragraph. Where it lives, what it does, what breaks if you touch it. This is not glamorous work, but it is the difference between a manageable legacy system and a hostage situation.
The honest roadmap conversation. At some point, someone needs to tell the product team that approximately twenty percent of engineering velocity is being eaten by the shame pile. This conversation is uncomfortable. It is also necessary. Products cannot be built on foundations that nobody is allowed to look at.
The Confession as Cure
There is something genuinely cathartic, developers told us, about simply saying it out loud. The function that shouldn't work but does. The migration that was 'temporary' during the Blair government. The environment variable with a name that is, frankly, unprofessional.
Saying it out loud doesn't fix it. But it does mean you can start.
Somewhere in Britain right now, a developer is staring at a function called handleEdgeCaseForNow that was written in a hurry before a demo and has since become the quiet, load-bearing heart of an entire product.
It's time to tell someone about it.
Dave, if you're reading this: we need to talk.