コーディングは任せられない
世の中では生成AIによる利活用が進められており、テレビをはじめとした各種メディアでその素晴らしい成果が連日報道されている。一行もコードを書けなくても雑な指示ひとつで要件に沿った基本的な動作をするプログラムが作れるし、なにかが間違っていてもそこからいろいろと指示を出して修正させていけばそのうち理想形に近づいていく。明確に言語化できなくてもこうしてほしいという内容を伝えると勝手に言語化していい感じにやってくれるので、バイブコーディング(Vibe Coding)とも呼ばれるようだ。
先日、私の職場でも生成AIコーディングに挑戦するということで、早速私にもアカウントが割り当てられて試しに使ってみることになった。いろいろ定石に従って指示を出してみたが、どうやら少なくとも現時点においては、巷で謳われているほどの成果は出ないようだ。
美学を理解していない
まずこの課題に直面した。どんなに調教しても余計な空白行を挿入するし、逆もまた然りだ。インデントレベルも合わないし、適切な折返しができないし、if-elseと三項演算子のうまい使い分けもできない。可能な限り言語化してコード例を示してもルールを破るし、指示ごとにゆらぎが出る。うまくいったと思ったらうまくいかないこともあって、どうにも安定しない。
生成AIコーディングに期待するところを間違えていると言われれば確かにそうかもしれない。つまるところ指示通りの動作をするアプリケーションを作れればいいのであって、中身がどんなコードであろうと価値提供ができればいいのだ。困ったらまた生成AIに修正してもらえばいい。コードの一行々々に心血を注ぐのではなく、モノを作り上げることに注力すればいいのだ。
しかし、本当にそれでいいのだろうか?見えないところにこそ精神が宿るものであるし、我々プロは見えないところに意志を宿すような仕事をしなければならないのではないだろうか?残念ながら、今の生成AIコーディングは私の考える美学に寄り添った答えを出してはくれなそうだ。しかし、それは集合知であることからもわかるように、世の中のコードのほとんどはそれほど綺麗ではなく、そこに神経を使っている人は少ないことの証左なのかもしれない。
差分を最小限にしたい
バイブコーディング的な視点では、要件に沿わないところがあれば修正を命じればいいが、どうもこの作業はレゴブロックを洗濯機に放り込んでうまく組みたたるかどうかを試しているようにも感じる。gitでコードの変更履歴を管理するにしても、毎回違う結果が出たり、脈絡のない大きな改変が発生したりするのは、妥当な理由づけができないし、もはや差分を取る意味がなく、ただの記録である。
いやまあ「ここまではうまく行ってました」ということを保証するためのものとして使えばいいのかもしれないが、あまりにも差分が大きいと人間では確認できない領域になってしまう。それすらも諦めて全部AI任せにして、AIがやりやすい形にしてしまえばいいじゃないかという割り切りも必要だとは思うが、流石にこちらは業としてプログラマをやっているわけで受け入れ難い。
もちろん、私が書くべきプログラムとAIで十分なプログラムに違いはあるので、棲み分けをすればいいだけの話なのだが、一律に生成AIコーディングをドライブすればプロダクトの進捗がマッハになるので、今ここで加速しないのはミッションにコミットできていないとか言われても困るのである。
根本的な解決策は提示してくれない
プログラマをしていると、ごく稀に世の中で自分しか直面していないんじゃないか?という課題にぶつかることがある。多くの場合は近似的解法があるか、問題のゴールを多少ずらして解決することになるのだが、集合知はこうした人間的な泥臭い部分に関しては解決してくれない。できる限りの提案はしてくれるものの、根本的な解決や新しい発想というものはやはり人間側から提案するしかない。
これが新時代に求められる人間の価値なのかもしれないが、それが10年後になってどれくらい残っていて価値のある存在になっているのかもわからない。すべてを生成AIに賭けられる時代の到来は、かつての駆け出しエンジニア時代以上の能力の分断を生み出す予兆かもしれない。
じゃあどう使うか?
とはいえ、オーガニック100%の手書きプログラミングこそが至高とかいう中学生みたいな極論に至っているわけでもない。今は生成AIフィーバー状態で何にでもマヨネーズをかけるような感じで何にでも生成AIを使う正直バカバカしいお祭り状態になってはいるが、それでも便利な道具のひとつではあるので、使えるところはうまく使っていくべきであって、要するにバランスが重要なのだ。
その一方でプライベートではこれまでどおりなるべく手書きするようにして、自分で考えることを忘れないように自らを律し続けている。
探し物は得意
ひとつ気づいたのは生成AIは探し物が得意だ。静的解析的にソースコードを分析させて問題がある箇所を見つけ出せるし、これからの改修予定を伝えると、およそどのあたりを直せばいいのかを教えてくれる。業務で扱う膨大なソースコード中から特定のロジックを見つけ出すにはうってつけだ。もうその機能を組み込んだ人に改修すべき場所を聞かなくてもいいのだ。
ロジックの差を判定する
動いているコードほど修正してはならないものはなく、無闇なリファクタリングは死を招く。私は軽い気持ちでやったリファクタリングで地雷を踏み抜いて考課を下げたこともあるが、それでも私がどうしても潰さなければならないと思っているもののひとつにコードクローンがある。こいつらは放置しておくとひたすら増殖して、改修時に修正漏れという悪夢をもたらす。
さて、それでは修正前と修正後のコードの正しさをどう保証するのだろうか?テストコードを書けばいいのはわかっている。しかし、デバッグビルドで実際に動かして操作する以外に試しようがなくなってしまったこのモノリシックなプロジェクトではどうすればいい?
そこで生成AIによる判定である。変更前と変更後でロジックの差があるかどうかを聞くと丁寧にどういう判断をして差があるのかないのかを教えてくれる。false-negativeはもちろん、今日になって少し気になったので、true-positiveも判定できるのか軽く試したところでは、うまく判定して修正案まで提示してきたので悪くなさそうだ。
人類は滅亡する!な、なんだってー!
しかし、なんというか、生成AIを使っていると自分が万能感あるバカになっていく感覚がある。指示すれば勝手に分析してくれるし、すぐに答えに辿り着けてしまう。何も知らなくてもなんらかの結果が出てしまう。これほど嬉しくて恐ろしいこともない。
最近では人類の滅びは戦争という武力よりも、生成AIがもたらす思考力の低下によって引き起こされるのかもしれない。そしてそれは実際にSNSでは起こり始めているようにも思う。