Node.js
EMFILE: Too Many Open Files, and Why Raising ulimit Is Wrong
The quick fix is raising ulimit. The real question is what is holding thousands of descriptors open and never closing them.
Method rather than tooling: forming a hypothesis, choosing the cheapest experiment that falsifies it, and finding the wrong assumption underneath a bug.
Node.js
The quick fix is raising ulimit. The real question is what is holding thousands of descriptors open and never closing them.
Opinion
Positions I argued for, sometimes loudly, that turned out to be mistaken. What changed my mind in each case.
Shopify
You cannot attach a debugger to Liquid. Here is the set of techniques that actually works for finding out why a theme is doing something unexpected.
Shopify
A practical migration order, the things that silently break, and how to verify you did not lose content along the way.
Shopify
The storefront cached availability, the customer added to cart, and checkout disagreed. Here is where the state diverges and what to do about it.
Debugging
An error message is read by a person under stress who needs to make a decision. Almost nobody designs them that way.
Bug Hunt
The classic heisenbug. Here is why observation changed the outcome, and the three techniques that found it anyway.
Bug Hunt
Every replica restarted at once during a brief database blip. The health check was working exactly as designed, and the design was wrong.
Shopify
Everyone says apps slow your store down. Almost nobody says by how much. Here are measurements from real stores and a method for auditing your own.
Shopify
The proxy path, the subpath prefix, and the actual route all have to line up. Here is the checklist and how to verify the signature properly.
Engineering Culture
A document nobody reads, listing action items nobody does, produced to satisfy a process. Here is the version that actually changes something.
Debugging
Every layer you add to avoid repetition adds a place where the truth can hide. Here is how to tell which abstractions earn their cost.