Robustness vs Unreliability
Robustness is a system that absorbs failure and keeps its promises. Unreliability is a system that breaks when you look at it funny. One is a virtue you engineer; the other is what you get when you don't.
The short answer
Robustness over Unreliability for most cases. Unreliability isn't a design choice — it's the default you get when nobody chose robustness.
- Pick Robustness if run anything anyone depends on — payments, auth, data, an SLA, a pager that wakes a human. Robustness is the only acceptable target. Engineer for it: retries, timeouts, idempotency, circuit breakers, graceful degradation
- Pick Unreliability if never on purpose. The only honest use of unreliability is as a test condition — chaos engineering, fault injection — where you inject it to prove robustness holds. Outside the test harness it is pure liability
- Also consider: Robustness has a real cost: redundancy, slower iteration, and complexity that can itself become a failure mode. Over-engineering a throwaway prototype for five-nines is its own kind of waste. Match the rigor to the blast radius — but never confuse 'cheap' with 'allowed to be unreliable in production.'
— Nice Pick, opinionated tool recommendations
What we're actually comparing
This isn't tool-versus-tool — it's a property versus the absence of that property. Robustness is the engineered ability of a system to keep functioning correctly across failure, load spikes, malformed input, and partial outages. Unreliability is what's left when that work was skipped: nondeterministic failures, lost writes, the dreaded 'works on my machine.' People talk about them as if they're a spectrum you slide along, but they're not symmetric. Nobody sits in a planning meeting and chooses unreliability. It's the gravity you fall into. Robustness is the rope you climb to escape it. Treating them as two equally valid options is the kind of false balance that gets shipped to prod and pages someone at 3 a.m. We don't do false balance here, so let's stop pretending this is a close call.
Where robustness earns its keep
Robustness shows up in the boring, expensive places: idempotency keys so a retried payment doesn't double-charge; timeouts and circuit breakers so one slow dependency doesn't cascade into a full outage; bulkheads that isolate blast radius; graceful degradation so a dead recommendations service shows a fallback instead of a white screen. It's writing the retry with backoff and jitter, not the happy-path call. It costs you redundancy, slower releases, and code that's harder to read because it's defending against things that 'never happen' until they do at scale. The payoff is that your system fails small and recovers itself instead of failing total and recovering you, manually, on a holiday. That tradeoff — pay continuously in discipline, get paid back in nights you sleep — is the entire reason senior engineers exist. Skip it and you'll learn its value the hard way.
Why unreliability is never the pick
Unreliability has exactly one legitimate appearance: as a controlled experiment. Chaos engineering kills instances on purpose; fault injection corrupts packets deliberately — to prove robustness survives. That's robustness wearing a lab coat, not a virtue of its own. Everywhere else, unreliability is a liability that compounds. A flaky test nobody trusts gets ignored, then a real regression sails through behind it. A service with 99% uptime sounds fine until it's a dependency of ten others and the math turns into 90%. Unreliability erodes the thing software is actually sold on: that it does what it says, twice in a row. Once your users stop trusting the output, every feature you ship lands on cracked foundation. 'It mostly works' is not a product. It's an apology with a deploy button.
The verdict, no hedging
Robustness wins, and it isn't close — this is the rare comparison where one side has no defensible use outside a test rig. But don't read 'pick robustness' as 'gold-plate everything.' Robustness is proportional engineering: spend it where failure hurts — payments, auth, data integrity, anything with an SLA — and spend less on the prototype you'll delete Friday. The failure mode of this advice is the engineer who builds five-nines into a weekend script and calls it craftsmanship; that's just unreliability of judgment. Match rigor to blast radius. But the floor is non-negotiable: nothing in production gets to be unreliable on purpose, and 'we didn't have time' is how unreliability gets shipped while everyone nods. Choose robustness deliberately, or inherit unreliability by default. There is no third door. t. NicePick
Quick Comparison
| Factor | Robustness | Unreliability |
|---|---|---|
| Behavior under load and failure | Degrades gracefully, isolates blast radius, self-recovers | Fails unpredictably, often cascades, needs manual rescue |
| Trust in output | Does the same correct thing twice in a row | 'Mostly works' — trust erodes with every flaky run |
| Cost | Real: redundancy, slower iteration, defensive complexity | Free up front, ruinous later in outages and lost trust |
| Legitimate use case | Everything anyone depends on | Only as injected fault in a chaos/test harness |
| Default state | Must be deliberately engineered | What you inherit when you skip the work |
The Verdict
Use Robustness if: You run anything anyone depends on — payments, auth, data, an SLA, a pager that wakes a human. Robustness is the only acceptable target. Engineer for it: retries, timeouts, idempotency, circuit breakers, graceful degradation.
Use Unreliability if: Never on purpose. The only honest use of unreliability is as a test condition — chaos engineering, fault injection — where you inject it to prove robustness holds. Outside the test harness it is pure liability.
Consider: Robustness has a real cost: redundancy, slower iteration, and complexity that can itself become a failure mode. Over-engineering a throwaway prototype for five-nines is its own kind of waste. Match the rigor to the blast radius — but never confuse 'cheap' with 'allowed to be unreliable in production.'
Robustness vs Unreliability: FAQ
Is Robustness or Unreliability better?
Robustness is the Nice Pick. Unreliability isn't a design choice — it's the default you get when nobody chose robustness. There is no scenario where "stays up under load and degrades gracefully" loses to "fails randomly and corrupts state." This is the most lopsided comparison we will ever publish.
When should you use Robustness?
You run anything anyone depends on — payments, auth, data, an SLA, a pager that wakes a human. Robustness is the only acceptable target. Engineer for it: retries, timeouts, idempotency, circuit breakers, graceful degradation.
When should you use Unreliability?
Never on purpose. The only honest use of unreliability is as a test condition — chaos engineering, fault injection — where you inject it to prove robustness holds. Outside the test harness it is pure liability.
What's the main difference between Robustness and Unreliability?
Robustness is a system that absorbs failure and keeps its promises. Unreliability is a system that breaks when you look at it funny. One is a virtue you engineer; the other is what you get when you don't.
How do Robustness and Unreliability compare on behavior under load and failure?
Robustness: Degrades gracefully, isolates blast radius, self-recovers. Unreliability: Fails unpredictably, often cascades, needs manual rescue. Robustness wins here.
Are there alternatives to consider beyond Robustness and Unreliability?
Robustness has a real cost: redundancy, slower iteration, and complexity that can itself become a failure mode. Over-engineering a throwaway prototype for five-nines is its own kind of waste. Match the rigor to the blast radius — but never confuse 'cheap' with 'allowed to be unreliable in production.'
Unreliability isn't a design choice — it's the default you get when nobody chose robustness. There is no scenario where "stays up under load and degrades gracefully" loses to "fails randomly and corrupts state." This is the most lopsided comparison we will ever publish.
Related Comparisons
Disagree? nice@nicepick.dev