From Bug Fixes to Feature Development: Working Effectively in Existing Codebases
Most professional software work is changing code somebody else wrote. A practical method for getting productive in an unfamiliar codebase quickly — an...
Engineering blog
Practical notes from building, debugging and maintaining real applications.
Most professional software work is changing code somebody else wrote. A practical method for getting productive in an unfamiliar codebase quickly — an...
AI tooling is genuinely useful for the mechanical half of development. The engineering judgement it does not replace is the half that decides whether...
Seven years across .NET, PHP, React, Angular and Flutter. The frameworks differ far less than they appear to — and what transfers is more valuable tha...
Three apps, three roles, one order. The interesting problems in a delivery product are not UI problems — they are state, connectivity and idempotency...
Supporting software that is already live teaches things that building greenfield does not — about change, evidence, and what 'done' really means.
Maintainability is not a folder structure. It is where decisions live, which direction dependencies point, and how much you have to understand to chan...
The query patterns that turn up again and again when a page that was fast in testing becomes slow in production — and how each one is usually fixed.
JWT and OAuth are often compared as alternatives. They are not — one is a token format, the other is an authorisation framework. Here is how they fit...
How I structure a React front end against a .NET Web API — project layout, the API contract, authentication and the boundaries that keep both sides in...
A repeatable sequence for production API failures: establish the facts, narrow the blast radius, reproduce, then fix at the right layer.