世界を動かす技術を、日本語で。

LLMの利用を控えます

概要

  • Alberto Fortin によるAI活用経験の実例紹介
  • LLM導入の期待と現実のギャップ に関する率直な意見
  • Claude Opus 4など新モデル の実地検証結果
  • 生産性の錯覚 と現場での実際の課題
  • エンジニア視点での実用的アドバイス を提示

AIハイプと現実のギャップ:プロダクションコードの現場から

  • Alberto Fortin は15年の経験を持つソフトウェアエンジニア
  • GoとClickHouse によるインフラ再構築時、LLM活用に挑戦
  • 初期は AI革命への期待 と熱意で導入を決断
  • 実際には バグや機能不全だけでなく、保守性やコードの整然さ にも課題
  • エラー出力をLLMに渡すと新たな修正案が返るが、別の部分が壊れる」という問題の連鎖
  • 修正が一週間で終わると思っても、次々と新しい小さなエラーが発生し、結果的に二週間以上かかる 現象

生産性の錯覚

  • LLMの自動補完や初期機能の驚き で期待が膨らむ現象
  • 最初の一歩は魔法のようだが、現実は違う」という冷静な分析
  • コード量の増加 により「10倍の生産性」を期待しがち
  • しかし、 本質的な課題や設計の意思決定 は依然として人間の役割

マインドセットの転換とコントロール

  • エンジニア自身が主導権 を持つことの重要性
  • 私はアーキテクトであり、LLMはアシスタント」という立ち位置の明確化
  • 大規模な機能開発はLLMに任せず、小さなリファクタや限定的な機能追加 に限定
  • コードベースを完全に理解した上で、自分でバグ修正する方が速く確実 という実感

実践的な知見とバランスの提案

  • シニアエンジニアであってもLLMがうまく機能しなくても自己否定不要
  • 従来のスキルを活かしつつ、AIは知識補助ツールとして活用
  • アーキテクチャの抽象化やプロダクトの意思決定は人間が主導すべき
  • AI技術の進化を歓迎しつつも、過度な期待は控え、現実的なバランス感覚を持つことの重要性

新モデルの実地検証:Claude Opus 4など

  • Claude Opus 4など最新LLMの検証 も実施
  • 一部の課題は改善 されたが、根本的な問題は依然として残存
  • 複雑な設計や長期的な保守性 には人間の判断力が不可欠
  • LLMは限定的な範囲での生産性向上や補助に有効 という結論

まとめ:現場でのAI活用の心得

  • AIの革命性を認めつつも、冷静な評価と現実的な使い分け が重要
  • 過度なハイプを抑え、実践的なバランスを意識した活用方針
  • YouTubeセッションやブログ も参考に、他エンジニアへの実践的示唆

Hackerたちの意見

俺もほぼ同じ結論に至ったよ。コードベースの大きな部分をオートコンプリートするのはあんまり得意じゃない。何がどうなってるか、どこで何をしてるかのメンタルモデルを失っちゃうんだよね。だから、個人的には、もっと早く反応するスタックオーバーフローみたいに使ってる。よく分からない概念の概要を教えてもらったり、良い解決策が分からないときに方向性を示してもらったりする。そしたら、自分で判断して実装するって流れが、今のところすごくうまくいってる。

私も同じように使ってるけど、カーソルが常にコードの変更を求めてくるんだ。コードベースを修正せずに内省させるトリックってあるのかな?

LLMには限界があるよね。めちゃくちゃ強力だけど、人間ができるような飛躍はできない。例えば、下の問題をClaudeとGeminiに聞いてみた。「Androidでウェブサーバーを動かしたいんだけど、1000未満のポートにバインドできない。どうすればいい?」二人とも以下の解決策を提案した。1. リバースプロキシを使う 2. 電話をルート化する 3. 高いポートで動かす。再考をお願いしても、期待してた解決策は出てこなかった。この問題の解決策はHTTPS RRレコードなんだけど、二つのモデルはHTTPS RRについては知ってたけど、解決策として提案できなかった。俺がそれを文脈に入れたら、ようやく可能な解決策として同意したんだ。

今日は学んだ。SRVレコードについては知ってたけど、ほとんど使われてないと思う?これは初耳だった。実際にサポートされてるみたいだし、SRVは一部のアプリケーションでしかサポートされてないのとは違うみたい。Matrixはデータを提供するためにSRVから.well-knownファイルに移行したんだ。(もしかしたら、両方をサポートしてるかも。)

「聞いたら解決策を教えてくれる」っていう古典的な問題だよね。

話は逸れるけど、スマホでウェブサイトをホスティングする記事を読んで、すごくインスパイアされたよ。脱獄してないスマホでもできるの?どんなウェブサーバーをおすすめする?

LLMに対して、例えばChromeですら完全にはサポートされてないような、かなりマイナーで新しい仕様を推奨させるのはどうかと思う。それは、人間の俺でもできない飛躍だし。

これも自分の知識に追加しておくね… :-P 最近になってLLMともっとやり取りするようになったんだ(以前の「ブッククラブパートナーとして使う」提案を試してみたら、結構良かった!)。カーソルを使ってコーディングしてるときに、「あれ、最初にそのコード書いたときにxyzを忘れてたよ」ってちょっと促したことがあって(関連データ構造やキャッシュの更新とか)、機械に対して「うん、自分もそのコード書いてたら同じミスしたかも」って意図的に思うようになったり、「最初に基本ケースを書いてからキャッシュを更新したり、見つかったアイテムの数を減らしたりしたかも」って考えたりするようになった。ブッククラブやムービークラブのケースでは、2つの映画について話すように頼んだんだけど、いくつかのミスがあった。「主人公は正当に投獄されたのか、それとも不当に投獄されたのか」みたいな…人間でも同じタイプミスをするかもしれないよね?直して、気にせず流れに乗る…本や映画についての100%人間の議論でも、みんな(そして幻覚を持つAI/LLMも)細かいディテールを100%正確に覚えてるわけじゃないし、会話相手に少しの信頼を持つことでストレスがかなり減るんだ。AIでも、ポジティブなやり取りを心がけるのが大事だね。

へぇ、それは面白いトリックだね。HTTPS RRレコードについて初めて知ったよ…だから、AIがそれを提案するべきだったかどうかは判断しないよ。

公平に言うと、質問はローカルサービスのポート番号が問題だって暗示してるけど、実際はURLにポート番号を指定せずにアクセスできるようにすることが重要なんだよね。経験豊富な人なら本当の問題を見抜けるかもしれないけど、特定の質問に答えたことについてはLLMのせいじゃないよ。もしかしたら、テスト用のサーバーを立てたかっただけで、URLに非標準ポートを追加できることに気づかなかったのかも。

HNに時間をかけすぎてるのかな、それともどの投稿やコメントセクションも同じ話ばかりなの?基本的に、LLMはワクワクするけど、開発者が所有感を持てないようなゴチャゴチャしたコードを生み出すんだよね。LLMが書いたコードベースを管理するのは難しい。自分で書いたコードのように、全体を頭に入れてないから。ワンオフのスクリプトや、維持するつもりのないプロジェクトにはまあまあ使えるけど。これは、毎日何度も目にするブログの投稿やコメントセクションの要約だね。逆に、すでに「理解した」ような人たちがいて、プロジェクト全体で変更を計画・実行・統合するために複数のエージェントを使って、そのワークフローがどれだけ素晴らしいかを教えたがるけど、実際にはコードを見せない人もいる。

どれだけ素晴らしいかを教えたがる それか、よくあるのは何かを売りつけようとすること。

メンタルモデルの部分、まさにその通りだと思う!プログラミングを「理論構築」として考えるこの方法、めっちゃ好き。https://gist.github.com/onlurking/fc5c81d18cfce9ff81bc968a7f... 他のプログラマーがAIを使うのは全然気にしないし、私も使ってる。でも、コードや結果に対する責任を放棄するのは嫌だな。AIを使うときに、grepでログ検索したときみたいに免責事項を出す必要はないと思う。使うなら、その結果をツールとして受け入れて、ちゃんと扱わないとね。生成されたコードには特に重要だよ。

うん、すごく分かれるよね。でも、LLMが生成したコードをたくさん見せてる人がいるから、あなたの最後の否定的な意見は理解できないな。以下は、LLMを使ったワークフローとその結果生まれたツールについて説明しているサイモン・ウィリソンの記事のリンクだよ。 [0] https://simonwillison.net/2025/Mar/11/using-llms-for-code/ [1] https://github.com/simonw/tools

ベルカーブみたいな感じだね。- 大きなユーザー層がいて、彼らはコードがたくさん生成されるし、自分たちのスタイルのアルゴリズムを使うから嫌がってる。ユーザーは頭の中に入れなきゃいけない知らないコードがいっぱいで、理解するには多すぎてすぐに圧倒されちゃう。で、その両側には、コードを自分で書けなかったユーザーがいて、彼らは頭に入れようともしていない。今はちゃんと動くプログラムを作れるようになった! - あと、自分で書けたかもしれないけど、時間が足りなかったユーザーは、これをジュニアコーダーの軍隊として扱う方法を見つけて、高レベルのアルゴリズムだけを頭に入れることを学んだ。今では、もっと大きなプロジェクトを速く作れるようになったよ!

それって、25人以上の他の開発者と一緒に大きなコードベースで作業するのと何が違うの?うちの組織には160人のエンジニアがいて、eコマースのフロントエンドやミドル層を担当してる。私は常に自分が所有していないリポジトリやコードに飛び込んでるよ。git blameを見たら、3年前にここで働いてた契約者が頻繁に出てくる。LLMは小さいのではうまくいくけど、中くらいだとダメで、大きなモジュールの中ではまたうまくいくみたいだね。

先月、別のキャンプに移ったんだけど、可能性に驚いてる。で、私にとってうまくいってることはこれだよ:

  • ClineをSonnet 4と一緒に使う。ほかのモデルも使えるけど、これが価格と効果のバランスが一番いい。
  • まずは「プラン」モードを使って、プランが良さそうになったら「アクト」モードに切り替える。
  • LLMを、まるでジュニアエンジニアとペアプログラミングしてるかのように扱う。
  • 書かれるコードの一行一行を確認する。気に入らない部分があったら、オブジェクトしたり変更したりする。
  • テスト駆動開発を行い、LLMには常に最初にテストを書かせる。私はこれをフルタイムでコーディングに使うようになって、結果に大満足。以前書いてたコードよりも良くなってるし、時々見落としたり怠けたりすることがあったから。コードのテストもちゃんとされてるし、書くスピードも少なくとも2倍は速い。これは実際に他の人間にコードレビューされるプロダクションコードだよ。

開発者が所有権を感じないもの。これは確実に選択だと思う。AI生成コードをかなり試してみたけど、公開したりメンテナンスするつもりのコードには、自分がそのコードを所有しているという意識を持っていて、AI生成の出力に満足できない場合は自分で修正する(またはAIに修正させる)ことを決めてる。これは他の人間のコードをレビューするのとは全然違うやり方で、対等だから妥協が必要になる。これによって、特に早くはないけど、AIを使わないよりは少し早く、そして質の高いコードが生まれると思う。一方で、全くアップストリームするつもりのないオープンソース製品の使い捨ての実験やパッチでは、「AI」がコードを所有することに決めて、もっと雰囲気重視のコーディングをしてる。これだとメンテナンスできない雑なコードができるけど、動くし、ちゃんとやるよりもずっと楽なんだ。AIを使わせようとする企業は、私のように興味や楽しさから実験している個人よりも「人間の所有権がない」コードをたくさん得ることになると思う。

LLMが実際のソフトウェアを作るのに役立つ唯一の方法は、「擬似ボイラープレート」だと思う。つまり、書くのが面倒なパターンがあるけど、伝統的な意味でのボイラープレートではないから、従来の解決策には向かない。私がよく扱う例は、Pytorchモデルの作成。実際のモデルは絶対にLLMに任せたくない。モデリングの目的は自分の知識をデザインに取り入れることだからね。でも、初期のモデル配線の設定には多くの面倒があって、エラーの余地もある。大局的には、これが人々が想像するような10倍(それ以上)の改善ではないけど、実際には「退屈な部分」で本当に詰まることが多い。面倒なことにかける時間を減らすことで、全体の流れがかなり改善されると感じてる。

これを言ってるのはしばらく前から。問題は、自分のコードを深く理解していないと、真にメンテナンスできないってこと。LLMが何かの obscure な問題を解決できなくて、それが毎分 $$$,$$$ のコストを生んでるとき、どうする? AIに解決できないのが許容できると思う?もちろん無理だよ。LLMはバグや進むべき道を見つけるのには良いけど、全インフラをそれに賭けるのはやめた方がいい。アシスタントとして使うべきで、ハンマーとして使うべきじゃない。

あなたの説明は、ほとんどの人よりもずっと簡潔だと思う。私もまさに同じ経験をしてる。LLMは、私がメンタルモデルを構築するよりもずっと早く開発できる。状況がわからなくなるポイントに簡単に達してしまうし、バグがたくさん入ってきて、簡単に修正したりリファクタリングしたりできない。まるで自分のプロジェクトの新入りになったかのように。私は頻繁にコードをコミットして、定期的にLLMに説明を求めるようにしてる。LLMに、言ってる通りに動いてるか確認するように頼むことも多くて、そうすることで自分のバグを見つけることが多い。私は主に小さなデータ分析タスクにLLMを使ってるから、少し気をつければ速く動きつつも、ちゃんと状況を把握できる。大きなコードベースを急いで壊すのは簡単だと思う。LLMを使うには、プロンプトを開発したり、コンテキストを管理したり、ペースをコントロールしたり、整理整頓したり、LLMの作業を効果的にレビューするスキルが必要だと感じてる。これらのことは誰も教えてくれないから、苦労して学ばなきゃいけない。今、少しでも味わったから、手放すつもりはない。自分でやりたくない面倒なことがたくさんあって、それをLLMに任せられるから。20年以上やってきたけど、もう同じレベルの忍耐力はない。実現したいことは概念的にはわかってるけど、実際にどう実装するかはわからないこともあって、その点でLLMが好き。以前よりも少ない時間で、確実にもっと達成できるようになった。

LLMを長期的なソフトウェア制作に使うのが好きなんだけど(1回限りのものにはすごく良いし、メンテナンスもいらないから)、高度な雛形生成器として使うのが一番好き。関数やクラスに抽象化できないけど、あまり考えなくてもいいもの。テストはよく(テスト内容によるけど)この範疇に入るね。最初は抵抗あったけど、今は大好き!単調な作業が減って、代わりに新しい楽しいことができるようになった - それは、効率よく進めるためのプロンプトを最適化すること。プロンプトを書くのとコードをレビューするのが、単調な簡単な作業ではすごく早くなったし、興味深い部分は自分がやることに残るからね。

目標達成にはもっと生産的になってるけど、プログラミング能力は逆に悪化してる気がする。まるでステロイドみたいで、筋肉はすぐに大きくなるけど、副作用がたくさんあって、止めた瞬間に全部崩れちゃう。企業は、あなたの健康よりも目標達成の速さを気にしてるから、あまり関心がないんだ。過剰に摂取すると脳にとって有害な薬みたいなもんだね。完全に使うのをやめるつもりはないけど、使い方を積極的にコントロールし始めてるよ。

あなたのステロイドの比較を聞いて、Cal Newportの最近のブログ記事を思い出したよ。彼はAIが私たちを怠けさせているって主張してるんだ。彼は、脳波計に接続された人たちが働く様子を引用していて、AIの助けなしで働く人たちは脳に「負担」をかけているらしい。それは多分いいことだね。でも彼自身もAIを使わないべきだとは思ってない。メールみたいなことには使ってもいいけど、コアの仕事には使わない方がいいって。

LLMのおかげで、多くの開発者が「Simple Made Easy」の教訓を忘れてしまったと思う。https://www.youtube.com/watch?v=SxdOUGdseq4 LLMは、リファクタリングや理解が難しい「泥の塊」を再現するのが得意みたい。シンプルなコンポーネントを作って、それらが相互作用して複雑な機能を生み出す力がすごく大事なんだ。各コンポーネントは理解しやすく、デバッグもしやすく、パフォーマンスも予測しやすい。複雑な問題をシンプルなコンポーネントとその相互作用に分解する方法を見つけるのがポイントだと思う。LLMがそのスキルを本当に得意になったら、開発者は必要なくなるかもしれないね。

LLMがそのスキルを本当にうまくできるようになったら、開発者はもう必要なくなるってことだと思う。私はこの議論がよくわからない。LLMが「完璧」なソフトウェア開発者になったら、私たちは彼らに24/7であらゆる考えられるソフトウェアを作らせるつもりなの?それを誰が使うの?それとも、すべての医者や電気技師、販売アシスタント、美容師、列車の運転手などが、自分の仕事の上にソフトウェアを開発し始めると思ってるの?もっと可能性が高いのは、数人が人々が抱える問題を見つけて、それを解決するためのソフトウェアを開発する仕事をするってことだね。今日では、そういう人たちをソフトウェア開発者って呼んでる。

でも、彼らに何をするか指示できるよね? LLMが役に立たないと言ってる人と、役に立つと言ってる人の間には大きな違いがあると思う。それは、自分が何が得意で何が苦手かを学び、入力に基づいて出力の質を予測できるかどうかだと思う。例えば、何かを分解する最適な方法についてLLMに意見を聞いて、私が考えていないことを「考え」させて、それを実装するように頼むことがある。全体をゼロから構築するように頼むことはないけどね。

ここ数ヶ月で、かなり懐疑的だったのが、今では普通に使うようになったよ(私の場合はCopilot)。二つの大きな変化があったんだ。まず、私がやりたいタスクに十分なモデルがあることを理解した(Claude Sonnet 3.7と4が私が試した中で一番良かった)。次に、インフラが必要だってこと。Copilotにどう動作させるかを指示するために、約1000語の追加指示を加えたし、それはテスト(これは必須だよね)やサードパーティのドキュメントの上に乗っかってる。エージェントのフリートのことは試してないけど、VS Codeのインスタンス一つで十分だし、変更点を詳しく理解したいから。具体的には、Copilotに変更をさせて、何が壊れたかを見て、それを直して、目標に対してdiffを確認して、変更を簡素化して、繰り返すって流れ。完全に手を離してるよ。

最近、ChatGPT(企業版を雇い主が払ってる)をかなり使ってるんだけど、便利なツールだと思ってる。時間が経つにつれて学んだことは、AIにたくさんのコードを与えない方がいいってこと。孤立した関数や依存関係が少ない小さなクラスに最適だよ。コードを生成したり完成させるように頼んだとき、10%のケースではコードの質が理想的じゃなくて、追加指示で修正できる。25%のケースでは、生成されたコードの質が悪くて、何が悪いかを教えても直らないことがある。そういう時は、AIの出力を無視して、他の合理的なことをするようにしてる。コードを書く以外にも、自分が書いた新しいコードをレビューするのに役立ってる。コメントの半分はクソで無視すべきだし、他のいくつかは疑わしい。でも、AIが実際のバグや重要な問題を指摘して修正案を提案してくれたこともあった。やっぱり、一度にたくさんのページをコピペしない方がいいよ、少しずつやるべき。ニッチな分野(例:HLSLシェーダーやSIMD命令を使ったC++)では、AIはほとんど役に立たないと思う。多分、十分なトレーニングデータがなかったんだろうね。全体的に、ChatGPTは私のコードの質を向上させたと思う。レビューやコメント、生成されたコードの結果だけじゃなくて、ピースごとのコピペ作業が全体のアーキテクチャを改善して、コードベースをクラスや関数、モジュール、インターフェースに分けて、それぞれが自分の役割を果たすようになった。

うん、コードレビューの可能性は大きいね。最近AIを使い始めたけど、かなり便利だよ。小さな部分、例えば関数を書くのを手伝うのに良いと思う。ユニットテストを書くのを手伝ってもらうのにも使ってるけど、そうしないと結構面倒くさいからね。AIのサポートの質は、去年の間にかなり改善されたと思う。だから、以前試したことがあるなら、もう一度挑戦してみて。

最近気づいたんだけど、LLMは特にコーディングに関して、他の多くのタスクでも、流行のダイエット現象の新しいバージョンみたい。人々は本当に手軽で低労力な解決策を求めてるけど、結果を約束してるんだよね。実際にはショートカットなんてなくて、ただトレードオフがあるだけで、みんな最終的にはそれに気づくんだ。

ソフトウェアを構築するためにエージェントを「オーケストレーション」している人たちと、LLMからあまり理想的でない結果を経験している人たちとの二項対立は面白いね。コーディングの生産性に関するLLMは全てが誇大広告だとは思わないけど、「魔法を見る」人たちには、MLMのピッチに引っかかる人たちと似たような幻想があると思う。すべての主張が必ずしも根拠がないわけではないけど、再現性が保証されていないことで、信者には信じる理由が、他の人には懐疑的な理由が生まれる。信者にとって、うまくいかないのは、最適なプロンプトやルール、完璧なコンテキストを提供するスキルの問題だと思われる。結局、これは自分でやるのと同じ回り道じゃない?