nunulkのプログラミング徒然日記

毎日暇なのでプログラミングの話題について書きたいことがあれば書いていきます。

ジェネレーティブAIとソフトウェアエンジニアの未来について

はじめに

この記事について

最近あちこちでジェネレーティブ AI によって奪われる仕事はどれだとか、プログラマーの仕事も奪われるだとか、色々見聞きして盛り上がっている感じがするので、自分もいっちょ噛みしたいなと思って書きました。

とくに慧眼とかはないので、戯言の類です。

ジェネレーティブ AI とは

いまさら解説の必要もないでしょうし、自分もそんなに深い知識があるわけではなく、世間に広く流布している情報以上のことは言えないので、省略しますが、プログラマーにとってインパクトがあるのはいまのところ、GitHub Copilot と OpenAI ChatGPT の2つでしょうか(類似プロダクト含む)。

GitHub Copilot は VS Code とか PhpStorm に入れて使ってますが、タブ押すだけでコード片が出てくるので、ちょっとタイプしてタブ、またちょっとタイプしてタブ、みたいな感じでさくさくコードが書けて快適ですね。

ChatGPT のほうは、こういうの作りたいんだけどサンプルコード出して、みたいな指示から得られた回答を叩き台にして利用したりしてます。

目次

コンピュータによって中間業者が不要になる世界

全部が不要になるわけではなくて一部だけなんだろうと思うんですが、これはもうとっくに始まっていて、生産者と消費者が直接繋がるのは EC でできているし、Twitter 転職では転職エージェントは不要です。

基本的には中間業者が間に入れば中間マージンが発生しその分製品やサービスに乗るコストが増えるので、コストに見合った価値を提供できるかにかかってるわけです。

出版界隈では(あまり詳しくないですが)、小売店(書店)が在庫を抱えないで済む仕組みを取次業者と一体となって作ってて、なかなか共依存関係が解消されない、みたいなのは聞いたことがありますが、デメリットもある代わりにメリットもあるからこそこうした仕組みが続いてるんだと思うので、業界の商習慣みたいな変わりにくいものがある場合は、消費者にとってメリットが大きかったとしても不要にならないんだろうとは思います。

ただ、コンピュータとインターネットは、あるジョブの物理的な制約が少なければ少ないほどそのジョブを代替できる可能性が高まるので、コンピュータで転送可能なデータで表現できるものはなんでも、今後中間業者を必要としなくなる傾向は変わらないと思います。

逆に、輸送とか保管とか、物理的な制約のあるジョブは置き換え不可能ですし、現状データ化の難しい部分は人間が手伝ってやる必要があって、様々な中間業者が持っている「目利き」のスキルとかはなかなか一般化しないと思うので、中間業者は多かれ少なかれ残るだろうし、減るとしても緩やかに減っていくんでしょう。

ジェネレーティブ AI によって奪われるソフトウェアエンジニアの仕事

コンピュータによる作業の代替には、中間業者という側面に加えて価値提供の手段の変換という側面もあって、あるジョブが提供する価値が変わらなければそのジョブをどうやって実行するかという点は問題になりにくいんだろうと思います。

サイゼリヤはお店の厨房ではほとんど調理らしい調理してないそうですが、料理のクオリティは(価格に比して)高いと認知されていると思います。レストランにおいては、シェフがどのように料理を作っているかを気にしない人が少なくないんだろうと思います。同一のメニューであればいつ行っても同じクオリティの味が食べられる、というのがプロにお任せする価値のひとつですが、それは逆に、ロボット技術が進化したら人間よりも正確に味を再現できる可能性もあるので、悩ましいところです。

いずれにしても、サービス提供者が内部でどのような工程や手段でそのサービスを成り立たせているかは利用者にとってはほとんどブラックボックスですし、詳らかに知りたいと思っている人も少ないんじゃないかっていうことです。

一方で、プログラマの提供するサービスである「コードを書く」というジョブは高度な技能が必要なものではありますが、部分的には汎用的なコードが存在し(そういうものの一部はすでにライブラリ化されていますが)、それらは全員が自分で書く必要があるものではありません。

書かれたコードが GitHub Copilot が生成したものだろうが、自らタイプしたものだろうが、同じ機能を提供できるならどちらでもいいのはもちろんですが、自分では書けないものを AI なら書ける、ということが起こっているので(もちろんその逆もあるけど)、これは大変だ、失業だって思ってる人もいるみたいです。

プログラマの中には、実際にコードを書いているんだから我々は生産者だって思ってる人がいるかもしれませんが、ほとんどの人は「何を作るか」という部分にはあまり関与してなくて、他のだれかからこういう仕様でお願いねって言われて「どうやって作るか」の部分を担当していると思うので、実質的には生産者じゃなくて中間業者に近い存在だと思います。

余談ですが、四半世紀以上ソフトウェア開発に携わってきて思うのは、ソフトウェアを作る工程はどうしてここまで分業が進んでしまったんだろう、ということです。

工程ごとに作業者が変わるっていうのは別にどの業種でも普通のことなんでしょうけど、自分にはアメリカの丸亀製麺に近いものを感じるときもあって、同業者がこの辺どう感じているのか知りたいと思うときがあります。

blog.btrax.com

それぞれの工程が非常に複雑で技術的に網羅するのは大変だ、というのはそうなんでしょうけど、全部が全部ってわけじゃないよなぁとも思います。

閑話休題

極端な話、「何を作るか」を握ってる人が AI の力を借りて「どうやって作るか」を気にしなくて済むようになった世界では、ソフトウェアエンジニアは不要になるでしょう。いまでも、ライブラリがどうやって動いているのか理解していなくてもソフトウェアは作れますし、ほとんどの人は部品や基盤の仕組みをいちいち検証したりはしないはずです(不具合に遭遇して初めてソースコードを読む、みたいなのはあると思いますが)。自分は、興味のあるライブラリのコードはざっと目を通しますが、あくまで興味であって、それをしないと仕事の質が落ちる、みたいなことはないと思っています。

そう考えると、ジェネレーティブ AI の普及によって極端に状況が変わるとは思えなくて、自分で書かなくていい部分が増えるだけなんだと思います。で、それがゼロになるにはしばらくかかるでしょうし、もしかしたら永遠に来ないかもしれないし、当面は自分たちの仕事が楽になっていくって考えたほうがハッピーなんじゃないかなと思います。

これまでも大部分の人は Google を始めとする検索エンジンを活用して他人の書いたコードを参考にしてきたわけで(まるまる利用するとコピペプログラマなどと揶揄されるわけですが、AI の生成したコードをそのまま利用するのはなんて呼ばれるんだろう?)、本質的にはそれと変わらない気がします。

とはいえ、一人のソフトウェアエンジニアが提供できる価値の総体が減っていくのは間違いないので、これまで10人必要だった仕事が5人で済むようになるとか、そういうのは起こるかもしれません。

ソフトウェアエンジニアは需要に対して供給が不足しているそうなので、短期的には仕事を失う人も出るかもしれませんが、長期的にはいいことなんじゃないかと思います。

状況の変化を受け入れるか別の価値を生み出そうとするのかはその人次第な気もしますし、変化は緩やかに起こるでしょうから、中長期的に適応していけばいいんじゃないかと思います。

ソフトウェアエンジニアとして提供できる価値

以前から自分はソフトウェアエンジニアは「何を作るか」にもっと積極的に関与したほうがいいと思っていて、自社開発にしろ受託開発にしろ、利用者(もしくは将来の利用者)との接点を増やすことで提供できる価値が増えるんじゃないかと思います。

現状でも、何かを作りたいが作れないっていう人がいて、その人がそれを作れる人にお願いして作る、というパターンはよくありますが、もしその人が自分でやってみようかなと思って AI を使って作れるようになってしまうと、作る人はいらなくなってしまいます。それでも、自分でもやろうと思えば作れるけど、時間がないからとか、人に頼むと自分より速くあるいは正確に作れるから他人に頼む、みたいなこともあると思っていて、そういうときに、頼まれる人になれるかどうかっていうのはどの辺で差が出るだろう、っていうことを考えたりします。

その観点でいうと、やはり速くて正確に作れる人っていうのは依然として価値が高くて、AI を使うと逐一対話していかないといけないので、一を聞いて十を知ることができる人間のほうがまだ優位性はあるんじゃないかと思いますし、人間は本人が思っているより、求めるものの言語化ってできないもんだと思ってるので、AI の場合は「この人こう言ってるけど、本当はこういうことなんじゃないかな」っていう推論(忖度?)は苦手で、基本的には言葉どおり受け取るので、そこも人間が優位にあるかなと思います。

つまり、いかに抽象的な命令に対して的確なアウトプットを出せるかっていうのが、ソフトウェアエンジニアに求められる技能のひとつになるんじゃないかということです。

自分はたまに整体に行くんですが、整体師の方に痛めてる箇所を口頭で伝えて触診を受けると、原因は痛い箇所ではなく別のところにあって、そのせいで患部に負担が来てる、みたいなことがあります。

ソフトウェアの場合は、エラーメッセージから直接的に原因になってる箇所を即座に特定するのが難しいことがあり、そういうのはやはりプロフェッショナルじゃないとわからない部分だと思うので、訓練された人間のほうが解決までのスピードは速そうです。

あと、これもけっこう大事なことなんじゃないかと思うんですが、優秀なコーチとしての役割です。

人間がやるにしろコンピュータがやるにしろ、それなりの規模のソフトウェアを作るのは長距離走的な忍耐と執念が必要で、疲れたり、最悪途中で投げ出したりすることになりかねないので、そういう局面でアドバイスや励ましができる人っていうのは必要なんじゃないかと思います。ただ、チャットの相手が人間なのか AI なのか区別できなくなるほどに日常に溶け込んでくれば、人間である必要はなくなってくるかもしれませんが、AI は自ら主体的にケツを叩いてくれるわけではないので、キーポイントはケツを叩けるかどうか、になるかもしれません。

ChatGPT とそれに類似する GPT たちは、総じてポジティブなことしか言わないように訓練されているようですが、ポジティブな言葉が常に人を奮い立たせるとは限らないですし(だからといってネガティブなことを言えばいいというわけではなく)、一緒にやっていきましょうの度合いというか、熱量みたいなのは人間ならではである気がします。

要するに、主体性、コミュニケーション能力、熱量、みたいなところが(いまのところは)人間ならではなのかな、と思った次第です。

さて、5年後10年後、ソフトウェア開発の世界がどうなってるのか本当に楽しみです(私は引退したので高みの見物をさせていただきます)。

おわりに

いつも以上にだらだらと書いてみましたが、明日から某コミュニティ有志の開発合宿(前回は1行もコード書かなかったけど)があるので、ジェネレーティブ AI とソフトウェア開発の未来みたいな話は出るでしょうから、そこでの議論を経て追記・整理するかもしれません。

an image of some software developers discussing and drinking a glass of beer generated by Stable Diffusion

何人かのソフトウェアエンジニアが床の上でビールを飲みながら議論している画像 by Bing Image Creator

(Bing Image Creator は日本語で指示したらアジア人っぽい人たち出してきた)