AIが大量にコードを書くようになってから、従来の意味で全差分をコードレビューすることは現実的ではなくなったと思います。私は、従来の意味でのコードレビューをしていません。
すべての差分を読み、その変更が何をしているのかを理解し、設計まで判断する。AIが生み出すコード量を前にすると、そのやり方はもう現実的ではないと感じています。
もちろん、何も確認していないわけではありません。型、lint、テスト、CIに、以前レビューで見ていたことの一部を任せています。
しばらくはそれでよいと思っていました。人間が仕様を決め、AIが実装する。コードではなく仕様を書くのはより高い抽象度へ進むことなのだ、と。
ただ、最近は少し違う見方をするようになりました。
##コードから解放されたわけではない
コードが意図を完全に表すわけではありません。それでも、機械が実行するロジックはコードで厳密に決まります。型やテスト、実行結果、差分を見れば、少なくとも実際の振る舞いは確かめられます。
仕様をAIに渡すことはコードから解放されることではないのかもしれません。コードが厳密に表していたロジックを、解釈がブレやすい自然言語に表現の場を移しただけではないか、と感じています。
##AIが増幅するもの
AIは実装を速くします。しかし、変更がプロダクト全体にどう影響するかを理解すること、設計が妥当か考えること、失敗したときに戻せるようにすることまで同じように速くしてくれるわけではありません。
その結果、よく分からない抽象化や後から直しにくい判断も以前より速く積み上がります。
AIが増やすのは、良い実装だけではありません。
##人間が手放してはいけないもの
とはいえ、人間が全コードを読む時代に戻るべきだとも思いません。ただ、次のことは手放せないと思います。
- この変更で何を達成し、何を変えないのか
- モジュールの境界と公開するAPI
- データを誰が持ち、どこに依存するのか
- DBスキーマや認可、外部連携のように後から戻しにくい判断
- 何をもって正しいとするか、壊れたらどう気づくか
- 判断の理由を後からたどれる記録
AIには、決めた境界の内側を任せればよいと思います。人間が持ち続けるべきなのは、境界と契約、そして失敗したときに戻れる状態です。
AI時代に必要なのは、コードを一行ずつ読むことではありません。プロダクトを自分たちでコントロールできる状態を保つことだと思います。