풀 리퀘스트(pull request)를 열어보고 실제 버그를 수정하는 시간보다 review 댓글을 읽는 데 더 많은 시간을 쓰고 있는 자신을 발견한 적이 있습니까?
하나의 댓글은 변수 이름을 변경할 것을 제안합니다. 다른 하나는 함수를 추출할 것을 권장합니다. 또 다른 것은 가능한 엣지 케이스(edge case)를 지적합니다. 그 중간 어딘가에 정말로 중요한 문제가 있을 수도 있습니다.
이제 여러분이 여는 모든 풀 리퀘스트에서 그러한 피드백을 받는다고 상상해 보세요.
AI 코딩 도구들은 개발자들이 전례 없이 빠르게 코드를 작성하도록 돕고 있습니다. 하지만 우리가 충분히 이야기하지 않는 문제가 하나 있습니다:
코드를 더 빨리 생성하는 것은 그것을 효과적으로 검토할 수 있을 때만 유용합니다.
그리고 AI를 코드 리뷰에 추가한다고 해서 그 문제가 자동으로 해결되는 것은 아닙니다.
더 많은 AI 생성 피드백의 문제점
사용자 인증 플로우(user authentication flow)를 변경하는 풀 리퀘스트를 열었다고 가정해 봅시다.
여러분의 AI 리뷰어는 15개의 댓글을 남깁니다.
- 세 개는 포맷팅 또는 명명 규칙 제안입니다.
- 네 개는 이미 작동하는 코드를 리팩토링(refactoring)할 것을 권장합니다.
- 다섯 개는 더 많은 맥락이 필요한 잠재적 문제를 식별합니다.
- 세 개는 정확성이나 보안에 영향을 줄 수 있는 문제들을 강조합니다.
이제 여러분에게 또 다른 과제가 생겼습니다. 어떤 댓글들이 여러분의 주의를 받을 자격이 있는지 파악하는 것입니다.
리뷰어가 여러 유용한 것들을 식별했을 수도 있습니다. 하지만 중요한 발견 사항들이 낮은 가치의 제안들 사이에 묻혀 있다면, 그 경험은 좌절스러워집니다.
문제는 반드시 AI가 버그를 찾는 데 무능하다는 것은 아닙니다.
문제는 가능한 문제를 찾아내는 것과 그것이 개발자의 주의를 받을 자격이 있는지 결정하는 것은 두 가지 다른 과제라는 것입니다.
유용한 AI 코드 리뷰어는 실제로 무엇을 해야 할까요?
저는 우리가 다른 질문을 사용하여 AI 코드 리뷰를 평가해야 한다고 생각합니다.
“이 리뷰가 제가 어떤 유용한 엔지니어링 결정을 내리는 데 얼마나 도움이 되었나요?”
이는 우리가 전체 워크플로우를 생각하는 방식을 바꿉니다.
1. 비판하기 전에 코드를 이해하라
코드는 고립되어 존재하지 않습니다.
어떤 함수는 미들웨어(middleware)에서 해당 검증이 이루어지기 때문에 유효성 검사(validation check)를 놓친 것처럼 보일 수 있습니다. 어떤 설계는 확립된 아키텍처 패턴을 따르기 때문에 불필요하게 복잡해 보일 수도 있습니다.
AI 리뷰어가 작은 코드 diff만 본다면, 구현을 오해할 수 있습니다.
더 나은 리뷰는 변경의 목적, 관련 주변 코드, 기존 테스트, 그리고 팀의 컨벤션을 고려합니다.
더 많은 맥락이 자동으로 정확한 리뷰를 보장하지는 않지만, 충분하지 않은 맥락은 신뢰할 수 있는 추론을 어렵게 만듭니다.
2. 실제 영향도에 따라 문제를 우선순위화하라
다음 세 가지 가상의 발견 사항을 고려해 보세요:
- 데이터베이스 쿼리가 SQL injection을 허용할 수 있습니다.
- 오류 처리 경로가 다운스트림 서비스(downstream service)를 사용할 수 없게 될 때 실패할 수 있습니다.
- 변수 이름이 더 설명적일 수 있습니다.
이러한 발견 사항들이 동일한 우선순위를 가질 필요는 없습니다.
유용한 리뷰어는 발견을 뒷받침하는 증거와 그것이 실제로 사실일 경우의 잠재적인 결과를 모두 고려해야 합니다.
보안 문제는 미용적 선호도처럼 취급되어서는 안 됩니다. 동시에, AI가 충분한 증거 없이 무언가를 치명적인 취약점(critical vulnerability)이라고 자신 있게 라벨링해서도 안 됩니다.
심각도(Severity)와 신뢰도(Confidence)는 다른 문제입니다.
3. 왜 잘못되었는지 설명하라
이 두 개의 코멘트를 비교해 보세요.
코멘트 A:
“여기서 오류 처리를 개선하세요.”
코멘트 B:
“이 작업은 다운스트림 서비스가 사용할 수 없을 때 실패할 수 있지만, 새 코드는 그 실패를 처리하지 않습니다. 명시적인 실패 처리와 이 시나리오에 대한 테스트를 추가하는 것을 고려해 보세요.”
두 번째 코멘트는 개발자에게 조사해야 할 이유와 구체적인 다음 단계를 제공합니다.
유용한 리뷰는 문제를 설명하고, 그것이 발생하는 상황과 잠재적인 결과를 설명해야 합니다.
개발자는 AI가 무엇을 의미했는지 추측할 필요가 없어야 합니다.
4. 주석을 달지 말아야 할 때를 알기
이것은 아마도 AI 코드 리뷰의 가장 과소평가된 부분 중 하나일 것입니다.
모든 관찰 사항이 풀 리퀘스트(pull-request) 주석으로 작성될 필요는 없습니다.
AI 리뷰어는 추측성 문제 보고, 기존 도구 발견 내용 중복, 동일한 이슈 반복, 또는 무해한 스타일 선택을 결함으로 표시하는 것을 피해야 합니다.
린터(linter)가 포맷팅 문제를 신뢰성 있게 잡아낼 수 있다면, 린터가 그 역할을 하도록 두어야 합니다.
잠재적인 버그가 이용 가능한 증거로 뒷받침될 수 없다면, 리뷰어는 가능하다면 추가 조사를 하거나 추측을 사실처럼 제시하는 것을 피해야 합니다.
때로는 가장 좋은 리뷰 주석은 게시되지 않는 주석일 때입니다.
AI 리뷰는 우리가 이미 신뢰하는 도구를 대체해서는 안 됩니다
AI 코드 리뷰는 더 광범위한 엔지니어링 워크플로우의 일부로 작동할 때 가장 잘 작동합니다.
책임을 분담하는 실용적인 방법은 다음과 같습니다:
린터 및 포맷터(Linters and formatters): 예측 가능한 스타일 및 포맷팅 문제 포착.
타입 체커 및 테스트(Type checkers and tests): 특정 클래스의 유효하지 않은 연산 감지 및 예상 동작 검증.
정적 분석 및 보안 도구(Static-analysis and security tools): 알려진 결함 패턴과 위험 식별.
AI 코드 리뷰어: 컨텍스트 내의 변경 사항을 분석하고 추가 잠재적 문제 노출에 도움.
인간 엔지니어: 아키텍처, 비즈니스 요구사항, 복잡한 트레이드오프(trade-offs), 그리고 코드를 승인하는 최종 결정 평가.
이러한 책임들은 일부 영역에서 중복되지만, 서로 대체할 수는 없습니다.
AI 리뷰는 기존 품질 검사를 보완해야 하며, 제거해야 할 이유가 되어서는 안 됩니다.
그리고 빈 AI 리뷰는 절대 코드가 안전하다는 증거로 간주되어서는 안 됩니다.
AI 리뷰어가 좋은지 어떻게 알 수 있을까요?
주석의 개수는 세기 쉬운 지표이지만, 리뷰 품질에 대해서는 많은 것을 알려주지 않습니다.
대신 여러 가지를 살펴볼 것입니다:
– 어떤 발견 사항이 진정으로 관련성이 있습니까?
– 주석이 부정확하거나 중복되는 경우가 얼마나 자주 발생합니까?
– 리뷰어가 알려진 테스트 케이스에서 중요한 문제를 식별합니까?
– 개발자들이 불필요한 피드백을 조사하는 데 시간을 덜 쓰게 됩니까?
– 엔지니어들은 발견 사항을 충분히 신뢰하여 계속해서 이 도구를 사용합니까?
– 중요한 결함이 여전히 후반 테스트나 프로덕션 환경으로 빠져나가고 있습니까?
어떤 단일 지표도 모든 질문에 답할 수 없습니다. 예를 들어, 높은 수용률(acceptance rate)이 리뷰어가 어려운 버그를 잡아낸다는 것을 증명하지는 못합니다.
목표는 대시보드 숫자를 극대화하는 것이 아니라 전체 코드 리뷰 프로세스를 개선하는 것입니다.
Codzee가 이 논의에서 차지하는 위치
Codzee에서는 근본적인 질문에 관심을 두고 있습니다. AI 코드 리뷰가 개발자들이 실제로 중요한 발견 사항에 집중하도록 어떻게 도울 수 있을까요?
AI 지원 코딩이 더욱 일반화됨에 따라, 리뷰 경험 역시 진화해야 합니다. 개발자들은 단순히 가능한 개선 목록을 길게 받는 것이 아니라, 관련성이 있고, 실행 가능하며, 조사할 가치가 있는 피드백이 필요합니다.
이는 컨텍스트(context), 우선순위 지정(prioritization), 노이즈(noise), 그리고 개발자의 워크플로우에 대해 신중하게 생각하는 것을 의미합니다.
또한 AI가 틀릴 수 있다는 점을 인식하는 것도 의미합니다. 엔지니어들은 여전히 발견 사항을 검증해야 하며, 자신이 배포하는 코드에 대한 책임은 유지해야 합니다.
목표는 소프트웨어 개발에서 인간의 판단력을 제거하는 것이 아닙니다.
그것은 그 판단력이 가장 큰 가치를 제공하는 곳에 사용하는 것입니다.
커뮤니티에게 묻고 싶은 질문 하나
오늘날 AI 코드 리뷰에 대한 여러분의 가장 큰 좌절감은 무엇입니까?
거짓 양성(false positives), 누락된 컨텍스트, 지나치게 일반적인 제안 중 어느 것입니까, 아니면 다른 무언가입니까?
여러분들의 워크플로우에서 어떤 것이 효과적이었는지—그리고 그렇지 않았는지—듣는 것에 관심이 있습니다.
결국 최고의 AI 리뷰어는 가장 많은 것을 말하는 도구가 아닐 수 있습니다.
그것은 적은 주의 분산으로 더 나은 코드를 배포할 수 있도록 돕는 도구입니다.