Why the Flask Creator Ditched Python for Go in His AI Startup

Go Over Python, Not Heresy: Armin’s Pragmatic Play for Speed, Focus, and Better AI Output

分享
Why the Flask Creator Ditched Python for Go in His AI Startup

Introduction: When a Python Evangelist “Switches Sides”

Armin Ronacher, creator of Flask — one of Python’s most beloved web frameworks — is a household name in the Python community. For years, he’s been a standout contributor to Python’s ecosystem, with his career deeply intertwined with the language. Yet when launching his AI startup, he made a surprising decision: the company’s core backend services wouldn’t use Python, the reigning champion of AI, but Go instead.

This choice raises a fundamental question: Why would a top-tier Python expert “betray” his preferred language in an AI project where Python should dominate? This isn’t just a technical decision — it’s the result of an internal struggle between two identities: the “Swiss watchmaker” who pursues code perfection and the pragmatic founder focused on shipping products. This article explores how Armin Ronacher balances these personas and how AI-era tech companies should rethink their technology stack decisions.

1. Reconsidering Python: AI’s King with Hidden Concerns

Python’s dominance in today’s tech landscape seems unshakeable, especially in AI. However, every technology choice involves tradeoffs, and even Python isn’t the best answer in every scenario.

Python’s Absolute Strengths

First, we must acknowledge that no company can completely avoid Python. Armin Ronacher explicitly states that whether you like it or not, Python will be part of your stack. Its position in these domains is irreplaceable:

  • Machine Learning (ML): Core for AI inference and data processing tasks.
  • Data Processing: Unmatched data science ecosystem.
  • Infrastructure Management: For example, Armin uses Pulumi with Python to build his company’s infrastructure.

As the “glue” in the ecosystem and the data science engine, Python’s value is undeniable. Even for network-intensive tasks like AI inference, performance bottlenecks typically lie in networking rather than the language itself, making Python an excellent choice.

The Tradeoff for Core Services

Despite Python’s ubiquity, Armin believes it shouldn’t be used to build the primary services of his new company. This consideration isn’t rooted in performance bias but rather stems from more profound insights into language complexity and ecosystem strengths.

  • Growing Complexity: Armin observes that Python itself is becoming increasingly complex. In contrast, Go has maintained relative simplicity since its inception. This matters because for an engineering team that needs rapid iteration and collaboration, Go might be “an easier language to write.”
  • Ecosystem Specialization: Technology choices aren’t just about what a language can do, but what its ecosystem is good at. Armin explicitly states he’s abandoning Python not for performance reasons, but because of “what the ecosystem is good at.” While Python is fully capable of handling email parsing (one of Armin’s company’s core businesses), this isn’t where its ecosystem naturally excels. Compared to Go, it’s not the “chosen one” for building this type of scaled core service.

These nuanced considerations led Armin to look toward another language, naturally bringing us to the discussion of Go.


2. Embracing Go: The Pragmatist’s Victory

If choosing technology is an art, then for startups, the core of this art is pragmatism. Armin Ronacher’s choice of Go perfectly embodies this philosophy. Go isn’t the most “sexy” or feature-rich language, but in specific scenarios, it’s the most pragmatic, most suitable tool.

Here are Go’s core advantages that made it stand out:

  • Built for Web Services: Go is clearly positioned as “an excellent language for building web services,” with an intense focus (“really kind of only web services”), plus some CLI tool-building capability. This focus makes it exceptionally performant in its target domain.
  • Extreme Pragmatism: This is Armin’s primary reason for choosing Go. He emphasizes Go’s “very pragmatic language features,” a crucial quality for startups that need to focus on products, ship quickly, and reduce unnecessary technical friction.
  • Ecosystem Stability: For long-term projects, technology longevity is a key consideration. Armin believes Go can be “expected to stick around.” Even if Google stopped maintaining it someday, the massive community and industry users have enough strength and willingness to sustain its vitality, providing solid guarantees for projects.
  • The Pragmatic Landing Point After Avoiding Python Scaling Concerns and Rust Development Friction: After weighing options, Go became an ideal pragmatic choice. It avoids both Python’s ecosystem fit issues when building certain types of core services and Rust’s steep learning curve and high development “friction,” making it the best choice for a “founder.”

To better understand this decision, we need a horizontal comparison of these languages to examine their roles in different scenarios.

3. Horizontal Comparison: Go vs. Rust vs. Python Use Cases

Armin Ronacher houses “two programmers” within himself: one is the “Swiss watchmaker” pursuing code perfection, usually thriving in the open-source world; the other is the company founder focused on product delivery, making all decisions with pragmatism first. From the latter’s perspective, he made a clear distinction between Go, Rust, and Python’s applicable scenarios.

Python: The Ubiquitous “Glue” and Data Science Engine

  • Role: Python is the universal “glue” in the ecosystem and the undisputed default choice for data processing and machine learning.
  • Advantages: Most powerful library ecosystem, supports rapid prototyping and iteration. In network-intensive tasks like AI inference, the language’s performance bottleneck isn’t prominent.
  • Tradeoffs: The language’s inherent complexity is increasing, and for certain types of core services, it may not be the most natural, direct choice.

Rust: The “Swiss Watch” for “Rust-Shaped Problems”

  • Role: Rust is the expert-level language for solving specific “Rust-shaped problems,” such as handling binary data, building databases, load balancers, or high-performance Python extension modules.
  • Advantages: Memory safety, predictable performance without garbage collection (GC), and excellent as Python extensions.
  • Tradeoffs (for Startups): Extremely high development “friction.” This includes “incredibly slow” compilation speeds and the steep learning curve of ownership and borrowing checking. This makes it highly unsuitable for environments requiring rapid iteration and flexible adjustments.

Go: The Pragmatic, Focused Web Service Builder

  • Role: Go is the pragmatic choice for building web services and CLI tools, and a focused service-building specialist.
  • Advantages: Simple language, easy for teams to learn and master, stable ecosystem, excellent performance in high-concurrency service scenarios.
  • Tradeoffs: Its domain of applicability is relatively narrow, lacking Python’s “jack-of-all-trades” versatility.

Notably, Armin also explicitly ruled out using TypeScript/JavaScript for core backend services. Despite its increasingly mature language environment, he’s reserved about the npm ecosystem, stating bluntly: "I feel like in the JavaScript ecosystem, I can barely build efficiently without introducing 500+ dependencies, which makes me uncomfortable."

Traditional language selection considerations are now obvious. However, AI’s rise introduces a new, potentially disruptive decision dimension.

The New Deciding Factor: AI Agent Code Generation Quality

The rise of AI programming assistants is fundamentally changing software development paradigms, and the underlying logic of technology selection is shifting accordingly. Armin Ronacher, as an entrepreneur who heavily relies on AI-assisted coding (which he calls his “army of interns”), discovered a striking fact: the quality of AI-generated code has become an unavoidable consideration.

He reached a clear conclusion from practice:

“I did actual testing… I found that AI Agents perform much better on Go than on Python.”

Why? The reason lies in the language’s design philosophy. Armin explains: “Because the abstractions are very thin, it (AI) can understand the code better.” Go’s simplicity and directness make its structure easier for large language models to understand and generate, resulting in more reliable, more correct code.

This discovery is significant for a team heavily dependent on AI. When your “army of interns” is more efficient and makes fewer errors with a particular language, choosing that language isn’t just a technical preference — it directly impacts the entire team’s productivity.

Conclusion: No Best Language, Only the Right Choice

Armin Ronacher’s abandonment of Python for Go isn’t a rejection of Python, but rather a highly pragmatic trade-off made within a new technical paradigm, based on a specific startup context (AI company, rapid iteration, small-team collaboration).

His decision logic can be summarized as follows:

  • Pragmatism Above All: For startups, product success matters far more than “meticulously crafted” code. Choosing tools with less friction and more focus on solving core problems is wise.
  • The Art of Tradeoffs: Among language simplicity (easy for teams to master), ecosystem maturity, performance, and development efficiency, Go provides an excellent balance point.
  • Embracing New Paradigms: Incorporating AI code generation quality into core technology selection considerations reflects adaptation to changing times. A language’s friendliness to AI is becoming a new, critical productivity metric.

Ultimately, Armin’s story brings a profound insight to all technical decision-makers: we must continuously reevaluate our toolbox and courageously make the most suitable, most pragmatic choices based on current project needs and emerging technology waves.