CIと連携したレビュー設計をレビューアーが設計するには

Lint、フォーマット、静的解析、ユニットテスト、E2E。
今やCI(継続的インテグレーション)は開発プロセスに欠かせない品質ゲートとなっている。

一方で、こうしたCI自動化の発展により「レビューの意味が薄れてきたのではないか」という誤解も生まれている。
本稿では、CIとレビューが競合するのではなく補完関係にあることを前提に、レビューアーが意図して“分担設計”するための実務戦略を解説する。

1. CIの進化とレビュー役割の再定義

CIの役割は「形式的保証」と「機械的正しさ」

CIでカバーされる範囲は年々広がっている。

  • コーディング規約の逸脱(ESLint, Stylelint)
  • フォーマット統一(Prettier)
  • 静的型解析(TypeScript, mypy, etc.)
  • ユニットテスト通過確認
  • セキュリティスキャン(Snyk, Trivy など)
  • ビルド・デプロイの整合性確認

これらは「コードが形式的に間違っていないか」を機械的に検出する手段であり、再現性・即時性に優れている。

それでもレビューが必要な理由

しかしCIではカバーしきれない領域が確実に存在する。

項目 CIで検出可能か? レビューが必要な理由
設計意図とコードの整合 × コードの背後にある判断・文脈は機械には見えない
責務分離の妥当性 × 意図的な構造判断は人間の経験と背景理解に依存
バグの芽 テストがなければCIは検知できない
ユーザー体験の観点 × インタラクションや視点のズレは機械検出不能
曖昧な命名・コメントの意味性 × 機械は「伝わるかどうか」を判断できない

2. 自動化と人間が担うべき観点を分離する設計

観点のマッピング:CI vs. レビューアー

チェック観点マッピング表

[CIに任せる観点]
- 構文誤り、文法違反
- インデント・改行・スペース
- 未使用変数・未使用import
- 型の基本的整合
- テスト通過有無
- セキュリティ脆弱性の有無(定義済みルール)

[レビューアーが担当すべき観点]
- 設計意図との整合
- 担当責務の分離
- 命名の意味性と読解性
- 業務ドメインとの対応
- 影響範囲の妥当性
- バグの入り込みやすい構造

意図的な観点分離が文化を作る

「レビューでこれ指摘する必要あった?」という空気があると、レビュー自体が萎縮する。
逆に「この観点はCIでやるから、レビューは構造と背景に集中しよう」という暗黙の観点分離が浸透していれば、
レビュー時間は深く・短く・価値あるものになる。

3. CIで担保すべきチェック項目の設計原則

レビューから形式的なチェックを減らすには、CIが正しくカバーしていることが前提条件になる。

原則1:ルールが曖昧ならCIに移すな

例えば、「関数は3行以内で」や「コメントは必須」といったルールが曖昧な場合、CIに載せても誤検出や過剰検出の温床になる。

CIに載せるべきは、「ルール化できて定量的なもの」に限る

原則2:自動修正可能なものはすべてCI+Pre-commitで

推奨構成例

- ESLint + Prettier → `lint-staged`でPre-commit自動適用
- Stylelint → CSS/SCSSの静的解析
- husky → git commit前に実行保証

「直すべきことはCIが先に直す」ことで、レビュー時間を「考えるべきこと」だけに集中させる。

原則3:レビュー観点を明示的に外す設定を持つ

PRテンプレートやチーム規約で「この観点はCIに任せる」ことを明示しておく。

チーム規約例

以下の観点はCIで強制されているため、レビュー対象外とする:

- スペース/改行のスタイル
- 変数未使用チェック
- import順
- ファイルサイズチェック

4. レビューアーがCI設計に関与すべき理由

なぜレビューアーがCI構成を理解・設計する必要があるのか

  • CIでカバーされていない観点をレビューで見てしまう無駄を減らすため
  • 「CIで失敗するかも」と不安になりながらレビューする心理負荷を下げる
  • CIとレビューが「互いに補完し合う関係」になるため

よくある問題:CIのエラーをレビューアーが解釈できない

例:CIエラー

`Line 22:10: 'userInfo' is assigned a value but never used`

→ エラーは出ているが、プロジェクトに特有な命名規約や暗黙仕様などの判断が混ざると、
レビューアーが「どこまで踏み込むべきか」判断できなくなる。

解決策:CIルール設計と観点整理にレビューアーが関与する

  • Lint・Test・Buildなど各CIの観点表をレビューアー向けに作成
  • PRテンプレートに「このCIエラーは無視して良いか」などの欄を設ける
  • 「レビューしなくてよい観点」の記述をCIログとともに明示

5. CIとレビューの役割分担をドキュメント化する実務設計

CIの構成が整っていても、「誰がどこまで見て、どこから見ないのか」が曖昧なままでは運用に乗らない
そこで、レビュー設計とCI設計を接続した役割分担ドキュメントの作成が重要になる。

ドキュメント構成例:CI vs Review 担当観点一覧

観点 CI Review 備考
Lintチェック(文法・スタイル) × ESLint/Prettierで強制
型整合(簡易) TypeScriptで基本はCI、ただし型設計の妥当性はReview
エラーハンドリング × 業務的意図を反映するためCIでは難しい
ユーザー体験の整合性 × UX上の不整合は人間による評価が必須
テストの通過有無 Reviewではテストの「妥当性」を見る
セキュリティの脆弱性 CIは既知脆弱性検知、Reviewは論理的抜けの検討

→ このようなマッピングを明文化することで、レビューアーが何を「見ない」かを安心して判断できる

6. レビュー起点でCIを改善するための実務手法

CIが完璧に設計されているチームは稀であり、むしろレビューの中で「これCIで検出できればいいのに」という気づきが重要な改善契機になる。

パターン1:毎回の指摘をCIに昇格させる

指摘例
@Reviewer: import順がプロジェクト内とずれているようです。

→ 解決策:
.editorconfig や eslint-plugin-simple-import-sort をCIに追加

パターン2:PRテンプレートに「CI化候補」を記入

PRテンプレート拡張案

- レビューで毎回指摘される事項:
(例)APIエラーハンドリング忘れ、nullチェック漏れ

- 今回のPRで「CI化できそう」と思った観点:
(例)ファイルサイズ上限、特定ファイル拡張子の混入

→ レビューアーだけでなく開発者からのCI改善提案フローにもなる

パターン3:レビュー観点漏れをCIで補完する実験

  • テスト書き忘れ → jest --coverage とカバレッジ閾値で警告
  • コメント未記載 → ESLintルールで特定ファイルに注釈強制

7. レビューアーがCIと連携するときの注意点

注意1:CI結果を「合否」ではなく「会話の起点」として扱う

  • 「CIが通っていればOK」ではなく、「なぜこのCIルールがあるのか?」を話題にする
  • CIエラーを放置してレビューが進むと、責任の所在が不明瞭になる
例:CIを使った観点提示
@Reviewer: CIで通ってますが、型ガードで防げるミスが1つ見落とされているように思います。tsconfigのstrict設定に反映してもよいかもしれません。

注意2:CIの形骸化を防ぐために「なぜ」を記録する

  • LintやTestが「なぜこのルールになっているか」が不明なままでは形だけになる
  • ルール導入時に「背景・目的」を .github/CODE_GUIDE.md に書いておくことが望ましい

8. 今後の展望:CIとレビューの相互強化へ

将来像:レビューコメントからCIルールを半自動生成

  • 頻出レビューコメントを記録し、パターン化されたものをCI化
  • 例:「未使用変数」はESLint、「複数ファイルで繰り返されるロジック」は共通化スクリプトで検出

高度CI:構造解析・ビジネスルール検知

  • AST(抽象構文木)レベルでのコード構造チェック
  • 「業務的にこのif文は不自然」などを静的解析で補助する研究も進行中

レビューとCIは今後さらに近づき、「人間の思考」をルール化・自動化する方向に進む

9. まとめ:レビューアーが設計者になる時代

CIが進化するほど、レビューの本質はむしろ設計の妥当性、背景理解、文脈読解といった
人間にしかできない観点に集中する構造へと進化している。

本記事では以下の点を実務構造として提示した:

項目 内容
CIの役割 形式的・機械的な正しさの担保
Reviewの役割 意図・設計・影響評価など文脈的評価
分担設計 担当観点マッピングとレビュー対象明示
レビュー起点のCI改善 頻出指摘 → CI化、テンプレートへの誘導
文化構築 「CIが守り、レビューが考える」役割共有

レビューアーは、レビューを単に実施する存在ではなく、レビューという“構造そのもの”を設計する存在へと進化している。