Writing

Essays on software architecture, modular Rails, and the craft of building for the long game.

Latest · June 30, 2026 · The Engineer's Notebook

Reading a Binary Game Format in Ruby

Ruby is the last language most people would reach for to take a binary game archive apart. It turned out to be one of...

Jun 24, 2026

The View Layer Rails Couldn't SeeNotebook · 09

Every layer of a Rails app has had a parser-based linter for years — except the one that ships HTML. Marco Roth's Herb makes...

Jun 23, 2026

The Propshaft Version Lever You Were Told Was GoneNotebook · 08

Community feedback claimed Rails 8's Propshaft removed config.assets.version. I read the source and ran the experiment on a clean Rails 8.1.3 app: it's still...

Jun 16, 2026

From One Controller to Thirteen Handlers: A Webhook RefactorNotebook · 07

Refactoring a 200-line Stripe webhook god-object into thirteen single-purpose handlers, using Template Method, Strategy and Registry to make adding an event type a one-class...

Jun 9, 2026

When Rails Engines Are the Wrong ToolNotebook · 05

Rails engines aren't free. When adding engine boundaries is over-engineering — the performance, boot-time and memory costs — and how to tell when a...

Jun 2, 2026

Testing Strategy for a Modular Rails ApplicationNotebook · 06

How a modular Rails test suite runs in 4 minutes instead of 40: per-engine unit tests, dummy apps, contract tests for boundaries, selective execution,...

May 26, 2026

The Modular Monolith as the Default Starting PointNotebook · 03

Why a modular monolith built with Rails engines beats microservices as your default. The operational cost of distribution, the companies that came back, and...

May 22, 2026

Spec is the Artefact

A passing test tells you the implementation is correct. The second-order question — was the work behind this code the work we meant to...

May 21, 2026

The Perception Gap

An engineer opens a pull request. It is eighteen hundred lines across roughly fifteen files. The description has the kind of structure you write...

Browse the full archive (42 posts) →