アーキテクチャ ·

コードレビューで見ている9つの観点と、Must / Should / Mayの付け方

  • コードレビュー
  • 品質
  • チーム開発

この記事で扱う問題

コードレビューが、インデントや命名の指摘だけで終わってしまうことがあります。スタイルは静的解析と自動整形に任せられます。人が時間を使うべきなのは、ツールでは見つからない、本番で壊れる問題です。

一方で、指摘がすべて同じ重さで並ぶと、作者はどれを直すべきか判断できず、レビューが長引きます。

判断

私はレビューで、おおよそ次の順に確認します。

# 観点 確認すること
1 要件 チケットの要件を本当に満たしているか。仕様の解釈がずれていないか
2 責務の配置 そのロジックは、その層・そのクラスに置くべきものか
3 境界条件 0件、上限、空文字、日付の境目、権限の境目
4 例外系 失敗したときに、途中まで処理された状態が残らないか
5 データ整合性 複数のテーブル・外部リソースを更新するとき、片方だけ成功しないか
6 冪等性 リトライや二重送信で、同じ処理が2回走っても問題ないか
7 性能 N+1、ループ内のクエリ、インデックスのない検索、全件読み込み
8 後方互換性 既存のクライアントやデータを壊さないか。デプロイ順序に依存しないか
9 障害時の復旧 失敗したときに原因を追えるログがあるか。やり直せるか

指摘には優先度を付けます。

  • Must:直さないとマージできない。要件漏れ、データ破壊、セキュリティ、互換性の破壊
  • Should:直すべきだが、理由があれば別チケットでもよい。責務の置き場所、テスト不足
  • May:好みや提案。直すかどうかは作者が決めてよい

なぜそう判断したか

上の9つは、本番で起きたときの影響が大きく、後から見つけるほど直すコストが上がる順に近い並びです。スタイルの問題は後からでも一括で直せますが、データ整合性の問題はデータそのものが壊れてから気づくことになります。

優先度を付けるのは、レビューを「作者との交渉」にしないためです。Must と May が同じ重さで並ぶと、作者は全部に対応するか、全部に反論するかの二択になります。優先度があれば、Must だけ確実に直してマージする、という判断ができます。

どこから設計過剰になるか

  • 小さな修正に、9つの観点すべてを当てはめる必要はありません。変更の種類によって、効く観点は数個に絞れます
  • May を大量に付けると、それだけでレビューが重くなります。本当に伝えたいものだけにします
  • 観点のチェックリストをそのまま機械的に適用すると、要件(1)の確認がおろそかになりがちです。一番大事なのは1です

まとめ

  • スタイルはツールに任せ、人は本番で壊れる問題を探す
  • 要件・責務・境界条件・例外系・整合性・冪等性・性能・後方互換性・復旧の順に見る
  • 指摘は Must / Should / May で優先度を付け、レビューを交渉にしない

本記事の設計判断・事例・技術的見解は筆者によるものです。構成・文章編集には生成AIを利用しています。