2025년 11월 아카이브되었지만 오늘도 트렌딩 11위에 올라 있는 레포. 코드가 한 줄도 없다. 그 대신 "코드리뷰를 어떻게 해야 하는가"에 대한 구글 사내 가이드 — 리뷰어 가이드 7편, 작성자 가이드 4편 — 이 마크다운으로 정리되어 있다. ⭐ 20.5k · CC-BY 3.0 · 모든 언어·모든 회사에 적용 가능한 "코드리뷰의 표준."
코드는 없다. 사상(philosophy)이 있다.
구글 사내에서 모든 신입 엔지니어가 입문서로 읽는 "코드리뷰 가이드라인"을 외부에 공개한 것. 리뷰어가 무엇을 봐야 하는지, CL(Change List, 풀리퀘) 작성자는 어떻게 행동해야 하는지, 의견 충돌은 어떻게 풀어야 하는지를 "규칙이 아니라 원칙"으로 풀어 썼다.
대부분의 회사는 PR 템플릿, 리뷰 체크리스트 같은 "규칙"을 만든다. 구글의 이 문서는 다르다. "왜 코드리뷰를 하는가", "리뷰어와 작성자의 역할은 무엇인가", "갈등이 생기면 어떤 원칙으로 푸는가" — 실무 규칙 뒤에 깔려 있어야 할 정신을 먼저 정의한다.
그래서 짧다. 전체 분량이 14개 마크다운 파일, A4 50장 정도. 그런데 별이 20.5k. 사람들은 코드리뷰 도구가 아니라 "리뷰를 둘러싼 인간관계의 매뉴얼"을 찾고 있었다는 뜻이다.
2019년 공개 → 2025년 11월 아카이브 → 그래도 매일 트렌딩에 오르는 이유.
이 레포는 사실 업데이트가 멈춘 지 오래된 문서다. 2025년 11월 21일자로 read-only 아카이브 처리됐다. 그런데도 매일 누군가가 별을 누른다. 이유는 세 가지다.
리뷰가 길어지면 본질이 아니라 감정싸움이 된다. 이 문서는 "리뷰어 vs 작성자"가 아니라 "코드 헬스(code health) vs 시간"이라는 더 추상적인 축으로 갈등 구조를 재정의한다. 사람을 비판하는 게 아니라 "장기적으로 코드가 더 건강해지는가"를 보자는 것. 이 관점 하나만 팀에 깔려도 리뷰 문화가 180도 바뀐다.
"Go 코드는 이렇게 리뷰하라", "React PR은 이런 체크리스트로" 같은 도구 의존적 문서가 아니다. 리뷰 자체의 메타 원칙을 다루기 때문에, GitHub·GitLab·Phabricator·Gerrit 어느 환경에서도 그대로 적용 가능하다. CC-BY 3.0 라이선스라 회사 위키에 그대로 복사·번역해도 된다.
2026년 현재 Claude Code, Cursor, Copilot이 PR을 자동 생성한다. 그러면 리뷰어의 역할이 더 무거워진다 — AI가 생성한 1000줄짜리 PR을 그냥 LGTM할 수는 없으니까. 이 문서가 말하는 "작은 CL 원칙", "every line 원칙", "Why를 묻는 코드리뷰"가 AI 시대의 안전벨트 역할을 하게 됐다. 트렌드 카테고리에 #AI agent가 없는데도 11위에 오른 건 그 때문이다.
| 자료 | 스타일 | 이 문서와 차이 |
|---|---|---|
| 《Code Complete》 (Steve McConnell) | "좋은 코드"의 책 | 이 문서는 "좋은 코드"가 아니라 "좋은 리뷰"에 초점 |
| SmartBear《Best Kept Secrets of Peer Code Review》 | 리뷰 통계·연구 기반 | 이 문서는 통계보다 의사결정 원칙 중심 |
| 회사별 PR 템플릿 | 체크리스트 | 이 문서는 체크리스트가 아니라 사상을 가르침 |
| 《The Pragmatic Programmer》 | 개인 엔지니어링 태도 | 이 문서는 팀 vs 개인의 속도 트레이드오프를 정면으로 다룸 |
코드가 없으니 기술 스택도 없다. 대신 "문서가 어떻게 짜여 있는가"가 곧 이 레포의 설계다.
이 레포는 review/ 폴더 하나에 모든 콘텐츠가 들어 있다. Jekyll 기반 GitHub Pages로 빌드되어 google.github.io/eng-practices에 호스팅된다. 빌드 설정은 _config.yml 한 파일이 전부.
마크다운 → HTML 변환은 GitHub Pages에 내장된 Jekyll이 처리한다. 별도 빌드 파이프라인이 없다. master 브랜치에 푸시하면 끝.
전체 콘텐츠가 리뷰어용 7개 문서와 작성자용 4개 문서로 양분되어 있다. "리뷰는 양쪽이 같은 책을 읽어야 한다"는 사상이 폴더 구조에 그대로 드러난다.
코드용 라이선스(Apache, MIT)가 아니라 저작물용 라이선스를 쓴다. 이 레포가 "코드 프로젝트"가 아니라 "문서 프로젝트"임을 라이선스로 선언한 셈. 회사 위키에 복사하고 번역해도 출처만 밝히면 된다.
코드 아키텍처 대신, 이 문서가 가르치는 리뷰 의사결정 트리를 그려본다.
이 문서 전체에서 가장 중요한 한 문장:
이게 "수석 원칙(senior principle)"이다. 완벽을 추구하지 말고 지속적 개선(continuous improvement)을 추구하라는 것. 모든 다른 규칙은 이 조항 아래에 종속된다.
리뷰가 늦어지면 개인은 다른 일을 할 수 있어서 효율적으로 보인다. 그러나 팀 관점에서는 손해다. 그래서 이 문서는 "리뷰 응답 시간은 영업일 1일 이내"라는 강한 룰을 박는다. 단, 본인이 "집중 작업 중"이라면 끊기지 말 것. 끊김 비용이 더 크기 때문.
이 문서가 거의 신앙처럼 반복하는 주장: "CL은 작을수록 좋다." 이유는 8가지로 정리된다.
가이드라인은 약 "100줄이 적당, 1000줄은 너무 큼". 다만 줄 수보다 "한 가지 일만 하는가(one self-contained change)"가 더 중요한 판단 기준이다.
큰 PR을 한 번에 리뷰하는 건 장편소설을 한 호흡에 정독하는 것과 같다. 작은 PR을 연속으로 리뷰하는 건 단편소설집을 한 편씩 끊어 읽는 것과 같다. 같은 분량인데 후자는 디테일을 다 잡아내고, 전자는 클라이맥스도 졸면서 넘긴다.
"이 폴더 구조 자체가 가르침이다."
핵심은 두 폴더로 나뉜다는 것이다. 리뷰어와 작성자는 같은 사건을 다른 관점에서 본다. 그래서 같은 사건(=CL 충돌)에 대해 양쪽 문서가 서로 다른 조언을 한다. 그러나 결론은 항상 같은 "헌법 1조"로 수렴한다 — standard.md의 "코드 헬스 개선" 원칙.
14개 문서 중 가장 자주 인용되는 5개 챕터를 한 페이지로 압축.
standard.md — "코드 헬스가 헌법이다"리뷰어는 "perfect"를 요구해서는 안 된다. continuous improvement를 추구해야 한다. CL이 시스템을 개선한다면 며칠씩 붙잡고 폴리싱하지 말 것.
중요한 부속 원칙:
looking-for.md — 리뷰어 체크리스트 8개 영역| 영역 | 핵심 질문 |
|---|---|
| Design | 이 변경이 시스템에 어울리는가? 라이브러리에 들어가야 할 코드가 아닌가? |
| Functionality | 의도대로 동작하는가? 엣지케이스, 동시성 문제는? |
| Complexity | 더 단순할 수 없나? "미래에 필요할 것 같다"는 이유의 과잉 설계는 거부 |
| Tests | 의미 있는 단위/통합/E2E 테스트가 함께 있는가? |
| Naming | 이름이 충분히 정보적인가? 너무 길지 않은가? |
| Comments | "what"이 아니라 "why"를 설명하는가? |
| Style | 스타일 가이드 준수? 스타일 변경과 기능 변경을 한 CL에 섞지 말 것 |
| Documentation | README, g3doc, generated docs 업데이트되었는가? |
| Consistency | 기존 코드 패턴·스타일 가이드와 일관성 있는가? 가이드에 없을 경우 기존 코드 스타일을 따를 것 |
그리고 가장 강한 한 줄: "Every line. 사람이 작성한 모든 라인을 본다." 자동 생성 코드, 데이터 파일이 아니라면 한 줄도 건너뛰지 말 것. 이해 안 되면 작성자에게 물어볼 것 — 당신이 이해 못한 코드는 미래의 개발자도 이해 못한다.
speed.md — "리뷰는 빨라야 한다, 단 본인은 끊기지 말 것"응답 시간 룰: 한 영업일 이내. 아침에 PR을 받으면 그날 안에, 저녁에 받으면 다음날 아침 첫 일과로 응답.
예외: 본인이 집중 작업 중이면 끊지 말 것. 점심·미팅 후 자연스러운 break-point에 응답.
"LGTM with comments": 사소한 수정만 남았다면 "LGTM, 단 코멘트 반영해줘"로 미리 승인. 작성자가 다른 타임존이라면 특히.
큰 CL 거절권: 너무 큰 CL은 "쪼개와"라고 돌려보내는 게 정당한 응답이다.
comments.md — 리뷰 코멘트는 "사람"이 아니라 "코드"를 향한다주체가 "당신"이다. 사람을 비난한다.
주체가 "코드"다. 그리고 왜(why)를 함께 설명한다.
코멘트는 심각도 라벨을 붙일 것:
Nit: — 사소함. 기술적으로 맞지만 큰 영향 없음Optional: / Consider: — 좋은 아이디어일 수 있지만 강제는 아님FYI: — 이번 CL에 안 해도 됨. 참고용이 라벨이 없으면 작성자는 모든 코멘트를 필수로 받아들여 좌절한다. 한 줄 라벨이 갈등의 90%를 줄인다.
cl-descriptions.md — CL 설명은 "What + Why"가 의무다"Fix bug", "Fix build", "Phase 1" — 모두 나쁜 CL 설명의 실제 예시다.
Servers like FizzBuzz have very large messages and would benefit from reuse. Make the freelist larger, and add a goroutine that frees the freelist entries slowly over time, so that idle servers eventually release all freelist entries.
구조: ① 첫 줄 = 명령문으로 압축 (Delete X. / Add Y. / Replace Z.) → ② 본문 = 왜(why), 어떤 trade-off, 어떤 한계를 함께 설명. 미래의 누군가가 git log를 grep할 때 발견할 수 있도록.
기술이 아니라 "관점"이 학습 대상이다.
"버그 잡기"가 아니다. "장기적 코드 헬스 유지"다. 이 관점이 깔리면 다음과 같은 변화가 생긴다:
리뷰어와 작성자가 충돌하면? 이 문서가 제시하는 순서:
실무에서 가장 즉시 적용 가능한 팁. PR 코멘트 앞에 Nit:를 붙이는 습관 하나만 들여도 팀 분위기가 바뀐다. 작성자는 "이건 안 고쳐도 됨"을 알 수 있고, 리뷰어는 "내가 이건 그냥 취향임을 인정함"을 표시할 수 있다.
| 전략 | 설명 | 예시 |
|---|---|---|
| Stacking | 작은 CL을 머지 안 기다리고 그 위에 다음 CL을 쌓음 | git rebase, jj 등으로 PR 체인 |
| By Files | 파일 묶음별로 다른 리뷰어 배정 | proto 변경 + 사용 코드 → 두 PR로 분리 |
| Horizontal | 레이어로 자르기 (UI/API/Service/DB) | 먼저 API 스텁만, 그 다음 구현 |
| Vertical | 기능 단위(end-to-end)로 자르기 | 곱셈/나눗셈을 별도 PR로 |
리뷰어가 "이거 이해 안 됨"이라고 하면 작성자의 첫 반응은 무엇이어야 할까? 설명 댓글이 아니다. 코드를 더 명확하게 고친다. 안 되면 코드 주석을 단다. 그것도 안 되면 그제서야 PR 댓글로 설명한다. 이유는 단순하다 — PR 댓글은 1년 뒤 코드를 읽는 사람에게는 안 보이기 때문.
"이 레포에는 코드가 없다. 그래서 요구사항도 없다."
로컬에서 실행할 게 없다. 문서를 읽기만 하면 된다. 굳이 빌드해보고 싶다면 Jekyll만 설치하면 GitHub Pages와 동일한 사이트를 로컬에서 띄울 수 있다.
Ruby 2.7+ → gem install jekyll bundler → 레포 클론 → bundle exec jekyll serve → localhost:4000 접속.
하지만 솔직히 공식 호스팅 페이지를 그냥 읽는 게 더 편하다.
"읽기"가 아니라 "내 팀에 적용"이 진짜 학습이다.
"버그 수정" 같은 한 줄 설명을 쓰지 말고 — 첫 줄에 명령문, 본문에 "왜"를 적는다. cl-descriptions.md의 GOOD 예시를 그대로 모방해본다.
한 주 동안 내가 다는 모든 리뷰 코멘트 앞에 Nit:, Optional:, Consider:, FYI: 중 하나를 붙인다. 일주일 후 작성자들의 반응 변화를 관찰한다.
최근 내가 보낸 가장 큰 PR 1개를 가져와서, small-cls.md의 4가지 전략(Stacking/By Files/Horizontal/Vertical) 중 어떤 걸로 쪼갰어야 했는지 사후 분석한다. 다음에 같은 작업을 한다면 어떤 순서로 PR을 보낼지 종이에 그려본다.
회사 위키의 "PR 작성 규칙"을 리뷰어용 / 작성자용 두 폴더로 분리한다. 양쪽 모두에 같은 "헌법 1조"(코드 헬스 원칙)를 새긴다. CC-BY 3.0이므로 이 레포에서 그대로 인용해도 된다.
Claude / Copilot이 자동으로 PR을 만드는 환경에서, looking-for.md의 8개 영역을 그대로 체크리스트로 만들어 AI에게 자기검증을 시킨다. AI가 만든 PR에서 "Every line" 원칙을 어떻게 보존할지 사내 룰을 작성한다.
이 레포는 "출발선"이다. 4주 동안 코드리뷰의 전체 우주를 돌아본다.
| 주차 | 주제 | 학습 자료 |
|---|---|---|
| 1주차 | 이 레포 정독 | review/ 폴더의 14개 마크다운 전체. 메모 작성하며 읽기. Nit/Optional 라벨을 본인 PR에 적용 시작 |
| 2주차 | 스타일 가이드 깊게 | google/styleguide — 본인이 자주 쓰는 언어(Python, TS, Go, …) 하나만 정독 |
| 3주차 | 좋은 코드 자체에 대한 책 | 《Code Complete 2》 Ch.20-22 (코드리뷰/페어 프로그래밍) + 《The Pragmatic Programmer》 |
| 4주차 | 리뷰의 사회과학 | 《Software Engineering at Google》 (O'Reilly, 무료 공개) — Ch.9 "Code Review" 정독 |
이 레포에 반복 등장하는 용어 한 자리 정리.
Nit: / Optional: / FYI: 라벨을 의식적으로 붙인다. 한 주만 해도 팀이 달라진다.