Writing
Notes on systems, mostly written after they broke.
Posts published here, plus the ones that appeared somewhere else. External pieces are marked and open in a new tab.
Three tools, three ways to be wrong quietly
Serena, Graft and enola all give a coding agent context about a codebase. Each one can hand your agent an incomplete answer without saying so, and each does it differently.
- #code-intelligence
- #mcp
- #ai-agents
- #benchmarks
- #static-analysis
Why bug count is a bad measure of software quality
A product can have hundreds of known bugs and work perfectly. It can have exactly one that makes it unusable. Counting bugs measures about as much as counting lines of code - and once the number becomes a target, people optimize the number.
- #software-quality
- #metrics
- #bugs
- #testing
- #tradeoffs
- #ai-assisted-development
Two years building the wrong product
FairwayHub took two years, 230 domains, more than 3,000 routes, three client apps and highly available infrastructure sized for 200,000 users. It had none of them, and not one paying user. AI made all of that cheaper to build and did nothing at all to make it useful.
- #product
- #ai-assisted-development
- #overengineering
- #tradeoffs
- #architecture
What does it mean to be a Staff Engineer?
The title means something different in every company, so arguing about the definition is not useful. What is useful is the set of things that make somebody able to operate at that level: tradeoffs over preferences, several languages for the same problem, metrics before opinions, and the willingness to actually decide.
- #staff-engineer
- #career
- #leadership
- #decision-making
- #metrics
What Go's garbage collector actually charges you
I spent a day arguing about rewriting a Go program in Rust, and a day measuring it instead. Peak memory fell 33 percent, allocations 42 percent, and the whole thing got 3.5 percent faster. Almost none of that came from where the profiler first pointed.
- #go
- #memory
- #garbage-collection
- #rust
- #performance
- #profiling
I did not understand tradeoffs until the database started dying
Twenty years of decisions that felt free at the time: a C++ job parsing call detail records, business logic buried in PL/SQL triggers, an ORM that made everything effortless, and one monolithic data model that eventually had to be paid for. What I would keep, and what I would not.
- #architecture
- #tradeoffs
- #scalability
- #databases
- #monolith
How I accidentally benchmarked grep, three times
Benchmarking a tool that plugs into a coding agent sounds like a weekend job. It is not. 510 agent sessions later, here is how an evaluation quietly turns into a machine for confirming whatever you already believed, and the small number of things that survived.
- #benchmarks
- #ai-agents
- #evaluation
- #code-intelligence
- #mcp
Four code graphs, four storage engines
enola, CodeGraph, graphify and codebase-memory-mcp all turn a repository into a queryable graph. They agree on almost nothing else. A benchmark-backed look at how each one stores, remembers and traverses a codebase, and what those choices cost.
- #code-intelligence
- #architecture
- #benchmarks
- #sqlite
- #static-analysis
How Did the Codebase Get Like This?↗ enola.tech
Enola can now record and explore how a codebase’s architecture changed over time. enola log, show, diff and blame turn architectural drift into evidence you can query, instead of a story you reconstruct by hand from old commits.
Cross-Repository Code Analysis: A Repository Is Not an Architecture↗ enola.tech
Relationships between repositories are rarely written down in one place. Why cross-repository dependency analysis is an evidence problem, not a search problem.
Parsing Code Is Not The Same As Mapping Architecture↗ enola.tech
Tree-sitter and a symbol graph are a good start, but a syntax tree is not an architecture graph. Here is where the real engineering work begins.
The Most Boring File in Enola Explains Why Static Analysis Is Hard↗ enola.tech
Enola’s extractor cache version history reads like a changelog of every place naive parsing gets architecture wrong - and why that turns out to be the real product.
Codebase Memory Is Not an Architecture Map↗ enola.tech
Most codebase-memory tools parse symbols and retrieve fragments. That is useful, but it is not the same as building an architectural model. The difference matters.
Building a Global Event-Driven Platform, Part 2↗ Vinted Engineering
The second half: what regional read projections cost in practice, and how the system behaves when consistency, retries and partial failure stop being theoretical.
Building a Global Event-Driven Platform, Part 1↗ Vinted Engineering
Taking a monolith that works and giving it a second continent to serve. The shape of the problem, and why the obvious answers do not survive contact with latency.
New posts go out on RSS.