Gloriously Broken: The Case for Letting Your Code Be a Little Ugly
Photo: ESA/Hubble & NASA, W. Sargent et al., CC BY 4.0, via Wikimedia Commons
Somewhere in a Slack channel right now, a senior engineer is gently losing their mind over a pull request. The code works. It ships. But it's wrong — at least architecturally. There are hardcoded strings, a function that does four things it shouldn't, and comments that say things like // fix this later with suspicious confidence.
And yet, that messy little feature? It's the one that got users talking.
This is the technical debt paradox that a growing number of builders are starting to talk about openly: the idea that deliberately imperfect code — written fast, with corners cut and elegance sacrificed — can actually be a competitive advantage in the early stages of product discovery. Not because bad code is good. But because the obsession with clean code can quietly kill momentum before you've figured out whether you're even building the right thing.
The Myth of the Perfect Foundation
There's a seductive story that gets told in engineering circles — that you should build your foundation right the first time, because cutting corners now means paying triple later. And honestly, for mature products with real scale, that's often true.
But here's the thing: most experimental projects never reach scale. They get killed in the backlog, pivoted out of existence, or quietly deprecated after six months of lukewarm user feedback. If you spent three sprints architecting a beautiful, extensible, thoroughly tested system for a feature that nobody actually wanted — congratulations, you built a very clean monument to a dead idea.
Jordan Mercer, a product engineer who's worked across both early-stage startups and mid-size SaaS companies in Austin, put it bluntly: "I've watched teams spend two months building the 'right' version of something before they showed it to a single user. By the time they got feedback, they'd already made a hundred assumptions in the codebase that were just wrong. Ripping that out was way more painful than if they'd just shipped something janky in week two."
This isn't a novel observation — the build-fast-iterate-later philosophy has been gospel in Silicon Valley for decades. But what's changed is the nuance around when messy code is strategic, and when it crosses into genuinely dangerous territory.
Intentional Shortcuts vs. Accidental Chaos
The key word here is intentional. There's a massive difference between a team that knowingly ships a rough implementation with a clear plan to revisit it, and a team that just writes bad code because they're moving fast without thinking.
The first approach is a calculated bet. The second is just chaos with a Jira ticket attached.
Teams that do this well tend to operate with what you might call a "debt ledger" — an explicit, shared understanding of where they've made shortcuts and why. They're not hiding it. They're documenting it, flagging it, and treating it like a real line item in their planning cycles.
Take the approach used by a small product studio based in Denver that builds experimental consumer apps. Their internal rule: any feature shipped in "discovery mode" gets a literal comment block at the top of the file that reads like a sticky note — what the shortcut is, why it was made, and what the trigger condition is for cleaning it up. When the feature hits a certain usage threshold, the cleanup becomes non-negotiable.
"It sounds almost too simple," one of their engineers said. "But it changes the psychology completely. You're not pretending the mess doesn't exist. You're just making a deliberate choice to live with it for now, and you've already thought about when that choice expires."
When 'Good Enough' Engineering Actually Finds Product-Market Fit
Here's where it gets interesting. There's a pattern that shows up repeatedly in how successful products actually get discovered: the scrappiest version of a feature — the one that barely works, that the engineering team is slightly embarrassed about — is often the one that generates the most signal.
Why? Because it ships faster, so it gets in front of users sooner. And because it's rough around the edges, teams are less emotionally attached to it. They're more willing to kill it, change it, or completely reimagine it based on what they hear.
Perfectly architected features, paradoxically, can become harder to kill. The team has invested weeks of careful thought into them. There's ownership. There's pride. And that pride can quietly bias the way feedback gets interpreted.
Rachel Okonkwo, who co-founded a B2B workflow tool that recently crossed 10,000 active users, described their early development process as "controlled sloppiness." Their fastest-growing feature — the one that became the core of their product — was originally a weekend hack that her co-founder built in a single sitting using an approach she described as "borderline embarrassing from a code quality standpoint."
"It had no error handling. It was basically duct tape. But we shipped it on a Monday, had real user feedback by Wednesday, and knew by Friday that we'd found something. If we'd waited to build it 'correctly,' we would've spent three weeks on something we might have scrapped anyway."
The Line You Actually Can't Cross
None of this is an argument for recklessness. There are categories of shortcuts that are never strategic — they're just dangerous.
Security is the obvious one. You don't get to ship a "discovery mode" authentication system and call it intentional debt. Same goes for data integrity issues, anything touching payments, and infrastructure decisions that will be nearly impossible to undo at scale.
The framework that seems to work best is thinking about reversibility. If a shortcut creates a problem that's painful but fixable — a slow query, a brittle API integration, a UI component that's harder to maintain than it should be — that's potentially acceptable debt in an experimental context. If a shortcut creates a problem that could compromise user data, expose the company to liability, or require a full architectural rewrite before you can scale at all, it's not a shortcut. It's a trap.
The other line worth drawing: team knowledge. Technical debt that lives only in one person's head is uniquely dangerous. The "I'll clean this up later" approach falls apart catastrophically when the person who wrote the mess leaves the company, gets sick, or just moves to another project. Messy code that's documented and understood by the team is a manageable liability. Messy code that's a mystery is just a time bomb.
Building Fast Without Building Dumb
The teams getting this right aren't abandoning engineering standards — they're developing a more sophisticated relationship with them. They understand that standards exist to serve the product, not the other way around. And in the early, uncertain stages of building something new, the product is best served by learning fast.
That means shipping the rough version. Getting it in front of people. Staying honest about where the shortcuts are. And having a real plan — not a vague intention, but an actual plan — for when and how the cleanup happens.
Sloppy code that teaches you something is worth more than elegant code that sits unread. The experiment that ships messy and generates signal beats the beautifully architected feature that never quite makes it out the door.
At Konkreet Labs, we've always believed that the most interesting digital work happens at the edge of what's comfortable — and sometimes, that means letting your repo look a little rough while you figure out if you're onto something real. The key is knowing the difference between a calculated mess and just a mess.
Your code doesn't have to be pretty. It just has to be honest about what it is.