Skip to content
Architecture Strategy

The Hidden Cost of "Good Enough"

An essay on why "good enough" decisions behave like unlabeled debt and why deferred architecture choices compound into expensive rewrites.

6 min read
A single credit card floats above a layered shadow that grows larger as it extends downward into darkness.

Article body

Introduction

"Good enough" is the most expensive phrase in software engineering — not because the decision is always wrong, but because it almost never includes a price tag. A genuine trade-off requires knowing what you are giving up. Most "good enough" decisions skip that step entirely. They are not compromises. They are unpriced deferrals wearing the language of pragmatism.

The Pragmatism That Isn't

Every engineering organization has a version of the same narrative: move fast, ship early, iterate later. The "good enough" decision sits at the center of this philosophy. Choose the simpler schema. Use the off-the-shelf solution. Skip the abstraction layer. Ship the feature with the known limitation and circle back when it matters.

The reasoning feels sound because it borrows from legitimate engineering wisdom. Premature optimization is real. Overengineering is real. Building for scale you do not have is a well-documented waste of effort. "Good enough" positions itself as the antidote to these failure modes — the disciplined choice to solve today's problem today and tomorrow's problem tomorrow.

What makes this framing dangerous is not that it is always wrong. It is that it provides cover for decisions where no one has actually estimated what "later" will cost. The discipline of a genuine trade-off — we are accepting X limitation now, it will cost us approximately Y to address when Z condition is met — is almost never present. What is present is a feeling of pragmatism, reinforced by deadline pressure, and a vague confidence that the future team will sort it out.

The Deferral Without a Ledger

The specific failure is not choosing simplicity over complexity. It is making deferred-cost decisions without tracking the deferral. A genuine trade-off is recorded, scoped, and revisitable. A "good enough" decision, in practice, vanishes into the codebase the moment the pull request merges. There is no ledger. There is no trigger condition. There is no estimate of remediation cost. The decision was framed as pragmatic, so it is treated as resolved.

This is where the common understanding breaks down. Organizations believe they are making conscious speed-versus-quality trade-offs. They are not. They are accumulating obligations with no accounting system. The language of pragmatism obscures the fact that the cost is real, compounding, and invisible to every planning process the organization runs.

What an Unpriced Deferral Actually Produces

A logistics SaaS company — roughly 40 engineers, Series B, growing fast — made a "good enough" decision in its first year: addresses would be stored as a single freeform text field alongside latitude and longitude coordinates. The geocoding API would handle the rest. It was simple, it worked, and the team had three months of runway to build the core dispatching product. Nobody argued.

Fourteen months later, the company had expanded into three countries and was negotiating an enterprise contract that required compliance-grade address validation and per-region formatting for customs documentation. The address field — that single text column — had become a dependency for 23 distinct services. Dispatching read it. Billing read it. Customer notifications parsed it for display. The driver app geocoded from it. Route optimization consumed it. Compliance reporting attempted to decompose it into structured components using regex patterns that broke on non-US formats.

The team could not change the address model without coordinating across every service that consumed it. Each service had built its own assumptions about what that text field contained — assumptions that were mutually inconsistent and individually undocumented. The billing service expected a comma-separated format. The compliance module assumed the last token was a postal code. The driver app stripped everything after the first newline character.

Introducing a structured address model was no longer a schema migration. It was a cross-team coordination project requiring interface contracts, data backfill logic, and a transition period where both formats coexisted. The original "good enough" decision had taken an afternoon. The remediation was estimated at eleven weeks and ultimately took sixteen.

Nothing about the original decision was irrational. Freeform text was a defensible choice for a pre-product-market-fit company with a single-country scope. The failure was not the choice itself — it was the total absence of any mechanism to track what had been deferred, re-evaluate when conditions changed, and allocate remediation before the dependency graph made it expensive.

Pragmatism as an Organizational Reflex

The deeper pattern is that "good enough" stops being a decision and becomes a reflex. When an organization successfully ships by deferring costs early on, it learns that deferral works. The behavior gets reinforced every time a deadline is met. Over time, the threshold for what qualifies as "good enough" drifts. Decisions that would have prompted debate in the first year pass without scrutiny in the second.

This is not cynicism or negligence. It is organizational learning operating exactly as designed — reinforcing behaviors that produce short-term success. The problem is that the feedback loop is broken. The costs of deferral surface months or years after the decision, in a different sprint, on a different team, under a different manager. The person who made the original call never sees the invoice. The organization's reward signal says deferral is free because the cost is always attributed to something else — a "hard" project, an "unfortunate" dependency, a "legacy" constraint.

The result is an organization that has lost the ability to distinguish between genuine pragmatism and habitual avoidance. Both feel identical from inside the sprint. Both use the same language. Both ship on time. The difference only becomes visible when someone tries to account for why the team needs sixteen weeks to add a structured address field to a system that has been "working fine" for over a year.

Where Judgment Erodes

The terminal cost is not the accumulated rework — it is the degradation of the organization's capacity to make trade-offs at all.

An organization that has spent two years treating unpriced deferrals as pragmatic compromises has miscalibrated its judgment about when quality investment is warranted. Every future proposal to "do it right" gets measured against the same internal benchmark: we shipped without it before, so why do we need it now? Engineers who advocate for foundational investment are perceived as overengineering — because the organization has no record of what past deferrals actually cost.

This miscalibration is quiet and durable. It does not present as a crisis. It presents as a persistent, low-grade disagreement between engineers who feel the accumulated friction and leadership that sees a team still shipping features. Both perspectives are internally consistent. Neither has the data to convince the other, because the data was never collected.

The organization does not notice that its judgment has drifted. It just finds that every quarter, the gap between what the product needs and what the system can absorb grows a little wider — and nobody can explain exactly why.

Key Takeaways

  • Most "good enough" engineering decisions are not conscious trade-offs — they are unpriced deferrals that vanish from organizational memory the moment they merge.
  • The cost of deferred decisions compounds not through the deferral itself but through the dependency graph that forms around the original choice, making remediation a coordination problem rather than a technical one.
  • Organizations reinforce deferral behavior because the short-term reward (shipping on time) is immediate and visible while the long-term cost (remediation complexity) surfaces months later on a different team's roadmap.
  • The most damaging consequence of habitual "good enough" decisions is the erosion of an organization's ability to distinguish genuine pragmatism from avoidance — a miscalibration that compounds across every future investment decision.
  • Tracking deferred-cost decisions explicitly — with estimated remediation cost and trigger conditions — converts "good enough" from an unpriced habit into an actual trade-off.

Topics covered

technical-debtarchitecturescalingoperating-model

Keep reading

Continue with essays that connect through the same product and engineering themes.