무기고는 이미 열렸다
기관총은 이미 모두에게 나눠준 상태다.
AdEspresso의 공동 창업자이자 Unkover의 최고 AI 책임자인 Massimo Chieruzzi는 이를 완벽하게 포착했다: “AI는 때때로 당신을 기관총을 든 원숭이처럼 느끼게 한다.” 우리도 동의한다. 그리고 그 통찰에서 우리는 우리만의 결론을 도출한다: 우리가 바로 그 원숭이고, 총은 이미 우리 손에 쥐어져 있으며, 문제는 그 둘 중 어느 것도 아니다. 문제는 조준의 부재다.
Cursor, Copilot, Claude Code, v0 — 이것들은 architecture review에서 논의 중인 미래 기술이 아니다. 이미 여러분의 스택에서 살아 숨 쉬며, 여러분의 엔지니어 곁에서 코드를 생성하고, 여러분의 저장소에 커밋하고 있다. AI 에이전트는 이미 여러분의 codebase에 API 접근 권한을 가지고 있다. “AI 도구를 허용해야 할까?”라는 질문은 6개월 전, 누구도 허락을 구하지 않았다는 사실로 이미 결론이 났다.
여러분의 팀은 이미 무장했다. 유일한 질문은 aimbot을 설치했느냐다.
AI 코드 거버넌스란 무엇인가
AI 코드 거버넌스는 개발자와 AI 에이전트가 코드를 작성하고, 수정하고, 배포하는 방식을 안내하는 구조적 규칙의 집합이다. 허가 기반 관료주의가 아니다. 티켓 큐나 강제적인 승인 체인이 아니다. 개발자의 속도로 작동하는 guardrail 기반 enforcement다: service module에 대한 단단한 경계, 명시적 dependency interface, 그리고 나쁜 코드가 프로덕션에 도달하기도 전에 CI에서 실패하는 contract test.
이것이 없으면, 모든 AI 생성 pull request는 어둠 속으로 발사된 총알이다. 이것이 있으면, 원숭이는 여전히 발사한다 — 하지만 모든 총알은 있어야 할 곳에 박힌다.
원숭이가 목표물을 맞혔다
공포는 바로 여기에 있다. 기능은 배포된다. 티켓은 닫힌다. 데모는 완벽하게 작동한다.
원숭이가 목표물을 맞혔다. 하지만 어떤 대가를 치렀는가? 그 하나의 목표물을 맞히기 위해, 인증 서비스와 database schema, 그리고 그 과정에서 갈가리 찢긴 세 개의 microservice를 관통해 총알 30발을 흩뿌렸다. 원숭이는 조준하지 않기 때문이다 — 흩뿌릴 뿐이다.
Slack 채널은 축하한다. 프로덕션은 조용히 피를 흘린다. auth 회귀는 pull request diff에 나타나지 않는다. 48시간 후, 로그인 토큰이 전체 플랫폼에서 실패하고 있다는 이유로 온콜 엔지니어가 새벽 2시에 호출되면서 그 모습을 드러낸다.
목표물은 결코 문제가 아니었다. 부수적 피해가 문제였다.
코드 리뷰가 거버넌스로 실패하는 이유
코드 리뷰는 수동 총알 방어다
표준적인 대응은 훈련이 아니다. 누구도 bootcamp에 6주를 쓸 여유가 없다. 진짜 대응은 더 나쁘다: 시니어 엔지니어가 모든 pull request를 리뷰하게 만드는 것이다.
코드 리뷰는 총알 방어가 된다. 시니어는 모든 줄을 읽고, 빗나간 총알을 모조리 잡아내 목표물 쪽으로 방향을 돌린다. 그들은 멘토링을 하는 게 아니다. 아키텍처를 설계하는 게 아니다. 그들은 원숭이 앞에 서서, 매 사격이 어딘가 수용 가능한 곳으로 향하도록 수동으로 조정하고 있다.
이것은 확장되지 않는다. 시니어 한 명. 원숭이 열두 마리. sprint당 총알 400발. 시니어는 소진된다. 리뷰 큐는 쌓여 간다. 결국 승인해서는 안 될 것을 승인한다. 게을러져서가 아니라, 인간의 주의력은 유한한 자원이고 원숭이는 무한한 탄약을 가지고 있기 때문이다.
훈련이 존재한다 해도, 그것은 샌드박스에서 일어난다. 진짜 원숭이는 프로덕션에서 실탄을 쏘면서 배운다. 교훈이 몸에 배기까지, codebase는 수리하는 데 분기가 걸릴 타격을 이미 입은 상태다.
모든 총알을 수동으로 막아낼 만큼 충분한 시니어를 고용할 수는 없다. 수학이 성립하지 않는다.
AI 배율: 자부심도, 두려움도 없다
주니어 개발자는 적어도 무언가를 느낀다. 빠르게 배포했을 때 Slack에서 환하게 웃는다. 도탄이 postmortem이나 rollback의 형태로 자신에게 돌아왔을 때, 결국 그 반동을 체감한다.
AI 에이전트는 아무것도 느끼지 않는다. 자부심도 없다. 두려움도 없다. 비난도 없다. 새벽 3시에 auth 계층이 망가져도, 누구도 모델을 호출하지 않는다. pull request를 머지한 인간을 호출한다.
LLM은 새벽 3시에 “codebase를 정리”하며 절대적인 확신을 가지고 여러분의 인증 계층을 리팩토링할 것이다. 다운스트림 소비자가 여전히 의존하고 있는데도 더 이상 사용되지 않는 필드를 삭제할 것이다. 깔끔하게 컴파일되지만 런타임에 깨지는 순환 dependency를 도입할 것이다. 이 모든 것을 정중하게, 훌륭한 변수명과 포괄적인 주석과 함께 수행할 것이다.
원숭이는 결국 무턱대고 쏘면 도탄에 맞는다는 것을 배운다. 먼저 조준하고, 그다음 쏘는 법을 배운다. 그때쯤이면 피해는 이미 끝나 있다.
Autotomy가 aimbot이다
여기서 이 비유는 경고에서 해결책으로 전환된다.
총을 빼앗지 않는다. 어차피 비즈니스가 취소할 6주짜리 안전 교육을 잡지 않는다. aimbot을 설치한다.
Autotomy는 관료적인 승인 절차가 아니다. 티켓 큐도, 이미 물에 빠져 허우적대는 시니어의 강제적인 코드 리뷰도 아니다. 개발자의 속도로 작동하는 guardrail 기반 거버넌스다.
원숭이는 여전히 발사한다. 크로스헤어가 유효한 목표물에 고정되기 때문에, 원숭이는 더 자신 있게 발사한다. Service boundary는 제안이 아니라 단단한 제약이다. Dependency는 명시적 interface를 통해서만 흘러야 한다. Contract 변경은 검증된 경로를 통해 전파된다. 기능은 배포되고, 그 외에는 아무것도 죽지 않는다.
이것이 허가 기반 거버넌스와 guardrail 기반 거버넌스의 차이다. 허가는 멈추고 물어보라고 말한다. Guardrail은 최대 속도로 움직이라고 말하며, 나쁜 사격은 착탄 전에 구조가 잡아낼 것이라고 신뢰한다.
보상: 시니어가 다시 관측수가 된다
오늘날, 여러분의 시니어 엔지니어는 경호원이다. 그들은 원숭이 앞에 서서 빗나간 총알을 받아낸다. 모든 pull request는 피해 통제다. 모든 리뷰는 응급실 분류다. 시니어는 “아니요, 그 파일은 건드리지 마세요”와 “아니요, 그 module은 접근 금지입니다”라고 말하며 하루를 보내다가, 자신의 생산성은 제로로 떨어진다.
aimbot이 설치되면, 시니어는 다시 관측수가 된다. 풍향을 검증한다. 어려운 목표물의 명중을 확인한다. 자동화된 거버넌스가 보지 못하는 엣지 케이스를 사냥한다. 그들은 더 이상 인간 방패가 아니다. 전력 배율기다.
확장되는 거버넌스는 시니어 엔지니어가 모든 코드 줄을 읽는 데 의존하지 않는 거버넌스다. 기관총을 든 원숭이조차 실수로 위반할 수 없을 정도로 엄격한 구조적 규칙에 의존하는 거버넌스다.
견고한 경계가 어떻게 AI 생성 코드를 프로덕션에서 신뢰할 수 있게 만드는지 더 깊이 알아보려면, AI 코딩이 Autotomy framework와 작동하는 방식을 참고하라. Guardrail이 스택 전반에서 어디에 위치하는지 이해하고 싶다면, AI 안전 스택에 대해 읽어보라.
실제로 다음에 해야 할 일
주니어 개발자나 AI 에이전트가 있는 팀을 관리하고 있다면, 훈련 커리큘럼부터 시작하지 마라. 단단한 경계부터 시작하라.
누군가 구현을 작성하기 전에 module interface를 정의하라. 모든 dependency를 composition root를 통해 연결하라. 경계마다 contract test를 하나씩 추가하라. architecture를 위반하면 pull request가 말 그대로 머지될 수 없도록 CI에서 import restriction을 enforcement하라.
이 단계들은 하루면 끝난다. 4주 차에 팀이 자신의 개발자를 신뢰하느냐를 바꾼다. AI 생성 코드를 사용하는 팀에게는, 모든 API 경계에 contract test를 추가하는 것이 가장 레버리지가 큰 첫걸음이다.
원숭이는 이미 건물 안에 있다. 총은 이미 장전되었다. aimbot을 설치하라, 아니면 계속 총알을 받아낼 준비를 하라.