Writing
Things I figured out the hard way
93 articles

career ·
The 10x engineer
AI made all of us faster, so speed alone no longer tells one engineer from another. The engineers who get ten times more out of it knew more to begin with: they mastered their own craft, then learned enough of the professions around it to do that work as well.

ai ·
The agent prefers the monolith

career ·
The three pillars of the modern software product engineer

migration ·
We left Heroku during the World Cup final

access control ·
The lock keeps the hours

payments ·
Unknown is not a decline

ai ·
Opus is back

ai ·
An identity provider in an afternoon

mobile ·
The check-in app is one web page and two wrappers

ai ·
A year with Codex, a week with Astra

ai ·
Onboarding took two days. Now it takes two hours.

on-premise ·
A door on someone else's network

cost ·
$58 a month to keep one container awake

cloud run ·
Ready is not alive

ci/cd ·
Nobody has a service-account key

ai ·
The CSV importer that proposes and never executes

astro ·
The landing pages belong to the designer now

postgresql ·
The RAG client was stealing my connections

google cloud ·
The project quota that killed Shared VPC

ai ·
Five assistants, one loop

ai ·
A harness for the model after this one

react ·
The front-end choice is made, and it is not my favourite

nestjs ·
Express 5, Fastify 5, and the adapter I did not swap

ai ·
AGENTS.md, or writing for a reader that forgets

typescript ·
They ported tsc to Go

redis ·
Redis is open source again, and I have stopped keeping score

ai ·
The block images are generated now

ai ·
A tool call is just a schema

kafka ·
ZooKeeper is gone

sdk ·
A batch of ten, a flush timer, and the event that did not fit

messaging ·
One topic, three regions, and the policy that took the longest

databases ·
Aurora DSQL, and the clock doing the hard part

redis ·
A week of alternatives, and the migration I did not make

nestjs ·
NestJS over plain Express

analytics pipeline ·
The tunnel that starts on our side

postgresql ·
Two years later, MERGE grew the clauses I wanted

elasticsearch ·
Elasticsearch came back

embedded analytics ·
The filter you can see is not the one that matters

redis ·
Redis changed its licence, and the fork was already warm

ci/cd ·
Auto-merging a pull request nobody wrote

aws proton ·
Proton opens the pull request. You own everything after it.

lookml ·
Promoting a dashboard is a string replacement

redis ·
Valkey exists now

solid ·
One week with Solid

platform engineering ·
The button in Port and the service it makes

svelte ·
One week with Svelte

go ·
Go changed a loop, and nothing broke

opentofu ·
The fork shipped

c# / .net ·
.NET 8, Native AOT, and what a container actually costs

automation ·
The snapshot restore was the easy half

queues ·
BullMQ, and the Mongo queue I did not use

migration ·
The cutover was a connection string

terraform ·
The licence changed under the state file

kafka ·
The bridge release arrived

vue ·
One week with Vue

terraform ·
The import block, and the resources nobody wrote down

next.js ·
The App Router went stable. My site did not move.

rust ·
A weekend with Rust, and the index that stopped cloning

typescript ·
TypeScript 5.0 and the decorators that are finally the real ones

go ·
Errors are values. Go 1.20 made them a list.

eventbridge ·
EventBridge Pipes, and the Lambda I deleted

kafka ·
Kafka without ZooKeeper, for new clusters only

c# / .net ·
.NET 7, and the string literal I stopped escaping

postgresql ·
MERGE is not the upsert you already had

self-hosted runners ·
Self-hosted runners, one deployment per product

mongodb ·
MongoDB 6.0, and the change stream that can show you the before

node.js ·
Node 18 shipped fetch and a test runner. I kept one.

terraform ·
Terraform learned to say what it assumed

kubernetes ·
The dockershim went away and my images did not notice

lucene ·
Every string search I did not have to write

c# / performance ·
The Java port we could not make fast enough

ci/cd ·
GitHub Actions over Jenkins

groovy ·
Groovy everywhere, with one large asterisk

python ·
Two hundred lines of PowerShell I could not test

windows / containers ·
Windows containers, Linux containers, and when a small Windows VM wins

pipelines ·
The scheduled job on the Windows agent

spark / hadoop ·
I wrote a Spark job. The stack trace was Hadoop.

spark ·
The cluster went away. The shuffle did not.

jenkins ·
A Windows agent for Jenkins, from bare VM to online

c# / architecture ·
C# without the class hierarchy

retrospective ·
A year of automating a flat

c# / .net ·
.NET 6 makes small services simpler

infrastructure ·
The same stack, written twice

memorydb ·
Redis you are allowed to lose, and Redis you are not

step functions ·
A ten minute wait should not cost you Lambda time

serverless ·
SAM and Serverless Framework, on the same flat

infrastructure ·
The template I wrote and the one AWS ran

serverless ·
EventBridge cannot tell you when the sun sets

.net / containers ·
Running .NET 5 in Linux containers - and measuring its memory

c# / .net ·
C# 9 and .NET 5: less ceremony, useful improvements

alexa ·
A smart home skill is a router and a contract

migration ·
The migration tool that could not phone home

leadership ·