アール氏の仕事は、コードをレビューすることだった。
正確に言えば、誰かがプロンプトを書き、AIが生成したコードである。アール氏はそれをレビューする。チームには若手が三人いたが、彼らはコードを書かない。プロンプトを書く。
そして、そのプロンプトが下手だった。
毎朝、PRが届く。
AIの生成したコードは一見動く。テストも通る。だが読めばわかる。意図のない抽象化。不要なデザインパターン。誰も使わないオプション引数。エラーメッセージが全部同じ調子の丁寧語。どこを切っても同じ断面が出てくる。
アール氏はレビューで毎回同じことを書いた。
「なぜStrategyパターンにしたのか」
「このtry-catchの意味は何か」
若手は答えられない。プロンプトに書いたら出てきたのだという。
業界では「スロップ」という言葉が使われていた。アール氏はその言葉を口にしなかった。口に出すと自分まで安っぽくなる気がした。だが心の中では確かにそう思っていた。雑に注文して、雑に出てきたもの。それを毎日読んでいる。
アール氏は苛立っていた。しかし同時に、安心してもいた。
AIはまだわかっていない。人間がプロンプトを書く限り、人間の理解の浅さがコードに滲み出る。レビューには意味がある。自分には意味がある。
夜、缶ビールを開けながらアール氏は考えた。
AIが駄目なのではない。使う側が駄目なのだ。
四半期に一度のモデルアップデートがあった。
社内のAIコーディングツールがv5に切り替わった翌朝、アール氏はPRを開いて手を止めた。
今までとは違う。
昨日までのスロップが消えている。変数名が的確になった。不要な抽象化がない。コメントは必要な箇所にだけ、必要な分量だけある。意味不明な部分がない。
アール氏は一時間かけてレビューした。指摘は出なかった。もう一件開く。同じだった。もう一件。同じ。
若手のプロンプトが上手くなったわけではない。同じ雑なプロンプトから、モデルが正しい意図を汲み取っている。アール氏が十年かけて身につけた設計の勘を、LLMが獲得したのだろう。
その日、アール氏はApproveを8回押した。コメントは0件だった。
v5以降、アール氏のレビューコメントは激減した。
たまに見つける指摘は些末なものばかりである。定数名の好み。改行の位置。技術的に間違っているわけではない。自分ならこう書く、というだけの話だ。
それすらも数日で意味を失った。v5はコードベースを読み込み、既存の命名規則に完璧に合わせてくる。アール氏の好みすら学習していた。
レビューを開く。スクロールする。何も書かずに閉じる。その繰り返しだった。
ある朝、社内チャットにCTOからの全体アナウンスが流れた。
「レビュープロセスの効率化として、AI自動レビューを試験導入します」
アール氏は驚かなかった。むしろ遅いと思った。
添付のドキュメントを開いた。自動レビューのルール定義ファイルがある。そこにはアール氏がこの数年間、繰り返し指摘してきたパターンがすべてルール化されていた。自分のコメント履歴から学習したのだと気づいた。
アール氏はドキュメントを閉じ、コーヒーを淹れに立った。窓の外を見た。
v5が出る前に辞めていれば、「AIはまだまだだ」と言い続けることができた。
金曜の夕方。自動レビュー導入の前日である。
アール氏のレビューキューに最後のPRが届いた。タイトルは「レビュー自動化システム v1.0」。
コードを開いた。明日から自分の代わりをするシステムのコードだった。
アール氏は読み始めた。
完璧だった。
レビュー観点の網羅性。コンテキストの理解。指摘の粒度。トーンの調整。厳しすぎず、甘すぎない。アール氏はコードを読みながら、自分のレビュースタイルを鏡で見ているような気分になった。当然である。自分のコメント履歴から学習したのだから。
ふと、コードの末尾に目が止まった。AIが残したコメントがある。
// このシステムの導入により、レビュー担当者の負荷が軽減されます。
// アール氏、長い間お疲れさまでした。
名指しだった。
これは感謝なのか。労いなのか。それとも、学習データの中にある無数の「お疲れさまでした」から、最も適切なトークン列を選んだだけなのか。アール氏にはわからなかった。
アール氏はApproveボタンの上にカーソルを置いた。
ここを押せば、自分の仕事は消える。押さなければ。だが理由のないRejectはできない。コードは完璧なのだ。
カーソルが、緑色のボタンの上で止まっている。