24년 된 2백40만 라인 코드베이스는 어떻게 갈아엎히는가 — 그리고 왜 "성공의 정의는 아무도 눈치 못 채는 것"인가.
print가 문(statement)이 아니라 함수로 바뀌었고, 1/2가 0이 아니라 0.5가 됐고, str이 유니코드가 됐다.예상 소요: 요약만 5분 · 완독 25분 · 팩트체크까지 35분.
| 수치 | 맥락 |
|---|---|
| 2003 | EVE 런칭 연도. 이 코드베이스는 지금 23년 굴러왔다. |
| 2010 | 마지막으로 Python 버전을 올린 해 (2.5 → 2.7). 그 후 16년 동안 언어 버전을 안 바꿨다. |
| 2.4M | 파이썬 코드 라인 총량 (약 20,000개 파일). |
| 95.9% | 첫 스캔에서 이미 Py2와 Py3 양쪽에서 컴파일되는 파일 비율. 산이 아니라 큰 언덕이었다. |
| ~3,300 | Py3가 파싱을 거부하는 문법이 있는 줄 수 (2.4M 중). 대부분은 print문·long 리터럴·구식 except·<>. |
| 단계 | 목표 | 수단 | 상태 |
|---|---|---|---|
| Stage 1 | Py2.7과 Py3 양쪽에서 돌아가는 코드로 만들기 (문법 debt 청소) | python-future / 2to3 기반 자동 fixer | Tranquility 배포 (2026-08-25) |
| Stage 2 | 양쪽에서 컴파일되지만 다르게 동작하는 코드 수정 | 사람이 한 줄씩 판단 — 예: 1/2가 0인지 0.5인지 |
시작 전 · 약 20K 라인 |
| 후속 | 실제 Python 3 인터프리터로 스위칭 | Singularity 플레이테스트 → Tranquility 롤아웃 | 이후 |
Stage 1은 의도적으로 invisible이다. 배포 후 뭔가 이상하면 버그 리포트를 넣어라. 미션 에이전트 백엔드도 Py3 준비 중이지만 역시 티가 안 나야 한다.
<> — 이 마지막 통계는 이 코드베이스의 나이를 웅변한다 (<>는 Python 2.6에서 이미 deprecated, 대다수 현직 파이썬 개발자가 본 적 없는 문법).1/2가 대표 예. EVE 맥락에선 그게 피해량·ISK·좌표일 수 있다는 게 무섭다./는 Py3에서 항상 true division, Py2에선 정수/정수는 floor division. EVE 코드가 이 차이를 실제로 물었을 때 조용히 잘못된 값을 반환할 수 있는 대표 사례가 맞다.lib2to3의 fixer 인프라를 재사용해 Py2 코드를 Py2/Py3 공용 코드로 변환한다. Stage 1의 도구 선택으로 합리적.캡슐리어 여러분,
EVE는 EVE Evolved 이니셔티브의 일환으로 계속 진화하고 있고, 이제 코드 그 자체에 스포트라이트를 비출 때가 왔습니다!
EVE Online의 모든 게이트 점프, 모든 마켓 오더, 모든 함대전 아래에는 매우 많은 양의 Python이 깔려 있습니다. 그 코드는 20년 넘게 뉴 에덴을 굴려 왔고, 이제 Python 3로의 전환을 시작합니다. 여러분에겐 그게 이렇게 다가옵니다 — 버그를 더 빨리 잡을 수 있는 도구, 새 기능을 위한 여지, 그리고 시간이 흐르면 더 빨라진 EVE.
이 이주의 성공 정의는 간단합니다. 완전히 눈치채지 못하는 것 — 가끔 뭔가가 더 매끄럽게 굴러가는 순간을 제외하고는요.
많은 분들이 이미 Singularity에서 우리의 첫 발걸음을 테스트해 주셨고, 그 변경사항은 오늘 배포됐습니다. 이건 앞에 놓인 긴 여정의 시작일 뿐입니다.
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 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개였습니다.
산은 알고 보니 크고 아주 잘 측정 가능한 언덕이었습니다:
print 문123L 같은 "long" 숫자 리터럴<> — "같지 않다"를 쓰는, 어찌나 오래된 방식인지 지금 활동하는 파이썬 개발자 다수가 본 적조차 없는 문법파싱은 쉬운 쪽입니다.
같은 스캔이 세는 바에 따르면, 양쪽 버전에서 컴파일은 잘 되지만 Python 3에서 다르게 동작하는 코드가 대략 2만 라인입니다. 고전적인 예가 나눗셈입니다. Python 2에서는 1 / 2가 0이지만, 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
img/) 후 사용. 트래킹 픽셀·헤더/푸터 UI 이미지·소셜 CTA 이미지는 본문 콘텐츠가 아니므로 포함하지 않았다.2026-08-25로 확인됐다 (meta 태그의 article:published_time은 빈 값).파이프라인: 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 드래프트.