LLM全盛時代でもプログラミングを「心から楽しむ」ための生存戦略
How to keep enjoying programming in a world of LLMs
How to keep enjoying programming in a world of LLMs
AIがコードを爆速で生成してくれる今、私たちはエンジニアとしてどう立ち回るべきでしょうか?単なるコーディングマシンにならないために、プログラミングの本質的な喜びを見失わないためのヒントをまとめました。LLMを最強の相棒にしながら、知的好奇心を満たし続けるマインドセットと実践術について議論しましょう。
プログラミング中にLLMを使うのは全然ありかな。少なくとも自分の使い方だと、自分の経験や知識、センスが活かされていて、ただ適当にやる(vibe it)よりも良いものができていると感じるから。
ただ、同僚がLLMを使っているのを見るのは正直楽しめない。悪いけど、中身のない人間(meat proxies)と話しているような気分だし、見当違いな問題を解決した巨大なPR(プルリクエスト)が送られてくるのは勘弁してほしい。みんな脳みそをオフにしているみたいだ。作るスピードは上がったかもしれないけど、肝心な正しいものを作れていないんだ。
つい最近(2日前)、超高速で推論能力が低めのモデル(gpt 6 luna low effort + fast mode)を使う方が、ずっと楽しめることに気づいたよ。これならずっと自分が主体的に手を動かせるし、モデルが勝手に色々判断を下すのを20分も待つ必要がないからね。
それに、LLMはそもそも爆速で読み込むのが得意だ。だから、コードのモジュールを要約したり別の形で表現し直したりさせるには最適だよ。
「創造性のネメシス(The Nemesis of Creativity)」を読んでいたら、機械を使うことへの抵抗について、ある中国の賢者の言葉が引用されていたんだ。
「師が言うには、機械を使う者はすべてを機械のようにこなす。機械のように仕事をする者は機械のような心を持ち、胸に機械の心を抱く者は純粋さを失う。純粋さを失った者は、魂の探求において迷いが生じる。魂の探求における不確実性は、誠実な感性と相容れないものだ。私はそういった道具を知らないわけではない。ただ、それを使うのが恥ずかしいのだ。」
この投稿の内容と重なる部分があって、深く考えさせられたよ。
自分はLLMを使わないようにしている。仕事では難しいかもしれないけど、プライベートなら間違いなく選択できる。もし使わないでいると、プログラミング言語で思考する能力が徐々に衰えていくと思う。これは音楽演奏、外国語の学習、クロスワード、チェスや囲碁など、他のあらゆる知的スキルにも同じことが言える。コンピュータの方がはるかに強いからといって、チェスを辞めたりはしないだろう?大事なのは、自分で学び、理解し、実践することだ。
自分の経験に基づいたアドバイスを一つ。LLMを使わずに、ゼロから自分でプログラミング言語を実装して、それでコードを書いてみること。その実装や書いたコードを世に出す必要はない。
家でのプログラミングは、ほとんど(というか全て)自分で設計したLisp方言でやっている。Common Lispに似ているけど微妙な違いがあって、あえて残した欠陥をなんとか工夫して補いながら書いているんだ。そのLisp方言でビジュアルデータフロー言語も実装した。コードサンプルは自分のサイトに載せているけど、PNG画像だからLLMにも読み取られないはず(たぶんね)。その言語は現実には存在しないMIMDハードウェア上で動かすように設計した。他にもEdinburgh構文を使わないPrologも実装して、型チェックや制御された英語の実装の解析に使っている。おかげで、LLMを使おうという誘惑も選択肢も、そもそも存在しない状況だ。
これらをやり遂げる過程で得られた学びは、LLMを使っていたら絶対に得られなかったものばかりだよ。
一つ覚えておいてほしいのは、何かに対してLLM(あるいは誰か)に丸投げするたびに、そのスキルは確実に衰えていくということだ。
自分も経験したけど、ある時、非常に小さなプロジェクトのアーキテクチャ設計すら上手くできなくなったんだ。本来なら一瞬で分かるはずのことなのに、それができない。答えが普段のように目の前に現れてくれないことに焦って、Claudeにアイデアを出してもらおうかと考えた。
でも、そこで踏みとどまった。「自分でできるはずだ!」と思って紙とペンを取り出し、アイデアを書き殴っていたら、急に堰を切ったように全体の設計が見えてきた。5分しかかからなかった。
でも、その5分間は本当に恐ろしかった。まるで答えが見えなくなって盲目になったような感覚だったからね。
気づいたんだ。以前はClaudeにアイデアを出させて、そこから経験をもとに「一番いいものを選ぶ」というスキルだけを使っていたんだと。ゼロから答えを導き出すスキルは使っていなかったんだよ。
特定のスキルが衰えてもいいと割り切る場面は多いし、やりたくないことならそれも一つの選択だと思う。ただ、使う時には十分気をつけた方がいい。
少し前にHNで読んで共感した内容があるんだけど、今は「自動車整備マニア」の時代に似ている気がする。ハンドツールでいじるのを楽しむ古い世代の車と、ソフトウェアパッチでチューニングする現代の車、みたいなね。
LLMが出始めた当初から、生成されたコードで良い経験をしたことがないんだ。バグだらけだったり、一見動くけど後で変なバグに数時間悩まされたり、あるいは危険な兆候だらけだったりする。
最近の趣味のプロジェクトは、テキストエディタとマークアップだけでやっている。IDEの補助機能ももうこりごりだ。忘れたことはググればいい。最近よく見かける「LLMでファームウェアやドライバを適当に書いたら動いちゃった」みたいなすごい話を読んでると、正直それがプロモーション目的のbotが書いてる記事なんじゃないかと疑ってしまうよ。
LLMが登場するずっと前から、仕事のせいでプログラミングが嫌いになっていたよ。むしろ今は、やりたくないクソみたいな作業をLLMに押し付けて、興味のある問題――たいていは9時から5時の仕事以外の時間に見つけるような問題――にエネルギーを注げるようになったから、前よりプログラミングを楽しめているかも。
LLMコーディングの是非はさておき、最近のエージェント的なコーディングになってから何かが決定的に変わってしまった。仕事へのモチベーションがじわじわと失われていくのを感じている。どんな役割でも、これまでは仕事に夢中になれる何かを見つけてきた。でも今はやる気が出ない。毎週、自分のスキルや才能、アイデアそのものが、どんどん価値を失っているように感じる。ただのボット間でデータや権限を右から左へ動かすだけの肉の塊になった気分だよ。
数週間コーディングせずに全てをエージェントに任せると、自分でコーディングする感覚を取り戻すのが難しくなることに気づくはずだ。
でも、トレンドはその逆方向に向かっている。手作業でコーディングする能力を維持することに、そこまで大きな意味はないんじゃないか。今どき馬の乗り方を知っている人がどれくらいいる?あるいは、手計算で大きな数の掛け算を日常的にする人がいるだろうか。
今必要なのは、コーディングエージェントの死角や制限を補い、彼らの抱える問題を理解し、その問題に対処しながら、信頼できて意図通りに動くコードを確保する能力だよ。
「コーディング(Coding)」「プログラミング(Programming)」「エンジニアリング(Engineering)」は区別する必要があると思う。
コーディングは、医療事務やコード入力のように、ドメインロジックの抽象化や符号化へと向かっている。
プログラミングは、そのコーディングされたものを、特定のシステムの文脈の中で実装すること。
エンジニアリングは、それら全てを統合的に指揮すること。
これが新しいパラダイムなのか、正しいのかは分からないけど、面白い現象だと思っている。理論としてではなく、現場の実践としてね。特に「シェブロン・デファレンス(行政の裁量権)」や今の政治情勢を考えると余計にそう感じるよ。