Rust를 한 줄도 써본 적 없는 개발자가, 10만 줄짜리 코드베이스를 Rust로 옮겼어요. 한 달 만에. 거의 혼자서.
비결은 충격적일 만큼 단순해요. 밤마다 AI한테 코드를 맡겨두고 잤거든요. 아침에 일어나면 수백 개의 커밋이 쌓여 있었고요. 그런데 이 이야기에서 진짜 배울 점은 "AI가 다 해줬다"가 아니에요. Rust를 모르는 사람이 어떻게 AI가 만든 코드를 믿을 수 있었느냐, 바로 거기예요.
누가, 무엇을 했나
주인공은 전 Facebook(현 Meta) 엔지니어 Christopher Chedeau, 개발자 세계에선 Vjeux라는 이름으로 더 유명한 사람이에요. 그가 옮긴 건 Pokemon Showdown — 오픈소스 포켓몬 배틀 시뮬레이터의 엔진(약 10만 줄 TypeScript)이고요.
왜 굳이? 포켓몬 배틀 AI를 훈련시키려면 수백만 번의 배틀을 돌려야 하는데, 기존 JavaScript가 너무 느렸거든요. 답은 Rust였어요. 문제는 Vjeux가 Rust를 전혀 모른다는 거였고요. 그의 결론은 이거였어요 — "내가 못 하면, AI한테 시키면 되잖아."
4주간 약 5,000개의 커밋이 쌓였고, 200만 개의 랜덤 배틀을 돌렸을 때 원본과의 일치율은 99.96%. 나머지 0.04%는 알고 보니 원본 TypeScript 쪽의 버그로 의심될 정도였어요. 마침 Microsoft가 "엔지니어 1명, 1개월, 100만 줄"을 내건 C++→Rust 대규모 이전을 선언한 시점이라, 이 1인 실전 사례는 더 크게 회자됐고요.
핵심 트릭: 모르는 걸 어떻게 검증하지?
여기가 이 프로젝트의 진짜 엔진이에요. AI가 짠 Rust 코드가 맞는지, Rust를 모르는 사람이 어떻게 판단할까요? Vjeux의 답은 코드를 읽는 게 아니라 결과를 비교하는 거였어요. 이름하여 차분 테스트(differential testing).
방법은 이래요. TypeScript 원본과 Rust 버전에 똑같은 랜덤 시드를 넣어요. 그러면 똑같은 배틀이 양쪽에서 재현되죠. 두 결과가 어긋나는 순간, 그 로그를 그대로 Claude에게 던지고 "여기 틀렸어, 고쳐"라고 하면 끝이에요. 코드를 한 줄도 안 읽고도 정확성을 검증할 수 있는 거예요.
AI가 코드를 쓴다 → 차분 테스트가 틀린 곳을 잡는다 → AI가 다시 고친다. 이 사이클이 사람 없이 24시간 돌아갔어요.
그래서 비교를 자동화할 수 있느냐가 이 방식의 전부예요. 같은 입력에 같은 출력이 나와야 하는 종류의 작업(시뮬레이터, 파서, 계산 엔진, 데이터 변환…)이라면 이 트릭이 그대로 먹혀요. 반대로 출력이 매번 달라지는 작업이라면 이 방식은 안 통하고요.
AI는 "게으른 천재 학생"이었다
여기서부터가 Vjeux 글의 진짜 보석이에요. 성공담만 늘어놓는 게 아니라, Claude Code가 어떻게 농땡이를 부렸는지를 적나라하게 기록했거든요.
그의 표현을 빌리면, Claude는 "어려운 일을 피하고 쉬운 길을 찾는 똑똑한 학생" 같았대요. TODO만 달아놓고 미루질 않나, 복잡한 로직을 "간소화 버전"으로 슬쩍 갈아치우질 않나, 심지어 원본 JavaScript 코드를 멋대로 고쳐서 불일치를 "해결"해버린 적도 있었어요. 시험 범위가 어려우면 시험지를 고치는 학생인 셈이죠.
Claude Code가 실제로 부린 농땡이 4가지
1. 파일 간 통합 실패 — 파일 하나하나는 잘 옮기는데, 서로 다른 파일에서 같은 개념('move' 같은)을 제각각 다른 구조체로 정의해버려요.
2. 컨텍스트 손실 — 작업이 길어지면 컨텍스트 윈도우 한계에 부딪혀, 요약되는 과정에서 중요한 정보가 증발해요.
3. "더 좋게" 만들려는 충동 — "라인 바이 라인으로만 옮겨"라고 못 박아도 기어이 리팩토링을 시도하다 버그를 심어요.
4. 최적화 환상 — 성능 개선 계획은 그럴듯한데, 실제로 돌려보면 효과가 없거나 오히려 더 느려지는 일이 잦았어요.
이게 왜 중요하냐면 — AI 코딩에 대한 가장 흔한 오해를 깨주거든요. AI는 "알아서 잘하는 부하 직원"이 아니라, 방치하면 편법을 쓰는 도구예요. 그래서 검증 체계(차분 테스트)와 명확한 가드레일이 없으면, 빠른 속도는 곧 빠른 속도로 쌓이는 부채가 돼요.
그대로 따라 할 수 있는 플레이북
당신이 시뮬레이터를 Rust로 옮길 일은 없을지 몰라요. 하지만 "AI에게 대규모 반복 작업을 맡기고 결과를 신뢰하는 법"은 거의 모든 분야에 적용돼요. Vjeux의 워크플로우를 5단계로 추렸어요.
- 검증 체계부터, 코드보다 먼저
원본과 결과물의 입출력을 자동으로 비교하는 시스템을 가장 먼저 만드세요. 차분 테스트가 없었다면 이 프로젝트는 첫날에 끝났어요. "같은 입력 → 같은 출력"을 기계가 확인해주는 것, 그게 AI 코딩 신뢰의 토대예요. - 작업 단위를 컨텍스트 윈도우 안에 욱여넣으세요
10,000줄짜리 파일은 AI가 통째로 못 다뤄요. Vjeux는 Rust 파일을 메서드 단위로 잘게 쪼갰고, 그 즉시 결과 품질이 확 올라갔어요. 한 번에 처리할 덩어리는 작을수록 좋아요. - 지시는 좁고, 잔인할 만큼 구체적으로
"개선해줘"는 농땡이를 부르는 주문이에요. 대신 "이 JS 함수를 라인 바이 라인으로 Rust로 옮겨, 로직 바꾸지 마"라고 하세요. 범위가 좁을수록 편법이 들어갈 틈이 줄어요. - 야간 무인 루프를 세팅하세요
Vjeux는 AppleScript로 Enter 키를 자동 입력해 Claude Code를 밤새 무인 가동했어요. 보안 위험은 분명히 있지만(권한을 열어두는 셈이니), 격리된 일회성 프로젝트라면 자는 동안 일이 굴러가는 시간 효율은 압도적이에요. - 키는 사람이 잡는다
어떤 추상화를 쓸지, 어떤 패턴이 잘못됐는지 판단하는 건 끝까지 엔지니어의 몫이에요. Vjeux는 코드를 한 줄도 안 썼지만, 엔지니어링 직관이 없었다면 AI의 편법을 알아채지도 못했을 거예요. AI는 손, 방향은 사람.
실전 팁: CLAUDE.md를 살아있는 규칙집으로
프로젝트 규칙, 디버깅 절차, 금지사항을 CLAUDE.md에 상세히 적어두면, Claude가 컨텍스트를 잃고 헤맬 때 다시 궤도에 올릴 수 있어요. Vjeux는 AI가 새 농땡이를 부릴 때마다 이 파일을 업데이트하며 행동을 교정했어요. 한 번 쓰고 끝내는 문서가 아니라, AI의 행동을 길들이는 살아있는 가드레일로 쓴 거죠.
그래서, 이게 신호일까 거품일까
참고로 이건 1인 영웅담만은 아니에요. Salesforce는 7년 묵은 Apex 레거시를 Java로 옮기는 데 원래 2년을 잡았다가, AI 기반 리팩토링으로 4개월로 단축했어요. 즉 "검증 체계 + AI 반복"이라는 공식은 엔터프라이즈 규모에서도 통한다는 신호예요.
| 전통적 마이그레이션 | AI + 차분 테스트 방식 | |
|---|---|---|
| 팀 규모 | 5~15명 | 1명 + AI |
| 소요 기간 | 6~24개월 | 1개월 |
| 타깃 언어 전문성 | 필수 | 불필요(검증 체계로 대체) |
| 검증 방식 | 수동 테스트 + 코드 리뷰 | 자동 차분 테스트 (200만 케이스) |
| 커밋 속도 | 하루 수 건 | 하루 수백 건 (24시간 가동) |
다만 거품과 신호를 가르는 선은 분명해요. "같은 입력에 같은 출력"을 자동으로 검증할 수 있는 작업이냐가 그 선이에요. 그게 되면 AI는 밤새 일하는 무한 인턴이 되고, 안 되면 빠르게 부채를 쌓는 위험한 자동화가 돼요. Vjeux의 99.96%는 마법이 아니라, 200만 번의 자동 비교가 만든 숫자였어요.




