レビューで好みの指摘と品質リスクをどう切り分けるか

コードレビューでは、正しい指摘と好みの指摘が混ざりやすい。
たとえば、次のようなコメントは現場でよく見る。

Comment
@Reviewer: この書き方は好みではないので直してください。

このコメントは危うい。
本当に品質リスクがあるのか、チームルールなのか、単なる個人の好みなのかが分からない。

レビューアーがまず行うべきなのは、指摘を書く前に
これはブロックすべき品質リスクか、任意の改善提案かを切り分けることである。

この記事では、レビューにおける好みと品質リスクの線引きを、実務で使える判断軸として整理する。

なぜ切り分けが必要なのか

好みの指摘を強く書くと、レビューは摩擦を生む。
逆に、品質リスクを弱く書くと、重要な問題が流れてしまう。

どちらも避けたい。

  • 好みを必須修正にすると、チームの速度が落ちる
  • 品質リスクを任意提案にすると、障害や保守負債が残る
  • 指摘強度がぶれると、レビューイーが優先順位を判断できない
  • レビューアーごとに基準が違うと、チームルールが育たない

レビューで重要なのは、指摘数ではない。
指摘の強度がリスクに合っていることである。

まず分けたい3分類

1. 品質リスク

バグ、障害、セキュリティ、データ不整合、運用事故につながるものは品質リスクである。
これはマージ前に止める理由になる。

Comment
@Reviewer: この処理は決済API呼び出しにリトライを入れていますが、冪等性キーがありません。通信失敗時に二重決済になる可能性があるため、マージ前に重複防止方針を入れてください。

このコメントは強くてよい。
理由と失敗シナリオが明確だからである。

2. チームルール

formatter、lint、命名規約、ディレクトリ構成など、チームで合意済みのルールは個人の好みではない。
ただし、ルールへの参照を示すとよい。

Comment
@Reviewer: このファイルは既存ルールでは `features/orders` 配下に置く方針です。関連するAPI、hook、型定義を同じfeature境界に寄せるため、配置を合わせてください。

チームルールは、背景が説明できるほど納得されやすい。
単に「ルールなので」だけで終わらせないほうがよい。

3. 個人の好み・任意提案

どちらでも成立するが、読みやすさや一貫性の観点で提案したいものもある。
これは強く書きすぎない。

Comment
@Reviewer: ここは現状でも読めますが、条件が増えるなら早めに関数名へ意図を出す案もあります。必須ではありませんが、`canSubmitOrder` のようにすると判定目的が残りやすいです。

任意提案は、受け手が採用しない選択肢を持てるように書く。
これだけでレビューの摩擦はかなり減る。

判断軸1:壊れるか、迷うだけか

最初の判断は、放置したときに壊れるかどうかである。

放置した結果 指摘強度
障害、データ不整合、セキュリティ問題につながる 必須修正
将来変更で誤用されやすい 強めの改善要求
読み方が少し分かれそう 任意提案
個人的には別案が好き コメントしない、または参考提案

レビューコメントを書く前に、この表に当てはめるだけでも強度のぶれは減る。

判断軸2:根拠をチームで共有できるか

指摘の根拠を、他のレビューアーも同じように説明できるかを考える。

  • 仕様書に書いてある
  • 既存コードの方針と一致している
  • 運用上の事故を防ぐ理由がある
  • テストで検証できる
  • チームルールとして明文化されている

これらがあるなら、好みではなく共有可能な判断に近い。

Comment
@Reviewer: このエラーは呼び出し元でリトライ判定に使われるため、単なる `fmt.Errorf` ではなく判定可能なエラー型にしてください。既存の外部API呼び出しでも同じ方針になっています。

根拠が共有できるコメントは、議論になっても前に進みやすい。

判断軸3:代替案が複数あるか

解決策が複数ある場合、レビューアーの提案を唯一解のように書かない。
目的を固定し、手段は相談にする。

Comment
@Reviewer: ここで重要なのは、失敗時に部分更新が残らないことです。実装案としてはトランザクションに寄せる、または更新単位を分ける方法があります。どちらの方針にするか確認したいです。

このコメントは、目的を明確にしつつ、実装者の設計判断を残している。
レビューで常に細部まで指定する必要はない。

好みの指摘を書きたいとき

好みの指摘を完全になくす必要はない。
ただし、次の条件を満たすときだけにしたい。

  • 既存コードとの一貫性が崩れている
  • 将来の読み手にとって認知負荷が上がる
  • チームで何度も同じ議論が起きている
  • 任意提案であることを明示できる
Comment
@Reviewer: 必須ではありませんが、このプロジェクトではboolean関数を `is` / `has` / `can` で始める例が多いです。既存コードに合わせるなら `canRetry` のほうが読みやすいかもしれません。

このように書けば、好みの押し付けになりにくい。

チームルールへ育てる

同じ好みの指摘が何度も出るなら、それは個人の好みではなく、チームルール候補かもしれない。
その場合、PR上で毎回強く言うより、ルール化を提案したほうがよい。

Comment
@Reviewer: この命名方針は今回だけでなく複数PRで議論になっているため、レビューコメントで都度判断するより、チームの命名ルールとして短くまとめたほうがよさそうです。

レビューはルールを押し付ける場ではない。
しかし、繰り返し発生する判断をチーム資産に変える場ではある。

チェックリスト

好みと品質リスクを切り分ける確認項目
  • 放置すると具体的に何が壊れるか説明できるか
  • 指摘の根拠をチームで共有できるか
  • 既存ルールや仕様に接続できるか
  • 必須修正、強めの改善、任意提案を区別して書いているか
  • 代替案が複数ある場合に目的と手段を分けているか
  • 同じ指摘が繰り返されるならルール化を検討しているか

まとめ

レビューで好みを完全に消すことはできない。
しかし、好みの指摘と品質リスクを同じ強度で扱うと、レビューは不安定になる。

レビューアーは、コメントを書く前に
これは壊れるリスクなのか、チームルールなのか、任意提案なのかを切り分けたい。

その切り分けができるほど、レビューコメントは強くも柔らかくも適切に書ける。