AIにコードを書いてもらうようになってから、差分を見る時間の質が変わった。
前は、差分というのはだいたい「自分が書いたもの」だった。もちろん昨日の自分は他人だし、三日前の自分はほぼ外注先なのだが、それでもまだ身内だった。酔って帰ってきた家族くらいの距離感。何をしでかしていても、まあこいつならやりそう、という諦めがある。
AIが書いた差分は違う。
急に知らない helper がいる。知らない分岐がある。テストが増えている。しかもまあまあ通っている。嬉しい。嬉しいんだけど、どわ〜〜〜〜、今からこれ全部読むのか、という気持ちにもなる。
便利さと不安が同じ PR に同居している。これがなかなか変な感じだ。
「全部読め」は正しい。正しいけど
AI生成コードを完全に理解すべきか、という問いに対して、いちばん安全な答えは「理解すべき」だと思う。
そりゃそう。理解していないコードを出すな。正しい。ぐうの音も出ない。
でも、正しさだけで生活していると疲れる。ちょっとした余白調整や、管理画面の小さい便利ボタンや、誰も見ていない設定画面の文言修正まで、毎回ぜんぶ読むのはしんどい。しんどいというか、たぶん続かない。
なので、自分の中では「完全に理解するべきか」よりも、「ここで不安にならないと後で痛い目を見るか」に近い問いになっている。
信頼するかどうか、ではない。
どこに不安を置くか。
セキュリティまわりは、まだ雑に流せない
まず、機密情報を扱うところ。
APIキー、個人情報、認証、権限、社内だけのデータフロー。こういう場所にAIの手が入ったら読む。さすがに読む。読まないと、夜に布団の中で「ログに何か出てないか?」が来る。あの時間帯の不安は最悪。だいたい寝る直前に来る。
AIがセキュリティを何も分かっていない、とは思っていない。むしろ脆弱そうなところを見つけてくれて助かることもある。ただ「このサービスにとって何が危ないか」は、けっこうローカルな話だったりする。
昔それで怒られた、という記憶。誰も文書化していないが絶対に触らないことになっている項目。営業が顧客に約束してしまった謎仕様。そういう、コードの外側にある泥をAIが全部知っているかというと、まあ知らない。知らないまま、きれいな顔で「問題ありません」と言ってくる。
そのとき、AIの「問題ありません」が妙にまっすぐすぎて、なにが問題ありませんだ、trust me broで信頼できるかコノヤロ、と思っている間はしっかり読む。キレつつ読む。
説明できない機能は、急に怖くなる
人に説明する予定があるコードも読んでおきたい。
これは責任感とか倫理とか、そういう立派な話にしてもいいのだけど、もっと雑にいうと、恥をかきたくない。
たとえば営業同席の場で「IP制限がある環境だと、この機能はブロックされますよね?」と聞かれる。こちらはその機能をリリースした人間として座っている。ここで「えー、たぶん……?」みたいな顔をすると、空気が一段冷える。
別に実装を暗唱したいわけではない。関数名も全部は覚えたくない。そんな人生はつらい。
ただ、どういう条件で動くのか、どこで弾くのか、どこから先は例外なのか。そのへんを自分の言葉で説明できないと、画面の向こうにいる人の不安を増やしてしまう。
LGTM by vibes は気持ちいい。短いし、勢いがある。だが議事録に残すには弱い。vibes は法務レビューを通らない。
増築予定地を知らないまま、増築はできない
一番やっかいなのは、あとから触る場所だと思う。
AIに実装してもらった時点では動いている。テストも通っている。レビューも大きな指摘なし。よかったですね、解散。
そう思っていたら、二週間後にその横へ機能を足す話が出る。
「この関数の挙動をちょっと変えたいです」
えっ、その関数、いま初めて名前を認識しました。
この瞬間がかなり嫌だ。自分のリポジトリなのに、知らない街に迷い込んだ感じがする。看板は読める。道も舗装されている。けど、土地勘がない。
そこでまたAIに頼むと、AIは既存コードをそれっぽく読んで、それっぽく計画を出してくる。こちらは「多分大丈夫だと思うから実装して」と返したくなる。正直、返したこともある。あるよ。あるに決まっている。
でもそれを繰り返すと、自分がどこまで分かっているのかが溶ける。
機密情報を扱っているのか。人に説明する必要があるのか。次に壊れそうなのはどこか。そういう判断まで、なんとなくAIの返答に寄りかかってしまう。
これは便利というより、足場がふわふわしてくる感じに近い。
未来の自分はだいたい容赦なく戻ってくる。しかも issue 付きで戻ってくる。Slack にも来る。やめてほしい。
だから、あとから増築しそうな場所は読む。全部を精密に読めなくてもいいから、せめて地図くらいは持っておく。
それでも、読まない日もある
ここまで書くと、結局読めという話に見える。
でも読まない日もある。
局所的な表示崩れ。管理画面の小さい便利ボタン。失敗しても困る人数が少なくて、戻すのも速い変更。こういうところまで毎回フル読解していたら、気力が先に死ぬ。
差分の雰囲気は見る。変なAPIを触っていないかも見る。知らない依存が増えていたら一応見る。それくらいはする。
でも、影響範囲が小さくて、人に説明する予定もなくて、あとから増築もしなさそうなら、ある程度は流す。
消火器が近くにあって、燃えても一部屋で済むなら、this is fine で様子を見ることはある。家全体が燃える場所ではやらない。
雑だなと思う。
ただ、現場というのは、かなりの部分がこの雑さで回っている気もする。完璧な理解より、壊れたときに戻れること。全部を読むことより、どこが燃えたら困るかを知っていること。
そのくらいのほうが、今の自分には続けやすい。
PR概要欄は、わりと嘘発見器
「完全に理解する」とは何か。
これもけっこう難しい。コードを一行ずつ説明できることなのか。依存ライブラリの内部まで読むことなのか。生成されたテストの意図まで全部言えることなのか。
毎回そこまでやるのは無理だ。少なくとも自分には無理。
最近は、PR概要欄を自分の言葉で書けるかを見ている。
何を変えたのか。なぜ変えたのか。どういう条件で動くのか。危なそうなところはどこか。やらなかったことは何か。
これを書こうとして手が止まるなら、たぶん理解できていない。
空欄のPR概要欄は怖い。あれはただの空欄ではなく、「あなたは本当に分かっていますか?」と聞いてくる白い圧力である。GitHub の白って、たまに怖い。
自分で概要を書いたあと、AIに「この理解でズレてない?」と聞くこともある。AIに書かせたコードをAIに確認させる。循環している。変な絵面だ。でも意外と効く。
AIに全部任せるためではなく、自分の理解がどこで薄くなっているかを見るために使う。
この使い方は、けっこう気に入っている。
ちゃんと不安になる
AI生成コードを毎回ぜんぶ理解しないといけない、とは思っていない。
でも、読まなくていいとも思っていない。
機密情報を扱うところ。人に説明するところ。あとから増築するところ。このへんは読む。少なくとも、自分が何を分かっていないかくらいは見ておく。
逆に、影響範囲が小さくて、説明する予定もなくて、あとで触る予定も薄いなら、そこまで神経質にならなくていい日がある。
全部読むか、全部読まないか。
たぶんそういう話ではない。
どこでちゃんと不安になるか。
どこなら少し雑に笑えるか。
AIとコードを書く生活は、今のところその境界線を毎日ちょっとずつ引き直す作業に近い。線はすぐズレる。昨日の線は今日もう怪しい。それでも、何も線を引かないよりはだいぶまし。
今日も差分を開く。
知らない helper がいる。
どわ〜〜〜。
早く仕事を奪ってくれ、AI。
できれば、差分を読む仕事から先に。