LLMとともにプログラミングする方法
(crawshaw.io)- 過去1年間の、LLM(大規模言語モデル)を使ったプログラミング経験を要約した文章
- LLMは生産性を高めており、これを使わないプログラミングに戻るのは難しい
- 主にGoのプログラミング環境に焦点を当て、sketch.dev というツールを開発中
背景
- 新しい技術への好奇心から始まった。
- LLMが質問に対する複雑な回答を生成したり、プログラミングコードを書いたりできる能力に魅了された
- インターネットが初めて登場したときに似た興奮と可能性を感じさせる
- ツールが「だいたい正しい」コードを生成するときに得られる純利益を確認し、これを実用的に活用しようと努力
主なユースケース
-
自動補完 (Autocomplete)
- 頻繁に繰り返されるコーディング作業を自動補完で処理し、生産性を向上
- とくにFIM(Fill-In-the-Middle)モデルは日常的な作業で不可欠
-
検索の代替 (Search)
- 特定のプログラミングに関する質問(例: CSSでボタンの透明度を設定)に、検索エンジンより正確に答える
- LLMの回答が間違っていることもあるが、そのような限界を受け入れて使っている
-
対話型プログラミング (Chat-driven Programming)
- 最も難しい一方で、最も価値のある領域。
- 新しいファイルの作成、ライブラリの検索などの初期作業を代わりに実行。
- 対話型プログラミングの目標は、現在の不便さを減らし、LLMの能力をよりユーザーフレンドリーにすること
対話型プログラミングの核心
-
なぜ対話を使うのか?
- 一日が進んでエネルギーが落ちてきたとき、最初の草案を出してもらうのに有用
- 最初の草案を見て修正するほうが、最初から書くより効率的
-
LLMとの作業方法
- 明確で簡潔な作業目標を設定
- コードを読み、検証し、修正する
- コンパイラエラーを活用して素早く問題を解決
-
効果的なテスト作成
- LLMはテスト作成に積極的で、より徹底したテスト環境を構築できる
- 例ベースのテストだけでなく、ファズテスト(fuzz test)へ拡張可能
例: 分位サンプラー
- 目標: Go言語でデータストリームの四分位数をサンプリングするアルゴリズムを書く
- プロセス
- LLMを通じて最初の草案を作成
- コンパイルエラーを修正しながらコードを改善
- テストコードを書き直し、より読みやすい構造を作成
新しいコード構造の可能性
-
より小さなパッケージ、より多くのテスト
- 小さなパッケージはコードの文脈を明確に提供し、LLMにも人間にもより有用
- 独立したテストとコンパイル可能性を高める
-
例: APIラッパー
- 大規模な公式ライブラリの代わりに、必要な部分だけを実装する薄いラッパーの使用を推奨
- 保守および学習コストを削減
今後の方向性: sketch.dev
- LLMのためのGo IDE
- LLM中心のプログラミング環境を提供
- 自動化されたテストフィードバック、コンパイラエラーの修正、Goモジュール統合などをサポート
- 人間とLLMの協力を強化し、より生産的な環境を提供
1件のコメント
Hacker Newsの意見
著者はすでに世界水準のソフトウェアエンジニアであり、Googleの元社員で、Tailscaleの共同創業者/CTOでもある。LLMsが彼の生産性をさらに高めている点が印象的。
LLMsは作業を始めるためのエネルギーを減らしてくれる。
LLMsを使うときは、自分がよく知っている分野でのみ使うべき。
LLMsはソフトウェア開発ツールとしての可能性がある。
検索エンジンの利用と似ている。
LLMsを使いたいという強い気持ちは感じない。
プログラマーではない人にとって、LLMsは大いに役立つ。
簡単なアプリケーションを書くのにLLMsは有用。
趣味でプログラミングをする人にとって、LLMsは助けになる。
LLMsは主に自動補完と検索に使われている。