Software
Why software ships with bugs the developers already know about
Shipping is a decision about which known defects are acceptable, and pretending otherwise would mean never releasing anything.

This looks at software defects from the practical end — what holds up once conditions stop being ideal.
What holds up in practice
- Defects are triaged by severity and frequency, not fixed in order of discovery.
- Testing can demonstrate the presence of bugs but never their absence.
- Every fix carries a risk of introducing a new defect elsewhere.
The bug list is never empty
Any non-trivial project has a backlog of known defects, and the number tends to grow with the size of the codebase. Shipping means deciding that the remaining known problems are less costly than the delay of fixing them.
Defects are ranked by how severe the consequence is and how many users encounter it, which is why an ugly bug affecting everyone outranks a catastrophic one affecting nobody. A team that fixed every known defect before releasing would never release.
Testing has a hard limit
The number of possible states of a program grows combinatorially with its inputs and configuration, so exhaustive testing is impossible for anything real. Tests demonstrate that specific behaviours work; they cannot demonstrate that nothing else is broken.
Under load, automated testing catches regressions cheaply and finds novel defects poorly, which is why it complements rather than replaces exploratory testing. Formal verification can prove properties of a program and is expensive enough that it is reserved for genuinely critical code.
Fixes are not free
Changing code to repair one defect can break something that depended on the old behaviour, which is a regression. Late changes are riskiest because they receive the least testing, which is why release branches freeze and only critical fixes are accepted. This is the reason a fix you consider obvious may be deferred to the next cycle rather than rushed out.
At the protocol level, security fixes override the freeze because the cost of not shipping them is higher.
Reproducibility decides everything
A defect that cannot be reproduced cannot reliably be fixed or verified, so unreproducible reports sit unresolved. Bugs that depend on timing, hardware, locale or specific data are the hardest to reproduce and the most frustrating to report. Crash reporting exists to gather the state at the moment of failure precisely because user descriptions are rarely sufficient.
A report with exact steps, versions and a recording is worth many vague ones, and this is why triage asks for them.
Technical debt is a real interest payment
Shortcuts taken to meet a deadline make future changes slower and riskier, which is the debt metaphor doing honest work. Untangling it produces no visible feature, so it competes badly for priority against anything users can see.
Mechanically, codebases that never pay it down eventually reach a state where small changes carry large risk, which users experience as long gaps and unstable releases. The economic pressure is toward accumulating it, which is why it accumulates.
Implementations differ, and vendors are not obliged to document the differences.
What this means for users
Waiting a short while after a major release avoids the defects found by people who did not wait, at the cost of missing fixes for problems you already have. Reporting a defect with reproduction steps genuinely increases the chance of a fix, because triage is capacity-limited rather than indifferent. Long-term support releases trade new features for stability deliberately, which is the right choice for anything you depend on.
Beta channels exist for people willing to trade reliability for early access, and joining one is a choice about which risk you prefer.
The takeaway
Shipping means choosing which known defects to live with. The alternative is never shipping.
Understanding the failure mode tells you more than the feature list does.
Questions readers ask
Why did an update break something that worked?
A change made for one reason interacted with behaviour something else relied on. Regressions are the ordinary cost of changing code and are why test suites exist.
Should I install updates immediately?
Security updates yes, promptly. Feature updates can reasonably wait, particularly on machines you depend on, until early reports have surfaced.
Also by Junko Ishida
- USB-C solved the connector and not the confusionPower & Batteries
- File formats decide whether your files outlive the softwareSoftware
- Where the electricity goes when everything is switched offPower & Batteries
- The memory effect was real, and it has nothing to do with your phonePower & Batteries





