TypeScript 10만 줄을 Rust로 포팅: Claude Code와 함께한 1개월의 광기 (그리고 현실적인 교훈)


최근 “1명의 엔지니어가 1개월 동안 100만 줄의 코드를 C++에서 Rust로 마이그레이션 한다”는 Microsoft의 야심 찬 계획이 화제가 된 적이 있습니다. 솔직히 시니어 엔지니어로서 코웃음을 쳤습니다. “또 AI 과대광고(Hype) 시작이네”라고 생각했죠.

하지만 최근 React Native와 Prettier의 창시자로 유명한 Vjeux(Christopher Chedeau) 가 실제로 이와 유사한 실험을 감행했고, 그 결과를 블로그에 공개했습니다. 그는 Claude Code 를 이용해 약 10만 줄에 달하는 Pokemon Showdown (TypeScript) 코드를 Rust 로 포팅했습니다. 기간은 단 한 달. 심지어 그는 Rust를 한 번도 써본 적이 없었습니다.

이 글은 단순한 “AI 찬양” 글이 아닙니다. 그가 겪은 삽질, 기괴한 워크플로우, 그리고 시니어 엔지니어들이 주목해야 할 AI 코딩의 현실적인 한계와 가능성 을 분석해 봅니다.

1. Sandbox 탈출: 자동화를 위한 “광기”의 셋업

Claude Code와 같은 CLI 에이전트는 기본적으로 안전장치(Sandbox)가 걸려 있습니다. 하지만 Vjeux는 24시간 내내 AI가 코드를 짜고 커밋하게 만들기 위해 사실상 Jailbreak 에 가까운 환경을 구축했습니다. 이 대목에서 그의 집요함에 혀를 내둘렀습니다.

  • Git Push 우회: Claude는 SSH 키 접근 권한이 없습니다. 그래서 로컬 Node.js 서버를 띄워 HTTP 요청으로 Git 명령어를 실행하게 만드는 백도어(?)를 만들었습니다.
  • Antivirus 우회: rustc가 바이너리를 생성할 때마다 안티바이러스가 차단하자, Docker 컨테이너 내부에서 컴파일을 돌려버립니다.
  • 무한 “Yes” 입력: Claude가 위험한 명령어를 실행할 때마다 승인을 요청하자, AppleScript로 5초마다 Enter 키와 Cmd+V를 누르는 스크립트를 짰습니다.
  • 절전 모드 방지: 옛날 Minecraft 시절 쓰던 Auto Clicker를 켜서 마우스가 계속 움직이게 했습니다.

이게 “미래의 코딩”인가요? 아니면 Rube Goldberg 머신인가요? 어쨌든 그는 인간의 개입 없이 밤새도록 AI가 커밋을 날리는 환경을 기어코 만들어냈습니다.

2. 실패한 전략 vs 성공한 전략

처음에는 단순히 “이 파일 포팅해줘”라고 던졌지만, 결과는 처참했습니다. 여기서 우리가 LLM을 다룰 때 겪는 전형적인 문제들이 튀어나옵니다.

AI의 고질병: “제멋대로 개선하기”

Claude는 코드를 1:1로 포팅하는 대신, 자기가 보기에 “더 나은” 구조로 추상화를 시도했습니다. 결과적으로 서로 다른 파일에서 호환되지 않는 구조체를 만들거나, 복잡한 로직을 “Simplified” 주석 하나로 퉁치고 넘어갔죠.

해결책: “Little Islands”와 강제된 컨텍스트

Vjeux가 찾은 해법은 엔지니어링적 통제 였습니다.

  1. Source as Comments: 원본 JS 코드를 Rust 파일 내 주석으로 박아넣는 스크립트를 먼저 짰습니다. AI에게 “창의성”을 발휘하지 말고 주석에 있는 로직을 그대로 옮기라고 강제한 것이죠.
  2. File Splitting: 1만 줄짜리 파일은 Context Window 한계를 초과합니다. 메서드 하나당 파일 하나로 쪼개서(Little Islands) AI가 집중할 수 있게 만들었습니다.
  3. Integration Last: 컴파일 에러를 그때그때 잡는 게 아니라, 일단 전체를 다 포팅한 뒤 마지막에 통합하는 방식을 택했습니다. 이는 Skip 컴파일러 팀에서의 경험을 살린 것이라고 합니다.

3. 핵심은 “Oracle Testing”

이 프로젝트가 성공할 수 있었던 유일한 이유는 강력한 테스트 오라클 이 있었기 때문입니다. Pokemon Showdown 엔진은 결정론적(Deterministic)입니다. 같은 시드(Seed)를 넣으면 전투 결과가 똑같아야 합니다.

그는 240만 건의 전투 시뮬레이션을 돌려 JS 원본과 Rust 포팅 버전의 출력을 비교했습니다. 처음에는 수백 개의 버그가 있었지만, Claude에게 스택 트레이스와 로그를 던져주자 3주 동안 스스로 버그를 하나씩 고쳐나갔습니다. 현재 정합성은 99.96%라고 합니다.

Insight: AI에게 코딩을 맡기려면, 인간이 눈으로 리뷰하는 게 아니라 기계적으로 검증할 수 있는 테스트 하네스 가 필수적입니다. 테스트 코드가 없다면 AI가 짠 코드는 그저 “그럴듯한 쓰레기”일 뿐입니다.

4. Hacker News의 반응과 논쟁

이 글에 대해 Hacker News에서는 뜨거운 논쟁이 벌어졌습니다. 특히 “Rust를 전혀 모르는 상태에서 포팅했다” 는 점이 논란의 중심입니다.

  • 유지보수성 의문: “Rust를 모르는 사람이 AI로 짠 코드를 유지보수할 수 있는가?”라는 지적이 많습니다. 실제로 Vjeux도 Claude가 Option<>을 남발하거나, Rust의 관용적(Idiomatic) 패턴 대신 JS 스타일의 구조를 억지로 끼워 맞췄다고 인정했습니다.
  • “개선”의 함정: 한 유저는 “나도 LibGDX 게임을 포팅하려 했는데, Claude가 자꾸 코드를 ‘개선’하려다 버그를 만들어서 포기했다”고 토로했습니다. AI의 “Arrogance(오만함)“를 지적하며, 있는 그대로 베끼는 것이 얼마나 어려운지 이야기합니다.
  • Anthropomorphization (의인화): Claude가 실패 원인을 분석하며 “제가 오만했습니다”라고 반성문을 쓴 것에 대해, 유저들은 “그건 진짜 반성이 아니라 그저 그럴듯한 텍스트 생성일 뿐”이라며 AI를 의인화하는 것을 경계해야 한다고 지적했습니다.

5. 마치며: 이것은 코딩인가, 매니징인가?

이 프로젝트에서 Vjeux는 단 한 줄의 Rust 코드도 직접 짜지 않았습니다. 하지만 그는 시스템 아키텍트 이자 QA 매니저 로서 엄청난 엔지니어링 역량을 발휘했습니다.

  • 어떻게 Context Window를 효율적으로 쓸지 설계하고,
  • Antivirus와 권한 문제를 우회하는 파이프라인을 구축하고,
  • 대규모 검증 시스템(Oracle)을 만들었습니다.

결국 “AI가 코딩을 다 해준다” 는 말은 반은 맞고 반은 틀렸습니다. AI는 타이핑을 하지만, 그 AI가 헛발질하지 않도록 구조를 잡고 감시하는 것은 여전히 Senior Engineer 의 몫입니다.

Rust로 포팅된 엔진은 병렬 처리를 통해 JS 버전보다 훨씬 빠르다고 합니다. 하지만 그 내부 코드가 얼마나 “Rust스러운지(Rusty)“는 별개의 문제입니다. 만약 여러분이 프로덕션 레벨의, 장기적으로 유지보수해야 할 코어 시스템을 이렇게 만든다면? 저는 반대표를 던지겠습니다. 하지만 성능이 중요한 모듈을 빠르게 실험하거나, 레거시 코드를 초벌 번역하는 용도라면? Claude Code 는 무서울 정도로 강력한 도구임이 증명되었습니다.