이번 수요일에 제가 드리는 뜨거운 의견은 이렇습니다. 만약 팀이 AI 코딩 도구를 도입했지만 코드 검증 방식을 바꾸지 않았다면, 여러분은 빨라진 것이 아닙니다. 단지 더 빨리 빚을 지기 시작했을 뿐입니다.
코드를 작성하는 것은 예전에는 느린 과정이었습니다. 함수 하나를 만드는 데 한 시간이 걸렸고, 기능 하나는 일주일이 걸렸으며, 타이핑에 쓰는 시간은 생각할 시간을 벌어주었습니다. 하지만 AI 어시스턴트와 에이전트는 그 단계를 몇 분으로 압축했습니다. 그러나 그 다음 단계인 '코드가 올바른지 아는 것'의 비용은 전혀 싸지지 않았습니다. 그래서 병목 지점이 이동한 것입니다. 이제 문제는 더 이상 '누가 이것을 작성하는가?'가 아닙니다. '이것이 작동한다는 것을 어떻게 알 수 있는가?'입니다.
검증할 수 없는 코드는 자산이 아닙니다. 아직 청구되지 않은 부채(liability)입니다. 검증 계층 없이 10배 빠르게 생성한다면, 여러분은 기계 속도로 기술 부채(technical debt)를 쌓고 있는 것입니다.
데이터는 이미 이 방향을 가리킨다
제가 숫자를 지어낼 생각은 없으니, AI로 코드를 사용하는 모든 팀이 읽어야 할 세 가지 발표된 출처를 알려드리겠습니다.
1. Google의 DORA 2024 보고서. DORA는 AI 채택률이 25% 증가했을 때 문서화 품질이 7.5% 증가하고, 코드 품질이 3.4% 증가하며, 코드 검토 속도가 3.1% 증가하는 것과 관련이 있음을 발견했습니다. 좋은 소식입니다. 하지만 같은 증가는 예상되는 전달 처리량(delivery throughput)의 1.5% 감소와 전달 안정성(delivery stability)의 7.2% 감소와도 관련이 있었습니다. 그들의 설명이 흥미로운 부분입니다: 개발 프로세스를 개선하는 것이 '작은 배치 크기나 강력한 테스트 메커니즘과 같은 성공적인 소프트웨어 전달의 기본 사항을 제대로 준수하지 않는 한' 자동으로 전달을 개선하지는 못한다는 것입니다. 이 보고서는 또한 AI가 변경 목록(changelists)을 더 크게 만든다고 가정하며, 더 큰 변경 사항은 느리고 불안정해지기 쉽다고 말합니다.
2. Stack Overflow의 2025 개발자 설문조사. 개발자들의 가장 큰 좌절감으로 지적된 부분은 **66%**가 차지하는 "거의 맞지만 완벽하지 않은 AI 솔루션"입니다. 두 번째로 높은 비율인 **45%**는 "AI가 생성한 코드를 디버깅하는 것이 더 많은 시간이 걸린다"고 답했습니다. 또한, 개발자들은 AI 결과물의 정확성을 신뢰하기보다 불신하는 경향이 더 강하여 (46%) 신뢰하는 경우(33%)보다 비율이 높습니다.
'거의 맞는' 코드가 가장 위험한 종류입니다. 명백히 작동하지 않는(broken) 코드는 큰 오류를 내며 실패하지만, 거의 맞는 코드는 한눈에 지나가고, 데모에서는 통과하며, 아무도 기록하지 않은 엣지 케이스에서 실제 운영 환경에서 실패합니다.
3. METR의 2025 무작위 통제 시험. 2025년 초, 자체적인 성숙한 저장소(repository)를 다루는 숙련된 오픈 소스 개발자들은 AI 도구를 사용했을 때 19% 더 오랜 시간이 걸렸다고 보고했지만, 여전히 AI가 자신들을 20% 빠르게 만들었다고 믿고 있었습니다. METR 자체는 이제 그러한 결과가 구식이 되었으며, 현재 도구로는 개발자들이 오히려 더 빠를 가능성이 높다고 말하므로, 이 19% 수치를 자연의 법칙처럼 인용해서는 안 됩니다. 여기서 얻을 수 있는 지속적인 교훈은 인식과 측정 사이의 간극입니다: "더 빠르게 느껴진다(it feels faster)"는 검증 방법이 아닙니다.
테스트와 사양이 진정한 레버리지다
도구 공급업체들도 같은 이야기를 하고 있습니다. Anthropic의 공식 Claude Code 모범 사례에서는 이를 명확하게 제시합니다. 에이전트에게 "실행 가능한 검사(테스트, 빌드, 비교용 스크린샷)"를 제공해야 한다는 것입니다. 이것이 없다면, 그들은 "'완료된 것처럼 보인다'는 유일한 신호가 될 것이며, 당신 자신이 검증 루프(verification loop)가 된다"고 적습니다.
그 문장이 전체 논거입니다. 실행 가능한 검사가 없다면, 당신이 테스트 스위트가 되며, 이는 확장될 수 없습니다.
좋은 테스트는 AI 등장 이전보다 지금 더 중요한 세 가지 역할을 수행합니다:
- 모델이 읽을 수 있는 명세(spec)입니다. '
validate_email; [email protected]은 참이고, [email protected]은 거짓이다'라는 프롬프트가 산문 형태의 단락보다 훨씬 낫습니다. 예시 케이스는 모호성을 제거합니다.
- 멈춤 조건(stop condition)입니다. 테스트가 실패하는 에이전트는 녹색 상태(green)가 될 때까지 스스로 반복할 수 있습니다. 하지만 테스트가 없는 에이전트는 출력이 그럴듯해 보일 때 멈춥니다.
- 조정 장치(ratchet)입니다. 일단 테스트에 의해 특정 동작이 고정되면, 다음에 생성된 변경 사항이 그것을 조용히 깨뜨릴 수 없습니다.
제가 실제로 할 일
- 프롬프트보다 먼저 테스트를 작성합니다. 기능을 구현할 때는 가장자리 케이스(edge case)를 포함하여 두세 개의 예시 케이스를 먼저 작성합니다. 버그의 경우, 실패하는 테스트로 재현하고, 올바른 이유로 실패함을 확인한 후, AI에게 수정하라고 요청하기 전에 커밋합니다.
- '완료'를 '검증 통과'로 의미하게 만듭니다. 한 개의 명령어(
make test, npm test, pytest)가 실패 시 0이 아닌 코드를 반환하도록 합니다. 에이전트에게
팀의 검증 과정 중 가장 먼저 문제가 발생하는 부분은 무엇일까요? 테스트 누락, 간헐적 오류 테스트(flaky tests), 또는 아무도 신뢰하지 않는 테스트인가요?
참고 자료