korrents
Nelson Elhage

Nelson Elhage

@nelson-elhage · 19 positions · 0 changes of mind

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.

  1. But 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

  2. writing 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

  3. 5 months earlier
  4. My 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

  5. I 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

  6. 4 months earlier
  7. Modern 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

  8. most 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

  9. neural networks

    in 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

  10. 4 months earlier
  11. benchmarks

    It'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

  12. However, 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

  13. compilers

    I'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

  14. 6 weeks earlier
  15. Also, 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

  16. LLMsdesign

    Overall, 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

  17. design

    Thus, 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

  18. 7 months earlier
  19. I 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

  20. 6 weeks earlier
  21. The 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

  22. In 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

  23. It 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

  24. 5 months earlier
  25. Profilers 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

  26. a 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