AIコーディング実践教科書新人技術者のための「ハーネス設計」入門——Anthropicの最前線から学ぶ、落とし穴と突破口——
AIコーディング実践教科書
新人技術者のための「ハーネス設計」入門
——Anthropicの最前線から学ぶ、落とし穴と突破口——
はじめに:この教科書で何を学ぶか
こんにちはmakokonです。
この記事は、Anthropicブログ記事の解説を、AIコーディングを利用する新人技術者に向けて、教科書的に再構成したものです。失敗しやすいAIコーディングの問題と対処をなるべくわかりやすく解説します。
「AIにコードを書かせれば、すぐにアプリが完成する」
そう思って試してみた経験がある方は多いはずです。実際に試してみると、動くことは動くが、どこか噛み合っていない。デザインは似たようなものばかり。少し複雑な要件を伝えると途端に崩壊する。そういった体験に、困惑と失望を感じたことはないでしょうか。
あるいは逆に、AIが生成したコードをほぼそのまま採用し続けた結果、プロジェクトの後半になってから修正不可能な設計ミスが積み重なっていたことに気づいた、という経験をした方もいるかもしれません。
この教科書は、そういった「AIコーディングの現実」に正面から向き合い、効率的かつ正しくAIを活用するための実践的な指針を提供することを目的としています。
ベースとなっているのは、Anthropicが公開した最新の研究——自律的なソフトウェア開発を可能にする「ハーネス設計」の思想と技法です。しかし単なる技術解説に留まらず、新人技術者がAIコーディングに取り組む上で陥りやすい落とし穴と、それを乗り越えるための心構えを丁寧に説明します。
この教科書を読み終えた頃には、次のことが理解できているはずです。
AIが「なぜ間違えるのか」という構造的な理由
AIを正しく活用するための設計パターン(ハーネス設計)
長期・複雑なタスクでAIを動かし続けるための実践的な戦術
AIコーディングに向き合うための技術者としての姿勢
第1章:AIコーディングの「幻想」を捨てる
1-1. なぜAIは「使えない」と感じさせるのか
AIコーディングツールを初めて使った新人技術者が最初に感じるのは、大抵「すごい」という驚きです。しかしその驚きは、しばらくすると「なんか違う」という違和感に変わっていきます。

具体的にどういう場面でしょうか。たとえば以下のような状況です。
簡単なタスクは素晴らしいが、少し複雑になると途端に精度が落ちる
生成されたコードは動いているように見えるが、実際に動かすとエラーが出る
修正を頼むと、別の場所が壊れる
デザインが似通っている——どれも似たような紫のグラデーション、白いカード
長い開発セッションの後半になると、AIの出力の質が落ちてくる
これらの現象には、それぞれ明確な原因があります。「AIが賢くない」のではなく、「AIというものの性質を理解せずに使っている」ことが原因であるケースがほとんどです。
この章では、AIコーディングの落とし穴を一つひとつ解説していきます。

1-2. 落とし穴①:「自己評価バイアス」——AIは自分の作品を甘く見る
AIコーディングにおける最初の、そして最も根本的な落とし穴は、AIが自分の出力を過大評価するという性質です。
Anthropicの研究でも明確に指摘されています。AIエージェントは自分が作ったコードやデザインを評価させると、人間から見て明らかに不十分であっても、自信を持って「良い出来です」と返してくる傾向があります。
これは決してモデルが「嘘をついている」わけではありません。AIは自分が生成した文脈の中で評価を行うため、その生成物が「それなりに指示に沿っている」ことは確かに認識できます。しかし「本当に優れているかどうか」という相対的・比較的な評価を、生成したモデル自身が公平に行うことは構造的に難しいのです。
新人技術者が陥りやすい罠:
AIが「完成しました、品質に自信があります」と言ったとき、それを鵜呑みにしてレビューを省略してしまうこと。特に、締め切りが迫っているときや、自分でコードを精査する力がまだないと感じているときに、この罠にはまりやすくなります。
正しい心構え:
AIの「自己評価」は参考にしない。必ず別の視点でレビューする。
この「別の視点でのレビュー」を、どうシステムとして組み込むかが、後の章で説明するハーネス設計の核心になります。
1-3. 落とし穴②:「AIスロップ」——創造性の錯覚
「AIスロップ(AI Slop)」という言葉があります。AIが生成しがちな、特徴のない、どこかで見たような凡庸な出力のことを指します。デザインの文脈では、紫のグラデーション背景に白いカード、ありきたりなサンセリフフォント、予測可能なレイアウトがその典型です。
なぜAIはこういった出力をするのでしょうか。AIは学習データから「よく見られるパターン」を強く学習します。そのパターンは統計的に「それらしい」ものではありますが、「創造的に優れているもの」ではありません。指示が曖昧であればあるほど、AIは「平均的に正しいもの」を出力しようとします。
新人技術者が陥りやすい罠:
AIが生成したデザインやUIをそのまま採用し続けること。一件一件は「まあ悪くないかな」と感じても、積み重なると「どれも同じに見える」ひどく凡庸なプロダクトが完成してしまいます。特に、自分自身のデザインセンスがまだ養われていない段階では、AIスロップを「普通に良いもの」として誤認しやすくなります。
正しい心構え:
AIの出力を「スタート地点」として扱う。「これで十分か」ではなく「これをどう超えるか」を考える習慣をつける。
1-4. 落とし穴③:「コンテキスト不安」——記憶が埋まるとAIは焦り始める
AIは「コンテキストウィンドウ」と呼ばれる記憶領域を持っています。これは会話の履歴や生成されたコードなど、AIが「今考えている内容」を保持する領域です。
長い開発セッションを続けると、このコンテキストウィンドウが満杯に近づいていきます。するとAIは特徴的な動作を見せ始めます——作業を急いで終わらせようとする、細かいエラーへの対処が雑になる、「これで完了です」と早めに宣言しようとする。Anthropicの研究ではこれを「コンテキスト不安(Context Anxiety)」と呼んでいます。
新人技術者が陥りやすい罠:
長時間のセッションで「なんかさっきより出力の質が落ちたな」と感じながらも、会話を続けてしまうこと。コンテキストの飽和が原因であることに気づかず、「プロンプトが悪いのかな」と別の原因を探し続けてしまうこともよくあります。
正しい心構え:
AIのパフォーマンスが落ちてきたら、コンテキストを疑う。長いセッションは計画的に「区切り」を設ける。
1-5. 落とし穴④:「詳細すぎる指示」が逆効果になる
「AIは詳細な指示を与えれば与えるほど良い結果を出す」——これは半分正しく、半分間違いです。
ある程度の具体性は確かに重要です。しかし過剰に細かい指示は、AIの持つ柔軟性と問題解決能力を損なうことがあります。実装の詳細を事前に全て指定しようとすると、AIが「本来こうすれば自然に解決できた問題」を、指示された手順に縛られて迂回してしまうことがあります。さらに、指示と指示の間の矛盾が、エラーの連鎖を引き起こすこともあります。
新人技術者が陥りやすい罠:
「AIはバカだから、すべて細かく説明しなければいけない」という思い込みから、過剰に詳細な実装仕様を記述してしまうこと。これは特に、自分でコードを書いてきた経験が豊富な技術者が、その思考プロセスをそのままプロンプトに転写しようとするときに起きがちです。
正しい心構え:
「何を達成したいか(What)」を明確にし、「どうやって(How)」はAIに考えさせる余地を残す。
第2章:ハーネス設計の思想——AIを「包み込む」アーキテクチャ
2-1. 「ハーネス」とは何か
ここまで、AIコーディングの落とし穴を4つ紹介しました。これらに共通する解決策の思想が、Anthropicが提唱する「ハーネス設計(Harness Design)」です。
「ハーネス」とは、登山や工事現場で使われる安全帯のことです。高所作業者が墜落しないよう、体に装着して支持点につなぐ装置です。AIコーディングにおけるハーネスは、AIが「墜落」——つまり品質の低下、エラーの連鎖、目的の逸脱——しないよう、AIの挙動を支え、制御するための設計上の仕組み全体を指します。
重要なのは、ハーネスはAIの能力を制限するものではないという点です。むしろ逆で、AIが安全に、そして最大限の能力を発揮できる「足場」を提供することがその目的です。

2-2. ハーネスの基本構造:3つの役割
Anthropicのハーネス設計の中核は、単一のAIに全てを任せるのではなく、役割の異なる複数のエージェントを連携させる多層構造です。

その基本となる3つの役割を説明します。
プランナー(Planner):方向性を決める設計者
プランナーの役割は、プロジェクト全体の仕様と方向性を決定することです。ただし、重要なのは「高レベルの仕様に留める」という原則です。
実装の詳細をプランナーが全て決めてしまうと、後工程の柔軟性が失われます。プランナーは「何を作るか」「どんな価値を提供するか」という本質的な問いに答え、「どう実装するか」はジェネレーターに委ねます。
ジェネレーター(Generator):実際にコードを書く実装者
ジェネレーターは、プランナーの仕様を受け取り、具体的な実装を行う役割です。コードを書き、UIを構築し、APIを実装します。
重要な点は、ジェネレーターが作業を開始する前に「スプリント契約(Sprint Contract)」を結ぶプロセスがあることです。これは、「何をもって完了とするか」を事前に合意するプロセスです。プランナーの仕様を自分の言葉で解釈し直し、具体的な実装計画として提示します。これをエバリュエーターと合意してから、初めて実装を開始します。この「事前合意」が、実装完了後の「思っていたものと違う」というミスマッチを大幅に減らします。
エバリュエーター(Evaluator):冷静に評価する批評家
エバリュエーターは、ジェネレーターが作った成果物を評価する役割です。ここで最も重要なのは、エバリュエーターは懐疑的(Skeptical)な視点を持つよう設計されているという点です。
前章で説明した「自己評価バイアス」を克服するための構造がこれです。自分が作ったものを自分で評価させるのではなく、独立したエージェントに評価させることで、客観性を確保します。
また、エバリュエーターは「コードを読むだけ」ではありません。Anthropicのシステムでは、エバリュエーターに実際のブラウザ操作ツール(Playwright MCP)を与え、人間のユーザーと同じようにアプリケーションを操作させます。ボタンをクリックし、フォームを送信し、APIのレスポンスを確認する。このリアルな「操作による検証」が、コードレビューだけでは見つけられない欠陥を発見します。
2-3. GANからの着想:「対立」が品質を高める
なぜこの3者構造がうまく機能するのか、その理論的背景を理解しておくと、実践の際の判断がしやすくなります。
この設計はGAN(Generative Adversarial Network:敵対的生成ネットワーク)から着想を得ています。GANは機械学習の一手法で、「生成器」と「識別器」を競わせることで、両者が互いに向上していく仕組みです。生成器はより良い出力を作ろうとし、識別器はより鋭く見破ろうとする。その「対立」が結果として高品質な出力を生み出します。
ハーネス設計における「ジェネレーターとエバリュエーターの対立構造」は、同じ原理を応用しています。エバリュエーターが厳しく批評するほど、ジェネレーターはより良いものを作ろうとする。この「建設的な緊張」が、単一エージェントでは決して到達できない品質の天井を突き破る原動力となります。
第3章:評価基準の具体化——主観を客観に変える技術
3-1. 「良い」を言語化しないと、AIは動けない
ハーネス設計において、エバリュエーターが機能するためには、「何が良くて、何が悪いのか」という評価基準が明確に定義されていなければなりません。
「良いデザインにしてください」という指示では不十分です。「良い」は主観的すぎて、AIが判断の拠り所にできません。Anthropicが採用した4つの評価基準は、この「主観を客観化する」という課題への一つの答えです。
3-2. 4つの評価基準:デザインに「物差し」を与える
Anthropicが導入した評価基準を、実践的な観点から解説します。

① Design Quality(デザインの質)
単なる「見た目の良さ」ではなく、「一貫したアイデンティティとムードを持っているか」という問いです。
具体的には:
フォント、色、間隔に一貫性があるか
全体を通じて「これはどんな世界観のプロダクトか」が伝わるか
パーツがバラバラに存在しているのではなく、統一されたシステムとして機能しているか
実践での活用: プロジェクト開始時に「このプロダクトはどんな感情・世界観を表現したいか」を言語化し、それをエバリュエーターの評価基準に含める。
② Originality(独創性)
AIスロップを排除し、テンプレートではない独自の選択がなされているかを問う基準です。
具体的には:
「他のAI生成サイトで見たことがない」要素があるか
ありきたりなパターン(紫グラデーション、白カード、汎用アイコン)に頼っていないか
そのプロダクト固有の文脈から生まれた創造的な選択があるか
実践での活用: エバリュエーターに「これは典型的なAI生成デザインに見えるか?」という問いを明示的に含める。
③ Craft(技能・仕上げの質)
「良いアイデア」を「良い実装」に落とし込む技術的な実行力の評価です。
具体的には:
タイポグラフィの階層(見出し・本文・注釈の大きさと重みの関係)が適切か
余白の使い方が計算されているか
色のコントラスト比がアクセシビリティ基準を満たしているか
アニメーションやトランジションが不自然でないか
実践での活用: 技術的なチェックリストとしてエバリュエーターに与える。
④ Functionality(機能性)
最終的に「ユーザーが目的を達成できるか」という問いです。
具体的には:
初めて使うユーザーが迷わずに主要なタスクを完了できるか
エラーが起きたとき、ユーザーは何をすれば良いか分かるか
全てのインタラクティブな要素が実際に動作するか(スタブになっていないか)
実践での活用: エバリュエーターに「初めてのユーザー」の視点でブラウザ操作による検証を行わせる。
3-3. 評価基準が生んだ「創造的飛躍」——実例から学ぶ
この評価基準がいかに劇的な効果をもたらすか、Anthropicの実験事例を詳しく見てみましょう。
あるタスクで、AIに「オランダの美術館のウェブサイト」を生成させました。最初の数回の試みでは、ダークテーマに白いテキスト、標準的なナビゲーション——「それらしい美術館サイト」ではあるものの、独創性の欠片もない典型的なAIスロップが生成されました。
しかし、エバリュエーターが「最高級の美術館クオリティ」という評価基準で繰り返しフィードバックを与え続けた結果、10回目の反復でAIは驚くべき選択をしました。
それまでの全てのデザインを捨て去り、CSSのパースペクティブ機能を用いた3D空間体験として作り直したのです。チェック柄の床が奥に向かって消えていき、壁には絵画がランダムに配置されている。ナビゲーションは「ボタンをクリックする」のではなく「扉を開けて次の部屋に進む」という体験になっていました。
これは重要な示唆を含んでいます。AIが「創造的な飛躍」をするためには、「より良いものを作れ」という抽象的な指示ではなく、「現状ではまだ足りない」という具体的かつ継続的なフィードバックループが必要なのです。一度のプロンプトで傑作を生み出すことを期待するのではなく、反復と評価のサイクルを設計することが、AIから最高の出力を引き出す方法です。
第4章:長期タスクの制御術——コンテキストと闘わない
4-1. コンテキストウィンドウという「体力」の管理
AIのコンテキストウィンドウは、人間に例えると「作業記憶(ワーキングメモリ)」に近い概念です。人間も一度に考えられることの量には限界があり、疲れてくると細かいことに気が回らなくなります。AIも同じです。
ただし人間と違うのは、コンテキストウィンドウが「疲れによって徐々に劣化する」のではなく、「容量の上限に近づいたときに特徴的な振る舞いをする」という点です。具体的には:
作業を急いで完了させようとする
細かなエラーへの対処が粗くなる
「これで完成です」という宣言が早くなる
これを「コンテキスト不安」と呼びます。
4-2. Claude 4.5時代のアプローチ:「構造化された引き継ぎ」
コンテキストが飽和する前に、意図的にリセットをかけるのがClaude 4.5時代の主要な対処法でした。
ただし、単純にリセットすると、それまでの作業文脈が失われてしまいます。そこで重要になるのが「構造化された引き継ぎ(Handoff)」です。

コンテキストをリセットする前に、以下の情報を整理したファイルを生成させます:
# 開発引き継ぎドキュメント
## 現在の状況
- 完了した機能: [リスト]
- 現在取り組んでいる箇所: [具体的なファイル・関数名]
- 未完了のタスク: [優先度順リスト]
## 重要な設計決定事項
- なぜこのアーキテクチャを選んだか
- 既に試みて失敗したアプローチ
- 依存関係と注意事項
## 次のエージェントへの指示
- 次に実装すべき機能
- 注意すべき技術的な制約このドキュメントを新しいコンテキストに渡すことで、「経験の連続性」を保ちながら「集中力の新鮮さ」を取り戻します。
実践的なポイント: このアプローチは現在のプロジェクト管理にも応用できます。長いAIセッションをする前に「今回のセッションで何を達成するか」の範囲を決め、そのスコープが完了したら次のセッションに移る、という計画的なセッション管理の習慣を作ることが重要です。
4-3. 最新モデルでの変化:「自動コンパクション」
Claude Opus 4.6などの最新モデルでは、長文の文脈理解能力が大幅に向上しました。これにより、強制的なリセットを行わなくても、コンテキストを自動的に圧縮・要約しながら2時間を超える継続的な作業が可能になっています。
これは「ハーネスを削ぎ落とす」という重要な原則を示しています。
モデルが賢くなったとき、以前は必要だった補助的な仕組みの一部は不要になります。しかし全ての仕組みが不要になるわけではありません。大切なのは、「どの仕組みはまだ必要か」「どの仕組みは過剰になったか」を継続的に見直すことです。
新人技術者への教訓: 今日学ぶ「ベストプラクティス」が、半年後には「時代遅れ」になる可能性があります。重要なのは特定の手法を暗記することではなく、「なぜその手法が必要なのか」という根本的な理由を理解することです。理由が分かれば、状況が変わったときに適切に対応できます。
第5章:実践——フルスタック開発への応用
5-1. スプリント契約:作業前の「合意形成」が成否を分ける
ハーネス設計を実際のフルスタック開発に適用する際、最も重要なステップは作業開始前の合意形成です。

「スプリント契約」と呼ばれるこのプロセスは、以下の問いに答えることで成立します:
このスプリントで達成することは何か? (スコープの明確化)
完了の定義は何か? (「動く」ではなく具体的な検証基準)
使用する技術スタックは何か? (後から変更しないための合意)
想定されるリスクは何か? (事前の問題共有)
なぜこのプロセスが重要かを、具体例で説明します。
「ユーザー認証機能を実装してください」という指示を出した場合、AIはある解釈で実装を進めます。あなたが「メールとパスワードによるログイン」を想定していても、AIは「ソーシャルログイン」や「OTP認証」を実装するかもしれません。作業が完了してから「思っていたものと違う」と気づいても、やり直しのコストは膨大です。
スプリント契約では、こうした解釈のズレを作業前に検出します。AIに「実装計画を提示してください」と求め、その計画をレビューすることで、「自分が想定していたものと違う方向に進もうとしている」ことを事前に発見できます。
5-2. テックスタックと役割分担の明確化
Anthropicの実験では、以下のテックスタックが採用されています:
フロントエンド: React + Vite
バックエンド: FastAPI (Python)
データベース: PostgreSQL
ブラウザ自動化: Playwright MCP(エバリュエーターの検証ツール)
このスタック選定自体よりも重要なのは、「AIに任せる部分」と「人間がコントロールする部分」の境界線を明確にすることです。

AIに任せるべき部分:
定型的なCRUD処理の実装
UIコンポーネントの構築
テストコードの生成
ドキュメントの作成
人間が最終判断すべき部分:
データベーススキーマの設計(後から変更コストが高い)
セキュリティに関わる設計決定
パフォーマンスのクリティカルパス
外部サービスとの連携仕様
5-3. エバリュエーターが見つけた実際のバグ——人間も学べる失敗パターン
エバリュエーターが実際の開発で発見した具体的なバグの事例を見てみましょう。これらは「AIが犯しやすいミス」であると同時に、「新人技術者も陥りやすいミス」でもあります。

バグ事例①:APIルートの競合
FastAPIで以下のようなルート定義をAIが生成しました:
@app.get("/{frame_id}")
async def get_frame(frame_id: int):
...
@app.put("/frames/reorder")
async def reorder_frames():
...問題は、`PUT /frames/reorder` というリクエストが来たとき、Pythonが上から順番にルートをマッチングしようとするため、`/{frame_id}` のルートが先にマッチしてしまうことです。`"reorder"` という文字列を整数としてパースしようとして `422 Unprocessable Entity` エラーが発生します。
正しい定義順序は:
# 具体的なパスを先に定義する
@app.put("/frames/reorder")
async def reorder_frames():
...
# 動的なパスパラメータは後に定義する
@app.get("/{frame_id}")
async def get_frame(frame_id: int):
...学習ポイント: ルーティングの優先順位は、多くのWebフレームワークで「定義順」に依存します。AIはコードを生成する際にこの順序を常に正しく管理できるとは限りません。APIルートの定義順序は、レビュー時に必ず確認すべきポイントです。
バグ事例②:CSSのイベント透過問題
UI上でレイヤーをクリックして選択し、その後`Delete`キーで削除しようとしても削除できない、という操作性の欠陥です。
コードを見ると、削除ハンドラーは以下のような条件分岐になっていました:
if (selectedEntity && activeLayer === selectedEntity.layerId) {
deleteEntity(selectedEntity.id);
}問題は `activeLayer === selectedEntity.layerId` という条件です。あるUI操作のフローで`activeLayer`が更新されるタイミングが`selectedEntity`の更新と異なり、この条件が常に`false`になるケースがありました。
学習ポイント: 状態管理(State Management)は、フロントエンド開発において最もバグが生まれやすい領域の一つです。特に「複数の状態が絡み合う操作」では、AIが生成したコードでも人間が書いたコードでも、エッジケースのテストが不可欠です。
バグ事例③:スタブ化された機能
UI上には「録音開始」ボタンが存在し、クリックすると視覚的なフィードバックもあります。しかし実際には録音処理が実装されておらず、ボタンを押しても何も記録されません。
const handleRecordStart = async () => {
setIsRecording(true);
// TODO: implement actual recording
console.log("Recording started");
};AIはUIコンポーネントとインタラクションを先に実装し、実際の機能(この場合はMediaRecorder APIを使った録音処理)をスタブ(仮の空実装)のまま残していたのです。
学習ポイント: AIは実装の「骨格」を素早く作る能力に優れていますが、「見た目は動いているが実際には動いていない」スタブを残すことがあります。機能の動作確認は、UIの見た目だけでなく実際のデータの流れを追って確認する必要があります。
5-4. 単独実行vs.ハーネス実行——コストと品質のトレードオフ
実際のプロジェクトでハーネス設計を採用すべきかを判断するために、Anthropicの比較データを見てみましょう。

単独実行の$9と20分は魅力的に見えます。しかし生成物が「実際には使えないもの」であれば、それは$9を節約したのではなく、$9と20分を無駄にしたことになります。
重要なのはコストの比較対象を正しく設定すること。
フルハーネス実行の$200と6時間を「高い」と感じる場合、比較対象は何でしょうか。熟練エンジニアが6時間作業した場合の人件費は$200どころではありません。さらに、「6時間完全に自律的に動作する」という点も重要です。人間が他の作業をしている間、AIが開発を進めていられるのです。
もちろん、全てのプロジェクトにフルハーネスが必要なわけではありません。
単独実行が適切な場面: プロトタイプ、概念実証(PoC)、小規模なスクリプト
ハーネスが必要な場面: 実際にリリースするプロダクト、複数機能を持つアプリケーション、品質基準が明確に求められるプロジェクト
第6章:AIコーディングに向き合うための心構え
6-1. AIは「部下」でも「師匠」でもなく「ペアプログラマー」である
AIコーディングツールとの関係性をどう捉えるかは、その活用の質に大きく影響します。
「AIは自分の代わりに全部やってくれるもの」 と捉えると、AIの出力を批判的に検証しなくなり、バグや設計ミスを見逃します。「AIが言ったから正しい」という思考停止に陥ります。
「AIは高性能な補完ツールに過ぎない」 と捉えると、AIの能力を過小評価し、本来AIに任せられる作業を全て自分でやろうとして非効率になります。
最も良い関係性は、「ペアプログラマー(ペアプロ)」 という捉え方です。ペアプロでは、一人がコードを書き(Driver)、もう一人が俯瞰してレビューする(Navigator)という役割分担があります。どちらが正しくどちらが間違いということはなく、互いの視点を合わせることで品質が高まります。

AIをDriverとして使うとき、あなたはNavigatorとして:
今やっていることが全体の方向性に合っているかを確認する
AIが陥りがちな落とし穴を先回りして指摘する
AIが自信を持って提示している選択を批判的に検証する
という役割を果たします。
6-2. 「信頼するが検証する」原則
AIの出力に対する正しいスタンスを一言で表すなら「Trust but Verify(信頼するが検証する)」です。
これは冷戦時代にロナルド・レーガン大統領が使ったフレーズで、核軍縮交渉において「相手の言葉を信じるが、それを独立した検証で確認する」という原則を示したものです。

AIコーディングにおいても同じです:
AIが「このコードは正しく動作します」と言っても、実際に動かして確認する
AIが「このアプローチが最善です」と言っても、なぜそうなのかを理解しようとする
AIが「完了しました」と言っても、要件を全て満たしているか確認する
特に重要なのは、「なぜそうなのかを理解しようとする」という姿勢です。AIが生成したコードを理解せずに使い続けると、技術者としての成長が止まります。AIはアウトプットを生成しますが、その背後にある原理・原則を理解するのは人間の仕事です。
6-3. 失敗を設計に織り込む
優れたエンジニアは「失敗しないシステム」を作ろうとするのではなく、「失敗しても大丈夫なシステム」を作ります。
ハーネス設計の本質も同じです。AIが間違えないようにするのではなく、AIが間違えたときにそれを発見・修正できる仕組みを設計することです。
この考え方を「フェイルセーフ設計」と言います。AIコーディングにおいて具体的には:
小さく試す: 大きな機能を一度に実装させるのではなく、小さなステップに分けて検証しながら進む
可逆的な作業を先に: やり直しが難しい設計決定(DBスキーマなど)は慎重に、やり直しが容易なUI実装は積極的にAIに任せる
テストを先に書く: AIにテストコードを先に生成させ、そのテストを通過する実装を作らせる(テスト駆動開発のAI版)
6-4. 「今できること」と「今後できること」を分けて考える
AIの能力は急速に進化しています。今日の「AIには難しいこと」が、半年後には「AIが当たり前にできること」になっているかもしれません。
逆も然りです。「AIに任せておけば大丈夫」と思っていた作業が、実は想定外の品質問題を引き起こしていた、ということも起きます。
大切なのは、現在のAIの能力の「フロンティア(最前線)」を常に把握し続けることです。Anthropicの研究者Prithvi Rajasekaran氏が言うように、「モデルが賢くなれば、エンジニアリングのフロンティアもまた遠のく」のです。
AIがより多くのことをこなせるようになるにつれ、私たちが取り組むべき課題の難易度も上がります。より高品質なものを、より複雑なシステムを、より創造的なアプローチで作ることが求められます。これは脅威ではなく、機会です。
6-5. AIコーディングにおける倫理的な責任
最後に、新人技術者が意識すべき重要な点を一つ加えます。
AIが生成したコードであっても、それをリリースし、ユーザーに使わせる責任は人間の技術者にあります。
セキュリティの脆弱性を含むコードをレビューせずにリリースすることは、AIのせいにできません
障害を持つユーザーへのアクセシビリティが確保されていないUIも、同様です
プライバシーを適切に保護していないデータ処理も、同様です
AIは「免責の盾」ではありません。AIを使って開発するということは、AIの助けを借りながら、技術者としての責任をより大きなスケールで果たすことです。
終章:AIエンジニアリングの「真の戦場」
組み合わせこそが競争優位
Anthropicが示したハーネス設計の最大の教訓は、「AIモデル単体の性能よりも、それをどう組み合わせるかが成否を分ける」という事実です。
同じClaudeというモデルを使っても、単独で使った場合と、プランナー・ジェネレーター・エバリュエーターの3者構造で使った場合では、成果物の品質に圧倒的な差が生まれます。
これは今後のソフトウェアエンジニアリングにおける競争優位の本質を示しています。「どのAIモデルを使っているか」ではなく、「どうAIを組み合わせるか」「どう評価基準を設定するか」「どうフィードバックループを設計するか」——これらのシステム設計能力こそが、差別化の源泉になります。
サイバネティクス的思考の獲得
私たちは今、AIを「単なるコード生成器」として使うフェーズから、複数のエージェントを組み合わせ、相互に監視・修正させる「サイバネティクス(制御学)」のフェーズへと移行しています。
サイバネティクスとは、システムが目標に向かって自律的に修正・調整を行う仕組みの研究です。恒温器が室温を一定に保つように、フィードバックループによって目標状態を維持します。

ハーネス設計はまさにこの思想の実装です。ジェネレーターが生成し、エバリュエーターが評価し、そのフィードバックがジェネレーターに戻り、品質が目標水準に達するまでループし続ける。AIを「一方通行のコード生成機」として使うのではなく、「フィードバックによって自己修正するシステム」として設計する——この発想の転換こそが、AIエンジニアリングにおける本質的なスキルです。
あなたへの問いかけ
この教科書を読み終えたあなたに、いくつかの問いを残します。
次にAIコーディングツールを使うとき、あなたは:
AIの出力を批判的に検証する「エバリュエーター」の役割を自分の中に持てていますか?
「これで十分か」ではなく「これをどう超えるか」という問いを持てていますか?
AIが間違えたときに備えた「フェイルセーフ」を設計に織り込んでいますか?
AIが生成したコードの背後にある「なぜ」を理解しようとしていますか?
AIモデルが「自分で自分を疑う」能力を完全に手に入れたとき、私たちの開発プロセスは確かに変わるでしょう。しかしそれでも変わらないものがあります。それは、何を作るべきかを問い、品質の基準を定め、最終的な責任を引き受ける——人間の技術者としての本質的な役割です。
AIは強力な道具です。しかし道具は、それを正しく使う人間があって初めて価値を発揮します。
ハーネス設計を学ぶことは、AIという道具を正しく使うための設計図を手に入れることです。それは同時に、技術者としての自分自身の役割を再定義することでもあります。
付録:実践チェックリスト
プロジェクト開始時
[ ] このプロジェクトの「完了の定義」を明確に言語化した
[ ] AIに任せる部分と人間が判断する部分の境界線を決めた
[ ] 使用するテックスタックを合意した
[ ] 評価基準(Design Quality / Originality / Craft / Functionality)のうち何が重要かを整理した
開発セッション中
[ ] セッションのスコープを事前に絞り込んだ
[ ] AIに「実装計画」を先に提示させ、レビューしてから実装を開始した
[ ] AIのパフォーマンスが落ちてきたらコンテキストを確認した
[ ] 各ステップで実際に動かして検証した(コードを読むだけでなく)
成果物レビュー時
[ ] AIが「完了」と言っても、自分の目で確認した
[ ] スタブ化されたまま残っている機能がないか確認した
[ ] セキュリティ・アクセシビリティ・プライバシーの観点で確認した
[ ] 「AIスロップ」になっていないか、独創性の観点で評価した
セッション終了時
[ ] 次のセッションへの引き継ぎドキュメントを生成した
[ ] 今回のセッションで学んだ「AIが陥りやすいパターン」を記録した
この教科書が、AIというパートナーと共に、より良いプロダクトを作り出すための一助となれば幸いです。
本記事の重要キーワード(振り返りに利用してください)
1. AI特有の課題と落とし穴
#自己評価バイアス : AIが自分の作ったコードやデザインを過大評価してしまう性質。
#AIスロップ : AIが生成しがちな、特徴のない凡庸なデザインやコードのパターン。
#コンテキスト不安 : 記憶領域(コンテキストウィンドウ)が満杯に近づくと、AIの作業が雑になる現象。
2. ハーネス設計のアーキテクチャ
#ハーネス設計 : AIの品質低下やエラーを防ぎ、能力を最大限引き出すための制御の仕組み。
#プランナー : プロジェクト全体の高レベルな仕様と方向性を決定する役割。
#ジェネレーター : 具体的な実装を行い、コードを書く役割。
#エバリュエーター : 懐疑的な視点から成果物を厳格に評価・検証する批評家としての役割。
#懐疑的視点 : エバリュエーターに持たせるべき、AIの甘い自己評価を排するための姿勢。
#スプリント契約 : 実装開始前に「何をもって完了とするか」をAI同士(および人間)で合意するプロセス。
#GAN : 生成器と識別器を競わせることで品質を高める、ハーネス設計の着想源となった理論。
3. 評価と品質の基準
#デザインの質 (Design Quality): 一貫したアイデンティティとムードを持っているかの基準。
#独創性 (Originality): テンプレートに頼らない、独自の創造的な選択がなされているかの基準。
#創造的飛躍 : フィードバックループを繰り返すことで、AIが当初の想定を超える革新的な解決策を生み出すこと。
4. 長期開発の制御技術
#構造化された引き継ぎ : コンテキストをリセットする際、現在の状況や未完了タスクを整理して次へ渡す手法。
#自動コンパクション : 最新モデルにおいて、長時間の作業を可能にする文脈の自動圧縮機能。
5. 技術者のマインドセット
#ペアプログラマー : AIを単なる道具ではなく、共に品質を高める対等なパートナーとして捉える考え方。
#信頼するが検証する (Trust but Verify): AIの言葉を鵜呑みにせず、常に独立した検証を行う技術者の原則。
#フェイルセーフ設計 : AIが間違えることを前提に、失敗を早期に発見・修正できる仕組みを組み込むこと。
#サイバネティクス的思考 : フィードバックループによって目標状態を維持・向上させる、自律的な制御の思想。
