본문으로 건너뛰기

Chapter 7: Code Review

Code review는 품질 게이트입니다 — 형식적 절차도 아니고, 퍼포먼스도 아니며, 사교적 의례도 아닙니다. Superpowers는 code review를 피드백을 요청하고 받는 것 모두에 대한 명시적인 프로토콜을 갖춘 엄격한 기술 활동으로 취급합니다.


Part 1: Code Review 요청하기

구조가 중요한 이유

구조 없는 code review 요청("이것 리뷰해줄 수 있어요?")은 구조 없는 피드백을 만들어냅니다. Reviewer는 코드가 무엇을 해야 하는지, 어떤 문제를 해결하는지, 어떤 tradeoff가 있었는지 모릅니다. 그 결과는 중요한 문제를 놓치는 표면적인 댓글입니다.

구조화된 요청은 reviewer에게 진정으로 유용한 피드백을 제공하는 데 필요한 모든 것을 줍니다.

Context 준비하기

Reviewer를 파견하기 전에 다음 세 가지 정보를 준비하세요:

WHAT — 이 변경은 무엇을 합니까? 다음을 설명하는 2~4개의 문장을 작성하세요:

  • 해결되는 문제
  • 취한 접근 방식
  • 주요 설계 결정과 그 이유
  • 하지 않는 것과 그 이유

PLAN — 구현 계획은 무엇이었습니까? 이 작업을 안내한 계획에 링크하거나 요약하세요. 이를 통해 reviewer는 구현이 의도와 일치하는지 확인할 수 있습니다.

BASE_SHA → HEAD_SHA — 검토 중인 정확한 commit 범위:

# base 가져오기 (브랜치가 main에서 분기된 곳)
git merge-base main HEAD

# 현재 HEAD 가져오기
git rev-parse HEAD

이렇게 하면 reviewer가 정확히 올바른 diff를 보게 됩니다 — 관련 없는 commit이나 전체 히스토리가 아닙니다.

Reviewer Subagent 파견하기

Context가 준비되면, 다음 구조로 code review subagent를 파견하세요:

REVIEW REQUEST
--------------
WHAT: [변경 사항에 대한 2~4문장 설명]

PLAN: [구현 계획의 링크 또는 요약]

DIFF RANGE: [BASE_SHA]..[HEAD_SHA]

FOCUS AREAS: [선택 사항: 면밀히 검토하고 싶은 특정 영역]

Subagent는 diff를 검사하고, 계획에 대조하여 확인하고, 관련 test를 실행하고, 구조화된 피드백을 반환합니다.

심각도별 Review 피드백 처리하기

모든 피드백이 동일한 긴급도를 갖지는 않습니다. 각 심각도 수준에 따라 다르게 처리하세요:

심각도정의조치
Critical버그, 보안 문제, 데이터 손실 위험, 깨진 contract완료를 차단합니다. 다른 작업 전에 즉시 fix하세요.
Important중요한 품질 문제, 누락된 test, 성능 문제다음 작업 시작 전에 fix하세요. 축적하지 마세요.
Minor스타일 선호도, 명명 제안, 선택적 개선기록하세요. 후속 ticket을 만드세요. 현재 PR을 gold-plate하지 마세요.

가장 흔한 실수는 모든 피드백을 동일하게 긴급하게 취급하는 것입니다. Critical 문제는 차단합니다. Minor 문제는 기록됩니다. 이를 혼동하면 사소한 스타일 피드백으로 지연이 발생하거나 실제 버그를 무시하게 됩니다.


Part 2: Code Review 받기

핵심 문제: 형식적 동의

AI agent — 그리고 많은 개발자들 — 은 code review 중 형식적 동의를 하는 경향이 있습니다. 이는 reviewer가 무언가를 제안하면, 구현자가 즉시 "맞습니다! 바로 수정하겠습니다!"라고 말하며 제안이 올바른지 진정으로 평가하지 않고 변경을 하는 것입니다.

형식적 동의는 해롭습니다. 왜냐하면:

  • 작동하는 코드에 잘못된 제안을 적용합니다
  • Reviewer가 무조건적 compliance를 기대하도록 훈련시킵니다
  • 축적된 나쁜 제안을 통해 시간이 지남에 따라 코드 품질을 저하시킵니다
  • Review가 실제 문제를 찾아내고 있다는 허위 확신을 줍니다

금지된 표현

다음 표현은 형식적 동의를 나타내며 허용되지 않습니다:

금지된 표현이유대신 사용할 표현
"맞습니다!"평가 없이 검증함"수정했습니다. X를 Y로 변경했습니다. 이유: [이유]."
"잘 발견하셨어요!"사교적 칭찬, 내용 없음"확인했습니다. 문제는 Z였습니다."
"바로 수정하겠습니다"이해 전에 약속함"지금 읽어보고 있습니다."
"완전히 이해가 됩니다"분석 없이 동의함"우려 사항을 이해합니다. 제 평가는: ..."
"맞습니다, 제가 ~했어야 했는데..."행동 없는 자기비하"구현했습니다. 변경된 사항은 다음과 같습니다."

대체 표현은 사실에 집중합니다: 무엇이 변경되었는지, 왜 변경되었는지, 무엇이 검증되었는지.

올바른 응답 패턴

Code review 댓글을 받으면, 이 순서를 정확히 따르세요:

READ → UNDERSTAND → VERIFY → EVALUATE → RESPOND → IMPLEMENT

READ: 참조된 코드나 문서를 포함하여 전체 댓글을 읽으세요. 읽는 동안 응답하지 마세요.

UNDERSTAND: 자신의 말로 reviewer의 우려 사항을 설명할 수 있습니까? 그렇지 않다면, 명확한 질문을 하세요. 의도를 추측하지 마세요.

VERIFY: 실제 코드를 보고 우려 사항이 유효한지 확인하세요. 해당되는 경우 관련 test를 실행하세요. 정신 모델이 아닌 실제 동작을 보세요.

EVALUATE: YAGNI 체크를 적용하세요 (You Aren't Gonna Need It):

  • 이 변경이 현재 요구사항에 필요합니까?
  • 실증된 실제 문제를 해결합니까?
  • Codebase가 현재 정당화하지 않는 복잡성을 추가합니까?
  • 이것이 합법적인 best practice입니까, 아니면 개인적인 스타일 선호도입니까?

RESPOND: 본능적 동의가 아닌 평가에 기반한 응답을 작성하세요.

IMPLEMENT: 제안이 유효하다면 구현하세요. 유효하지 않다면 추론을 설명하세요.

Reviewer 제안에 대한 YAGNI 체크

"여기에 caching을 추가해야 합니다" 또는 "이것을 generic interface로 추상화해야 합니다"라고 제안하는 reviewer는 옳을 수도 있습니다 — 하지만 YAGNI 테스트를 적용해야 합니다:

  • 현재 요구사항이 실제로 caching을 필요로 합니까? 성능 문제에 대한 측정된 증거가 있습니까?
  • 지금 당장 추상화에 대한 두 개 이상의 구체적인 사용 사례가 있습니까?

답이 아니오라면, 올바른 응답은: "잠재적인 미래 개선 사항으로 기록해두었습니다. 현재 요구사항에는 더 간단한 접근 방식으로 충분합니다. 후속 항목으로 기록했습니다."

유효한 Pushback 시나리오

Review 피드백에 pushback하는 것이 허용될 뿐만 아니라 — 다음과 같은 경우에는 반드시 해야 합니다:

  1. 제안이 버그를 도입합니다. 제안된 변경이 잘못된 동작을 만들어내는 이유를 test나 구체적인 예시로 보여주세요.

  2. 제안이 확립된 계획을 위반합니다. 구현 계획이 검토되고 승인되었다면, 이탈은 code review 중 일방적인 변경이 아닌 명시적 재승인이 필요합니다.

  3. 제안이 scope 밖입니다. 제안이 좋을 수 있지만, 별도의 작업에 속합니다. 지금 구현하면 scope가 확장되고, 배포가 지연되며, 혼합 목적의 commit이 생성됩니다.

  4. 제안이 정확성 영향이 없는 스타일 선호도입니다. 스타일 선호도는 linter config에 속하지 code review 피드백에 속하지 않습니다. 자동화할 수 없다면, PR을 차단할 가치가 없을 것입니다.

  5. 코드가 올바르다고 검증했으며 reviewer가 틀렸습니다. 증거를 명확하고 존중스럽게 제시하세요. 틀릴 수도 있습니다 — 하지만 반드시 논거를 제시해야 합니다.

Pushback 템플릿

Pushback 시, 이 구조를 사용하세요:

이 제안을 평가했습니다. 제 판단:

CONCERN: [Reviewer의 우려 사항을 정확하게 재서술]
INVESTIGATION: [이를 평가하기 위해 확인한 것]
FINDING: [발견한 것]
DECISION: [구현 / 나중을 위해 기록 / 이유와 함께 동의하지 않음...]
EVIDENCE: [Test 출력, 참조, 또는 구체적인 예시]

이렇게 하면 추론을 감사할 수 있게 되고, review 대화가 사실에 집중하게 됩니다.


요약

잘 수행된 code review는 가장 강력한 품질 도구 중 하나입니다. 형식적 승인이나 compliance 극장으로 잘못 수행된 code review는 시간을 소비하면서 품질을 생산하지 않기 때문에 review가 없는 것보다 나쁩니다.

Superpowers 프로토콜은 review의 양쪽이 엄격하도록 보장합니다: reviewer는 필요한 context를 얻고, 구현자는 사회적 compliance가 아닌 기술적 정직함으로 피드백을 평가합니다.