Engineering rigor, modernized.
RSS FeedA frontend engineering leader bringing two decades of rigor to modern tooling — functional TypeScript, AI-assisted teams, and the standards that survive both.
Read the blog posts or check README for more info.
Featured
- Featured
The Wrong Thing, Built Perfectly: Why Shared Understanding Comes Before Code
The expensive failure is not an agent that writes bad code. It is an agent that writes good code for the wrong design, quickly, while you nod along. The fix is an interrogation before implementation, and the questions it asks are not the ones you expect.
- Featured
Break Your Own Code First: Property-Based Testing in TypeScript
Your tests pass because you chose the inputs, and you chose them with the same mental model that wrote the bug. State the law instead and let a generator hunt the counterexample. Doing this to my own published reducer found a rule I had promised in print and never actually enforced.
- Featured
Stop Building Spread Pyramids: Composable Focus in TypeScript
Changing one string five levels down means rebuilding every object on the way back up, by hand, in a pyramid of spreads where the bug is never in the value you meant to change. A lens turns that path into a value you can name, compose, and reuse, and the pyramid collapses to one line.
- Featured
It Doesn't Forget, and That's the Problem: Why Your Chat History Isn't a Handoff
A long design session goes bad in a specific way, and it is not that the agent forgets. It remembers everything you said, including every idea you abandoned, at full weight. The fix is the same one engineering already uses for people: write down what survived, and hand over the document instead of the conversation.
- Featured
AI Is a Brilliant Developer With No Discipline: Why Managing Agents Is Managing Engineers
Updated:I spent months writing prompts, rejecting what came back, and rewriting it myself. The problem was never the model. It was that I was prompting a tool instead of managing a developer, and engineering already knows how to manage a fast, talented, undisciplined developer.
Recent Posts
State Is a Fold Over Events: Functional State in React and Beyond
Your state is the residue of setter calls nobody recorded, which is why the bug won't reproduce. Name what happened as events, let one pure function fold them into state, and every screen your app has ever shown is one replay away.
Effects Are Values: Functional Core, Imperative Shell
Your business rules can't be tested because they're welded to fetches, toasts, and analytics calls. Split the program in two: a pure core that decides what should happen and returns it as plain data, and a thin shell that performs it. The mock count drops to zero.
Booleans Lie: Modeling State with Discriminated Unions in TypeScript
Updated:Three booleans give you eight states when you only meant four. Discriminated unions make the illegal ones unrepresentable — model a value as exactly one of a fixed set of shapes and let TypeScript hold you to it.
Errors Are Values: Functional Error Handling in TypeScript
Updated:Stop throwing, start returning. Model failure as a value with Result, compose fallible steps on a railway, make illegal states unrepresentable, and let TypeScript force you to handle every error — no try/catch required.