生成AIに小さなコードを書か
せるプロンプトを作った話

関連記事

1. なぜ「小さなコード」なのか

生成AIにプログラムを書かせるとき、いつも困ることがありました。一度に長いコードを出力されると、どこが重要なのかわからなくなるんです。

特に学習用のコードでは、エラーハンドリング(エラーが起きたときの処理)や複雑な機能まで含まれていると、本質が見えにくくなります。

そこで考えました。「AIに渡す開発方針を、最初に決めておけばいいんじゃないか」と。

1.1. YAML形式で方針を整理する

プロンプトの形式には、YAML(ヤムル)という書き方を選びました。YAMLは設定ファイルでよく使われる形式で、階層構造が見やすいのが特徴です。

コードの方針を箇条書きでバラバラに書くより、構造的に整理できると思ったんです。

最終的にこんな形になりました。

# 開発方針
コーディング方針:
  可読性:
    - 変数名・関数名は役割が明確にわかる名前
    - 1関数は1つの責任のみ
    - マジックナンバーは設定ファイルで管理
    - 難しい書き方より、わかりやすい書き方優先
    - デザインパターンは避ける(シンプルな実装を優先)

  コードサイズ:
    - 1関数: 20行以内
    - 1クラス: 100行以内
    - 1ファイル: 200行以内
    - 機能追加時は関数の肥大化を防ぐ(分割・リファクタリング)

  構造:
    - 早期リターンでネストを浅く(2階層まで)
    - 条件判定は関数化
    - 重複コードは関数化(過度な抽象化は避ける)
    - 機能ごとにファイル分割(細かすぎない)
    - 1ファイルの依存は5つ以内
    - 循環依存を避ける

  簡潔性:
    - エラーハンドリングは最小限
    - コメント不要(コードで説明する)
    - 型ヒントを活用(対応言語のみ)

  開発プロセス:
    - 段階的に実装(一度に全部作らない)

  出力形式:
    - 変更部分のみコードブロックで提示
    - ファイル名・関数名(またはクラス名)を明示
    - 変更理由を1行で記載

# 案件情報(毎回変わる)
言語: 
目的: Code language: PHP (php)

上の部分は共通の開発方針で、下の「案件情報」だけをプロジェクトごとに書き換えて使います。

1.2. 使い方

新しいプロジェクトを始めるとき、このYAMLをAIに渡してから具体的な機能要求を伝えます。

すると、最初に決めた方針に沿って、小さく読みやすいコードを生成してくれるはずです。

2. 重視したポイント

2.1. コメント不要で理解できるコード

コメントがなくても読めるコードが理想だと考えています。そのためには、変数名や関数名で何をしているかが明確にわかることが大切です。

例えば、calc()よりcalculateTotalPrice()の方が、何を計算しているのかすぐわかりますよね。

2.2. サイズの制限

関数は20行以内、クラスは100行以内、ファイルは200行以内という目安を設けました。

これくらいのサイズなら、画面にすべて収まって把握しやすいんです。機能を追加するときも、関数が大きくなりすぎないよう分割を意識できます。

2.3. ネストを浅く保つ

if文の中にif文が何重にもあると、読みにくくなります。

そこで「早期リターン」という書き方を推奨しました。条件に合わない場合は早めに処理を終了させて、ネストを2階層までに抑えるんです。

# ネストが深い例
def process(data):
    if data is not None:
        if len(data) > 0:
            if data[0] == 'valid':
                # 処理

# 早期リターンの例
def process(data):
    if data is None:
        return
    if len(data) == 0:
        return
    if data[0] != 'valid':
        return
    # 処理Code language: PHP (php)

条件判定自体も関数化すると、さらに読みやすくなります。

2.4. 依存関係を少なく

1つのファイルが他のファイルに依存する数を5つ以内にしました。

ファイル同士が複雑に絡み合うと、修正したときの影響範囲がわからなくなるからです。特に循環依存(AがBに依存し、BがAに依存する状態)は避けたいところです。

2.5. デザインパターンは使わない

シングルトンやファクトリーといったデザインパターンは、確かに便利です。でも学習用には複雑すぎると感じました。

シンプルな実装の方が、何をしているのか追いやすいんです。

2.6. 段階的な実装

「一度に全部作らない」というのも重要なポイントです。

生成AIは頼めば何でも一気に作ってくれますが、段階的に進めた方が理解しやすいし、途中で方向修正もできます。

2.7. 出力形式の工夫

AIには「変更部分のみをコードブロックで示す」ように指示しました。

ファイル全体を毎回出力されると、どこが変わったのか探すのが大変です。「このファイルのこの関数を修正した」と明示してもらえば、変更箇所がすぐわかります。

変更理由も1行で書いてもらうことで、なぜその修正が必要だったのか振り返れるようにしました。

2.8. 設定ファイルの活用

マジックナンバー(コード中に直接書かれた数値)は、設定ファイルで管理することにしました。

例えば「最大件数100件」という制限があるとき、コードの中に直接100と書くのではなく、設定ファイルにmax_items: 100と書いておくんです。

こうすると、後で変更したいときに1箇所修正するだけで済みます。設定ファイルの形式(JSONやYAMLなど)は、使う言語に応じてAIに任せることにしました。

2.9. やってみてわかったこと

エラーハンドリングを最小限にするのは、学習用だからこそできることです。実際のプロダクトなら、もっと丁寧なエラー処理が必要になります。

でも学習段階では、「まず動く最小限のコード」を理解することが大事だと思うんです。必要になったら、ログ出力のコードを追加すればいいわけですから。

3. まとめ

生成AIは便利ですが、何も指示しないと長くて複雑なコードを出力しがちです。

最初に方針を明確にしておくことで、理解しやすい小さなコードを生成してもらえます。特に学習用なら、シンプルさを優先した方が本質が見えやすくなると感じました。