Rewrites, forks and breaking changes: hard lessons from language and codec builders

October 5, 2026 · 16 min read

Guido van Rossum weighs what a possible Python 4 could break, Chris Lattner designs Mojo around compatibility after the lessons of Swift and Julia, and the FFmpeg maintainers recount the Libav fork and the push for Rust rewrites. Each has lived through the cost of breaking with what users already have, and their caution is useful to anyone tempted to start over.

The rules, numbers and steps worth keeping in front of you.
  • The cost of a break lands on users and is usually larger than planned.
  • Van Rossum: the Python 3 transition's pain for users was underestimated.
  • Van Rossum: a Python 4 would need a different reason and a different process.
  • A break often falls on a hidden layer, such as C extensions beneath Python code.
  • Some of those extensions are already short of maintainers.
  • Van Rossum's process: years of warning, new behavior offered first as an option.
  • Type hints reused existing syntax and required no changes to the language.
  • Lattner: implementing long-tail compatibility is easier than persuading everyone to rewrite.
  • Mojo is a superset of Python and imports existing Python packages.
  • Lattner: launch early and openly, labelled unfinished, with a roadmap.
  • Kempf: Rust is excellent for new projects; reading code is far harder than writing it.
  • Kunhya: a replacement must be as good or better and pass the same tests.
  • FFmpeg's bar: every implementation must produce exactly the same bits.
  • Caveat: Mojo was unproven, and no rewrite advocate speaks in these sources.
This is the short form. The full insight has every expert's reasoning, their own words and the sources.