読む量が増えるほど、読まなくなる
前々回の記事で、 AI時代に品質を担保する主戦場が「コードレビュー」から「テストレビュー」へ移る、 と一行だけ書きました。今回はその一行を、もう少し丁寧に開いてみます。
逆説的な話から始めます。 AIエージェントが書くコードの量は、人間が書いていた頃とは比較にならないほど増えました。 ところが、人間が一行ずつ読むべきコードの量は、むしろ減らすべきなのです。 読む速度は変わらないのに、書かれる量だけが増える——このまま「全部読む」を続ければ、 レビューはチーム最大のボトルネックになります。
コードレビューが担ってきた「二つの仕事」
この移行を理解するには、コードレビューがそもそも何のためにあったかを 分解しておく必要があります。実は二つの、性質の異なる仕事を兼ねていました。
- 欠陥検出:バグ、設計上の問題、セキュリティホールを実装が本番に届く前に見つける
- 知識伝達:Googleのエンジニアリングガイドは、知識伝達を欠陥検出と同格の主目的として明記しています。レビューはシニアからジュニアへの、業務を止めない形での指導の場でもありました
AIが実装の大半を書くようになると、この二つの仕事のうち、 後者が静かに崩れます。コードの「書き手」が、成長する人間ではないからです。 レビューコメントを返しても、次に同じ間違いをしないよう学習して育っていく ジュニアエンジニアが、そこにいません。
「読む量」の限界を超えた
もう一つの問題は、単純な物理量です。 AIエージェントが夜間に生成する差分をすべて人間が一行ずつ精読する、 というモデルは、量の面でそもそも持続可能ではありません。 前々回書いた 「実装コストがほぼゼロになった」という話は、 そのまま「レビュー対象の量がほぼ無限になった」という話でもあります。 ボトルネックは実装から検証に移りましたが、 検証もまた「全部読む」という同じやり方を続けていては、次のボトルネックになるだけです。
コードレビューに残るもの、テストレビューが引き受けるもの
だからといって、コードを一切読まなくていいわけではありません。 正しく切り分けると、こうなります。
| コードレビューに残るもの | テストレビューが引き受けるもの | |
|---|---|---|
| 問う内容 | この抽象化は半年後も耐えるか、この設計は正しいか | この仕様理解は正しいか、この境界値は網羅されているか |
| 対象 | アーキテクチャ、セキュリティに関わる箇所、可読性 | 正常系・異常系・境界値、受け入れ基準との一致 |
| 読む理由 | 将来この場所を読む「人間」のため | この仕様が「本当に仕様通りか」を保証するため |
ポイントは、コードは相変わらず人間が読むものだという点です。 AIが書いたとしても、半年後にそこを触るのは人間です。 だからアーキテクチャ判断と可読性は、引き続き人間の目が必要です。 一方で「仕様通りに動くかどうか」の保証は、 テストという形式化された基準に主戦場が移ります。
テストレビューは、実は簡単ではない
ここで安易にカバレッジ率を追いかけると、危険な罠にはまります。
カバレッジは「実行されたかどうか」を測るだけで、
「その実行が本当に意図を検証できているか」は測りません。
if 文を通過しても、その分岐の結果が正しくアサートされていなければ、
カバレッジ100%のまま、意味のないテストが量産されます。
この弱点を炙り出す手法がミューテーションテストです。 ソースコードに意図的に小さなバグ(ミュータント)を注入し、 既存のテストスイートがそれを検知して「殺せる」かどうかを機械的に検証します。 ミュータントを生き残らせてしまうテストは、 カバレッジ上は緑でも、実質的に何も守っていません。
AIが大量にテストを生成できる時代だからこそ、 「テストの数」や「カバレッジ率」ではなく、 「このテストは本当に壊れたコードを検知できるか」を 人間が問い続ける必要があります。それがテストレビューの核心です。
簡単な例で見てみます。割引計算のロジックです。
int applyDiscount(int price, boolean isMember) {
if (isMember) {
return price - 100;
}
return price;
}
これに対して、カバレッジ100%を達成する「弱いテスト」はこう書けてしまいます。
@Test
void discountIsApplied() {
applyDiscount(1000, true);
applyDiscount(1000, false);
// どちらの分岐も実行はされている。しかしアサーションが一つもない。
}
このテストは、行カバレッジも分岐カバレッジも100%です。
しかしreturn price - 100;を
return price - 1;に書き換えても、テストは気づかず通過します。
ミューテーションテストは、まさにこの「気づかない」状態を機械的に暴きます。
正しいテストは、こう書かれているべきです。
@Test
void memberGets100YenDiscount() {
assertEquals(900, applyDiscount(1000, true));
}
@Test
void nonMemberPaysFullPrice() {
assertEquals(1000, applyDiscount(1000, false));
}
一行のコードに対して、これくらい単純な例でも「弱いテスト」は容易に生まれます。 AIエージェントが数百のテストを一晩で生成する状況では、 この種の「実行されているだけで何も検証していないテスト」が カバレッジの数字の裏に大量に紛れ込むリスクは、むしろ人間が書いていた頃より高くなります。
ジュニアエンジニアは、どこで育つのか
知識伝達という、コードレビューが失った機能はどこへ行くのでしょうか。 2026年に発表された研究 "From Junior to Senior: Allocating Agency and Navigating Professional Growth in Agentic AI-Mediated Software Engineering" は、この問いに正面から向き合っています。
この研究によれば、ジュニアエンジニアはAgentic AIの扱いにおいて 「過度な依存」と「慎重すぎる回避」の間で揺れていることが分かっています。 一方でシニアエンジニアは、AI以前に培った基礎的な勘所を使ってツールを制御し、 AI時代のキャリア形成におけるメンタリングについて、貴重な視点を持っているといいます。
ここから見えてくるのは、メンターシップの教材が変わるという話です。 かつては「なぜこの行をこう書いたのか」を問うのがレビューでした。 これからは「なぜこのテストをこう設計したのか」「このエッジケースになぜ気づけたのか」 「AIへの指示をどう組み立てたのか」を問う場に、指導の重心が移ります。 コードを読む力ではなく、仕様を分解し、検証すべき境界を見抜く力—— これが新しい時代の徒弟制度の教材です。
具体的な実践としては、ジュニアメンバーに 「AIが生成したこのコードに対して、ミュータントを生かしてしまう抜け穴を見つけてください」 という課題を与えるのが有効です。 コードを一から書かせるより、 既にあるテストの弱点を見抜かせる方が、 短時間で「検証すべき境界」を見抜く目を鍛えられます。 そしてこの営みは、Ownershipの記事で書いた 「検証の網への投資」そのものでもあります。
移行のためのチェックリスト
- レビューのコメントの何割が「設計判断」で、何割が「フォーマットや些末な指摘」か——後者はすでにAIが担うべき仕事になっていないか
- テストのカバレッジ率だけを見て「十分」と判断していないか。ミューテーションテストのような、テストの実効性を測る仕組みはあるか
- ジュニアメンバーへのフィードバックは、コードの行単位ではなく、テスト設計やエージェントへの指示の出し方に向いているか
- 「テストがある」ことと「テストが機能している」ことを、チームは区別できているか
おわりに
以前の記事で、 トヨタ生産方式の自働化・アンドンを引き合いに、 「品質を工程の最後ではなく、工程そのものに埋め込む」という話を書きました。 テストレビューへの移行は、この思想をレビュー工程そのものに適用する話でもあります。 検査を後工程に置くのではなく、 「何を検査すべきか」を定義する工程そのものを、品質保証の主戦場にする。
コードレビューが不要になるわけではありません。 ただし、その役割は縮小し、より少ない、しかしより重要な判断—— アーキテクチャと可読性——に集中していきます。 そして空いた場所には、これまで軽視されがちだった 「テストを正しく設計し、正しく評価する力」が主役として座ります。
品質の砦が移動したことに気づかず、 古いレビュー習慣のままカバレッジの数字だけを見ているチームは、 緑色のバッジに守られた砂上の楼閣を築いていることになります。
参考:Feng, D., Yun, B., & Wang, A. Y. (2026). "From Junior to Senior: Allocating Agency and Navigating Professional Growth in Agentic AI-Mediated Software Engineering." arXiv。 ミューテーションテストに関する一般的な解説を参照。