同じようなプロンプトを何度も書いていた
agentic codingを始めてしばらく経った頃、あることに気づいた。
同じような指示をAIに毎回ゼロから書いている。
「Reactコンポーネントを作って」「スタイルはTailwindで」「Propsの型はこうで」「エラーハンドリングはこうやって」。毎回同じ前置きを書いているのに、その指示を再利用できる形にしていなかった。AIに作業を任せているつもりが、AIへの指示出しがルーティンワークになっていた。
ある日、同じようなReactコンポーネントを3つ連続で実装した。3回とも、エラーハンドリングのパターン、Propsの定義の仕方、テストの書き方を一から指示している自分がいて、さすがに馬鹿らしくなった。AIに任せる前に、自分が同じことを繰り返している。これでは本末転倒だ。
コードはDRY原則(Don't Repeat Yourself)で書くのに、AIへの指示は毎回コピペの繰り返し。この矛盾に気づいてから、方針を変えた。
どう変えたか
最初に試したのは単純なテンプレート化だった。「Reactコンポーネント作成用プロンプト.txt」を作って、毎回コピペする。悪くはないが、プロジェクトが変わるたびにアップデートが必要で、すぐに陳腐化した。
次に試したのが、プロンプトそのものを関数化する発想だ。一部のパラメータ(プロジェクト名、使っているライブラリのバージョン、ディレクトリ構成)だけを差し替えれば、あとは同じ手順で動くような形にする。
具体的には、一度AIと一緒に作業した結果のなかで「これは別の場面でも使える」と思った指示を、マークダウンファイルとして保存していった。ファイル名は prompt-create-react-component.md のような感じで、中身は「あなたはこのプロジェクトの規約に従ってコードを書くアシスタントです。以下のルールに従ってください」で始まる定型文と、固有の指示を組み合わせたものだ。
| 毎回ゼロから書く | テキストファイルにコピペ | 抽象化して再利用可能にする | |
|---|---|---|---|
| 初回の手間 | 小 | 中 | 大 |
| 2回目以降 | 同じ手間 | やや減る | ほぼゼロ |
| プロジェクト変更時の対応 | 毎回考え直す | ファイルを編集 | パラメータだけ差し替え |
| 他人と共有できるか | できない | しづらい | しやすい |
| 指示の品質 | ばらつく | やや安定 | 安定する |
実際の抽象化ステップ
しばらく続けて、やり方が固まってきた。
- 一度AIに作業をやらせて、そのときのプロンプトと結果をセットで保存する
- 保存したプロンプトから「このプロジェクト固有の部分」と「汎用的な部分」を分ける
- 固有部分(ディレクトリ名、設定ファイルのパスなど)を変数化して、差し替え可能にする
- 残った汎用手順をマークダウンファイルにまとめ、「次はこのファイルを見てやって」で済ませる
抽象化の副作用
この習慣を続けて気づいたのは、時間の節約以上に「自分がどんな作業をしているか把握できる」ことだった。
毎回アドホックにプロンプトを書いていると、自分がAIに何を依頼しているのか、全体像が見えなくなる。でも一度それをファイルとして整理すると、「自分はこの1ヶ月でこういう作業を繰り返していたのか」 と俯瞰できる。これが意外と重要だった。繰り返しが可視化されると、「これはもう自動化できるんじゃないか」「この部分はそもそも人間がやらなくていいんじゃないか」という問いが生まれる。
結局、人間がやるべきこと
一回抽象化に30分かかっても、二回目以降が5分で終わるなら三回使えばペイする。この考え方はプログラミングの基本だが、AIとの付き合い方にもそのまま当てはまる。
このブログ自体も同じ考え方で作っている(このブログはagentic codingで作った)。コードベースの構成も、AIへの指示の抽象化と再利用の延長線上にある。
全部をAIに任せっぱなしにすると、いつの間にか自分で考えなくなってしまう。最近Xで「認知的降伏」と呼ばれるようになった状態だ。AIに作業を任せるのはいい。でも「何を繰り返しているか」「何を抽象化すべきか」の判断だけは、人間が持ち続ける必要がある。
今日agentic codingで書いたプロンプトを一つ選んで、「このプロジェクト固有の部分」と「汎用的な部分」に分けてみてほしい。
汎用的な部分をマークダウンファイルに保存して、次回はそれを見ながらAIに指示する。その一度の手間が、明日以降の自分を救う。