Robonaissance

Robonaissance

Written in Python, Part 4: The Framework Wars

Both sides were Python libraries, each with a trillion-dollar company behind it. The ecosystem they shared cannot explain the outcome. What decided it was the language itself.

Hugo's avatar
Hugo
Jul 31, 2026
∙ Paid

A series on how one language shaped artificial intelligence, and how intelligence is now reshaping it.


Implementation Details

In February 2019, Google published a guide to migrating from TensorFlow 1.x to TensorFlow 2.0. It is a technical document, written for engineers with code to move, and it contains a sentence that ends an argument.

The guide explains that TensorFlow 1.x required users to manually assemble an abstract syntax tree by making API calls, and then to manually compile that tree by passing input and output tensors to a session. It then states that TensorFlow 2.0 executes eagerly, the way Python normally does, and that in 2.0, graphs and sessions should feel like implementation details.

Graphs and sessions were not implementation details. They were the architecture. They were the reason TensorFlow was designed the way it was, the source of its advantages, and the thing every TensorFlow user spent their first week learning. A session was the object you had to create before anything could execute. A placeholder was how you told the graph that a number would arrive later. Variable scopes existed because the graph held state in a global namespace and you needed a way to find it again. None of that vocabulary was incidental. It was what using the framework consisted of.

In its own migration documentation, Google demoted the central premise of its framework to a background mechanism users should not have to think about.

That sentence is a concession. What was conceded, and why, is the subject here.

The previous instalment ended by handing over a puzzle. If accumulated ecosystem decides which technology wins, and if that is why Lisp lost and why Julia has not displaced Python, then the framework war of 2015 to 2019 should be inexplicable. Both frameworks were Python libraries. Both had access to the same array, the same notebooks, the same package manager, the same enormous installed base of scientific Python users. Neither had an ecosystem advantage over the other because they shared one.

If anything the asymmetry ran the other way. One side was released by Google with the resources of its research organization behind it. The other was a project inside a rival lab, built on top of a framework written in a language the field was leaving. If ecosystem and resources were sufficient to explain outcomes, this contest was over before it started, and it went the other way.

The ecosystem argument is silent here. Something else decided it, and the something else was the language.

User's avatar

Continue reading this post for free, courtesy of Hugo.

Or purchase a paid subscription.
© 2026 Robonaissance · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture