LLMを使ったコード生成の裏側に迫る!私のワークフローとは?
引用元:https://news.ycombinator.com/item?id=43094006
LLMはグリーンフィールドプロジェクトには最適だよね。新しいアイデアのプロトタイプを作るのはどんなツールよりも早い。ただ既存のコードに手を加えたりリファクタリングするときは、コンテキストが欠けていて余計な複雑さを招くことが多いんだ。解決策にたどり着いても、結局自分でじっくりやった方が早いこともある。LLMは自分のコードを理解する代わりにはならない。
全くその通りだね。大体のLLMは複雑な解決策にすぐ飛びつくし、生成されたコードは自分が書いた方が維持しやすいことが多い。でも複雑なコードだけが問題なわけじゃなく、技術的負債も急速に蓄積されるんだ。LLMは良さそうに見える抽象化やデザインパターンを生成するけど、それが問題に合ってないことがある。Sandi Metzが言ってたことを思い出すよ。>「パターンを守るという約束があって、良いパターンならコードが良くなるけど、悪いパターンなら問題が悪化する。」間違った抽象化でコードを急速に生成するのは、見た目には生産性が高く感じるんだ。
じゃあ、なんで間違った抽象化を追いかけたり、根本的に理解してないものを作ろうとするの?まあ、自分も複雑なシステムを作ったことあるよ。GuishっていうUnixパイプラインを構築するCLI/GUIや、WebDSLっていうCベースのDSLを使ったウェブアプリとか。
軽く言うけど、そのコードベースはすごく小さいね。大きなコードベースでの経験は、また違うんだよ。全体を把握するのが難しいし、何十人もの人たちと連携するのも難しい。そんな環境では、整合性が重要だけど、過剰になることもある。
LLMはスキルの問題だと思ってみるといいよ。コードベースをドキュメント化したり、孤立したコンポーネントをテストしたり、スパゲティコードをモジュラーチャンクにリファクタリングするのに使えるんだ。グリーンフィールドプロジェクトは、ガイドなしで進めるとすぐにメッセージになる。
>新しいコードを生成するスピードでレガシー化することになる。
LLMコーディングはUnix哲学に合ってると思うよ。小さなコンポーネントに分けられる高いモジュール性があるシステムには最適だね。
モジュール化はLLMがあってもなくても助かるね。テストもしやすいし、過負荷も減るし、新しい人を教育するのも早くなる。これを使ってオンボーディングの障壁を測れそうな気がする。もし混乱してクソみたいな提案を生成したら、次のジュニアが困るところのいいシグナルかもしれない。
その通りだけど、コードベースが複雑すぎるってことでもあるよ。一定のサイズを超えると、人間が理解するのも難しくなるからね。でも、モジュール化を心掛けることで、自分のコードもLLMにも役立つと感じた。
微妙な変更も持ち込まれることがあるよ。最近、o1を使ってPythonノートブックからコードを引っこ抜いたんだけど、ほぼ正しくできたんだ。でも、外部ソースから情報を探すために使った文字列の末尾から2文字が消えちゃってて、そのせいで環境の問題かと思っちゃったんだ。結局、ノートブックと抽出したコードを並べて全ての行を確認して、元のセルから手動でコピーした方が早かったかもしれない。
LLMがそうするのは見たことあるから、ローカルでもいいからgitリポジトリ作って、変更点を比べるようにしてる。そうすることで、LLMが本来の作業とは無関係なことを変更するのを捕まえやすいからね。
LLMを使ってコードを理解することができるよ。
同意するけど、既存の大きなプロジェクトで問題があって、128kのコンテキストウィンドウに収まらないことがある。特に自分が書いたわけじゃないレガシーなコードの場合、AIの助けがあればすごく助かる。
最初に自分に質問するように言ったのが、自分でプロンプトやコンテキストを作るよりもずっと効果的だった。こういう逆の発想には自分では気づかなかったよ。
これが俺のワークフローの大部分のカギにもなってる。最初のメッセージの最後に“理解を深めるために5つまで質問して”って付けることが多い。時間が経つにつれて、自分がいつも省いてしまう情報のパターンに気づけたし、考えてなかった面にも気づけるようになった。
正直、こういう習慣を身につけることは他のエンジニアとのコミュニケーションにも役立つかも。
L5からL7への昇格が確定した。
大きな疑問だけど、どのレベルがGPTに置き換わるのが早いかだね。
うん!例のプロンプトは役に立つよ。これでこの習慣を自分のワークフローに取り入れるのが楽になったし、良いプロンプトのライブラリを作って、TextExpanderのスニペットにできる希望が持てた。P.S. Insane Clown Posseのリファレンスに特別ボーナス!
o1-proの深いリサーチ機能が一つの大きな利点で、新しいプロンプトを送った後に良い質問をいくつかしてくれる。個人的にはモデルにTODOリストを生成させるのがいいアイデアだと思った。
最初のプロンプトに『何か質問があれば聞いてね』って入れるのがいい感じ。でも大きいリクエストのときは、やりとりして内容をまとめる流れができて、その後に解決策を提示してくれるよ。 やってみたけど、これはホントにいい戦略だよ! 最後の孤独な時間は危険信号かな。プロジェクトがうまくいってないときに、無駄な作業をして時間を浪費してるだけに見える。LLMで遊ぶのは楽しいけど、実際には具体的な目標があると失敗することが多い。実際、既存のコードを探す方が生産的だと思うよ。 LLMって、Emacsの設定をいじる新しい感じなんだね。 昔はEmacsの設定いじってたけど、今はLLMにやってもらうのが新しいトレンド! LLMでのコーディングは時間を節約できるって言われるけど、実際はうまくいかないことばかり。結局、自分でプログラミングを学ぶ時間を使った方が良いって思うよ。 確かに、自己成長にちょっと時間をかけることで、LLMを使うよりもずっと効率的になることがあるよ。具体的なプロンプトにするための練習が必要だね。 車も同じで、時間を節約できるって言われてるけど、運転がうまくいかないと逆に非生産的。自分の体力を高めた方がいいんじゃない? 確かに、LLMが本当に役立つツールかどうかわからない。車とは違って、操作が複雑で分かりにくい。あなたの比喩はあまり助けにならないね。 問題に詰まったときは、自分に質問を投げかけて考えるのが好き。LLMと一緒だと、その過程がいいドキュメントになるし、問題の本質を理解する助けにもなるよ。 分かるけど、俺はOneNoteや会社のウィキ、それに物理的な付箋使ってるからな。LLMからのフィードバックの価値はエンタメ以外感じないなー。 コードがコンパイルされるのを待つ感じだな、npmが改善される前のnode_modulesがインストールされるのを待ってるみたい。 >“常に全体をクリーンビルドするプロジェクトは、ダウンタイムも与えつつ前進する感覚をもたらす。”うわ、マジで考えてるね。君のアイデアは面白くて、ニュースレターに登録したいわ。 このやり方をちゃんと活用してる記事は初めてだわ。著者が時間と労力をかけて分かりやすく解説してくれたのがありがたい。多くの人は言語モデルを使いこなす練習が足りてないだけだと思う。適切に使うためには人間もまだ学ぶ必要がある。著者がLLMとのコミュニケーションをマスターしてるのが分かるわ。ここでのワークフローは素晴らしいから、AIderやrepomixに興味ある。 >“著者が時間と労力をかけて分かりやすく解説してくれたのがありがたい。”正直言って、著者は記事を書く際にクッキークリッカーやってたんじゃね? Cursorチャットからこのワークフローに進化した人、実際の改善例持ってる?計画にかけた時間って役立つ?ハルシネーションが減った?全体的に時間を節約できた?今の俺のワークフローは、アイデアを考えてnext-appを作り、Cursor Composerで音声転写してる感じ。著者のワークフローも試してみるけど、他の意見も聞いてみたい。 もしそれを進めて標準ライブラリを構築すれば、より良い結果が得られる。参考にしてみて: https://ghuntley.com/stdlib >“このアドバイスを無料であげるのはためらう。”業界内のリストラが多いから、シェアしないのも無理ないよね、シェアしてくれてありがとう。 ほんとに彼らは何してるの?5時に起きることも知らないんじゃ。業界ツールの議論から利益を得ないことが苦労しなきゃいけないなんて悲しい話だな。 これがレイオフに関してどう助けになるのか、逆に悪化しない? ghuntlyは他の人よりも価値を提供できればいいってこと。だから、ghuntlyがこのトリックを知ってれば、他の人が解雇されるって寸法。トリックを共有すれば、ghuntlyも他の社員を出し抜かなきゃいけなくなるけどね。 このワークフローを追ってるけど、Cursorは使ってない。Emacsとgptelを使った自作システムに取り入れてるよ。スタイルガイドも詳細に作って、推奨された標準ライブラリも構築中。書いてくれてありがとう! アドバイスありがとう。他のツールで使い始めてるけど、ここでのこの一文は急に出てきた感じで意味が不明だね:>”現在の基盤となるLLMモデルはおそらく45%の精度で、頻繁な調整が必要です。” ルールが頻繁な調整に入るの?それとも君の現在のワークフローの精度のこと? その規則の70%は、dotファイルやエディタ設定のように共有するといいかも。 Aider+AI生成マップや内部モジュール用のユーザーガイドがうまくいってる。今日、自作のスクリプトでGemini 2 Flashを使って、コードベースの各モジュールの説明を作成した。Aiderのリポジトリマップは俺には合わないから無効にしてるけど、これがうまくいくと思う。 LLMがドキュメント習慣を改善させてる。実際、多くの言語ではコメントからAPIドキュメントの生成が可能だ。これを整形してファイルにまとめてもいいかも。 うん、そうだね。このコードベースはJavaとKotlinのミックスで、内部コードは何年も前からJavadocs/KDocsでしっかりドキュメントしてるから、Geminiが正確なマップを作れる理由もそこにある。 Cursorで自動生成されたAPIドキュメントをインデックスするのがすごくうまくいってる。新しい実装やコード修正のために、ライブラリのガイドやmdbookもインデックスしてるよ。 AiderとAI生成マップ、ユーザーガイドの組み合わせ、どうやるの?特にAI生成マップが気になる! カスタムスクリプトを使ってソースファイルを選び、ライセンスヘッダーを削除して結合。<source_file name=”foo/bar/Baz.java”>… 基本に立ち返っているよ。小さな.cursorrulesファイルで自分の構築したいものと技術スタックを説明。 オレも同じこと考えてた。大きなファイルはコピペで、短いファイルはまとめて追加。アクセスするコンテキストを常に供給して、良いソリューションを見つけてる。 今週再構築して学んだことは、意見の強いフレームワークをプロジェクトに加えない方がいい。これはモデルが把握すべき文脈を増やすから。 職人フレームワークの終わりだね、それも良い方向へ。 プログラミングを簡単にしていた多くの抽象化が終わるかも。でも、専門のコード生成モデルはもっと効率的に低レベルのコードを出力できるようになるはず。 同意できないな。一部の抽象化は重要で、目的と複雑さを簡潔に伝えるためには必要だから。次に読んでくれる人のために、自己説明的なコードがベスト。 君のコメントについて考えたけど、両方正しいと思う。コンピュータは問題解決を人間とは違う方法で行うべきだ。 これだ!未来のプログラミング言語デザイナーは、モデルやハードウェアを考慮しつつ、どれくらい低レベルであるべきか考えている。 新しい木工のキャリアにワクワクしてるけど、これが現実になったらいいな。LLMは本当にアートを吸い取ってる気がする。 開発者はLLMに熱狂してるのに、作者やイラストレーターは避けてるのを見ると、コーディングはアートじゃなかったんだなって思う。コードは目的の障害に過ぎなくて、コード自体を楽しむ人は少数派だよ。 尊敬されるプロが理解してないコードを出すわけないよね。LLMは知られた言語やライブラリを使ってコードを生成すべきだと思う。 今はそうかもしれないけど、いずれソフトウェアがプログラマーよりも上手にコードを書く時代が来ると思う。あなたはCMOSイメージセンサーに施されるバイアフィルターについて二度考えたりする? 新しいプロジェクト始めた時にEdgeDB使ったんだけど、彼らのタイプスクリプトのクエリビルダーをLLMが理解できなくて困った。 個人開発者には良いかもしれないけど、チームで同じコードベースを作業するのはどうなるの?同じ分析をする7つのLLMがあっても、経済的に無駄だし危険だと思う。チーム用にコードベースのContextを集中管理する製品ってあるのかな? この投稿を読むとき、‘人間’を’LLM’に置き換えてる。7人の人間で同じコードベースを分析するのも無駄じゃない? 彼らは同じコードベースを分析してるわけじゃなく、それぞれ自分のドメインで貢献してる。ある人へのLLMの助言は、他の開発者にもリアルタイムで一貫性が求められると思う。 最近Cursorに切り替えたばかりだけど、埋め込まれたインデックスが他のメンバーと共有されるって言われても、他のメンバーがそのリポジトリにアクセスできるかは不明だね。インデックスが時間かかった気がするから、ちょっと勘違いしてるかも。 CodyやSourcegraphは、チームや企業向けに作業領域を提供してるみたい。多分これらの理由から。 プログラミングの設計と実行計画を忘れがちな新しいプログラマーが多いよね。エlegantなコードにこだわるんじゃなくて、こういう基盤を意識することでサイドプロジェクトが進んだんだ。LLMを使うコツは、質問を通じて仕様や実行計画を作らせることだね。これがLLMに受け継がれたら、我々は強化されたテスター・アナリストになっちゃうかも。 同じ経験をしたけど、俺は自分でエラーを直すよ。LLMは間違ったコードを沢山生成するから、結果として一度コードを見る必要があるんだ。単にLLMを使うためにコードを書くのは無駄だなって感じたこともあるよ。 この作業の費用についてもっと詳しい情報があったらいいな。特にリポジトリミックスを使ってたくさんのトークンをロードしてからコード生成すると、高コストになるかも。Aiderにおけるコスト評価についての投稿があれば嬉しい。 LLMを長く使ってきたけど、このプロンプトのアイデアは素晴らしいね。自分では考えつかないアイデアや質問を引き出してくれるから、学びがいっぱい。手順を踏んでアイデアを検証してくれたこともあって、本当に驚いた。プログラミングは好きだけど、『実行』の部分はやらないつもり。 いいね、偶然自分もワークフローについてブログを書いたんだ!あなたのワークフローはとても洗練されてて、次のプロジェクトで試すよ。 “claudeにプロンプトをペーストして、claude.aiからIDEにコピペする”のが洗練されてるって?何かの作業にしては質素じゃない? だいたいそんな感じ。Cursorを初めて使ったばかりで、まだまだ初心者で学びたいんだ。 これには思わず笑っちゃったよ、ありがとう! うまくいったら教えて! あなたのブログがクラッシュしたみたい、読みたかったのに。 修正してくれてありがとう ’do not hallucinate’ってプロンプトに書くとハルシネーションを防げるのかな?気になるなぁもっとコメントを表示(1)
もっとコメントを表示(2)
</source_file>のように。モデルの文脈ウィンドウに収まるようにチャンクして、要約を生成するプロンプトを送る。
DEVELOPMENT.mdファイルでTODOリストも作成してる。もっとコメントを表示(3)