Blog (1 of 17)
-
Cross-Team Collaboration
When you start hearing "we can't deliver because of another team" on a regular basis, something has already gone wrong. Usually you have optimised each team's own velocity so hard that you killed the company's. The work that would fix it, one team unblocking another, is invisible to every metric you are using, so it quietly stops.
Wednesday, 7 October 2026Read more ➞ -
The Sidecar That Shouldn't Exist
Data mesh gives every data product a sidecar: the logical home of cross-cutting concerns like policy enforcement, audit, and quality. I tried to find the sidecar a place in our repository and concluded it must not have one. Some architecture concepts are useful as vocabulary, not as structure, and telling the two apart is a design decision of its own.
Wednesday, 30 September 2026Read more ➞ -
The Layer Nobody Should Have to Import
My book describes an architecture in one sentence: Controller → Service → Gateway → Storage. It never says what to put in the HTTP box. I published the thing I have been putting there for fifteen years, mostly so I stop copying it between projects, and writing down why it is shaped like that turned out to be the interesting part. A framework should be the dependency almost none of your code imports.
Friday, 25 September 2026Read more ➞ -
Visible Actions Are More Important than Speech
I have watched a manager give a speech about a value and then, in the next small meeting, act exactly against it. People notice. They read what you do as the real message and treat what you say as noise on top of it, and they replicate the behaviour, not the speech.
Wednesday, 23 September 2026Read more ➞ -
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 ➞
Subscribe to updates
There are multiple ways to stay updated with new posts on my blog: