Fenris Creations · EVE Online

EVE Online, Python 3 이주를 시작한다

24년 된 2백40만 라인 코드베이스는 어떻게 갈아엎히는가 — 그리고 왜 "성공의 정의는 아무도 눈치 못 채는 것"인가.

읽기 전에

이 글을 가장 빠르게 흡수하려면

핵심 질문 하나

"20년 넘게 살아 있는 MMO의 240만 라인 Python 2 코드를, 서버를 24시간 중 23.75시간씩 돌리면서, 어떻게 Python 3로 옮기는가?"

선행 개념 (모르면 막히는 것만)

  • Stackless Python — 표준 Python의 포크. 수천 개의 경량 "tasklet"을 한 스레드에서 스케줄해 대규모 동시성을 낸다. EVE의 단일 서버 노드가 수천 명의 파일럿을 동시에 처리하는 근거.
  • Python 2 → 3 breaking change — 파이썬 3는 파이썬 2와 의도적으로 호환되지 않는다. 대표 예시: print가 문(statement)이 아니라 함수로 바뀌었고, 1/20이 아니라 0.5가 됐고, str이 유니코드가 됐다.
  • python-future / 2to3 — Py2 코드를 Py2와 Py3에서 둘 다 돌아가는 코드로 자동 변환하는 도구. 100% 자동은 아니고, 기계가 잡을 수 있는 문법 debt만 걷어낸다.
  • Tranquility / Singularity — EVE의 프로덕션 서버(Tranquility)와 테스트 서버(Singularity) 이름. 이 이주는 Singularity에서 검증하고 Tranquility로 넘긴다.
  • Fenris Creations — 2026-05 CCP Games가 Pearl Abyss로부터 독립·리브랜딩한 이름. "CCP"가 중국 공산당 약어와 겹쳐 국제화에 지장이 있었다는 게 CEO의 설명.

멘탈 모델 (3줄)

이건 "새 게임 만들기"가 아니라 움직이는 기차의 엔진 교체다. 승객은 계속 타고 있고, 좌석·화물·티켓 데이터 하나도 잃으면 안 되고, 라이브 서버 정지는 하루 15분(23.75/24 규칙)이다. 그래서 이주를 기계가 잡을 수 있는 debt인간이 판단해야 하는 debt로 자른 뒤, 앞엣것부터 완주하는 계단식 전략을 쓴다.

권장 읽기 순서

  1. Executive Summary로 전체 결론과 숫자 5개를 먼저 잡는다 (2분).
  2. 팩트체크로 "이 발표가 신뢰할 만한가"를 판정 뒤 원문으로 간다 (2분).
  3. 원본 완역은 §산을 측정하며(t-4)부터 봐도 된다 — 여기가 이 발표의 하이라이트다 (3,300줄 / 95.9% 이야기).
  4. Python/게임 개발 배경이 얕으면 §왜 Python 3인가(t-2)부터 순서대로 읽는다.

다 읽고 나면 스스로에게 이 3개를 물어봐라

  1. "기계가 잡을 수 있는 debt"와 "인간이 판단해야 하는 debt"의 구체적 사례를 각각 1개씩 댈 수 있는가?
  2. 왜 EVE는 Python 2.7에서 16년을 버텼는가? (경제적 이유 vs 기술적 이유)
  3. EVE Frontier가 이 이야기에서 왜 "게이트키핑 증거"로 쓰이는가?

예상 소요: 요약만 5분 · 완독 25분 · 팩트체크까지 35분.


Executive Summary

이 발표가 실제로 말하는 것

EVE Online의 대규모 함대 전투 스크린샷 — 이 발표의 헤더 이미지
원문 헤더 이미지 — EVE Online의 함대 전투 장면 (Fenris Creations 제공)
한 줄 결론: EVE Online이 Stackless Python 2.7에서 Python 3로 이주를 시작했다. Stage 1(기계적 문법 debt 청소)은 오늘 라이브(Tranquility)에 배포됐다. 진짜 어려운 Stage 2(같은 코드가 Py2/Py3에서 다르게 동작하는 부분 — 약 2만 라인)는 이제부터다.

핵심 수치 5

수치맥락
2003EVE 런칭 연도. 이 코드베이스는 지금 23년 굴러왔다.
2010마지막으로 Python 버전을 올린 해 (2.5 → 2.7). 그 후 16년 동안 언어 버전을 안 바꿨다.
2.4M파이썬 코드 라인 총량 (약 20,000개 파일).
95.9%첫 스캔에서 이미 Py2와 Py3 양쪽에서 컴파일되는 파일 비율. 산이 아니라 큰 언덕이었다.
~3,300Py3가 파싱을 거부하는 문법이 있는 수 (2.4M 중). 대부분은 print문·long 리터럴·구식 except·<>.

2단계 이주 전략

단계목표수단상태
Stage 1 Py2.7과 Py3 양쪽에서 돌아가는 코드로 만들기 (문법 debt 청소) python-future / 2to3 기반 자동 fixer Tranquility 배포 (2026-08-25)
Stage 2 양쪽에서 컴파일되지만 다르게 동작하는 코드 수정 사람이 한 줄씩 판단 — 예: 1/20인지 0.5인지 시작 전 · 약 20K 라인
후속 실제 Python 3 인터프리터로 스위칭 Singularity 플레이테스트 → Tranquility 롤아웃 이후

왜 지금인가 — 3개의 이유

플레이어에게 뭐가 바뀌나

단기: 아무것도 안 바뀐다. 그게 성공의 정의다.

→ 장기: 더 빠른 EVE · 더 빠른 버그 픽스 · 더 빠른 신기능

Stage 1은 의도적으로 invisible이다. 배포 후 뭔가 이상하면 버그 리포트를 넣어라. 미션 에이전트 백엔드도 Py3 준비 중이지만 역시 티가 안 나야 한다.

이 발표에서 정말 새로운 정보 (원자 가치)


팩트체크

주장 전수 검증

A 종합 신뢰도 A — Fenris Creations의 1차 발표. 역사적·기술적 주장(2003 런칭, 2010 Py 2.7 업그레이드, 2020 Py2 EOL, Frontier Carbon Py3 이주)이 외부 1차 출처로 전수 확인됨. 리브랜딩(CCP → Fenris)까지 검증 통과. 미래형 수치("장기적 속도 향상")는 가설로 표기.
"EVE는 2003년에 Stackless Python으로 런칭됐다"
판정: 사실. EVE Online은 2003-05-06 CCP Games가 런칭. 서버 엔진은 Stackless Python 기반. tasklet 기반 대규모 동시성 아키텍처는 오래 문서화된 사실.
"2007년 Stackless 2.5, 2010년 Stackless 2.7로 업그레이드했다"
판정: 사실. CCP 공식 뉴스가 2010-08-19에 "Stackless Python 2.7" 업그레이드를 공지했다. 그 이후 16년간 언어 버전이 유지됐다는 서술도 이번 발표 이전 EVE 관련 커버리지들과 일치.
"Python 2.7의 공식 EOL은 2020년이었다"
판정: 사실. Python 2.7은 2020-01-01자로 공식 sunset. 이후 코어 팀의 마지막 편의 릴리즈 2.7.18이 2020-04에 나오고 이후로 보안 패치 없음.
"EVE Frontier는 이미 Carbon 엔진을 Python 3에서 돌린다"
판정: 사실. Carbon 엔진의 Py3 이주는 2단계로 진행됐다: (1) Stackless 2.7 → Stackless 3.8.1 완료 2023-11, (2) Python 3.12로 승격 후 2024-06 EVE Frontier에서 첫 사용. 실측 성능 향상 10–30%가 공개돼 있다.
"개발사 이름이 CCP Games에서 Fenris Creations로 바뀌었다"
판정: 사실. 2026-05-06 발표. Pearl Abyss가 CCP 경영진에 $120M로 매각(분사). 이름 "Fenris"는 북유럽 신화 늑대에서. CEO Hilmar Veigar Pétursson: CCP 약어가 미·중 지정학 상황에서 오독을 유발한다는 게 배경. Google DeepMind와 리서치 파트너십 동시 공개.
"최근 Python 3 릴리즈들이 언어 역사상 가장 큰 속도 향상을 냈다"
판정: 부분 사실. Python 3.11의 Faster CPython 프로젝트가 벤치마크 대비 평균 25% 속도 향상을 공식화했고, 3.12·3.13이 계속 개선. "역사상 가장 큰"은 상대적·주관적 형용이지만 최근 5년 트렌드로 보면 합리적. EVE Tranquility에서 실제 얼마나 빨라질지는 이번 발표에서도 미정으로 조심스럽게 말한다.
"Python 3에서 1/2는 0.5이지만 Python 2에서는 0이다"
판정: 사실. PEP 238이 정확히 이 change를 규정: /는 Py3에서 항상 true division, Py2에선 정수/정수는 floor division. EVE 코드가 이 차이를 실제로 물었을 때 조용히 잘못된 값을 반환할 수 있는 대표 사례가 맞다.
"python-future / futurize는 2to3과 같은 rewrite 머신에 기반한다"
판정: 사실. python-future 프로젝트는 표준 라이브러리 lib2to3의 fixer 인프라를 재사용해 Py2 코드를 Py2/Py3 공용 코드로 변환한다. Stage 1의 도구 선택으로 합리적.
"Fenris Creations는 Stackless의 가장 중요한 기여자 중 하나였다"
판정: 부분 사실. CCP Games는 오랫동안 Stackless Python 커뮤니티의 주요 사용자·후원자로 알려져 있고, Stackless의 저자 Christian Tismer와 오랜 관계가 문서화돼 있다. 다만 리브랜딩 이후에도 "Fenris Creations가 기여자"라는 주장은 연속성의 표현으로 이해해야 한다 (기여의 실체 시기는 CCP 시절).
?
"미션 에이전트 백엔드도 Python 3용으로 준비 중이다 — 하지만 티가 안 나야 한다"
판정: 확인 불가 · 가설. 개발 내부 상태에 대한 미래형 서술. 2026-08-26 시점에 외부에서 검증 가능한 뒷받침은 없음. 발표자 진술로만 존재하는 정보로 처리.
레퍼런스: 발표 자체가 1차 출처.

원본 (완역)

The Move to Python 3 Begins!

캡슐리어 여러분,

EVE는 EVE Evolved 이니셔티브의 일환으로 계속 진화하고 있고, 이제 코드 그 자체에 스포트라이트를 비출 때가 왔습니다!

EVE Online의 모든 게이트 점프, 모든 마켓 오더, 모든 함대전 아래에는 매우 많은 양의 Python이 깔려 있습니다. 그 코드는 20년 넘게 뉴 에덴을 굴려 왔고, 이제 Python 3로의 전환을 시작합니다. 여러분에겐 그게 이렇게 다가옵니다 — 버그를 더 빨리 잡을 수 있는 도구, 새 기능을 위한 여지, 그리고 시간이 흐르면 더 빨라진 EVE.

이 이주의 성공 정의는 간단합니다. 완전히 눈치채지 못하는 것 — 가끔 뭔가가 더 매끄럽게 굴러가는 순간을 제외하고는요.

많은 분들이 이미 Singularity에서 우리의 첫 발걸음을 테스트해 주셨고, 그 변경사항은 오늘 배포됐습니다. 이건 앞에 놓인 긴 여정의 시작일 뿐입니다.

Python 프로그래밍 언어 공식 로고

어떤 이보다 오래된 코드베이스

EVE는 2003년, Stackless Python 위에 지어져 런칭됐습니다. Stackless는 Python의 한 버전으로, 그 경량 "tasklet"들이 단일 서버 노드가 수천 명의 파일럿을 동시에 돌릴 수 있게 해주는 물건입니다. Fenris Creations는 그냥 Stackless를 채택한 데 그치지 않았습니다 — 그 프로젝트의 가장 중요한 기여자 중 하나가 되었습니다.

여러분 중 몇 분은 2007년에 Stackless Python 2.5로, 그다음 2010년에 Stackless Python 2.7로 업그레이드한 걸 기억하실지도 모릅니다. 그게 EVE가 Python 버전을 바꾼 마지막이었습니다. Python 2.7은 2020년에 공식 수명이 끝났고, 나머지 소프트웨어 세계는 앞으로 나아갔으며, 그동안 한 세대의 캡슐리어가 태어나 학교에 가고 프리깃을 몰기 시작했습니다 — EVE는 같은 언어 버전에 머문 채로요. 그건 대규모의, 잠재적으로 위험한 이주를 정당화할 수가 없을 정도로 안정적으로 굴러갔습니다. 지금까지는요.

16년을 같은 버전에서 버텼다는 건 그것이 얼마나 잘 굴러갔는지에 대해 많은 걸 말해줍니다. Carbon 엔진이 엄청나게 도왔지만, 그 Carbon 역시 이제 앞으로 나아갔습니다!

왜 Python 3인가, 왜 지금인가

짧게 답하면 — Python 2에 머무는 것이 EVE의 발목을 점점 더 잡고 있고, Python 3로 옮기는 것은 여러분에게 더 건강하고 더 잘 지원받는 게임을 뜻합니다.

이유 하나는 성능입니다. 최근 Python 3 릴리즈들은 이 언어 역사상 가장 큰 속도 향상 중 일부를 이뤘습니다. 시간이 지나면 그건 더 빠른 EVE로 가는 문을 열어줍니다 — 다만 그게 정확히 뭘 뜻하게 될지 지금 말하기엔 너무 이릅니다.

또 하나는 생태계입니다. 현대의 라이브러리, 디버거, 프로파일러는 모두 Python 3용으로 만들어졌습니다. 우리가 Python 2에 남아있는 매해, 그 도구들 중 더 많은 것들이 우리의 손 밖으로 미끄러져 나가고, 게임을 개선하는 대신 우리가 직접 유지해야 할 것들이 늘어납니다. 더 나은 도구는 우리가 문제를 더 빨리 찾고 고칠 수 있게 해준다는 뜻입니다.

Python 3는 이 언어의 핵심 구성요소들 중 많은 것을 단순화합니다.

텍스트는 하나의 일관된 문자열 타입으로 다뤄져 로컬라이제이션이 더 안정적으로 됩니다. 정수는 더 이상 임의의 크기 제한을 갖지 않고, 필요할 때 자동으로 자라납니다. Python의 클래스 시스템조차 통합됐고, 유산적 동작이 제거되어 객체지향 코드가 더 일관되게 됩니다.

모든 캐릭터, 모든 스킬 포인트, 모든 격납고의 모든 자산, 모든 지갑의 모든 ISK가 Python 2 코드로 쓰여 있고, 그 전부가 Python 3 아래에서 정확히 있는 그대로 다시 읽혀야 합니다.

앞의 길은 어렵습니다. 우리는 EVE가 여러분을 위해 계속 돌아가는 동안 방대한 양의 코드를 업데이트해야 합니다. 하지만 목적지가 도달 가능하다는 걸 우리는 알고 있습니다. 왜냐하면 EVE Frontier가 이미 우리 Carbon 엔진을 현대 Python 3에서 돌리고 있고, 그게 작동하기 때문입니다.

Frontier의 이주는 Python의 12개 마이너 버전을 한 번에 커버했습니다 — 16년 언어 진화를 하나의 프로젝트로요. Tranquility는 23년치 누적된 코드를 가졌고, 더 중요하게는 23년치 실제 플레이어 데이터, 캡슐리어들의 역사를 가졌습니다. 그리고 그 서버는 24시간 중 23.75시간을 계속 숨쉬어야 합니다.

조심스럽게… 조심스럽게…

EVE 코드베이스는 240만 라인의 Python으로 이뤄져 있습니다. 그 중 상당수는 Python 2.7보다도 오래된 것이고, Python 3가 아예 파싱을 거부하는 2.3과 2.5 시대 표준으로 쓰여 있습니다.

그럼 240만 라인의 코드를 어떻게 이주하나요?

매우 조심스럽게, 그리고 여러 단계로.

이 단계들 중 일부는 Python 커뮤니티가 만든 도구(예: Python Futurize)를 쓰고, 다른 일부는 EVE만의 고유 기능에 더 집중합니다.

우리가 주요 마일스톤을 찍을 때, 여러분에게 도움을 요청할 겁니다 — 7월에 그랬듯이 Singularity에서 플레이테스트에 참여해 주시는 방식으로요. 거기서 우리는 업데이트된 시스템의 각 부분이 Tranquility 서버에 가까운 조건에서 어떻게 동작하는지를 관찰할 수 있습니다.

우리가 지금 있는 첫 번째 단계는 코드가 여전히 Python 2.7에서 돌아가는 채로 Python 3-ready 상태가 되도록 만드는 것입니다.

우리는 Python-Future라는 도구를 씁니다. 이건 정확히 이런 종류의 이주를 돕기 위해 Python 자체가 배포한 코드 재작성 머신(2to3)과 같은 것 위에 지어졌습니다. 각각 하나의 낡은 패턴을 재작성하는 자동 "fixer"들을 적용해서, Python 2.7과 Python 3가 둘 다 받아들이는 현대적 형태로 바꿉니다.

모든 코드가 양쪽 버전에서 돌게 되면, 진짜 어려운 일이 시작됩니다 — 양쪽에서 돌긴 돌지만 다르게 동작하는 코드요.

산을 측정하며 (그리고 그것이 줄어드는 걸 보며)

Python 3에서 얼마나 멀리 있는지 대체 어떻게 아느냐고요?

우리는 그걸 측정합니다. 우리의 약 2만 개 Python 파일 하나하나가 진짜 Python 2.7 인터프리터와 진짜 Python 3 인터프리터 아래에서 컴파일됩니다. 왜냐하면 컴파일러야말로 그 코드가 파싱되는지 아닌지에 대한 ground truth이기 때문입니다.

첫 스캔은 유쾌한 서프라이즈였습니다: 파일의 95.9%가 이미 양쪽 버전에서 컴파일됐습니다. 막힌 라인, 즉 Python 3가 거부하는 문법을 쓰는 라인은 240만 중 약 3,300개였습니다.

산은 알고 보니 크고 아주 잘 측정 가능한 언덕이었습니다:

앞에 놓인 도전들

파싱은 쉬운 쪽입니다.

같은 스캔이 세는 바에 따르면, 양쪽 버전에서 컴파일은 잘 되지만 Python 3에서 다르게 동작하는 코드가 대략 2만 라인입니다. 고전적인 예가 나눗셈입니다. Python 2에서는 1 / 20이지만, Python 3에서는 0.5입니다.

EVE에서 그 숫자들이 피해량이거나 ISK이거나 좌표일 수 있다는 걸 생각하면, 그런 라인들 하나하나는 기계적 수정이 아니라 인간의 결정을 필요로 합니다. 그 작업이 Stage 2의 일부이고, 그래서 Stage 1이 먼저 옵니다 — 기계적인 잔해를 걷어내야 인간의 주의가 인간이 필요한 곳에만 갑니다.

이게 여러분에게 뭘 의미하는가

단기적으로는 아무것도 없습니다, 그리고 그게 설계상 의도입니다. Stage 1 변경은 눈에 안 보이도록 만들어져 있습니다. 장기적으로는 이게 EVE의 미래를 위해 우리가 놓을 수 있는 가장 가치 있는 기초 공사입니다 — 함대전과 마켓 허브를 굴릴 더 빠른 인터프리터, 우리가 버그를 더 빨리 찾고 고치게 해줄 현대적 도구, 그리고 새 개발자들이 더 생산적으로 작업할 수 있는 코드베이스. 그건 결국 여러분에게 기능이 더 빨리 닿는다는 뜻입니다. 이건 다음 20년의 EVE Online을 위한 인프라입니다.

우리가 이걸 해내는 걸 도와줘 고맙습니다

아무것도 알아채지 못하는 것이 목표이고, 여러분이 우리가 그 목표에 닿을 수 있게 도와주는 분들입니다.

7월 말, 여러분은 Singularity에서 첫 변경 세트를 테스트했습니다. 참여해주신 모든 분께 감사드립니다.

우리는 이제 그 변경을 Tranquility에 배포하고 있습니다. 여기서 우리가 여러분에게 기댑니다 — 여러분이 늘 하던 걸 계속 하시고, 뭔가 이상하다고 느끼시면 버그 리포트를 파일링해서 알려주세요.

추가로, 우리는 에이전트 미션 백엔드도 Python 3용으로 준비하고 있습니다 — 하지만 여러분은 아무것도 눈치채선 안 됩니다.

이건 많은 발걸음 중 첫 걸음일 뿐입니다. 기계적 잔해를 걷어내는 것은 쉬운 쪽이었습니다. 진짜 일, 한 줄씩 읽어야 하는 코드는 아직 우리 앞에 있고, 그게 우리가 여러분을 가장 필요로 할 곳입니다.

다가올 테스트에 관해선 우리 채널을 계속 봐 주세요. "우리가 EVE를 Python 3로 옮기는 걸 내가 도왔다"고 콥동료에게 말하고 싶으셨다면, 지금이 그 기회입니다!

Fly safe, 여러분이 어떤 Python 버전 위에 있든지 간에.

#development-updates


원본 링크·인용

원문 및 검증 참조 (전수)

1차 출처

팩트체크에 실제로 접근·인용한 참조


기타

용어 · 고지 · 부분추출 여부

용어

고지

파이프라인: link (personal skill) → aside capture → 5-role fan-out → ui-ux(np1-proposal) 적용 → 로컬 serve → GATE (contrast/toc/placeholder/link/image) → post-html → dosi.dev 게시 → 이미지 실물 게이트 → Threads/X 드래프트.