最終回です。これまで、ソースの読み手が人からAIに変わるなら、コードの書き方、技術選定、開発の進め方がどう変わるかを書いてきました。最後に、じゃあ品質はどう守るのか、の話です。
■そもそもの前提
・コンパイラは出力が決定的で、何十年もかけて正しさが検証されてきたから、人は下の層を読まなくなった
・AIはまだそこまでいってない。なのでテストや型、契約がコンパイラの正しさ保証の代わりになって、初めて「人は実装を読まなくていい」状態になる
・障害や性能問題のときに今でもバイトコードやJITの出力、GCログを読みに行くのと同じで、実ソースも「いざという時に人が読む層」としては残る。そのとき大事なのは美しさより、影響範囲が局所的で追いやすいこと
■結局、管理するものは変わらない
・ソースを読まなくなる代わりに、その一つ上にあるコンテキストドキュメント(仕様、設計メモ、AI向けの指示、ADR)が新しい「ソース」になる。アセンブリを読まなくなった代わりに、Javaのソースを厳密に管理するようになったのと同じ
・なので、バージョン管理、レビュー、変更履歴、整合性チェックといった、今までソースにやってきた管理はドキュメント側に全部必要になる。管理の手間がなくなるわけじゃなく、管理対象が一段上がるだけ
・しかもドキュメントはコンパイラもテストも検証してくれない。これまでは「最後はコードが仕様」で逃げられたけど、その逃げ道がなくなる
・古いドキュメントがコンテキストに入っていると、AIはそれを信じて間違ったコードを書く。ドキュメントの腐敗がそのままバグになるので、技術的負債ならぬ「コンテキスト負債」が新しく生まれると思う
・1回目に書いた通りコンテキストドキュメントは階層に分けておく前提なので、そのぶん管理する単位も増える。全体ルールとモジュールごとのメモが食い違っていないかも、管理の対象になる
・対策としては、ドキュメントもソースと同じリポジトリでPRレビューする、実装の変更とドキュメントの更新を同じ差分に入れる、そして書けるものはなるべく型・テスト・interface・ArchUnitのルールに寄せて、ドキュメントには検証できない「なぜ」と「何を守るべきか」だけを残す、あたりかなと
■AIのブレはどう抑えるか
・AIの出力は毎回ブレる。でも一度生成してコミットしたソースは固定される。以降はそれをベースに差分だけを作り続ければ、ブレは差分の範囲に閉じ込められる。決定性をAIに求めるのではなく、バージョン管理で担保する発想
・その上でテストが成熟すれば、それを安全網にしてリファクタや作り直しもできるようになる。契約とテストが残っていれば、実装は丸ごと再生成してもいい。順番は「差分運用で品質を積む → テストが育つ → リファクタや作り直しが可能になる」
・ただし、AIは局所的な修正を積み重ねがちなので、一つ一つは正しくても全体の構造はだんだん崩れる。部分的な情報から作っている以上、全体を見ているのは人だけなので、定期的なリファクタは「できたら嬉しい」ではなく運用に組み込む必要がある
■テストをどう守るか
・テストの成熟度はカバレッジだけだと測れない。通った行がわかるだけで、挙動を縛れているかはわからないから
・そこで使えるのがミューテーションテスト。コードをわざと壊して、テストがちゃんと落ちるかを見る方法で、JavaならPITというツールがある。テストの質の指標としてはカバレッジより信頼できると思う
・AIはテストが落ちると、実装ではなくテスト側を直して通そうとすることがある。テストが仕様書であり安全網である以上、テストの変更は人がレビューする、実装の変更とは別扱いにする、くらいの線引きは要る
・性能やメモリまで守りたいなら、ベンチマークもスイートに入れて劣化を検知できるようにしておく。GCの停止時間やヒープ使用量も、計測して基準を超えたら気づける形にしておくと、構造が崩れてきたときの早期警報になる
■一個だけ気をつけたいこと
今のAIの癖に合わせすぎないこと。コンテキスト長や得意不得意は1年で大きく変わる。JVMもGCも同じくらいの速さで変わっていく。局所的であること、明示的であること、型と契約で意味が語られていること、は読み手の能力が上がっても価値が落ちないので、そこを軸にしておけば長持ちすると思っています。
■シリーズのまとめ
AIで開発が楽になる話というより、重心が移る話だと思っています。
人が書いて読むものは、実装から契約とコンテキストドキュメントへ。
AIに渡すものは、プロジェクト全体から、部分で完結する単位へ。
決めることは、戻せないものは先に、戻せるものは作って見ながら。
品質を守る仕組みは、人の読解力から、型・テスト・ツール・バージョン管理へ。
フレームワークは、手間を減らす道具から、正しさを保証する基盤へ。
チューニングは、勘と経験から、計測と実験へ。
そして人が最後まで手放してはいけないのは、テストとドキュメントの正しさ。
1回目に書いた「局所的に理解・変更・検証できること」という評価軸が、このシリーズ全体の背骨で、継承の利用範囲が狭くなるのはその軸の上にある一つの結果、という位置づけです。
■みんなに聞きたい
・コンテキストドキュメントの管理、実際どうやってる?もう腐り始めてたりしない?
・AIにテストを書き換えられた経験ある?どう防いでる?
・これまでジュニアは他人のコードを読んで判断力を身につけてきた。人が実装を読まなくなったら、テストや契約の良し悪しを判断できる人はどうやって育つんだろう。ここは自分もまだ答えがない
4回分、読んでくれた人ありがとうございました。あくまで今の時点での自分のスタンスなので、反論・ツッコミ大歓迎です。ここから一緒に煮詰めていけたら嬉しいです。