Blog

Latest Posts

Notes on software engineering, the JVM, AI, and building products that ship.

NuggetsJava & KotlinTesting25 June 2026

The flaky test that passes on your machine

A test that depends on Set iteration order often won't fail locally — which is exactly what makes it dangerous.

Problem SolvingJudgementCareer24 June 2026

Pattern Matching Is an Index You Build

I asked a senior engineer how they always seem to know which pattern fits a problem they've never seen. The answer reframed everything: it isn't talent, it's an index — and most engineers build the wrong one. How to build the right one.

DesignJudgementProblem Solving23 June 2026

The ThreadLocal Trap: How a One-Line Spec Hid a Security Decision

An afternoon ticket — add a Jackson serializer — turned out to be hiding a security decision nobody had written down. The story of building Ihawu's masking serializer, and the judgement call that kept a breach from shipping.

CI/CD22 June 2026

The Principles of CI/CD

Tools come and go; the principles don't. Nine ideas every reliable CI/CD system is built on — five for how work flows to production, four for making the automation itself trustworthy.

CI/CD21 June 2026

Why CI/CD? The Case for Shipping Continuously

Before the pipelines and the tooling, one question: why bother? The case for CI/CD, what the letters actually mean, and the counterintuitive truth that shipping more often makes software safer — not riskier.

Java & Kotlin11 June 2026

Idiomatic Kotlin: Lose the Java Accent

Every language has an accent — and most Kotlin code is full of Java's. What idiomatic Kotlin really looks like, and why writing it the Java way costs you the gains you switched for.