AIが生成するコードを信頼できるか。
この問い、最近ずっと微妙な顔になる。
信頼できる、と言いたい気持ちはある。だってめちゃくちゃ助かっているから。
ゼロからファイルを作るときの、あの最初の一文字目の重さ。面倒な型定義。退屈な変換処理。テストの雛形。既存コードを読んで「たぶんここですね」と候補を出してくる速さ。どれも普通にありがたい。
特に初速。
人間がまだ脳内で「えーっと、まず何から書くんだっけ」とやっている間に、AIはもうそれっぽいコードを置いてくる。こっちが朝のコーヒーを一口飲む前に、PRの形をした何かが立ち上がっている。速い。ありがたい。
でも、助かっていることと信頼していることは、たぶん別の話だ。
便利な外注、たまに怖い
自分の中でAIは、今のところ「便利な外注」か「仕事の速い新人」に近い。
頼むとすぐ出してくれる。しかも嫌な顔をしない。細かい修正にも付き合ってくれる。変数名を直して、テストを足して、別案も出してくれる。こう書くとかなりいい人材である。採用したい。
ただし、たまに静かに間違う。
ここが怖い。
派手に壊れてくれるならまだいい。テストが落ちる。型が怒る。画面が真っ白になる。そういう失敗は分かりやすい。こちらも「はいはい」と言いながら直せる。
怖いのは、ぱっと見ではまともなコードだ。
命名も自然。テストもある。説明も丁寧。なのに、仕様の端っこだけ違う。権限チェックの位置が少し変。境界条件で一人だけ弾かれる。タイムゾーンが微妙にズレる。こういうの、本当に嫌だ。静かに間違うな。間違うならもっと音を出してほしい。
しかもAIは、たまに自信満々で来る。
「この実装で問題ありません」
なにが問題ありませんだ、と思う。
こっちはまだ問題があるかどうかを確認している途中なんだよ。
信頼は出力に宿らない
AIが出したコードを、そのまま信頼できるか。
自分は、まだそこまでは行っていない。
でも、AIが生成したコードを使えないかというと、全然そんなことはない。むしろ使っている。かなり使っている。戻れと言われたら嫌だ。昔みたいに全部自分で書いてくださいと言われたら、たぶん床を見る。
だから最近は、信頼というものを、AIの出力そのものに置かないようにしている。
信頼するのは、出てきたコードではなく、そのコードを受け入れるまでの流れ。
差分を見る。危ないところを聞く。テストを足す。自分の言葉でPR概要を書く。別のAIやレビュアーに見てもらう。説明できないところをもう一回読む。
こういう流れがあるなら、AI生成コードもだいぶ扱いやすくなる。
逆に、流れがないと怖い。
AIが出した。動いた。よしマージ。
これで済ませたくなる気持ちはすごく分かる。速いから。速いものは気持ちいいから。差分が緑で、テストが緑で、AIが「問題ありません」と言っていたら、こちらも「よし」と言いたくなる。
でも、その「よし」は信頼というより、疲れかもしれない。
疲れているときのLGTM、だいたい危ない。
レビュー可能な形で出してほしい
AI生成コードで一番困るのは、間違うことそのものより、レビューできない形で来ることかもしれない。
巨大な差分。知らない抽象化。ついでに直された命名。触ってほしい場所の周辺に生えた親切なリファクタ。ありがたいような、ありがたくないようなやつ。
「ついでにやっておきました」
いや、ありがとう。
ありがとうなんだけど、今は頼んでない。
レビューできる大きさに切ってほしい。変更の理由を分けてほしい。動作の前提を書いてほしい。人間が追える速度で走ってほしい。
仕事の速い外注が、こちらの確認速度を無視して巨大な納品物を置いて帰る。そういう感じがある。
もちろん、人間もやる。人間も巨大PRを出すし、ついでの修正を混ぜるし、説明を書かない。AIだけが悪いわけではない。
ただ、AIはそれを疲れずに量産できる。そこが強くて、そこが怖い。
責任はまだこっちに残る
AIがどれだけコードを書いても、いまのところ責任はこっちに残る。
バグが出たとき、「AIがそう書いたので」とは言いづらい。少なくとも仕事では言いづらい。言ったところで場が救われる感じもしない。
ユーザーから見れば、その機能はサービスの機能であって、AIの機能ではない。営業から見れば、開発チームが出したもの。運用から見れば、直すべき本番障害。レビューした人から見れば、なぜ通したのかという話になる。
AIは納品してくれる。
でも、納品物を受け取ったのは人間だ。
ここがしんどい。便利なのに、責任だけは魔法のようには消えない。早く仕事を奪ってくれAI、と思う一方で、責任まで綺麗に持っていってくれるわけではない。そこだけ置いていくな。
それでも使う
じゃあAI生成コードは信頼できないのか。
そういう話でもない。
信頼できないから使わない、というには、もう便利すぎる。初速が出る。面倒を処理してくれる。相談相手になる。詰まりを動かしてくれる。
特に、手が止まっているときのAIはかなり効く。
こちらが「何から考えればいいんだっけ」となっているときに、AIはとりあえず案を出す。たたき台を出す。雑でも出す。雑なものがあると、人間は文句を言える。文句を言えると、頭が動き始める。
ゼロより、雑な一があるほうが強い。
この強さは本当にある。
Fableでも、シェーダーを軽くできたし、地味なバグ取りもしてくれた。ああいうのは普通にありがたい。ありがたいというか、ひとりでやっていたら途中で机に突っ伏していたかもしれない。
「ここ重くない?」と聞くと候補を出してくる。「この挙動おかしくない?」と聞くと怪しい場所を掘ってくる。全部が当たりではないけど、掘り始める場所を作ってくれる。これはかなり大きい。
だから使う。
怖いけど使う。助かっているから使う。助かっているのに怖いので、レビューする。レビューするのが面倒なので、早くその仕事も奪ってほしい。でも奪われたら奪われたで、たぶんまた怖い。
人間は面倒くさい。
信頼を作る
AI生成コードを信頼できるか、という問いは、たぶん少し雑だ。
信頼できるAIがある、というより、信頼できる受け入れ方がある。
小さく出してもらう。理由を書いてもらう。テストで囲う。危ないところを聞く。PR概要を自分で書く。説明できない部分を残さない。必要なら別の目で見る。
そういう手続きを通ったコードなら、AIが書いたか人間が書いたかに関係なく、少し信頼しやすくなる。
逆に、AIが書いたからダメ、人間が書いたから安心、というほど単純でもない。人間も普通にやらかす。昨日の自分とか、かなり信用ならない。
信頼は、作者ではなく、作り方と受け取り方に宿るのかもしれない。
などと書くと、急にいい話っぽくなる。
でも実際のところはもう少し泥っぽい。
今日もAIに頼む。差分が出る。助かる。怖い。読む。キレる。直す。たまに感謝する。
信頼というより、共同生活に近い。
めちゃくちゃ仕事が速い同居人が、夜中に勝手に棚を組み立ててくれる。朝起きると棚ができている。便利。ありがたい。でもネジが二本余っている。
おい。
そういう感じで、今日も使っている。