LLM時代におけるプログラミング学習
Learning Programming in an Age of LLMs (blog.ploeh.dk)
要約
この記事は、LLM(大規模言語モデル)の普及が進む中で、プログラミングを学ぶことの意義について読者からの質問に答える形式で論じています。著者は、AIが開発速度を加速させる一方で、深い理解なしにシステムを構築することのリスクや、AIによる大量失業の可能性について懸念を示しています。そして、自身の経験を踏まえ、AI時代においても基礎学習の重要性は変わらないとしつつも、その学習方法や目的については再考が必要であると示唆しています。
全文翻訳
LLM時代におけるプログラミング学習
by Mark Seemann
読者からの手紙に対する公開回答。
最近、ある読者からLLM時代におけるプログラミング学習について、多くの質問が寄せられた長い手紙を受け取りました。何度かのやり取りの後、その手紙の一部を広く引用して、公に回答を試みる許可を得ました。
これらの回答は、どれも特に厳密なものではありません。状況は非常に不確実であり、私は自分の能力の限りでしか答えられませんが、それらが何らかの不変の真実であるとは主張しません。
「AI時代における、ソフトウェアを深く理解している人々が学習や能力についてどのように考えているのかを理解しようとしています。私はほとんど歴史家のようにアプローチしています。実際に生きている間に技術的移行をどのように捉えているのかを、人々に直接尋ねているのです。
約1年前に、AI支援プログラミングに魅了されました。正式なCS(コンピュータサイエンス)のバックグラウンドはありませんでしたが、LLMを使って、API、PostgreSQL、LLMパイプライン、リサーチ自動化、マルチモデルワークフローを含む、かなり大規模なTypeScript/JavaScriptシステムを構築することができました。最初はほとんど魔法のように感じられました。AIは、アイデアを持つこととそれを構築できることの間の距離を縮めるように見えました。
しかし今、そのシステムを実際のプロダクション製品にしようとしていますが、苦労しています。AIで一つのエラーを修正すると、別のエラーが現れ、さらに別の部分が自分が完全には理解できないように動作します。数ヶ月のリファクタリングの後、不快な気づきがありました。私は自分の理解レベルを超えたシステムを構築してしまったのかもしれない、と。すべてがうまく機能しているときは、そのギャップはほとんど見えません。うまくいかないときは、それは非常に現実的になります。
時には、別のモデルに尋ねなければ、次に何をすべきか本当にわかりません。それが、私が1年間製品を構築していたのか、それとも、まだ十分に理解しておらず、真に所有するには至っていない、洗練されたものの見かけを構築していたのか、疑問に思わせました。
私は全くAIに反対しているわけではありません。これらのシステムに魅了されており、プロフェッショナルとしてそれらと仕事がしたいと思っています。しかし、それらとの正しい関係性が何であるか確信が持てません。」
確かに、私も確信が持てませんが、先に進む前に、私の立場を明らかにすることが最も透明であると考えます。私はまだAIについて決定を下していませんが、それを嫌う方向に傾いています。それが止められないかもしれないことを十分に承知しています。
私はそれを使って仕事をし、実験しており、しばしば感銘を受けます。他の時には、それは私を苛立たせます。通常、最も感銘を受けるときに、私はそれを最大限に憎みます。
悪いときは、それは苛立たしいものになり得ますが、その時は少なくとも、30年以上かけて学んだことがまだ関連性があるという幻想の中で、かすかな暖かさを吸収することができます。それが最高潮に達したとき、私は時々考えます。「バターリアン・ジハードにはどこでサインアップすればいいのだろう?」と。
LLMに対する私の立場は、私の個人的な社会経済的地位にのみ部分的に基づいています。私は十分に年をとっており、すでに十分な成功を収めているため、他の条件がすべて同じであれば、失業しても生き残ることができます。一方で、知識基盤社会が生き残れるかどうかはわかりません。
LLMは、他のホワイトカラーの仕事を奪う前に、プログラマーの仕事を奪うかもしれません。結局のところ、プログラミングは、例えば保険金請求管理よりも検証が容易な分野である可能性があります。それでも、もし知識労働者の大量失業の段階に達した場合、我々が知っているような社会が生き残れるかどうかはわかりません。
私は通常、経済学者としての私の背景についてあまり話しませんが、この文脈では言及することが関連性があると感じます。経済学者として、30〜40%の大量失業が経済に大きな影響を与えないとは想像できません。
以前にもこのようなことがあったという議論は痛いほどわかっています。仕事の喪失はあるかもしれませんが、技術の進歩は今日私たちが想像もできない新しい仕事を生み出します。それはストッキング・フレームの導入、蒸気機関、内燃機関、コンピュータなどと同様でした。これは部分的にしか真実ではありません。はい、新しい仕事は創出されましたが、多くの場合、仕事を失った人々のためのものではありませんでした。石炭採掘者が一夜にしてプログラマーになったわけではありません。
中国が世界貿易機関(WTO)に加盟したときも、同じような議論が使われました。そして確かに、多くの新しい仕事が創出されましたが、西側世界ではありませんでした。
したがって、実体験と歴史的経験に基づくと、すべてうまくいくという議論には懐疑的です。
しかし、私は心から間違っていることを願っています。私はプログラミングが大好きで、あと10年それを続けることを気にしません。さらに重要なことに、私には成人した子供たちがいます。彼らのためにも世界があることを願っています。
「ですから、あなたがどのように考えているのか、ぜひ知りたいです。LLMが存在する前にプログラミングの基礎を学んでいて良かったと思いますか?もし今日始めるなら、言語、データ構造、データベース、ネットワーク、オペレーティングシステム、デバッグ、アーキテクチャを真剣に学びますか?AIは、人々が理解できるようになるよりも速く、構築できるようになることを可能にすると思いますか?」
LLMが登場する前にプログラミングを学んでいて良かったか?はい、もちろんです。それらのスキルは30年間私に役立ちました。
もし今日始めるなら、大工仕事、金属加工、銃器製造、あるいは手と目の協調を必要とする他の何かを学ぶことを真剣に検討するでしょう。ロボット工学の進歩もあることは知っていますが、肉体労働の代替は、より遠い未来にあるように思えます。
しかし、質問に答えるために:私は個人的に、現在、大学のプログラムの一部としてデータ構造、言語セマンティクスなどを学んでいます。しかし、それは私がそれをすることに興味があるからであり、それから多くの金銭的報酬を得られると期待しているからではありません。
AIが人々を、彼らが追いつくことができるよりも速く開発できるようにするかどうか?これはまだわかりません。ソフトウェア開発者は、何十年もの間、理解していない抽象化の上に作業してきました。もしあなたがウェブ開発者であれば、コンパイラプログラミングについてあまり知りませんでした。もしあなたがコンパイラプログラマーであれば、集積回路設計についてあまり知りませんでした。そして、もしあなたの仕事が集積回路を設計することであれば、あなたの上にある抽象化のレベルについてあまり知りませんでした。
良い経験則がありました:あなたが作業しているレベルの直接下の抽象化レベルと、その上のレベルを理解すること。それにより、ほとんどの問題をトラブルシューティングできるようになるでしょう。
「そして、あなたは個人的にそれとどう向き合っていますか?AIがすぐに何かを解決できるとき、それを使うべきときと自分で問題を解決すべきときをどのように判断しますか?もし私があなたのような立場だったら、実質的にAIで構築されたプロジェクトがあり、その下に弱い基盤がある場合、立ち止まって体系的にその基盤を学ぶか、構築を続けながら問題が発生したときに学ぶか、あるいは両方を組み合わせますか?」
それは2つの根本的に異なる質問です。なぜなら、私はもはやソフトウェア開発において弱い基盤を持っていないからです。たとえ私が普段やっていることとはかけ離れたことを扱っていたとしても、すでに知っていることを活用して迅速に対応できます。例えば、誰かが私にRISC-Vアセンブリコードのみで書かれたアプリケーションを保守するように依頼したと想像してみてください。それは私にとって最も異質なソフトウェア環境です。そのような開発環境に適応することは私にとって困難ですが、プログラミング全般に新しい人にとっては、それほど困難ではありません。信じられないかもしれませんが、私はRISC-Vで小さな演習プログラムを書いたこともあり、RISC-Vにコンパイルする演習コンパイラを作成したこともあります。
しかし、もし私が実質的にソフトウェアのバックグラウンドを持っていなかったらどうでしょうか?
さて、かつて私はまさにその状況にありました。キャリアを始めたとき、何年もの間、仕事をこなしながらオンザジョブで学ぶという綱渡りをしました。1999年から、私はC++でCOMコンポーネントを書いていましたが、自分が何をしているのかあまり理解していませんでした。それでも、どうにかしてそれを機能させることができ、明らかなメモリリークをすべて排除するレベルにまで達しました。
しかし、私は仕組みを理解せずに物事をただ組み立てるだけで満足することはありませんでした。そのため、質問で示唆されたように、立ち止まって基礎を体系的に学びました。これは1990年代半ばに始まったキャリアにはうまくいきました。今日もうまくいくでしょうか?
あまり確信が持てません。過去の自信が、ダニング=クルーガー効果の「無知すぎて認識できない」部分に明確に位置していたことを認識できるほど高いレベルの能力に到達するには、数十年かかりました。今日、それほど時間がありますか?
確かに、LLMを使えば、より的を絞った質問ができるため、より速く学習できます。30年前、私は役立つ資料が含まれていることを期待して本を購入していました。それでも、手元のタスクにすぐには関連しない多くの学習資料を苦労して読み進める必要がありました。
それでも、人間の学習を大幅にスピードアップすることは可能であるとは疑っています。ボトルネックは、教師や教材ではなく、人間の脳が新しい知識を吸収できる速さにあるのでしょう。
「最後に、あなたがどのようにプログラミングを学んだのか、そして今日新しい技術的なことをどのように学んでいるのかについて、特に聞きたいです。キャリアの初期に新しい言語を学ぶにはどうアプローチしましたか?書籍、プロジェクト、他人のコードを読むこと、演習、デバッグ、それとも何か他のことですか?そして、もし今日、AIが利用可能な状態で、完全に新しいプログラミング言語を学ばなければならないとしたら、どうしますか?」
最初の質問への短い答え:ゆっくりと、多くの試行錯誤に基づいて、時折本に裏打ちされていました。
非常に初期のCOMAL 80での誤ったスタートを除けば、私の最初のプログラミングプロジェクトは、経済学の修士論文のために分岐図とローレンツアトラクタを(再)計算することでした。手元にあるものを活用しようと、私はそれらをQBasicで書き、それに付属していたサンプルから学び、時折友人に尋ねました。
多くの詳細を省略していますが、1990年代と2000年代には、主に例とドキュメントから学びました。C++に関する本は購入しましたが、それを最後まで読んだことはないと思いますし、様々なBasic方言やC#は、ドキュメントとサンプルコードからのみ習得しました。
とはいえ、C#を学ぶために本を読んだことは一度もありませんが、本はF#とHaskellの両方を独学する上で非常に役立ちました。長年にわたり、私は自分自身を教育するために本に大きく依存してきましたが、私のGoodreadsプロフィールが示すように、私は一般的に本が大好きです。
今日、完全に新しいプログラミング言語をどのように学びますか?再び、私の経験は2026年にプログラミングを始めたばかりの人には役に立ちません。私は今までに多くのプログラミング言語を見てきたので、新しい言語に遭遇した場合、既存のコードをざっと見て、すぐに明確でない少数の点を調べることで、通常は習得できます。
しかし、それはその言語が「普通」であることを前提としています。もし私がAPLに戻らなければならないとしたら、少なくともチュートリアルを見つける必要があるでしょう。
私がLLMを学習にあまり使わないことに気づいたかもしれません。LLMは幻覚を見ず、嘘をつきます。そして私は、それらが伝えるものすべてに深く不信感を抱いています。これは私がLLMを使用しないという意味ではありませんが、検証可能な回答が得られるような質問をすることが多いです。「このHaskellの式をもっと簡潔にできますか?」そのような質問に対する有用な回答は、コードの提案であり、それは機能するか、機能しないか、短くなるか、そうでないかです。これは検証が容易です。
一方、「次に何を学ぶべきか?」は検証可能な回答をもたらしません。私はそのような質問をLLMにしない傾向があります。
結論として、私はLLMに反証可能性のある質問をすることを好むと言えるでしょう。