暗いオフィスでモニターに向かうプログラマー

アール氏の仕事は、コードをレビューすることだった。

正確に言えば、誰かがプロンプトを書き、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はできない。コードは完璧なのだ。

カーソルが、緑色のボタンの上で止まっている。