Computing principles. What I believe, in order. Subject to revision when reality says otherwise.
A program that fits in your head is a program you can fix at 3am. Composable units beat monoliths every time. If a module needs an architecture diagram to read, it's already wrong.
McIlroy's first rule. Single responsibility isn't a unit-test slogan — it's how systems stay debuggable for a decade. Every time I extend a function past one job, I pay for it later.
Pipes over class hierarchies. impl Trait for T over extends. The Gang of Four said it before Rust did: favor composition. Inheritance is a one-way door.
Code I can read, fork, audit, and run on my own iron. Vendor lock-in is a tax on future me. Open formats, open protocols, open source — anything else is rented.
Pragmatism over purity. Premature abstraction kills more systems than premature optimization. Ship the ugly thing, learn from it in production, then refactor with knowledge you couldn't have had upfront.
Evans was right. If the code doesn't speak the language of the business, every reader translates in their head — and translations drift. Ubiquitous language isn't ceremony, it's the only way a system stays coherent across years and people.
Push frameworks, IO, and infrastructure to the edge. The core is plain types and pure functions. Tests run without a database, without a network, without a runtime. The hexagon is older than your favorite framework and will outlive it.
GoF gives names to recurring shapes — Strategy, Visitor, Adapter — so we can talk about them. Use the names to communicate, not to decorate. The wrong pattern shoehorned in is worse than no pattern at all.
Fowler was right to walk it back. Distribution is a deployment choice, not an architecture. Split when team size or independent scaling demands it — not because a conference talk said so. Every network call is a failure mode.
Each nine costs an order of magnitude more than the last. Five-nines means dedicated SREs and a runbook for every dependency. Pick the number you can afford to operate, not the one that sounds good in a slide.
Rust's borrow checker is not a tax. It's a colleague who never forgets a lifetime. unsafe is opt-in, sharp, and rare — and when you reach for it, you write the invariants down. Use-after-free shouldn't be a class of bug in 2026.
Iterators, traits, generics — pay only for what you use. If it allocates, locks, or boxes when it doesn't have to, that's a bug, not a feature. Performance is a property of the design, not a phase.
Result<T, E> is a contract: handle it or pass it on, but never hide it. Panics are for programmer errors, not user input. Silent failure is the worst possible kind — louder than a crash, slower to find, more expensive to fix.
Code is the spec. Docs lie, comments rot, tickets disappear, but the source is what runs. When in doubt — open the file.
Half the things I make never ship, and that's fine. The taste, the skill, the hands — those compound. The joy of typing the last semicolon of a thing that works is its own reward. The craft is the point.