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

HNに聞きたい: コーディング用LLMから価値を引き出すのに苦労している人はいませんか?

364日前

概要

  • LLMの活用で日常的な作業効率は大幅に向上
  • 一方で、保守可能な本格的コード生成には課題
  • LLMによるコード品質や一貫性の問題
  • 過度なマイクロマネジメントの必要性と疲労感
  • LLM活用の適切な期待値と使い方の見直し

LLMの日常的な活用と効果

  • 知識適用タスク の自動化による時間短縮
    • 例: Python import構造 の修正アドバイス
    • 例: SQLクエリ の自動生成
    • 例: Ansible接続エラー の原因調査
  • 自己完結型コード の生成やデバッグパートナーとしての有用性
  • 作業効率向上反復作業の削減

本格的なコード生成での課題

  • LLMによるコード生成は 動作するものの、品質や一貫性に課題
  • 保守可能なコードリポジトリのコーディングスタイル への適合が困難
  • 無関係なコメント部分的なリファクタ漏れ など細かな修正が頻発
  • フォーマッター再実行やテスト通過 の指示が必要
  • 多くの反復作業コンテキストスイッチ による疲労

LLMのコード生成は「インターン」のような存在

  • 基本的なプログラミング能力 はあるが、 協業力や自律性 に欠ける印象
  • 常時 細かい指示チェック が必要
  • 高いコード品質基準 を満たすには手間が増大

コード品質とLLM活用の期待値

  • 一部ユーザーは「 品質を気にせずLLMに任せる」という割り切り
  • コード品質・保守性 を重視する場合、現状のLLMでは 追加コスト が発生
  • LLMをどう使うか は目的と期待値次第
    • 一時的・使い捨てコード知識補助 には最適
    • 長期保守コードチーム開発 には現状では不向き

LLMツールの使い方・活用法の見直し

  • ツールの限界 を理解した上で、用途を明確に切り分ける運用
  • コード生成時は「設計・品質チェック」工程を人間が担う前提
  • 反復作業の効率化知識補助 に特化した運用
  • 将来的なLLMの進化カスタマイズ に期待

まとめ

  • LLMは 知識適用・補助作業 には非常に有効
  • 高品質な本格コード生成 には現状課題が多い
  • 期待値の調整適切な用途選択 が成功の鍵
  • 人間のレビュー工程品質管理 は依然として重要

Hackerたちの意見

基本的にはそうだね。「問題」が大きくなりすぎると、LLMはあんまり役に立たなくなる。君が言うように、退屈な作業を自動化するのには最高だよね。例えば、もっと複雑な検索&置換とか。「このインターフェースを満たすメソッドを実装して」とか、メソッドがかなり明白な場合ね。あるいは、「このAPIのリソースセットに対してCRUD操作のスタブを埋めて」みたいな感じ。最近、Claude Opus 4にパッチが終わった後にレビューをお願いしてるんだけど、たまにエラーを見つけてくれるし、自分が本当はやるべきことを促してくれることもある。でも、ある程度の複雑さを超えると、もう役に立たなくなるんだよね。例えば、変更が必要な箇所が複数のファイルにまたがることが多いし、それぞれが結構大きいから、どのファイルを触るべきか慎重に考えないといけない。そうすると、結局自分が何を変えなきゃいけないか分かってくるんだよね。とはいえ、AIを「ラバーダック」プログラマーとして使うのは必ずしも悪くない。基本的には、変更をお願いして、うまくいけばラッキー!もしちょっとランダムだったら、自分でやっちゃう。最初の変更をレビューするのに時間を無駄にしただけで、他のほとんどは自分でパッチを書いても同じことをしなきゃいけなかったからね。それに、ほとんど正しい方向にあるフレームワークを自分のやりたいように修正する方が、ゼロから全部コーディングするよりもずっと楽だと感じることが多い。だから、「これを実装して」と言って、結局ほとんど全部を修正することになっても、自分でゼロから始めるよりは労力が少ない気がする。重要なのは、LLMが明らかに苦労していることを無理にやらせようとはしないこと。時々、仕様が不明瞭で合理的な仮定をしてしまうこともあるけど、何かをやらせてまだ苦労しているなら、自分でそのタスクを終わらせちゃう。

エンジニアには二種類いるよね。一つは、LLMがコーディングのスーパーパワーで、100倍生産性が上がったとか、今までできなかったことを実現してくれるって大絶賛する人たち。もう一つは、君みたいに、すごく気を使わないと平均的な結果すら得られない、非常に手間のかかるプロセスだと感じる人たち。唯一理解できないのは、前者のグループの人たちがどうして市場を完全に支配して、革命的な製品や超高速のイテレーションで競合を圧倒していないのかってこと。

それは、彼らが「エンジニア」というカテゴリーに入るからだよ。地元の郵便配達員やミハエル・シューマッハも「ドライバー」というカテゴリーに入るのと同じようにね。ほとんどの人は技術的に難しいことに取り組んでいるわけじゃないし、大半の問題はビジネスロジックの問題で、技術的には解決できないか、レガシーコードの回避策で、3〜10人のドメインエキスパートを数時間集めて解決する必要があるんだ。

LLMを使うと、だいたい10%くらい生産性が上がる感じがする。これは素晴らしいけど、いくつかの主張に比べるとそんなに極端じゃない。カーソルのオートコンプリートは、どうせ自分が打つつもりだったものをたくさん補完してくれるし、LLMの検索はGoogleの強力な補完になるけど、直接の代替にはならない。数行以上のコードを生成すると、だいたい悪いコードになることが多いけど、知らなかったライブラリを提案してくれることもあるし、特に自分の専門外ではそういうことが多い。中間的な結果について話している人はあまりいないけど、極端な意見が会話を占めているからだと思う。

現実はその中間にあるからね。特定のトイタスクを除けば、100倍や10倍にはならないけど、私の日常の仕事ではおそらく1.5〜2倍くらいだと思う。私は主にロングテールの科学的なことに取り組んでいるから、ボイラープレートが多いフロントエンド開発をしている人ならもっと生産性が上がるかもしれない。LLMが生産性を上げていないと言っている人は、正しく使いこなせていないか、非常に特定のニッチな問題やインフラに取り組んでいて、役に立たない場合が多いと確信している。2倍という数字は、メディアで読んだことに比べると大したことないように思えるかもしれないけど、数年前に企業に「エンジニアの生産性を平均して2倍にできる」と言ったら、今頃は数十億ドルの資金を得ていたかもしれない。そのくらいの生産性の向上は本当に大きいんだ。

Math Academy、ChatGPT、YouTube(主に3Blue1Brownや似たようなチャンネル)で数学を学んでるよ。この組み合わせがなかったら、マジで地獄だったと思う。今はいい感じ。数年前はアムステルダム大学の似たようなものでやってたけど、その頃のChatGPTはあんまり賢くなかったから使わなかった。もっと大変だった気がする。ChatGPTは、先生が「何言ってんの?」って思うような質問にも答えてくれるけど、俺は数学の文化を理解したいタイプだから、それを通じて解決策を考えられるんだ。例えば、角度の話をする時にmっていう文字が使われる理由とか。数学的には関係ないはずなのに、aの方がしっくりくると思う。認知負担を減らして、数学に集中したいからね。だからChatGPTに聞いてみたら、歴史的には「measure」を意味してたって言ってた。なるほど、理解できたから、また実際の数学に集中できるようになったよ。もう一つの例は、分散の計算。average_of_squares - square_of_the_averageが(1/n) * sum((x - mean)^2)からどう来るのか?それをただ見せてくれる。世界征服?いや、でも普段なら学べないことを学んでるよ。YouTubeとMath Academyがそれぞれ役割を果たしてるのは分かるよね。

LLMは新しいプロジェクトに対して100倍生産的だと思う。もしXページのReactアプリを作りたいなら、Reduxストアや認証なども含めて、数分で作れる。例えば「今Xを追加して」って言えば、ちゃんとやってくれる。結果もだいたい良いし。でも、既存のシステムを維持したり、複雑な機能を追加したり、ビジネスドメインの詳細を知る必要がある時は、LLMはあんまり役に立たない。コードの提案ツールとしてはまだ良いけど、全体の機能を提供するには、簡単な部分を超えるとほとんど役に立たない。LLMを指示するのにかかる時間は、自分で書くのと同じくらいかかることもある。俺は、好きなデザインのスタブコードを書いてから、LLMに隙間を埋めてもらうことが多い。LLMが100倍生産的だって言ってる人は、たぶん新しいプロジェクトだけやってて、難しい部分にはまだ到達してないんだろうね。みんなが言うように、最初の90%は簡単な部分。最後の10%が一番時間がかかるところで、今のところLLMがその難しい部分をうまくやってるとは思えない。

ちょっと皮肉っぽいけど、私の経験では、100倍生産的な人たちは小さな数字を100倍にしてるだけだと思う。コーディングのリサーチフェーズではLLMがすごく役立つことが多い。先週、ドメイン特有の線形代数を書く必要があって、他の制約のせいでLAPACKを使えなかったから、手作業でやらなきゃいけなかった(そう、こういうのは手作業でやるべきじゃないって分かってるけど、小さな部分だったし、ドメイン的には完全に最適化されたLAPACKは必要なかった)。LLMを使ってリサーチ部分をやったら、普段は数冊の数学の教科書を使わなきゃ理解できなかったことを理解できたから、その場合は100倍効果的だった。必要な情報を見つけて、要約してくれたから、すぐにコードに変換できた。ついでに、LLMにコードを生成してもらったけど、専門家でないと分からないような微妙なミスがあった。ジュニアエンジニアなら感心してそのままチェックインしてしまうかもしれない。私は、自分がチェックインするコードのすべてを理解することが大事だと思ってるから、たとえLLMが本当に優秀になったとしても、私の仕事の「コードを書く」部分は早くならないと思う。でも、どのコードを書くかを考えるのに関しては、LLMが人々をもっと早くすると思う。リサーチと要約の部分は素晴らしい。世界での本当の価値は、合成と新しいアイデアだと思う。もしかしたら私はルダイトかもしれないけど、それには人間の創造性が必要だと思ってる。LLMは重要なサポート構造になるけど、高価値のコードを書くことにはまだ懐疑的だ。

エンジニアには2種類いるらしいけど、実際には少なくとも3種類あると思う。俺はそのどちらにも当てはまらないから。生産性が100倍になるわけでもないし、特別なサポートを受けてるわけでもない。プロとしてコードを書いて30年近く経つけど、常に何かを調べる必要があるのは変わらない。自分が何をしたいのか、何が可能なのかは分かってるけど、文法や具体的なことを覚えておくのが苦手なんだ。言語を頻繁に切り替える仕事をしていることもあって、余計に覚えられない。Googleみたいな質の高い検索エンジンがなかった頃は、参考書やマニュアルをめくるのが常だった。それが検索エンジンが登場して、少しは生産性が上がった。さらにSOみたいなサイトが出てきて、また一歩進んだ感じ。LLMもまた一歩前進だと思うけど、量子的な飛躍ってわけじゃない。例えばオートコンプリートの提案なんかは、時には思い出すきっかけになることもあるし、逆に自分が求めてるものじゃないと分かって無視することもある。チャットインターフェースは、SOをググるよりもやり取りができるから便利だと思う。

マクロな視点で見ると、前者のグループの人たちは思っているよりも良い状況かもしれない。LLMが登場してから、俺はシニアIIからリードアーキテクト、そしてプリンシパルエンジニアに昇進した。文字通り100倍の生産性アップってわけじゃないけど、特定の知識が足りないところを補ったり、新しい分野を調べるときの最初の接点として活用してきた。LLMのおかげで、T字型の知識の曲線を深めることで、自分の影響力を広げられた。

俺の予想では、何を扱うかによると思う。見栄えのいいウェブサイトやランディングページを作る能力には感心してるけど、ゲームを作ろうとしたら、動いているように見えても、最終的には自分のコードベースに混乱をきたして、昨日の要件が今日の機能追加で失われたり壊れたりすることが多い。まるで自分の尻尾を追いかけているような感じで、いわゆる「バイブコーディング」ってやつだ。ゲーム開発は今後ハイブリッドアプローチになると思う。新しいプロジェクトを作成して、提案された解決策を見てから、自分のメインのコードブランチに取り入れるつもり。これがカーソルのロールバックや提案された編集に過度に慎重になるよりも簡単だと思う。まだこの考えに至ったばかりだから、うまくいくかはこれからだ。ちなみに、プログラミング自体は得意だけど、ゲーム開発は俺のアキレス腱なんだ。どうなるか見てみよう。

たとえ誰かがAIを使って100倍速く作業しても、それが既存の市場を簡単に支配できるわけじゃない。製品は単なるコード以上のものであり、会社も従業員数だけではない。製品や市場に関するドメイン知識が必要だし、働く人の個々の能力や、長年にわたって育まれた構造の強さも関係している。ユーザーの習慣や信頼は、新しい製品が征服しなければならない大きな要塞だ。これは、ランダムな開発者や開発チームが100倍速くなるだけで簡単に達成できるものではない。現実的には、この主張がどこから来ているのかという疑問もある。AIを使って100倍速くなる人は、高い能力を持っているわけではないかもしれない。100倍のうち、90倍はおそらくピークの開発者とのギャップを埋めるためのものだろう。だから、最終的には特定の分野で高い能力を持つ開発者と同じくらい生産的になると思う。ただ、特定の分野での経験がなくても、どの分野にもアクセスしやすくなるだけだ。正直言って、AIなしでも、他の人がコピーしたり、クッキー型のものを作ったりしているから、すでにそれに近い状態だと思う。

新しいことを学ぶとき、例えば新しいライブラリやAPI、新しい言語のときにLLMがすごく役立つと思う。OpenGLでテキストをレンダリングする方法をLLMに聞く方が、ひどいドキュメントを何時間も読むよりずっと早いからね。それに、テンプレートがない繰り返しのボイラープレートがたくさんあるときも助かる。でも、私が「仕事」と考える部分、つまり自分が作っている製品に特有のコードベースの部分については、LLMにコードを書かせるという意味ではあまり価値を感じないことが多い。シニアエンジニアとしての時間のほとんどは、実際にはコードを書くことに費やされているわけじゃないと気づいたこともある。コードを書くこと自体は、私にとっては難しい部分でも時間がかかる部分でもないんだ。正しいアーキテクチャを考えたり、他の人の混乱したコードを適切にリファクタリングしたり、パフォーマンスの問題を見つけたり、珍しいバグをデバッグしたりすることが本当に大変なんだ。確かに、LLMはボイラープレートを書くプロセスを加速してくれるけど、もし毎週新しい製品をゼロから作っているわけじゃないなら、実際にどれだけボイラープレートを書いているのか考えてみて!もし「たくさん」と答えるなら、LLMに頼らずその問題を解決する方法を考えてみるべきかも。

銀の弾丸はないよ。概念化が難しい部分だって、君が言う通りだね。「神話の人月」は重要なテキストで、もっと研究されるべきだと思う。

新しいことを学ぶとき、例えば新しいライブラリやAPI、新しい言語のときにLLMがすごく役立つと思う。OpenGLでテキストをレンダリングする方法をLLMに聞く方が、ひどいドキュメントを何時間も読むよりずっと早いからね。LLMはひどいドキュメントを読むのが平均的なプログラマーより得意だよね。そういう意味では、「難解なテキストを読み解いてより良く説明する」っていうのは明らかに価値があると思う。 > もし「たくさん」と答えるなら、LLMに頼らずその問題を解決する方法を考えてみるべきかも。ボイラープレートが多い言語ってない?

銀の弾丸なんてないよね。私たちの分野で、フレッド・ブルックスのこのシンプルなアドバイスを何度も忘れるのがすごいと思う。私の経験では、LLMはコーディングにおいてはかなり役立つし、誇張した期待を持たずに使うと問題も少ない。バグのあるコードで訓練されてるから、当然バグのあるコードを生成するよね。ほとんどのコードはバグがあるから、デザインを任せるのはダメ。機能分解を使って、自分で宿題をしてからLLMを使って手間を減らす、退屈な作業を処理する、未知の領域を案内してもらうのがいい。でも、LLMを使っても、自分の名前がついてるコードを理解する必要はなくならない。もしLLMが生成したコードが完璧だと思ったら、欠陥があるかもしれないから、自分の知識やスキルを向上させる必要がある。常に疑って、盲目的に信じないように。

同感!私もいろんな使い方でLLMを使ってる—小さなトラブルシューティングタスクや、簡単なシェルスクリプト、コーディング、質問をする時とか。いろんなツールを使ってるよ。プライベートなタスクには、主にClaudeやOpenAIを使ってるし、時々GoogleやPerplexityも使う。ビジネス目的では、VSCode内のCopilotか、社内プラットフォームを通じてClaude、OpenAI、Googleを使ってる。Copilot Studioも少し試してみた。こんな感じで約1年半働いてるけど、ずっと全てのツールにアクセスできたわけじゃない。今のところ言えるのは、はい、LLMは私の生産性を上げてくれたってこと。いろんなプログラミング言語を試してるのが楽しいし、いろんなトピックの理解が深まってるから、確かにいくつかのことが楽になった。でも、モデルやバージョンに関係なく、すごくイライラすることも多い。タスクが複雑になるほど、よく知られた道から外れるし、単純なコンポーネントを組み合わせるだけじゃなくなると、失敗することが多い。さらに言うと、LLMが作った混乱を修正するのにかかる時間は、最初に節約できた時間よりも多いこともある。今の正直な結論は、LLMは小さなコード補完タスクやトラブルシューティング、説明には役立つけど、それ以上は期待できないってこと。私たちの仕事を奪うことはないよ。

あなたと似たような経験をしてるよ。いくつかの価値を見つけた:- 人気のUIライブラリを使っていると、比較的自己完結したReactコンポーネントやページを作るのが結構得意 - 明確に定義された純粋な関数を作るのが信頼できるし、それが正しいかどうかを検証するのが楽 - 人気のフレームワークでのボイラープレートには向いてることもある。人々が超強力なエンドツーエンドの体験を報告しているのを見て、正直頭がおかしくなりそう。日常の使用では、そんなものは見たことがない。完全な機能には全く役に立たない。Aiderを使ってみたけど、みんなが好きだって言うのに、私にはただの災難だった。Next.jsアプリで、比較的シンプルなテンプレートメール機能を実装したかったんだけど、これが一日かかるようなこと。想像できる一番典型的な開発シナリオの一つだよ。機能を完全に説明したら、Aiderは全くダメで、近くにも行かなかった。それで、サブ機能を一つずつ説明したら、少しはうまくいった。でも、どんどん追加していくと、既存の部分が壊れ始めて、問題をAiderに説明したら、毎回悪化していった。手動で修正しようとしたけど、コードがめちゃくちゃだった。

LLMはたくさんのことを知ってるけど、知識は比較的浅いと思ってる。自分が知らないこと、例えば慣れてないフレームワークやライブラリに関してはすごく役立つ。だいたい必要なコードを近似的に提供してくれるけど、かなり修正が必要になることが多い。それを基にして作業を進めることができる。LLMに初期の解決策をコーディングさせるのは、すぐにドキュメントを読むより効率的なことも多い。ドキュメントを読む必要はあるけど、見始める頃には何を調べるべきか分かってるし、頭の中に実行可能なアプローチがある。もし自分が何かを作る方法を正確に知ってるなら、LLMはあんまり役立たないけど、時々は自分では考えつかないような巧妙なアルゴリズムを提案してくれることもある。エンジニアとしてある程度の経験がある人には、すでに自分のコードの書き方があって、LLMはそれとは違うものだと思う。いろんなタスクでLLMを試すように自分を強制する必要がある。時間が経つにつれて、LLMを理解し、ワークフローに統合するのが上手くなっていく。

私が働いている会社でGitHub Copilotが導入されたけど、正直あんまり期待外れだった。私たちにはたくさんの自作フレームワークがあって、それについては全く知らない(まあ、実際には知ることはできないんだけど)。あるコードの一部を説明してもらったら、JavaDocに書いてあることをほぼそのまま繰り返しただけだった。明らかにnullの問題があるクラスがあって、それを修正してもらったら、かなり無駄な「nullじゃないか確認しなきゃ」みたいなコメントがたくさん入ってきた。

LLMは、幅広いタスクに取り組む人にはスーパーパワーを与えてくれるけど、特定の分野に精通していてそこから外れない人にはあまり効果的じゃない。例えば、プロジェクトごとに一度だけDockerfileを書くときに、社内にデプロイメントエンジニアみたいな専門家がいない場合、LLMを使って書くのは素晴らしい。文法エラーや他の小さな問題の回答をGoogleより早く得られるのもいいし、アーキテクチャのトレードオフについてLLMと議論してその分析を得るのも役立つ(でも最終的な決定は自分でね)。一般的に、LLMを使うときはプロンプトで制約をかけて、無駄なことをしないように注意が必要。LLMは時々存在しないAPIを妄想したりするから、反復が必要になることも多いけど、反復することで速くなることもある。

例えば、プロジェクトごとに一度だけDockerfileを書くときに、社内にデプロイメントエンジニアみたいな専門家がいない場合、LLMを使って書くのは素晴らしい。これを聞いて思い出したのが、ゲルマンアムネジア効果だ: https://en.m.wikipedia.org/wiki/Gell-Mann_amnesia_effect 基本的に、問題の領域を理解していると、LLMが生成するものがクソだってことが分かる。OPが言うように、自分の名前を付けたくないようなものだ。でも、知らない領域に入ると、LLMのクソさを忘れて、雰囲気で進めてしまう。

経験があまりない分野では多くの価値を感じているけど、ほとんどの場合は最終版を書くのは自分なんだ。商業ソフトウェアを作っているわけじゃないし、今は商業的な仕事もしていないから、クレジットのことでちょっと苦労してる。そうじゃなければ、たぶん1日40〜100ドル使ってしまうだろうな。