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. nameemailpasswordを受け取る。 2. email形式を検証する。 3. 重複メールを拒否する。 4. パスワードのハッシュを保存する。

カルパティのルールを適用:

  1. コーディング前に考える – アクションは重複に対して409を返すか、一般的な400かを判断します。
  2. シンプルさ優先 – メール検証に全く外部サービスを使わず、単一のヘルパーを利用。
  3. 外科的変更 – コントローラファイルのみ変更し、ミドルウェアは変更しない。
  4. ゴール駆動 – 有効・無効入力用ユニットテストを定義し、成功基準を明確に。

Claudeは最小限で構造化されたコードを生成し、プロジェクトのスタイルに沿います。開発者は必要な変更だけを含むクリーンなプルリクエストをレビューできます。

まとめ

カルパティの四つの原則を導入すると、LLMでコードを書く際のノイズとエラーが大幅に減ります。仮定を前面に出し、シンプルさ、変更の正確性、明示的ゴールを強調することで、開発者はClaudeの力を活かしつつ、コードベースを保守しやすく、信頼性の高い形に保てます。

次のプロジェクトにCLAUDE.mdを追加し、コードがより賢くループし、レビューも少なく効率的になる様子を体感してください。

この記事を共有