On August 25, CCP Games published a blog post titled “The Move to Python 3 Begins,” announcing that EVE Online — the 23-year-old space MMO — is finally migrating its 2.4 million line codebase from Stackless Python 2.7 to Python 3. The last major upgrade was in 2010. Sixteen years on a language the Python Software Foundation formally sunsetted in 2020.
The internet’s reaction was predictable. Hacker News lit up with 314 points and 165 comments, most of them variations on a theme: how could a company let this happen? Sixteen years? On a dead language? What kind of management allows 2.4 million lines of technical debt to accumulate?
Here’s the thing nobody in that thread seems willing to say: technical debt is a luxury good. Only companies that survive long enough get to have it.
The Companies That Never Migrate Are the Ones That Died
Think about what it means to have a 2.4 million line Python 2.7 codebase in 2026. It means you shipped a product in 2003. It means that product is still running. It means you’re still paying engineers to work on it. It means you have a reason to migrate at all.
Most software from 2003 is gone. Most MMOs from 2003 are gone. The ones that never had to migrate from Python 2.7 didn’t do so because they were more disciplined — they did so because they were acquired and shut down, or they ran out of money, or their player base evaporated. The graveyard of dead MMOs is full of codebases that never got the chance to become technical debt.
CCP’s migration is not a confession of failure. It’s a display of institutional competence. The company didn’t guess how far it was from Python 3. It compiled every one of its ~20,000 Python files under both interpreters and counted. The result: 95.9% already compatible. Roughly 3,300 blocking lines — 1,500 old print statements, 800 long integer literals, 600 deprecated exception clauses, 50 uses of the <> operator. That’s not a company drowning in debt. That’s a company that knows exactly how much it owes.
The Migration Is the Boring Part
The real story in CCP’s announcement isn’t the migration itself. It’s the measurement. You can only compile 20,000 files under two interpreters and get a clean number if you have a build system that still works, a test suite that still runs, and engineers who still understand the codebase well enough to know what “blocking” means.
That’s the part the “rewrite it in Rust” crowd never talks about. A rewrite is easy to propose and hard to survive. A migration — staged, measured, tool-assisted, with Python-Future doing the mechanical work and humans reviewing the ~20,000 places where Python 2 and Python 3 behavior diverges — is the opposite. It’s slow. It’s unglamorous. It’s the kind of work that doesn’t get a keynote at a conference.
And it’s the kind of work that only a company with 23 years of accumulated institutional knowledge can do at all. A startup with a 2.4 million line Python 2.7 codebase wouldn’t be migrating it. It would be dead.
What the Migration Actually Proves
The conventional wisdom in software is that technical debt is a moral failing. Managers who let it accumulate are negligent. Engineers who inherit it are victims. The solution is always the same: stop everything, pay it down, rewrite it clean.
CCP is quietly demonstrating that this is wrong. Technical debt is not a moral failing. It’s a balance sheet. You take on debt to build things. You service it when you can. And if you’re still in business 23 years later, you pay it down on your own schedule — carefully, in stages, with tools and measurement and a plan.
The companies that never have to do this migration are the ones that died. The companies that have to do it are the ones that won.
One engineer who worked on the migration put it to me this way, in a Slack DM: “Everyone wants to be the person who writes the greenfield code. Nobody wants to be the person who migrates 2.4 million lines. But the greenfield code is gone in five years. The migration is still running.”
That’s the part the Hacker News thread missed. EVE Online isn’t a cautionary tale. It’s a flex.