KarpathyのLLMコーディングルール:Think、Simplify、そしてIterate
アンドレイ・カルパティのLLMコーディングルール:Think、Simplify、そしてIterate
Claudeのような大型言語モデルは、コード生成に大きな利点がありますが、乱雑で過剰設計、あるいは誤った結果を生むこともあります。分野の先駆者アンドレイ・カルパティは、彼の観察を4つの原則に凝縮し、開発者がClaudeで信頼性の高いクリーンなコードを書けるようにしました。本チュートリアルでは、各ルールを詳しく解説し、その重要性を説明し、ガイドラインを自身のワークフローに組み込む方法を示します。
1. コーディング前に考える
目標: 仮定を浮き上がらせ、曖昧さを明確にし、安全な判断がある場合は遠慮なく指摘します。
Claudeがタスクを読む際、よく推論して解釈し、質問せずに進んでしまいます。これが隠れた混乱や誤ったトレードオフにつながる可能性があります。
- 仮定を明確に示す:プロンプトの先頭に短いリストで想定を記載します。
- 確認を求める:要件が曖昧な場合、まずユーザーに質問を生成します。
- 代替案を提示する:一つに固執せず、複数の実行可能なアプローチを用意します。
- 不明点があれば停止:不明点を名示し、コードを書く前に追加のコンテキストを要求します。
実践的なヒント:生成したファイルの先頭にコメントブロックを追加し、仮定と選択した戦略の概要を簡潔に記載します。
2. Simplicity First(シンプルさ優先)
目標: 仕様を満たす最も単純なコードを優先します。
Claudeはすべての可能な抽象化を探求するのが好きで、50行で済むはずが1,000行になることもあります。シンプルさは将来の開発者の認知負荷を低減し、バグの表面積を削減します。
- 不要な機能を削除:仕様に明示的に要求されない限り、オプション引数を追加しません。
- 汎用インフラを避ける:小さなヘルパー関数で問題が解決できるならそれを書き、余計にクラスを作成しない。
- エラーハンドリングは現実的に:実際に起こり得るエラー経路のみを扱い、不可能な状態を想定しない。
- 「200行を超えたら50行にリファクタ」原則を適用:コードが200行を超える場合はリファクタリングまたは削減します。
Senior Engineer Testを使用してください:シニアエンジニアはこのコードが過剰に複雑だと語りますか? もしそうなら簡素化してください。
3. Surgical Changes(外科的変更)
目標: ユーザーが明示的に要求した変更のみを行います。
既存コードを微調整するとき、Claudeはしばしば関連のないセクションまで影響を及ぼし、コメントや既存コードをリファクタリングしてしまうことがあります。
- 関連のないコードには触れない:依頼に直接関係する行だけを変更します。
- スタイルを守る:プロジェクトのスタイルガイドを保持し、既存パターンを模倣します。
- 既存のゴミコードを削除しない:孤立した関数を発見したら、要望がない限り削除せずにそのままにします。
- 後片付けを忘れない:変更で未使用になったインポートや変数を削除します。
変更後はdiffレビューを繰り返し、期待しない修正がないか確認します。
4. Goal‑Driven Execution(ゴール駆動型実行)
目標: 明確な成功基準を定義し、検証されるまでループします。
この原則は、検証可能な条件が満たされるまで繰り返すClaudeの強みを活かします。命令的な指示ではなく、望ましい最終状態を明示します。
- ゴールを記述:例:「入力検証を追加し、エラーメッセージをAPIレスポンスで公開する」
- 検証手順を定義:"空入力のユニットテストを作成し、失敗を確認。検証ロジックを追加し、再実行で成功を確認。"
- 短い計画を作成:ステップごとのチェックポイントを設けます。
- ループ:各変更後にClaudeにテスト実行や評価を依頼します。
擬似コード例:
1. 空入力用ユニットテストを追加 → 失敗を確認。
2. 検証ロジックを挿入 → 失敗を確認。
3. ロジックを試験通過させるよう調整 → 成功を確認。
ガイドラインのインストール方法
リポジトリにはCLAUDE.mdという単一ファイルがあります。これをプロジェクトに追加してください。
# オプションA:スキルCLIプラグインとして
npx skills add forrestchang/andrej-karpathy-skills
# オプションB:ファイルを直接コピー
# 新規プロジェクトの場合
curl -o CLAUDE.md https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md
# 既存プロジェクト(追記)
echo "" >> CLAUDE.md
curl https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md >> CLAUDE.md
ファイルが存在すれば、Claudeにゴール駆動型実行の形式でプロンプトを送りましょう:"データ検証を追加;それを捕捉するテストを書き;テストが通るまで実行する" Claudeは自動的にガイドラインを参照します。
実用例
シナリオ:チームがシンプルなユーザー登録APIを構築しています。目標は以下です。
1. name、email、passwordを受け取る。
2. email形式を検証する。
3. 重複メールを拒否する。
4. パスワードのハッシュを保存する。
カルパティのルールを適用:
- コーディング前に考える – アクションは重複に対して409を返すか、一般的な400かを判断します。
- シンプルさ優先 – メール検証に全く外部サービスを使わず、単一のヘルパーを利用。
- 外科的変更 – コントローラファイルのみ変更し、ミドルウェアは変更しない。
- ゴール駆動 – 有効・無効入力用ユニットテストを定義し、成功基準を明確に。
Claudeは最小限で構造化されたコードを生成し、プロジェクトのスタイルに沿います。開発者は必要な変更だけを含むクリーンなプルリクエストをレビューできます。
まとめ
カルパティの四つの原則を導入すると、LLMでコードを書く際のノイズとエラーが大幅に減ります。仮定を前面に出し、シンプルさ、変更の正確性、明示的ゴールを強調することで、開発者はClaudeの力を活かしつつ、コードベースを保守しやすく、信頼性の高い形に保てます。
次のプロジェクトにCLAUDE.mdを追加し、コードがより賢くループし、レビューも少なく効率的になる様子を体感してください。