AIを使いこなす手法をクイズで学ぶ!
プリンシプル オブ プログラミング 第6章:手法
公開日:
最終更新日:
AIを使いこなすには、道具より先に「手順(どう進めるか)」が必要です。本ページでは、『プリンシプル オブ プログラミング』第6章「手法」で紹介される現場で使える設計・実装手法を、要点を押さえた要約と4択クイズで整理します。
要約でアプローチをつかみ → 4択クイズ(10問・全問解説付き)で実務目線の判断力をチェック → 迷ったところは解説で復習。「読む→解く→わかる」で、AIを“作業者”ではなく“相棒”としてリードするための実践手順を身につけましょう。
第6章:AIを使いこなす「手法」クイズ! 目次
- プログラミング クイズ一覧へ
- 次のクイズへ(第7章:AIでは制御できない「法則」クイズ!)
- 前のクイズへ(第5章:AIに優しい開発「習慣」クイズ!)
- 『プリンシプル オブ プログラミング』101の原理・原則総まとめ
第6章:手法
~プログラマの道具箱~
6.1 曳光弾(Tracer Bullet Development)
要旨
まず、いちばん早く確かめたい部分だけを先行実装し、まだ簡易版でもよいので実環境で一通り動く流れ(エンドツーエンド:画面→処理→保存までつながった状態)を通してみる。理由
とりあえずでも動く最小構成が早く用意できると、「本当にこの方向でいいか?」を実際に触りながら学習・調整・検証できるサイクルがどんどん回せるから。結論
最初に土台となる骨格を作り、それを曳光弾(弾道が見える試し打ち)として通す。あとはその骨格に少しずつ肉付けしながら、目標とのズレを常にチェックして、必要なら途中で軌道修正していく。その他(メリット・比較)
メリット
- ユーザーフィードバックを早い段階で集められる(ジョハリの窓的に=自分もユーザーも気づいていないポイントが見えやすくなる)。
- プログラマの「舞台」が早く整うので、チーム全員が全体像を見ながら生産的に動ける。
- デバッグやテストを早く・正確に行える(小さな機能ができたら、すぐ全体に組み込んで確認できる)。
- いつでも人に見せられるデモ用ソフトを持っておける。
- 進捗が見えやすい(ユースケース単位で「ここまで通った」と説明しやすい)。
プロトタイプとの違い
- プロトタイプ…理解を確かめるための試作品。基本は使い捨てが前提で、「学び」を得たら本番コードは作り直すことが多い。
- 曳光弾…最初から本番で使うつもりの最小コードで全体のつながりを通し、あとからも使い続ける骨格として育てていく。
💡AIワンポイント
曳光弾では、AIにエンドツーエンドの最小経路を先に作らせます。仮の固定値でも本番経路を通すと、欠落要件が早く見えます。関連用語(用語集で復習)
6.2 契約による設計(Design by Contract)
AI重要 ★★★★★AI核心原則
要旨
関数やメソッドの「呼び出す側」と「呼び出される側」が、あらかじめ契約(前提条件・事後条件)を決めておき、その約束にそって実装する考え方。理由
契約をはっきりさせて守ることで、正しさの保証(やるべきことはやり、やらなくてよいことはやらない)・コードの単純化・バグの早期発見(おかしいときはすぐ落とす)がしやすくなるから。結論
関数の仕様はコメントなどで明示し、コードの中ではアサーション(assert:条件チェック)で契約を守れているか確認する。呼び出す前の前提条件と、処理が終わったあとの事後条件を意識して書く。その他(指針・注意・拡張・運用)
指針
- 呼び出す側は、決められた前提条件を満たしてから呼び出す(入力チェックは基本的に呼び出し側の仕事)。
- 呼び出される関数側は、引数をこっそり補正しない(契約違反はすぐ検出して問題に気づく)。
- 「こうであるべき」という想定は厳しく、「こう返す」という確約は少し余裕を持たせる(受け口を増やしすぎず、返り値の条件で縛りすぎない)。
オブジェクト指向の拡張
- クラス不変表明(どんなメソッドを呼んでも常に成り立っていてほしい条件)も契約として決めておき、それを壊さないように実装する。
アサーション運用
エラーハンドリング方針
- 「本来ありえないはず」の事態は、だらだら処理を続けず早めにクラッシュさせて、大きな音で知らせるイメージで通知する(被害が広がらないうちに止める)。
💡AIワンポイント
契約による設計では、AI生成関数に前提条件と失敗時挙動を明記させます。例外型と戻り値契約を固定すると呼び出し側が安定します。契約違反時のエラーメッセージ形式まで固定すると運用解析が速くなります。関連用語(用語集で復習)
6.3 防御的プログラミング(Defensive Programming)
AI注意 ★★★★
要旨
「きっと大丈夫だろう」ではなく「おかしいことが起きるかもしれない」と考え、入力と境界(はみ出しそうな部分)をしっかり守る書き方をする。理由
おかしな値や想定外の入力を早めに見つけて対処できれば、開発中はデバッグが楽になり、運用中も安全性やセキュリティを高く保てるから。結論
バリケード戦略で外からの「汚れたデータ」が中に入らないようにし、状況に応じてエラー処理のポリシー(どう振る舞うかの方針)を選ぶ。どこで正しさを最優先し、どこで止まらないこと(堅牢性)を優先するのかをはっきりさせておく。その他(観点・戦略・手当)
観点
- 外部入力の確認(ファイル・ユーザー入力・ネットワークなど)…許してよい範囲をチェックし、サニタイズ(危険な部分を無害化)して「想定内エラー」として扱う。
- 関数引数の確認…ここがおかしいのはプログラムのバグ。アサーションなどで検出し、必要なら処理を止める(=「想定外エラー」)。
バリケード戦略
- ダーティルーム(外部からデータが入ってくる入口)→バリケード(検証・消毒をする場所)→クリーンルーム(中の安全な世界)の三段構えで役割を分ける。
想定内エラーの処理例
- 無害な値を返す(0 や空文字列、NULL など)。
- 次のデータにスキップする(壊れているレコードは読み飛ばす)。
- 前回の値を返す(センサー読み取りに失敗したときなど)。
- 近い有効値に丸める(0~100 の範囲外なら 0 か 100 に直すなど)。
- 状況をログに記録するだけにして処理は続ける(軽い問題のとき)。
- エラー状態や例外などでエラーを返し、上位に判断をゆだねる。
- 共通のエラー処理に集めて処理する(ログ内容はそのままユーザーに見せない)。
- ユーザーに必要最小限のメッセージを見せる(特にログインなど認証系では詳しい理由を出しすぎない)。
- 処理を中止する(動き続けるほうが危険なとき)。
- 場所ごとにいちばん妥当な方法を選びつつ、システム全体としては方針がバラバラにならないよう注意する。
正当性 と 堅牢性
- 医療システムなど安全最優先の世界では、多少止まっても正しい結果であることを優先(正当性 > 堅牢性)。
- 文書編集ソフトなどユーザー体験最優先の世界では、多少結果があいまいでも落ちないことを優先(堅牢性 > 正当性)。
「言語の中へ」
- 言語に標準機能がなくても、ライブラリやマクロなどを使って契約や防御の考え方を取り込み、コードとして表現できる形で実装していく。
セキュリティ補足
- エラー処理が雑だと、そこがセキュリティホール(攻撃の入口)になりやすい。入力チェック・例外処理・ログの扱いには特に注意する。
💡AIワンポイント
防御的実装として、AIコードの入口でバリデーションを完了させます。内部で何度も同じ検証をしない構造にすると見通しが良くなります。境界で弾かなかった値が内部へ広がると、障害時の原因特定が急に難しくなります。関連用語(用語集で復習)
6.4 ドッグフーディング(Dogfooding)
要旨
自分たちが作ったソフトウェアを、自分自身がユーザーとして本気で使ってみること。理由
開発者はついバグを避ける動き方(安全な使い方)をしてしまいがちで、本当のユーザーが起こすような変な操作や別視点の使い方の中にしか見えない問題がたくさんあるから。結論
ユーザーになりきって使ってみて、「作り手から見た世界」と「使い手から見た世界」の差(ジョハリの窓)を意識しながら、そのギャップを少しずつ埋めていく。その他(効果・実践)
- 効果:隠れていたバグを早期に見つけられる/ユーザーにとって本当に大事な体験が分かる/どこから直すべきか優先順位がはっきりする。
- 実践:実際の環境・実際のデータ・実際の端末で操作する。正常なケースだけでなく、あえて異常な操作や境界ギリギリの値も試してみる。
💡AIワンポイント
ドッグフーディングでは、AIで作った機能を自分の実データで必ず回します。使いにくさは仕様書より操作時に露出します。関連用語(用語集で復習)
6.5 ラバーダッキング(Rubber Duck Debugging)
要旨
問題の状況を誰かに(ゴムのアヒルでもOK)説明することで頭の中が整理され、自分で答えにたどり着きやすくなるデバッグ手法。理由
説明の途中で、状況を筋道立てて言葉にし直すことになるため、矛盾しているところや「うまく説明できない部分」に自分で気づきやすくなるから。結論
行き詰まったときは、コードや状況を声に出して順番に説明してみる。相手は人でもぬいぐるみでもよく、いちばん大事なのは説明という行為そのもの。その他(コツ)
- 「再現手順 → 期待していた結果 → 実際の結果 → その差 → 仮説」の順で話してみる。
- コードの断片を読み上げつつ、自分の意図と実際の処理がズレていないかを一行ずつ確認する。
- 説明しながら最小限の再現コードになるように、問題の範囲を少しずつ縮めていく。
💡AIワンポイント
ラバーダッキングをAIと行う時は、再現手順を時系列で渡して矛盾点を突きます。説明途中で曖昧になる箇所が不具合の起点です。関連用語(用語集で復習)
6.6 コンテキスト(Context)
AIで差が出る ★★★★★AI核心原則
要旨
周りの状況や背景(文脈)を意識し、それを設計・実装・コミュニケーションの中に取り入れて、判断の質を高める。理由
コンテキストを考えながら見ると、バラバラに見えていた情報がつながって意味を持ち、迷子にならずに正しい解決策へたどりつきやすくなるから。結論
コンテキストをモデルとして整理・共有する(例:ドメインモデル=現実世界の構造を表したモデル)。さらにシステムシンキング(全体の関係を見る考え方)などの思考法を使って掘り下げ、チーム全体で共通の文脈(ハイコンテキスト)を育てていく。その他(活用・例・指針)
コードの読み書きに利用
- 階層原理(セクション/章/段落/文のように大きさで分ける)と驚き最小の原則(読んだ人が「えっ?」とならない自然な流れ)を意識して、読みやすい文脈を作る。
思考のツールとして利用
- 物事はお互いに影響し合っている。背景や周辺の事情も含めて考えることで、より正確に問題を解きやすくなる。
コンテキストと依頼作業
- 経験豊富な人には「目的」だけ伝えれば動いてくれることが多いが、初心者には前提や手順までセットで伝える必要がある。=経験が文脈を補ってくれる。
コンテキストの伝達能力
- 言葉(コンテンツ)は、文脈と一緒になって初めて意味を持つ。例として、トイレに行った子どもの「お母さん!」という一言は、状況込みで「トイレットペーパーを持ってきて」の意味になる。
チームはハイコンテキスト志向で
- 共通の文脈が増えるほど、説明のオーバーヘッド(余計な手間)が減り、品質も上がりやすい。
- 新しく入ったメンバーには、「自明だと思っていること」も5W1H(いつ・どこで・誰が・何を・なぜ・どうやって)を意識して言葉にして伝える。
コード共通化はコンテキスト志向で
- 見た目が似ている処理でも、役割や前提が違うものは安易に共通化しない(あとで別の変更が必要になりがち)。
- 共通化すると依存関係が増えるので、システム全体の構造と文脈をよく見てから判断する。
プログラマのコンテキストスイッチ
- 深く集中している状態(フロー)は中断に弱い。職場の文化として、むやみに中断しない・集中時間を尊重することを大切にする。
「システムシンキング」とドメイン駆動設計
- 全体を一つのシステムとして見る考え方を、ドメインモデル中心の開発(DDD=Domain-Driven Design)で形にする。
- 現場の専門家と一緒にモデルを何度も更新し、言葉・図・コードをそのモデルと一体にしていく。
フロネシスと全体最適化
- フロネシス(状況に応じて最善を選ぶ実践的な知恵)を働かせて文脈を読み取り、ユーザー価値にとって全体としていちばん良い選択を考える。
「関係主義」と障害対応
- 問題が起きたときは、コードだけでなくライブラリ・環境・他システムとの相互作用など、関係性全体の中から原因を探す。
💡AIワンポイント
コンテキスト重視なら、AIへ業務背景と制約を最初に与えます。断片コードだけ渡すと、正しそうで使えない案が増えます。特に例外時の業務優先順位を渡さないと、復旧方針が現場とずれやすくなります。関連用語(用語集で復習)
プリンシプル オブ プログラミング(第6章:手法)
1. 【6.3.防御的プログラミング⑨】
解説: 共通のエラー処理関数を用いることで、エラーハンドリングの一貫性が保たれ、デバッグや保守が容易になる。
2. 【6.3.防御的プログラミング⑪】
防御的プログラミングで使用される「サニタイズ処理」とは何を目的としたものか?
解説: サニタイズ処理とは、外部からの入力を安全な形式に変換し、システム内部への悪影響を防ぐための処理である。
3. 【6.4.ドッグフーディング②】
ドッグフーディングの目的として最も適切なものはどれか?
解説: 開発者自身が使ってみることで、他人の視点ではじめて気づくバグや使いづらさを発見するのがドッグフーディングの主目的である。
4. 【6.5.ラバーダッキング②】
ラバーダッキングにおいて、「説明相手」として最も必要な条件はどれか?
解説: ラバーダッキングでは、説明相手が人である必要はなく、重要なのは「説明する」行為そのもの。ゴムのアヒルでも効果がある。
5. 【6.3.防御的プログラミング⑬】
防御的プログラミングにおいて、次のうち「想定外のエラー」に最も該当するのはどれか?
解説: 型の異なる引数など、開発者が意図していないコードの使い方は「想定外のエラー」であり、重大な不具合の前兆である。
6. 【6.2.契約による設計(Design by Contract)⑩】
契約による設計の方針として正しいものはどれか?
解説: 契約違反が発生した場合には、早期に実行停止させて問題を顕在化させるのが原則である。これは「早めにクラッシュ」の原則にも合致する。
7. 【6.5.ラバーダッキング⑤】
問題が解決しないときに「ラバーダッキング」を試す利点はどれか?
解説: ラバーダッキングは、説明することで自分自身の理解が深まり、他人の助けなしに自己解決に至ることがある点が大きな利点である。
8. 【6.6.コンテキスト⑬】
「エピステーメ」「テクネ」「フロネシス」のうち、実践的な判断力を表すのは?
解説: フロネシスは実践的な智慧や判断力を意味し、状況に応じた適切な行動を導く力である。
9. 【6.5.ラバーダッキング③】
ラバーダッキングが有効な理由として最も適切なものはどれか?
解説: 説明することで、自分の理解が論理的に整理され、矛盾や誤解に気づくことができるため、ラバーダッキングは有効である。
10. 【6.6.コンテキスト⑰】
「言葉(コンテンツ)」は何と組み合わさって意味を持つか?
解説: 発言の意味は、状況や背景(=コンテキスト)と一体になることで正しく伝わる。
参考文献・出典
- プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
- 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3
※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。
このサイトの運営者
経験:Webアプリ・業務システム
得意:PHP・JavaScript・MySQL・CSS
制作・運用中:フォーム生成基盤・クイズ学習プラットフォーム・htmx逆引きレシピ 等
AI時代のエンジニアタイプ診断:CSPF/とろとろみかん
詳しいプロフィールはこちら! もちもちみかんのプロフィール