Editing an order created a duplicate order: why
Edit opened a blank form that saved a second order, and changing a completed order risked wiping shipped quantities. How to check your system.
Topic
Architecture, correctness and the bugs that only show up in production.
23 articles
Almost everything filed here starts with something that behaved correctly in testing and wrongly in production. That is not an accident of what we choose to write about — it is where the interesting engineering is. A bug that a test catches is a task. A bug that only appears when two requests arrive four hundred milliseconds apart, or when a queue redelivers a message nobody expected to see twice, is a design question wearing a defect as a disguise.
The recurring themes are correctness under concurrency, what a system does at a boundary it does not control, and the difference between code that works and code that can be operated. Where a piece describes one of our own mistakes it says so plainly, including the hypothesis that turned out to be wrong, because the wrong hypothesis is usually the more useful half of the story.
Edit opened a blank form that saved a second order, and changing a completed order risked wiping shipped quantities. How to check your system.
An app told users to check their wifi when the network was fine: our own timeouts were shorter than the work. How to tell, and what we changed.
A field app's camera button did nothing because two permission faults hid behind swallowed errors. What to check on your own app, and what we fixed.
On release day 17 staff ended their shift by accident and could not start another. The fix reached every phone without a new app release.
Handover photos from a rental inspection app arrived as a corner of the car. Large phone photos were being cut, not shrunk. How to check yours.
A Tally link reported success while 87 of 208 customers were dropped and 10 KG arrived as 10 GM. What to check on your accounting software integration.
Every booking confirmation to a Gmail address was refused from one afternoon. About 37 went unconfirmed and no code had changed. How to find the cause.
Staff saw error pages in bursts while the server looked healthy. A customer's browser pass was crashing the portal, which restarted 340 times.
A CMS lets a page with no meta description publish. A typed content schema fails the build instead. How that works, and what it costs your editors.
Reps see the wrong currency or dates when an app has them written into its code. Why that happens, how to check yours, and what we changed.
Tests failing when nobody changed the code usually means a shared test environment filled up. How we found it, and how to check yours.
How to check that a spreadsheet-to-software move lost nothing. Ours imported clean and was still 102 rules short. The count-by-count test that found them.
A mobile app worked for weeks in development and failed on its first release build. Development mode never ran the code paths that broke. What to check.
Invoicing software can charge 18% on a zero-rated sale because it reads a zero rate as no rate. How to test yours and what to ask your supplier.
Tests can pass while the feature is broken, because the check was never able to fail. Examples from our own work, and how to test your supplier's tests.
When someone denies changing fifty accounts, only an audit trail that names the records and the person can settle it. What to check in yours.
An approval step no expense could reach, because every claim was approved on creation. Three tests for what to remove before you decide to rebuild.
A static site has no database, login or plugins to attack. Two compromised brochure sites were rebuilt that way. When it is the right answer, and when not.
A receivables ledger kept in its own table drifts from the invoices after every payment. How to check yours, and why we worked the figure out instead.
Building every client pitch deck by hand means retyping what the booking already holds. How to check yours, and how we generated the deck and cost sheet.
Nine screens worked out the driver in nine ways: 81 legs got an arbitrary answer, 16 the wrong name, 17 a phantom. What we changed and how to check yours.
Two hard-coded roles make everyone an administrator. Why roles should be built from fine-grained permissions, and how 77 permissions replaced them.
A booking site went down for four hours with hardly any visitors and an idle database. Why a bigger server would not have helped, and how to tell busy from blocked.