AI와 함께 10만 줄 Rust 코드, 이렇게 써봤습니다!

AI와 함께 10만 줄 Rust 코드, 이렇게 써봤습니다!

단 4주 만에 10만 줄이 넘는 Rust 코드를, 그것도 AI의 도움을 받아서 뚝딱 완성했다는 이야기를 들으면 어떤 생각이 드시나요? "정말 가능해?" "그 코드가 제대로 작동하긴 할까?" 아마 이런 의문이 먼저 드실 겁니다. 여기, 그런 의구심을 속 시원하게 풀어줄 이야기가 있습니다. Azure의 핵심 서비스들을 지탱하는 분산 시스템 엔진을 AI 코딩 에이전트와 함께 현대화한 프로젝트의 생생한 경험담입니다. 그것도 단순히 기능을 복제하는 것을 넘어, 최신 하드웨어 환경에 맞춰 성능을 극적으로 끌어올린 결과물을 만들어냈다고 하니, 도대체 어떤 마법이 숨어있는 걸까요? 이 글에서는 AI와 함께 Rust 코드를 작성하며 얻은 놀라운 생산성 향상 비결과, 특히 코딩의 정확성과 성능을 잡기 위한 독창적인 방법들을 여러분과 함께 파헤쳐 보겠습니다.

I took this photo in London where the skyscrapers would mirror in the water which created these intersting patterns. There was nothing to do but just press the shutter button.
Photo by Susanne Schwarz on Unsplash

AI 코딩, 생각보다 훨씬 강력했습니다

지난 몇 달간, 저는 AI 코딩 에이전트가 실제 서비스에 쓰이는 복잡한 분산 시스템을 얼마나 잘 만들 수 있을지 끊임없이 테스트해왔습니다. 그 결과는 놀라웠습니다. Rust 기반의 멀티-팍소스(multi-Paxos) 합의 엔진을 만들었는데, 이는 단순한 기능 구현을 넘어 최신 하드웨어에 최적화된 모습으로 Azure의 기존 시스템을 현대화한 것입니다. 전체 프로젝트는 약 3개월이 걸렸고, 그중 Rust 코드 10만 줄 이상이 단 4주 만에 작성되었습니다. 심지어 성능 최적화 과정을 거쳐 초당 2만 3천 번의 연산에서 30만 번까지, 무려 13배 이상 끌어올리는 데에는 약 3주가 소요되었습니다. 단순히 개발 속도가 빨라진 정도가 아니었습니다. 저는 AI와 협업하며 코딩의 정확성을 보장하고, 성능을 극한으로 끌어올리는 데 결정적인 역할을 한 여러 기법들을 발견했습니다. 이 글에서는 AI를 활용한 코드 계약(code contracts) 적용, 경량화된 명세 기반 개발(spec-driven development), 그리고 공격적인 성능 최적화 전략 등 제가 얻은 가장 값진 경험들을 공유하려고 합니다. 더불어 AI 코딩 지원의 미래에 대한 저의 바람도 덧붙일 예정입니다.

왜 기존 시스템을 현대화해야 했을까?

Azure의 RSL(Replicated State Library)은 멀티-팍소스 합의 프로토콜을 구현하여 여러 Azure 서비스의 복제를 담당하는 핵심적인 역할을 합니다. 하지만 이 라이브러리는 10년 이상 전에 작성되어 최신 하드웨어와 워크로드에 최적화되지 못한 부분이 있었습니다. 현대화가 필요했던 주요 이유는 세 가지입니다. 첫째, 파이프라이닝(pipelining) 미지원입니다. 투표가 진행 중일 때 새로운 요청은 대기해야 했기에 지연 시간이 늘어나는 문제가 있었습니다. 둘째, 비휘발성 메모리(NVM) 지원 미흡입니다. 비휘발성 메모리는 최근 Azure 데이터센터에서 흔히 사용되며, 커밋 시간을 획기적으로 줄일 수 있음에도 RSL은 이를 제대로 활용하지 못했습니다. 셋째, 하드웨어 인식의 한계입니다. RSL은 현재 Azure 데이터센터에서 널리 사용되는 RDMA(원격 직접 메모리 접근) 기술을 활용하도록 설계되지 않았습니다. 이러한 제약을 제거함으로써 현대적인 클라우드 워크로드와 AI 기반 서비스에 필수적인 훨씬 낮은 지연 시간과 높은 처리량을 달성할 수 있었습니다. 이러한 문제점을 해결하고자 저는 Rust와 AI 가속 개발에 대한 관심을 바탕으로 RSL에 상응하는 새로운 시스템을 밑바닥부터 구축하기로 결심했습니다.

Free PSD mockups: http://feliperizo.co
Photo by @felirbe on Unsplash

AI 코딩, 생산성이 폭발적으로 늘어났습니다

불과 6주 만에 저는 AI의 도움을 받아 RSL의 모든 기능, 즉 멀티-팍소스, 리더 선출, 로그 복제, 스냅샷 처리, 설정 변경 등을 포함하는 13만 줄 이상의 Rust 코드를 구현했습니다. 이 과정에서 GitHub Copilot, Claude Code, Codex, Augment Code, Kiro, Trae 등 다양한 AI 코딩 에이전트들을 활용했습니다. 저의 작업 흐름은 빠르게 발전했지만, 현재 주로 사용하는 도구는 Claude Code와 Codex CLI이며, VS Code를 통해 코드 변경 사항을 확인하고 간단한 편집 작업을 수행합니다. 특히 CLI 환경에서 코딩하는 방식은 비동기적인 흐름을 만들어내 생산성을 극대화했습니다. 여기에 더해, 저는 한 가지 재미있는 심리적 장치를 활용했습니다. 매달 100달러를 Anthropic의 최대 요금제에 지불하는데, 이는 밤에 잠들기 전 Claude를 사용해 코딩 작업을 시작하지 않으면 돈을 낭비하는 것 같다는 느낌을 갖게 만들어 줍니다. Codex CLI가 출시되었을 때는, 속도 제한을 감당하기 위해 ChatGPT Plus 구독을 하나 더 추가하여 월요일부터 수요일까지는 하나를, 목요일부터 일요일까지는 다른 하나를 사용하는 방식으로 작업했습니다. 이러한 도구와 약간의 심리적 압박이 결합되어, 저는 상상 이상의 속도로 코드를 완성할 수 있었습니다.

AI가 만들어주는 코드 계약, 정확성을 잡는 비결

AI가 팍소스와 같이 복잡한 알고리즘을 어떻게 정확하게 구현할 수 있는지 자주 묻는 질문을 받습니다. 첫 번째 방어선은 역시 테스트입니다. 현재 제 시스템에는 단위 테스트부터 최소한의 통합 테스트(예: proposer + acceptor만 있는 경우), 그리고 장애를 주입하는 다중 복제 통합 테스트까지 1,300개 이상의 테스트 케이스가 포함되어 있습니다. 하지만 진정한 돌파구는 AI 기반 코드 계약에서 나왔습니다. 코드 계약은 중요한 함수의 사전 조건, 사후 조건, 그리고 불변성을 명시합니다. 이러한 계약은 테스트 중에 런타임 어설트(assert)로 변환되지만, 성능을 위해 프로덕션 빌드에서는 비활성화할 수 있습니다. 저는 .NET 환경에서 오래전부터 이 접근 방식을 사용해왔지만, AI 덕분에 코드 계약의 힘은 훨씬 강력해졌습니다. 제가 코드 계약을 적용하는 세 가지 주요 수준은 다음과 같습니다.

  • AI에게 계약 작성을 요청합니다. Opus 4.1은 좋은 계약을 작성하지만, GPT-5 High는 훌륭한 수준의 계약을 만들어냅니다. 저는 주로 검토와 개선에 집중합니다. 예를 들어, 팍소스의 2a 단계 메시지를 처리하는 process_2a 메서드에는 16개의 계약이 포함되어 있습니다.
  • 계약으로부터 테스트 케이스를 생성합니다. 계약이 정의되면, AI에게 각 사후 조건에 대한 구체적인 테스트 케이스를 생성하도록 요청합니다. AI는 이 작업에 탁월하며, 의미 있는 엣지 케이스를 자동으로 생성해냅니다.
  • 계약에 대한 속성 기반 테스트를 수행합니다. 이것이 제가 가장 좋아하는 부분입니다. AI는 계약을 속성 기반 테스트로 번역하여, 무작위 입력값의 방대한 공간을 탐색합니다. 계약 위반이 발생하면 패닉이 발생하여 심각한 버그를 조기에 발견할 수 있습니다. 예를 들어, AI가 생성한 한 계약은 미묘한 팍소스 안전성 위반을 발견했습니다. 이 단일 계약 덕분에 프로덕션에 배포되기 전에 심각한 복제 일관성 문제를 피할 수 있었습니다.

I was trying to take picture of a church nearby when I found this entrance to a building. I instantly felt eager to play with those arcs of light to capture something different. As a big fan of the ’80s and the movie Tron I like how this one came together, I can imagine one of those light grid bikes going through, can you?

Please share and enjoy 🤘
Photo by Alvaro Pinot on Unsplash

AI와 함께하는 경량 명세 기반 개발

저는 다양한 명세 기반 개발(Spec-Driven Development, SDD) 도구를 시도해 보았습니다. 실제로 초기 구성 요소(예: 리더 선출, proposer, acceptor, learner)는 엄격한 SDD 접근 방식을 따라 구현했습니다. 요구사항 마크다운 파일로 시작하여 설계 마크다운, 그리고 작업 목록 마크다운으로 전환하는 방식이었습니다. 하지만 시간이 지남에 따라 이 과정이 너무 경직되어 있다는 것을 깨달았습니다. 중간에 변경 사항을 만들고 모든 문서를 업데이트하는 것이 번거로웠습니다. 그래서 저는 AI를 활용하여 더 유연하고 가벼운 형태의 SDD를 도입했습니다. 핵심은 AI가 현재 코드 상태와 요구사항을 이해하고, 코드 변경이 명세와 일치하는지 확인하며, 변경이 필요할 경우 제안하도록 하는 것입니다. 저는 AI에게 마치 '페어 프로그래머'처럼 현재 구현된 기능과 원하는 기능 사이의 간극을 명확히 설명해 달라고 요청합니다. 그리고 AI가 제안하는 코드 변경 사항을 바탕으로 명세가 자연스럽게 업데이트되도록 유도합니다. 예를 들어, 특정 API의 동작 방식을 변경해야 할 때, AI에게 해당 변경이 기존 명세와 어떻게 충돌하는지, 그리고 어떻게 명세를 수정해야 하는지 설명해달라고 요청하는 식입니다. 이러한 접근 방식은 문서 업데이트의 부담을 줄여주고, 코드와 명세 간의 동기화를 유지하는 데 큰 도움이 됩니다. 이것은 완전한 SDD는 아니지만, AI의 능력을 활용하여 개발 속도와 코드의 정확성을 모두 잡을 수 있는 실용적인 방법이라고 생각합니다.

성능 최적화, AI와 함께라면 더 공격적으로

앞서 언급했듯이, 저는 성능 최적화를 통해 초당 2만 3천 번의 연산에서 30만 번까지 처리량을 13배 이상 향상시켰습니다. 이러한 급진적인 성능 개선은 AI 없이는 상상하기 어려웠을 것입니다. AI는 병목 현상을 식별하고, 하드웨어 특성을 고려한 최적화 방안을 제시하는 데 탁월했습니다. 특히 Rust의 메모리 관리와 동시성 모델에 대한 AI의 깊은 이해는 매우 유용했습니다. 예를 들어, 특정 함수 호출에서 발생하는 불필요한 데이터 복사나, 락 경합(lock contention) 문제를 AI가 먼저 감지하고 수정 방안을 제안했습니다. 저는 AI에게 현재 코드의 성능 프로파일링 결과를 보여주고, 이를 바탕으로 가장 개선 효과가 클 것으로 예상되는 부분을 집중적으로 탐색하도록 지시했습니다. 또한, 저는 AI에게 **비휘발성 메모리(NVM)**와 **RDMA**와 같은 최신 하드웨어 기술을 최대한 활용할 수 있는 코드 패턴을 적극적으로 제안하도록 요청했습니다. AI는 이러한 기술들의 특성을 고려하여 데이터를 어떻게 배치하고, 어떻게 메모리 접근을 최소화하며, 어떻게 네트워크 통신을 최적화할 수 있는지에 대한 구체적인 코드 스니펫을 제공했습니다. 이는 개발자가 놓치기 쉬운 복잡한 하드웨어 관련 최적화를 AI가 대신 수행해 주는 강력한 이점이었습니다. 물론, AI가 제안한 모든 최적화 방안이 즉각적으로 적용되는 것은 아니었습니다. 때로는 AI가 제시한 아이디어가 예상치 못한 부작용을 일으키기도 했고, 프로덕션 환경에 적용하기 전에 철저한 검증 과정을 거쳐야 했습니다. 하지만 AI 덕분에 성능 최적화라는 까다로운 작업이 훨씬 더 효율적이고 체계적으로 진행될 수 있었습니다. AI는 단순히 코드를 생성하는 것을 넘어, 최고의 성능을 이끌어내는 '조력자'로서의 역할을 톡톡히 해냈습니다.

AI 코딩 지원의 미래, 우리가 바라는 것은

이번 프로젝트를 통해 AI 코딩 지원의 가능성을 현실로 경험했습니다. 하지만 더 나은 미래를 위해 몇 가지 바람이 있습니다. 첫째, 더 나은 코드 계약 생성 기능입니다. 현재 AI는 훌륭한 코드 계약을 생성하지만, 복잡한 시스템의 미묘한 불변성이나 동시성 관련 문제를 완벽하게 포착하는 데는 아직 한계가 있습니다. AI가 더 깊이 있는 시스템 이해를 바탕으로, 잠재적인 모든 문제를 커버하는 더욱 강력한 계약을 생성해 줄 수 있다면 좋겠습니다. 둘째, 보다 능동적인 '코드 리뷰어' 역할입니다. AI가 단순히 코드를 작성하는 것을 넘어, 제가 작성한 코드에 대해 잠재적인 오류, 비효율적인 부분, 개선 가능성 등을 적극적으로 지적하고 제안해 주는 '페어 프로그래머' 역할을 더 잘 수행해주길 기대합니다. 마치 숙련된 동료 개발자가 코드를 리뷰해주는 것처럼 말이죠. 셋째, AI 기반의 '리팩토링 및 아키텍처 개선' 도구입니다. 현재 AI는 주로 개별 함수나 작은 코드 블록 수정에 능숙하지만, 시스템 전체의 아키텍처를 이해하고 더 나은 구조로 개선하는 데에는 아직 발전의 여지가 있습니다. AI가 코드 베이스 전체를 분석하여, 확장성, 유지보수성, 성능 측면에서 시스템을 어떻게 개선할 수 있을지에 대한 구체적인 로드맵과 코드 제안을 제공해 준다면 금상첨화일 것입니다. 마지막으로, AI와 인간 개발자 간의 '협업 시너지' 극대화입니다. AI가 개발자의 의도를 더 잘 파악하고, 개발자는 AI의 강점을 최대한 활용하여 서로의 약점을 보완하는 방식으로 시너지를 낼 수 있도록 인터페이스와 워크플로우가 지속적으로 발전해야 합니다. 10만 줄의 Rust 코드를 AI와 함께 완성한 경험은 이제 막 시작일 뿐입니다. 앞으로 AI는 소프트웨어 개발 방식을 근본적으로 변화시킬 잠재력을 가지고 있으며, 우리는 이러한 변화를 기쁘게 맞이하고 적극적으로 활용해야 할 것입니다.

원문 참고: https://zfhuang99.github.io/rust/claude%20code/codex/contracts/spec-driven%20development/2025/12/01/rust-with-ai.html

댓글 쓰기