Nelson Elhage
Software engineer who writes the blog Made of Bugs about performance, debugging and understanding computer systems. Previously worked at Anthropic on interpretability, at Stripe on Sorbet, and at Ksplice.
Everything they publish, on ppll ↗
Nelson Elhage did not write this page.
We collected these quotes from things they published elsewhere, and every quote links to where it was said. They have no account here and have not endorsed this site. Quotes are word for word; the short line under each one is our own restatement, not their wording. Their own site. Is this you? Claim it or ask us to remove it. Or tell us what is wrong here.
-
Their wordsBut I struggle to envision a general, composable, concurrent paradigm without one.
↗From error-handling to structured concurrencyblog.nelhage.com 1st of 2 in this piece
-
Their wordswriting programs in this style makes it much easier to write correct and safe concurrent code
↗From error-handling to structured concurrencyblog.nelhage.com 2nd of 2 in this piece
- 5 months earlier
-
Their wordsMy sense is that this hybrid is fairly common in practice; solvers aren't magical and if you can deduce additional structure using domain-specific analysis, it will often give the solver an important boost.
↗Solving regex crosswords with Z3blog.nelhage.com 1st of 2 in this piece
-
Their wordsI suspect the pattern generalizes: If Z3 has first-class support for your problem domain, it's worth starting there!
↗Solving regex crosswords with Z3blog.nelhage.com 2nd of 2 in this piece
- 4 months earlier
-
Their wordsModern CPUs mostly no longer struggle to predict the bytecode-dispatch indirect jump inside a "conventional" bytecode interpreter loop.
↗The ITTAGE indirect branch predictorblog.nelhage.com 1st of 3 in this piece
-
Their wordsmost branches are heavily "biased" one way or another - e.g. a "branch taken" rate of 10% or 90% is more common than 50%
↗The ITTAGE indirect branch predictorblog.nelhage.com 2nd of 3 in this piece
-
Their wordsin 2025 it might end up being easier to just throw a neural net at the problem, instead of a custom-designed-and-tuned prediction algorithm!
↗The ITTAGE indirect branch predictorblog.nelhage.com 3rd of 3 in this piece
- 4 months earlier
-
Their wordsIt's easy to get impressive-looking results if you're comparing against a poorly-tuned baseline, and that observation turns out to explain a surprising fraction of supposed improvements.
↗Performance of the Python 3.14 tail-call interpreterblog.nelhage.com 1st of 3 in this piece
-
Their wordsHowever, with so many different software projects out there, each moving so rapidly and depending on and being used by so many other projects, it becomes practically-inevitable that some regressions "like that one" happen, almost constantly.
↗Performance of the Python 3.14 tail-call interpreterblog.nelhage.com 2nd of 3 in this piece
-
Their wordsI'm hopeful this framework will turn out to be a much more robust style for writing performance-sensitive code, especially over time and as compilers evolve.
↗Performance of the Python 3.14 tail-call interpreterblog.nelhage.com 3rd of 3 in this piece
- 6 weeks earlier
-
Their wordsAlso, current models, while impressive, still fall well short of expert human performance.
↗Building personal software with Claudeblog.nelhage.com 1st of 3 in this piece
-
Their wordsOverall, though, this experience reinforced my belief that the tooling and interface design around LLMs is lagging way behind the actual capabilities, and is an area of active experimentation and development, even aside from any future model improvements.
↗Building personal software with Claudeblog.nelhage.com 2nd of 3 in this piece
-
Our reading
As AI makes code cheaper to produce, understanding and architectural design become more valuable.
Their wordsThus, code is cheaper than ever, but I suspect that insight and good architectural design and understanding, at least for now, will become more valuable than ever.
↗Building personal software with Claudeblog.nelhage.com 3rd of 3 in this piece
- 7 months earlier
-
Their wordsI suspect - but haven't verified - that in many corpora, we will encounter fairly bimodal Jaccard values - two clusters, near 1 and 0.
↗Finding near-duplicates with Jaccard similarity and MinHashblog.nelhage.com
- 6 weeks earlier
-
Our reading
Reliable, stable developer tooling matters more than which specific technical choices a team makes
Their wordsThe best tooling in the world will struggle to make up for "regularly losing a day debugging your environment," and so getting that aspect right can easily outweigh almost any other decisions you make.
↗Stripe's monorepo developer environmentblog.nelhage.com 1st of 3 in this piece
-
Their wordsIn a rapidly growing organization, it's much more important to have a developer environment that "just works" out of the gate, with minimal setup pain for new engineers.
↗Stripe's monorepo developer environmentblog.nelhage.com 2nd of 3 in this piece
-
Our reading
Per-engineer productivity inevitably declines somewhat as an organization and its codebase grow
Their wordsIt is almost inevitable that per-engineer productivity drops to some extent as an organization and codebase grows, even though it's also nearly-impossible to quantify that effect.
↗Stripe's monorepo developer environmentblog.nelhage.com 3rd of 3 in this piece
- 5 months earlier
-
Their wordsProfilers can only show you "what is there"; skillful performance engineering requires understanding the information that shapes and informs the profile but is "not there" in the profile itself.
↗Performance engineering, profilers, and seeing the invisibleblog.nelhage.com 1st of 2 in this piece
-
Their wordsa profile tells you how much time a program spent in a given operation; but not how much time it would spend if you optimized that operation.
↗Performance engineering, profilers, and seeing the invisibleblog.nelhage.com 2nd of 2 in this piece