ある夜、Antigravity のエージェントが返してきた差分を開いて、しばらく手が止まりました。9 ファイル、追加と削除を合わせて 400 行ほど。やろうとしていたことは「壁紙アプリの課金まわりのリファクタ」で、たしかに私が頼んだ通りに動いてはいます。けれど画面いっぱいの緑と赤を前に、どこから読めばいいのか分からなくなりました。
2014 年から個人でアプリを作り続けて、いま運用しているのは壁紙アプリが 4 本、累計ダウンロードは 5,000 万に届きました。それに加えて技術ブログを 4 つ並行で回しています。一人で抱える範囲が広いぶん、エージェントが一度に大きな仕事を片づけてくれるのは本来ありがたいはずです。なのにその夜は、ありがたさより先に「これ、本当に全部読めるのか」という不安が来ました。任せた結果をレビューしきれないなら、任せた意味が半分なくなってしまいます。
速く動くことと、読めることは別だった
最初の頃、私はエージェントに大きめのタスクをまとめて渡していました。「この機能を作って」「この画面をまるごと直して」といった頼み方です。出てくる差分は立派で、ビルドも通る。けれど自分でレビューする段になると、変更の意図を一つひとつ復元するのに時間がかかり、結局ざっと眺めて雰囲気で承認してしまう瞬間がありました。
その「雰囲気で承認」が一番こわい、と気づいたのが転機でした。課金まわりのような、間違えると実害が出る箇所をまとめて変えられて、それを流し読みで通してしまう。速く進んでいるように見えて、後で自分が困る種をまいているだけです。問題はエージェントの能力ではなく、私のレビューが追いつく粒度を超えた差分を、私自身が要求していたことにありました。
両家の祖父はどちらも宮大工でした。大きな梁をいきなり組むのではなく、継手を一つ仕上げては合わせ、また次を仕上げては合わせる。手で確かめられる単位まで作業を割ってから進める姿を、子どもの頃に近くで見ていました。コードのレビューも本来そういうもので、自分の目が追える単位まで刻まれていてはじめて、確かめながら前に進めるのだと思います。
最初の指示に「小さく刻む」を入れる
そこで変えたのは、タスクの渡し方そのものでした。完成形をまとめて頼むのをやめて、「どう刻むか」をエージェントと先に相談するようにしたのです。Antigravity は実行前に計画を立ててくれるので、その計画段階で粒度を交渉できます。
具体的には、作業を始める前にこう頼みます。
このリファクタを、レビューしやすい単位に分けて進めたいです。
まず実装はせず、次の形で計画だけ出してください。
- 変更を意味のある最小単位のステップに分割する
- 各ステップは 1 つの関心事だけを扱い、できれば 50 行以内に収める
- ステップごとに「何を」「なぜ」変えるかを一文で書く
- 振る舞いを変えない整理(リネーム・抽出)と、
振る舞いを変える修正は、別のステップに分ける
計画に合意したら、1 ステップずつ実装してください。
私が各ステップを確認してから次に進みます。ポイントは「実装はせず、まず計画だけ」と最初に区切ることです。これを入れないと、エージェントは親切心からか一気に最後まで作ろうとします。計画の段階なら差分はまだ生まれていないので、粒度の交渉に心理的なコストがかかりません。「3 番目のステップはもう少し分けられませんか」と気軽に言えます。
もう一つ細かい工夫として、各ステップを実装してもらう直前に「このステップで変える要点を一行で言い直してください」と頼んでいます。エージェントが自分の言葉で要約できないステップは、たいてい関心事が混ざっているサインです。要約が二つの話に分かれてしまったら、その場でステップをもう一段割ってもらいます。読む前にこの一行があるだけで、差分を開いたときの理解の速さがずいぶん変わりました。
振る舞いを変える変更と、変えない変更を混ぜない
刻み方のルールの中で、いちばん効いたのがこれでした。リネームや関数の抽出のように振る舞いを変えない整理と、ロジックそのものを書き換える修正を、同じステップに入れないという約束です。
両者が混ざった差分は、レビューが一気に難しくなります。たとえば変数名を 20 か所変えた中に、たった一行ロジックの修正が紛れていると、リネームのノイズに埋もれて見落とします。逆に分かれていれば、リネームのステップは「名前だけ」と分かっているので安心して速く読め、ロジックのステップは行数が少ないので一行ずつ吟味できます。
実際に同じリファクタを、混ぜたやり方と分けたやり方の両方で試したことがあります。混ぜたときは 400 行の差分を読むのに 40 分かかり、それでも一箇所バグを見落としました。分けたときは、リネーム 3 ステップ(合計 30 秒で確認)と、ロジック修正 2 ステップ(各 5 分ほど)に割れて、見落としもありませんでした。合計の作業時間はむしろ短く、なにより読んでいる最中の不安がほとんどありませんでした。
それでも自分で握っておく判断
刻んでもらうようになっても、すべてを任せきるわけではありません。むしろ刻んだからこそ、ここは自分が決めると線を引きやすくなりました。
私が必ず自分で見るのは、課金とユーザーデータに触れるステップです。Antigravity の計画にこの種のステップが現れたら、たとえ 10 行でも手を止めて、エージェントの説明とは別に自分の頭で挙動を追います。5,000 万ダウンロードという数字は、裏を返せばそれだけ多くの人の課金やプライバシーに関わっているということで、ここだけは便利さと引き換えにできません。
もう一つは、計画そのものの妥当性です。エージェントが出してくる分割は素直で読みやすいことが多いのですが、ときどき「技術的にきれいだけれど、私のアプリの事情に合っていない」分け方を提案してきます。そこは私の側の文脈なので、遠慮なく組み替えます。エージェントに任せているのは作業の手であって、何を大事にするかという判断ではない、という感覚です。
小さく刻むことは、速さを諦めることではない
一ヶ月続けてみて、いちばんの変化は心理的なものでした。差分を開くときの身構えが消えて、「これなら読める」という前提で一日が回るようになりました。承認のボタンを押すときに、雰囲気ではなく中身で押せている感覚があります。
「小さく刻む」と言うと、遠回りで遅くなりそうに聞こえるかもしれません。けれど実際には、見落としの手戻りが減ったぶん、トータルではむしろ速くなりました。手で確かめられる単位まで割ってから進める——祖父たちが梁を組む前にやっていたことを、私はエージェントとの仕事のなかでもう一度なぞっているだけなのかもしれません。
もしいま、エージェントの大きな差分を前に手が止まることがあるなら、次のタスクの最初に「レビューしやすい単位に分けて、まず計画だけ出してください」と一文添えてみてください。その一文だけで、レビューの流儀が変わるはずです。