Articles
Default Settings Are Production: Lessons from a Relay Rollout
We tested a new WebSocket relay by changing the default settings, and customers behind strict firewalls lost live sessions. What I learned from it.
Telling someone don't do it - considered harmful
What I learned when a code-review comment of mine was taken as an order: explain the why, and treat review comments as discussion.
The Devil's Advocate Technique
Before presenting a design, list the questions your CTO, teammates and other teams will ask, and answer them first.
How Not to Get Stuck When Solving a Problem
Stuck on a bug or feature? Timebox it, take breaks, rubber-duck it or ask a teammate, instead of sitting at your desk until it's solved.
When Is a Feature Really Done?
Implemented, reviewed, tested, deployed: the levels of "done" I've seen, and why your team needs a shared definition of done.
Don't Build One-Off Solutions — Build Reusable Patterns
Spot classes that solve the same problem differently, extract the common part into a generic pattern, and replace old code step by step.
How to Break Your App on Purpose: A Short Guide
A tongue-in-cheek guide to making your app buggy: skip unit tests and more, plus answers to the usual excuses for not testing.
How Making Coffee Helped Me Find a Bug
A breakpoint that only fired while I was making coffee, and how the browser's idle API turned out to be the culprit.
Improve Your Workflow with Custom TODO Labels
Go beyond TODO and FIXME: set up custom IDE labels like IMPROVE or QUESTION to keep your code notes organised.
Designing for Graceful Failure by Separating Failure Domains
How 150k emails a day exhausted a shared quota for all our apps, and why splitting quotas per service lets your system fail gradually.
Using the Blocking webRequest API with Manifest V3
Manifest V3 removed blocking webRequest, but enterprise and self-hosted extensions can still use it. Here's how, and the catches.
How to Choose Better Class Names
Stop agonising over class names: start with a temporary name like Foo, implement the logic, then name it by what it actually does.
Using Conditional Breakpoints
How conditional breakpoints stop code only when it matters, with a browser-API listener example and tips for multithreaded code.
Debugging Manifest V3 Browser Extensions
A simple trick to catch what your Manifest V3 service worker does right after start: delay the code so you can open DevTools in time.
Understanding Common Software Development Errors
A subjective list of the most common causes of errors