Angular's Move to Signals Is a Runtime Change, Not a Syntax Change
Angular went from NgModules and Zone.js to standalone components and signals, and it's easy to read that as a cleaner API. The part that actually matters is that change detection itself works differently now, not just how you write it.
Read more →The N+1 Query Problem Never Actually Left
ORMs made it easy to write a loop that looks like one operation and runs a hundred queries. GraphQL resolvers and AI-generated CRUD code just gave the same old bug a new place to hide.
Read more →Zero-Downtime Deploys Are a Database Problem, Not a Server Problem
Rolling restarts, health checks, connection draining — teams solve all of it and still get an outage, because the thing that broke was never the server.
Read more →AI Coding Agents Need Tests More Than Humans Do
The instinct is that a fast-moving agent needs a lighter process to keep up. It's the opposite: the faster the change rate, the more a real test suite is doing the job a cautious human used to do by hand.
Read more →Feature Flags Rot Just Like Any Other Code
A flag is sold as a safety net: ship dark, roll out gradually, kill it instantly if something breaks. The safety net itself needs maintenance, and it rarely gets any.
Read more →End-to-End Type Safety Is a Property of the Boundary, Not the Language
A strongly typed frontend and a strongly typed backend can still lie to each other constantly. The types only mean something at the seam between them.
Read more →Local-First Is an Architecture, Not a Feature
"Works offline" is usually bolted on as an afterthought. The systems that actually pull it off treat it as the starting assumption, not the exception.
Read more →WebAssembly Is Quietly Eating the Backend
Wasm shipped as a browser technology. Its most interesting use case turned out to be nowhere near the browser.
Read more →The Quiet Comeback of Server-Rendered Apps
For years the default answer was "ship a single-page app and let the client do the work." That default is being reconsidered, for reasons that have nothing to do with nostalgia.
Read more →Edge Functions Won't Fix a Slow Database
Running code closer to the user shaves milliseconds off the network hop. It does nothing for the query that takes 400ms once it gets there.
Read more →Context Engineering Is the New Prompt Engineering
Clever prompts get a lot of attention. What actually determines whether an AI coding agent is useful is what you let it see.
Read more →RAG Is an Architecture Problem, Not a Prompting Problem
Most retrieval-augmented generation tutorials focus on the prompt. The part that actually determines whether your system works is everything before the model ever sees a token.
Read more →Why I'm Learning RAG and LLM Engineering as a Backend Developer
Four years into building mission-critical .NET systems, here's why retrieval-augmented generation is the next thing I'm going deep on — and how I'm approaching it.
Read more →Migrating a Legacy System With Zero Downtime
Notes on moving GESCON from VB.NET to Angular and .NET 5 while keeping the old system live for every single user, every single day.
Read more →The Case for Boring Technology
New frameworks are fun to evaluate and expensive to maintain. A short argument for spending your "innovation budget" carefully.
Read more →Clean Architecture Isn't About Folders
Most "Clean Architecture" implementations get the dependency rule right and miss the point entirely. Here's what actually matters.
Read more →Reverse-Engineering an Undocumented Legacy System
How I mapped an 800-line biometric engine with zero documentation, and what it taught me about reading code instead of writing it.
Read more →
Blog
Notes on software engineering and AI