Blog (1 of 17)
-
Leaving DigitalOcean Took One Day
I have been a happy DigitalOcean customer for years: stable, simple, never a surprise. Then they put three million dollars into DHH's Omarchy, and I moved everything to Hetzner. The interesting part is not the outrage, it is that leaving took one day and almost no thought, because the whole setup is infrastructure as code. Being able to walk away from a provider on principle is something you build long before you need it.
Friday, 18 September 2026Read more ➞ -
Hierarchy Exists
A lot of managers want to be friends with the people who report to them. It does not work, and worse, it is dishonest, because there is a power imbalance everyone in the room already feels. Being kind is not the same as being friends. Pretending otherwise is the actual unkindness.
Wednesday, 16 September 2026Read more ➞ -
Designing a dbt Pipeline for Consent Withdrawal
When a student withdraws consent, their data must disappear from our learning-analytics platform. Irreversibly anonymised statistics may legally remain. Making both true at once is an architecture problem, not a cleanup script: two strictly separated lanes through the warehouse, a dependency rule between them, and materialization choices driven by deletion semantics instead of query performance.
Wednesday, 9 September 2026Read more ➞ -
How to Guarantee You Never Ship
I have written a run of posts arguing against multi-repo layouts, long-lived feature branches, reflexive microservices, dedicated QA, blanket coverage targets, and pull-request review. Each is bad on its own. Stack them together and you get something worse than the sum: a machine, built entirely from respectable best practices, optimised to make delivering a single change impossible.
Wednesday, 2 September 2026Read more ➞ -
Tests and product market fit
I watched a team write a careful test suite for a feature, then kill the feature two weeks later because nobody wanted it. The tests were wasted effort, and worse: they made the feature harder to kill. How much you should test is not a constant. It moves with where you are on the road to product market fit.
Wednesday, 26 August 2026Read more ➞ -
A Boolean PII Flag Is Not Enough
Every data catalog lets you tag a column as PII, true or false. For a platform processing student data under GDPR this single bit drops the questions a data protection officer actually asks: Does the column identify on its own or in combination? Is it raw, pseudonymised, or anonymised? Did a human assert the classification, or did a tool infer it? We classify on two axes plus provenance and propagate the result through lineage.
Wednesday, 19 August 2026Read more ➞ -
Innovation Tokens
Dan McKinley's "Choose Boring Technology" gives you a budget of innovation tokens to spend on novel choices. I agree with all of it, and I want to refine one thing: a token is not denominated in how novel the technology looks from the outside. It is denominated in what your team already knows.
Wednesday, 12 August 2026Read more ➞ -
Hexagonal Architecture vs. Microservices
Bounded contexts deserve boundaries. But a boundary is a code concern, and putting a network between two contexts because you want them separate is a mistake. In-process interfaces are far easier to debug and to keep consistent than network ones, for a concrete reason: one compiler spans both sides and will not let them drift. Nothing spans the network.
Wednesday, 5 August 2026Read more ➞ -
Why 3D Software Visualisation Keeps Failing
A zoomable 3D scene of your architecture, with domains as planes, services as boxes, and data flows as glowing particles, demos beautifully, and WebGL makes it a weekend project. But 3D software visualisation never failed for technical reasons. It fails for perceptual ones, and those have not changed: occlusion, an arbitrary Z axis, label degradation, and depth being one of the weakest visual encodings we know of.
Wednesday, 29 July 2026Read more ➞ -
Feature Flags Over Branches
A while ago I promised to write more about feature flags. Here it is, as one flat rule: develop on main, and use feature flags. Long-lived feature branches are a problem you create for yourself, and most of the structural contortions teams adopt to cope with merge hell are there to solve a process problem with architecture.
Wednesday, 22 July 2026Read more ➞ -
Always Go With a Monorepo
I made this argument to my team again last week, while a neighbouring team was busy splitting their monorepo into around eighty repositories. People reach for a second repository when what they actually want is a boundary, and a repository is a ruinously expensive way to draw a line you can draw for free in the filesystem.
Wednesday, 15 July 2026Read more ➞ -
There Is No Audience-Independent Architecture View
Every team eventually asks for "the architecture diagram", singular, the one picture which explains the system to everyone. That diagram cannot exist, because usefulness and audience-independence trade off by construction. The standards knew this in 1995. The answer is one model, many audience-specific views, and a clear separation between structural views and cross-cutting perspectives.
Wednesday, 8 July 2026Read more ➞
Subscribe to updates
There are multiple ways to stay updated with new posts on my blog: