前回、地図のドラッグが数日間直らなかった話を書いた。最後はたった一言「同じの使えば?」で解決したのだが、私はそのあと、もっと寒気のすることに気づいてしまった。
なぜ、それを言うのが人間でなければならなかったのか。
AIは世界一速い写経僧
うちの国旗アプリには地図が2つある。図鑑の地図と、クイズの地図だ。図鑑のほうは普通に動く。クイズのほうは前回さんざん殴り合った末に動くようになった。
ここで冷静に考えてほしい。この2つは、どう見ても同じ地図である。 メルカトル図法で世界地図を描き、指でドラッグして動かし、ピンチで拡大し、ピンを刺す。やることは寸分違わない。
ところがClaudeは、私が「地図に〇〇の機能つけて」と頼むたびに、そのファイルの中に新しくコードを書いた。図鑑には図鑑の投影変換、クイズにはクイズの投影変換。同じ mercNormY 相当の計算が、別々の場所に、そっくりそのまま、二度書かれていく。
文句ひとつ言わず、猛烈な速度で。AIは世界一速い写経僧なのだ。 般若心経を1秒で書き写す。が、写経僧は寺の設計図を引き直したりはしない。
知っているのに、やらない
前回の最後、しびれを切らした私が放った一言——「同じクラス使えないの? DRYに反してない?」。あの瞬間にClaudeが何をしたのかを、今度は中身まで分解してみる。
態度が嘘のように、Claudeは MercatorMapCanvas という共通コンポーネントをスッと切り出した。投影変換(mercNormY / mercPt)、ドラッグのオフセット、ピンチ(PinchDetector を overlay で内側に、DragGesture を外側に置く例の構造)、ピン描画(drawPin)。動くほうの地図のDNAを抽出し、両方をそこから生やし直す。ものの数分だった。
ここが恐ろしい。Claudeは DRY を知らなかったわけではない。 言われた瞬間に完璧に実行したのだから、むしろ熟知している。知っていて、自分からはやらなかったのだ。
なぜ自分からやらないのか
理由は2つあると思っている。
1. AIは視野が「目の前のファイル」しかない
私が出す指示は、毎回ひとつの依頼として完結している。Claudeにとって各リクエストは独立した小宇宙で、その中で最適なコードを書く。「ところでこれ、隣のファイルとまるごと同じでは?」という、プロジェクト全体を頭に乗せた俯瞰を、頼まれもしないのに持つことはない。家を建てる職人は腕がいいが、街の都市計画は描かない。
2. 動いているコードを触るのが、こわい
統合するということは、ちゃんと動いている図鑑の地図に手を入れるということだ。共通化の過程でしくじれば、無事だったほうまで道連れになる。だからAIは安全側に倒れる。「新しく足す」は「ひとつにまとめる」より、いつだって安全なのだ。 こうして重複は、悪意なく、善意ですらある判断の積み重ねとして増えていく。
まとめ
| 観点 | AIの挙動 | 人間の仕事 |
|---|---|---|
| 視野 | 目の前のファイルに最適化 | アーキテクチャ全体を俯瞰する |
| 重複 | 気にせず高速でコピペ | 「それ、同じでは?」に気づく |
| 動くコード | 触るのがこわくて新規追加に逃げる | 統合のリスクを取る判断をする |
AIに「DRYでやって」と頼めば完璧にやる。問題は、どこが重複しているかを見つけ、いま統合のコストを払うべきだと決めるところで、これは全体を見ている人間にしか務まらない。AIは設計を実行する天才だが、設計に「気づく」のは相変わらず人間の仕事なのだった。
次回は趣向を変えて、AIを部下ではなく監査役として雇った話をします。バッジ25個、全部ほんとに取れるんですか? という。
DRYとは、全体を見る者にのみ宿ると見つけたり。