筆者は「自分たちを外側から見ている人はここ最近のプログラミング事情について一体どのように思っているのだろうか」とずっと気になっていました。なので、今回はシンプルに「プログラミングを日常的に行なっている人とそうでない人にいまどれだけ認識の差がありそうなのか」という切り口でAIプログラミングの現在地について書いてみます。
AIの進化がプログラミングへ特に大きな影響を与えている?
現在の大規模言語モデル(LLM)は、基本的にはインターネット上のテキスト情報を主たる学習ソースとしていて、だからこそどの分野でも専門家レベルの回答能力が備わっています。しかしそうだとするなら、AIがプログラミングにだけ秀でているというのは正しくないことのように思えます。実際これはそうであり、AIがプログラミングにだけ高い能力を発揮するのではなく、AIの高い能力がプログラミングに適用しやすく、かつその結果人類に与えられる効果が他の分野に比べて特に大きい、というほうが正しい表現になるでしょう。
この話の根拠が主に2つあるので順番に見ていきます。
LLMの性質上、プログラムのソースコードは非常に相性がよい
以前の連載(1)でも紹介したように、LLMは言語構造に着目したAIです。そしてその動作理念は「次に来るべき最もふさわしい単語を選び続けるシステム」と捉えるとわかりやすいのでした。
この考え方はプログラムにもそのまま当てはまりそうですね。ソースコードを書くために人間が定義したルールもプログラミング "言語" というくらいですし、自然言語よりさらに厳格な文法で書かれていることを考えればLLMにとってはより扱いやすい概念であるだろうということもわかります。しかもソースコードはインターネット上から得られる情報源として山のように存在しており、学習量の観点でも困りません。
実際、ChatGPTをはじめとするLLMが世に登場する以前からGitHub Copilotという製品では「次のコードを予測し補完してくれる機能」というものが提供されていました(2)。これもGitHubにホスティングされている大量のコードをもとに訓練されたもので、プログラマにとっては「コードをAIに書かせる」という発想はもともと予想された方向性として捉えられていました。
AIによるプログラミング能力のブースト効果は半無制限に活用できる
ふたつめは、AIから受け取れる結果の活用方法についてプログラミングと他分野ではどのような性質差があるのかについてです。前述したように、LLMにとってはプログラムのコードを生成するというのは、日本語で質問されて日本語で回答していることと実質的に同じです。単なる質問への回答自体が「プログラミングという作業」の結果を包含していることにまず注目してください。
つまり「現実世界へAIの成果を適用する」のは、ことプログラミングにおいては単にファイルへコードを書き込むことでしかないのです。言い換えれば、素晴らしい建築技術を持った大工AIがいても私たちの物理世界に急に新しい構造物を発生させることはできないし、すべての判例記録を持っている弁護士AIも実際の裁判には出席できません。
多くの分野ではAIの優れた回答結果をどこかで人間が扱う必要があり結局それがボトルネックになってしまいますが、プログラミングにおいてはLLMが回答する時点でその目的がほとんど達成されているのです。
さらに、AIが動作した結果をコンピューターの中で適用できるということはそのスケーリング性にもアドバンテージがあることになります。人間の手作業から解放されているだけでなく、ICチップなどのハードウェアの進化、ソフトウェアとしての機能の進化などを素直にすべて享受できるので、これからも彼らの能力が行使される速度はどんどん上がっていくのですね。
最後に、プログラミングされた結果としてのアウトプットは、私たち人類がこれまで積み上げてきたソフトウェアの仕組みに最大限「乗っかる」形で利用されます。大半のものが電子化された情報化社会においては、その表層に置けるものを素早く大量につくることで非常に効率的な設計、製造が可能です。これが「プログラミングが他の分野に比べて人類に与えられる影響の大きさが特に大きい」と言われるゆえんでもあります。
LLMが登場してからプログラミングはどう変わってきた?
では、LLMが登場してから実際に現場ではどのような使われ方をしているのでしょうか。今回は大きな流れがわかるように3つのフェーズに区分けして紹介します。
ChatGPT登場時:コピペと質問の繰り返し。それでも多くのハマりポイントは解決できるようになった
いま思えばですが、ChatGPTが登場したばかりのころはハルシネーション(もっともらしい誤り)や議論の堂々巡りなども多く、複雑なやりとりを長く継続するのは難しいことがありました。とはいえ、これまで頑張って検索していたエラーの修正方法などを調べる工数は格段に省力化しましたし、状況に応じた回答をコードつきで返答してくれるというのはやはり革新的でした。
それを裏付けるべく、例えばプログラミング中に困ったことを相談しあうプラットフォームとして世界的に有名な「Stack Overflow」はChatGPT登場以降にアクセス数が激減したとして話題になったりもしました(3)。
筆者自身、それまで難解に感じて学習が進まなかったとある技術の習得がChatGPTにより急速に進んだ経験があり、「世界中で同じようなことが起こっているのだろうな」と感じていました。この時点でプログラミングに関して個人が直面する多くの問題が解決に向かうようになり、時を待たずしてこれはすぐに「どう効率化してスピードを速めていくか」という路線へシフトすることとなります。
自律型コーディングエージェントの登場:ソフトウェア開発の加速度が急激に上昇する
ほどなくして、開発者がコーディングを行うプログラミングエディタ内で自律的に動作するAI、通称「コーディングエージェント」が生まれました。彼らはユーザーが送った質問や実装命令などをもとに必要な情報を自分で集め、適切なファイルを探し出し、コードの書き込み、すなわちプログラミング作業そのものを実行します。
前述したGitHub Copilotがすでに存在していたこともあり「開発者の手元でそのまま動くAI」という発想が具現化するのは当然の流れとも言えましたが、勝手に考えて自分で作業を進めていく様を初めて見たときは呆気にとられたものです。
そしてこの頃から、前述した「プログラミングにかかわるほとんどの作業に物理的作用が必要ない」という事実が活きはじめます。例えば既存のプログラムに新機能を追加したいというシナリオを考えると、コードの読み取りや書き込み、実際にテストしたり起動したりするといった操作はすべてコンピューターのターミナル(CLI)操作で可能です。
しかもこれらのコマンドは長年ソフトウェア開発の歴史で積み上げられてきたごく一般的な概念なので、LLMは追加の学習や専用のツールなどなくともすでに使いこなせる状態だったのです。
開発者自身の作業効率も単純に向上しました。初期のChatGPTでは、ウェブ検索機能が存在しないので最新情報がわからないという弱点が如実に露呈していましたし、関連するファイルやコンテキスト情報を自動で参照してもらうこともできなかったのでいちいちすべてを貼り付けて説明する必要がありました。
いままでやっていた本来の開発作業が「泥臭いチャットコピペ作業」になっただけという感じでしたが、コーディングエージェントはそんなことをせずとも私たちは必要と考える情報は勝手に参照してくれます。まさにコンテキストの共有ですね。
この頃から周辺エコシステムのツールも乱立しはじめ、AIを提供する各社もコーディング用モデルの進化に中心的にリソースを割き始めるようになります。前半で話したように、プログラミング作業のためのさらなる効率化や性能向上の余地はどんどん見えてくることに対して、他の分野におけるモデル性能アップの費用対効果は鈍化しはじめていたからです。
コードレビューや周辺ツールすらもオーケストレーションするフェーズ:人間はマネジメントへ
ひとつ前のフェーズの時点で、すでに大半の作業はコーディングエージェントに任せられるようになっています。例えば筆者自身、新機能の追加、バグ調査や修正、仕様の確認などにはほぼ必ずエージェントを使用しています(4)。
反対に、現時点でエージェントにやらせていない主な作業は以下です。
- 要件や仕様の定義
- ソフトウェアの設計
- 長期的なプランの検討
(どこになにをつくる、組織課題とどう紐づけていくか、チームメンバーに何をやってもらうか…など)
そうです、これはいままで「管理職」や「上流工程」などといった言葉で表現されていた仕事ですね。プログラマは単にコードを書いていればいいのではなく、もっと広い視点を持った上位概念の業務にもあたらなければならなくなっています(筆者はもともとそれはそうだと思っていましたが)。
もし仮にプログラマという言葉が「与えられた仕様をもとにコーディングのみをする人」を指す言葉だったとしたら、この職種は絶滅に瀕しているといっても言い過ぎではないかもしれません。それくらい、ソフトウェア業界では仕事のあり方が変わっています。
さらに本記事執筆時点では、コーディングエージェントを複数同時に動かして効率化を図ったり、互いを協調させてより成果物の品質を上げるような使われ方も広まりはじめています。人間が行うAIのマネジメント作業ですら全体においてはボトルネックになってしまうので、そこもなるべくAIに任せてしまおうという考え方ですね。
なにやら危険な感じもしますが、うまく活用できている組織では歴史上類を見ないレベルでの開発速度を達成していたりする事例もあります(5)。
今後はどうなる?
今後については「わからない」以外に言えそうなことがないのですが、大まかな予測としては以下のようなことを考えています。
- プログラムを書くという行為は人間が行うものではなくなっていくのでは
- いっぽうで、ソフトウェアエンジニアという職種がなくなることはしばらくはないだろう
- 残る仕事のメインはトレードオフの判断、設計や運用方法の定義、ソフトウェアのテストなどではないか
ふたつめについては今回の記事で話してきたことと相反するようですが、これは「プログラムのコードを書くこと」以外ではまだまだ大きな専門領域として存在意義があるだろう、という意味です。結局のところプログラムを書く超便利なツールが現れただけであり、本質的にやっていることは変わらないという考え方ですね。
例えば黎明期のコンピューター(6)では人間が大量のケーブルやスイッチを手動でつけかえるという作業をしていたわけですが、彼らから見た現代のコンピューターやプログラミング言語は「革命的ではあるが自分たちのやっていることと方向性は同じだ」と感じるかもしれません。
たしかに仕事の内容は確実に変わってきていますし、より別種の知識を求められるようにもなってきています。しかしそれは本来「常に勉強あるべし」ということだったのと何も変わりはなく、過去何度も繰り返されてきたことであるというだけなのかもしれません。
多少なりとも身の危険は感じますが、それでもこの体験をリアルタイムでできていることに筆者は最近ずっと感動しています。この先の行く末はわかりませんが、楽しみながら生き残れるように改めて気を引き締めていきたいところです。
(執筆:みるみ)
【脚注】
- Vol.6(No.147 '24 秋の号)をご参照ください。
- https://www.itmedia.co.jp/news/articles/2106/30/news063.html
- https://gigazine.net/news/20230727-stack-overflow-traffic-fall/
- 生成されたコードに一切手をつけずそのまま使っているか?」というよくある質問に対しては「ケースバイケースです」という回答になります。生成規模が十分に小さければもちろん手直し不要なこともよくありますし、事前にエージェントに伝えておく「ルール」(システムプロンプトと近い概念)の精度が高ければ高いほど、自分が意図しているコードは一発で出やすいです。
- 例えば、コーディングエージェントのトップシェアを争う「Claude Code」というアプリケーションのそのもの自体が凄まじいスピードで開発されています。Claude社は早くからClaudeというAIを複数動作させてほとんどの作業を委任する仕組みを確立しており、この知見が現在業界にも広まりつつあるという状況です。
- ENIAC(エニアック)。参考:https://ja.wikipedia.org/wiki/ENIAC