Skip to content
Principles

Defaults for building software that lasts.

These are the working rules I come back to when designing systems, debugging incidents, and deciding whether a new abstraction is worth its operational cost.

01

Boring technology beats clever infrastructure

Reach for tools the team can operate on a bad day. A queue, a relational model, a cache, or a cron job only earns its place when its failure modes are understandable.

02

Make failure visible

Silent failure is the expensive kind. I prefer explicit errors, retry boundaries, useful logs, and dashboards that show where the system is hurting before users have to explain it.

03

Prefer small interfaces

Small interfaces force decisions into the open. They make services easier to test, replace, document, and reason about when the implementation inevitably changes.

04

Measure before optimizing

Performance work starts with evidence. I would rather remove one measured bottleneck than add five speculative abstractions that make the system harder to understand.

05

Automate the sharp edges

The best automation removes recurring risk: formatting, builds, deployment checks, migrations, and scripts that keep dangerous manual steps from becoming folklore.

06

Write down tradeoffs

A decision record is a gift to the next person. Capturing what was chosen, what was rejected, and why makes future changes less political and more technical.