『プリンシプル オブ プログラミング』手法編を10問で学べるクイズサイト

設計現場で使える手法をクイズで学ぶ!
第6章:手法 要約&クイズ

公開日:
最終更新日:

リファクタリング、テスト、デバッグなど、プロの開発に欠かせない実践的な手法を、要点要約で集中的に学びます。

要約で手法の基本を習得し、10問のクイズで実践力を確認。保守性と拡張性の高いコードを書くスキルを確立しましょう!

今すぐクイズに挑戦
(10問・約3分・解説つき)
プリンシプルオブプログラミング
1分で理解&101の原則総まとめ!

第6章:手法 目次

  1. 第6章:手法の要点・要約を読む(5分)
    1. 6.1 曳光弾(Tracer Bullet Development)
    2. 6.2 契約による設計(Design by Contract)
    3. 6.3 防御的プログラミング(Defensive Programming)
    4. 6.4 ドッグフーディング(Dogfooding)
    5. 6.5 ラバーダッキング(Rubber Duck Debugging)
    6. 6.6 コンテキスト(Context)
  2. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. 次のクイズへ(第7章:法則)
  3. 前のクイズへ(第5章:習慣)
  4. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

  1. 参考文献・出典
  2. このページの著者
  3. シェア

第6章:手法
~プログラマの道具箱~

6.1 曳光弾(Tracer Bullet Development)

  • 要旨

    まず、いちばん早く確かめたい部分だけを先行実装し、まだ簡易版でもよいので実環境で一通り動く流れ(エンドツーエンド:画面→処理→保存までつながった状態)を通してみる。
  • 理由

    とりあえずでも動く最小構成が早く用意できると、「本当にこの方向でいいか?」を実際に触りながら学習・調整・検証できるサイクルがどんどん回せるから。
  • 結論

    最初に土台となる骨格を作り、それを曳光弾(弾道が見える試し打ち)として通す。あとはその骨格に少しずつ肉付けしながら、目標とのズレを常にチェックして、必要なら途中で軌道修正していく。
  • その他(メリット・比較)

    • メリット
      • ユーザーフィードバックを早い段階で集められる(ジョハリの窓的に=自分もユーザーも気づいていないポイントが見えやすくなる)。
      • プログラマの「舞台」が早く整うので、チーム全員が全体像を見ながら生産的に動ける。
      • デバッグやテストを早く・正確に行える(小さな機能ができたら、すぐ全体に組み込んで確認できる)。
      • いつでも人に見せられるデモ用ソフトを持っておける。
      • 進捗が見えやすい(ユースケース単位で「ここまで通った」と説明しやすい)。
    • プロトタイプとの違い
      • プロトタイプ理解を確かめるための試作品。基本は使い捨てが前提で、「学び」を得たら本番コードは作り直すことが多い。
      • 曳光弾…最初から本番で使うつもりの最小コードで全体のつながりを通し、あとからも使い続ける骨格として育てていく。

6.2 契約による設計(Design by Contract)

  • 要旨

    関数やメソッドの「呼び出す側」「呼び出される側」が、あらかじめ契約(前提条件・事後条件)を決めておき、その約束にそって実装する考え方。
  • 理由

    契約をはっきりさせて守ることで、正しさの保証(やるべきことはやり、やらなくてよいことはやらない)・コードの単純化バグの早期発見(おかしいときはすぐ落とす)がしやすくなるから。
  • 結論

    関数の仕様はコメントなどで明示し、コードの中ではアサーション(assert:条件チェック)で契約を守れているか確認する。呼び出す前の前提条件と、処理が終わったあとの事後条件を意識して書く。
  • その他(指針・注意・拡張・運用)

    • 指針
      • 呼び出す側は、決められた前提条件を満たしてから呼び出す(入力チェックは基本的に呼び出し側の仕事)。
      • 呼び出される関数側は、引数をこっそり補正しない(契約違反はすぐ検出して問題に気づく)。
      • 「こうであるべき」という想定は厳しく「こう返す」という確約は少し余裕を持たせる(受け口を増やしすぎず、返り値の条件で縛りすぎない)。
    • オブジェクト指向の拡張
      • クラス不変表明(どんなメソッドを呼んでも常に成り立っていてほしい条件)も契約として決めておき、それを壊さないように実装する。
    • アサーション運用
      • アサーションは開発・保守のための仕組みであり、エンドユーザー向けの丁寧なエラーメッセージではない。→ 本番リリース版ではオフにする/含めない運用が多い。
    • エラーハンドリング方針
      • 「本来ありえないはず」の事態は、だらだら処理を続けず早めにクラッシュさせて、大きな音で知らせるイメージで通知する(被害が広がらないうちに止める)。

6.3 防御的プログラミング(Defensive Programming)

  • 要旨

    「きっと大丈夫だろう」ではなく「おかしいことが起きるかもしれない」と考え、入力と境界(はみ出しそうな部分)をしっかり守る書き方をする。
  • 理由

    おかしな値や想定外の入力を早めに見つけて対処できれば、開発中はデバッグが楽になり、運用中も安全性やセキュリティを高く保てるから。
  • 結論

    バリケード戦略で外からの「汚れたデータ」が中に入らないようにし、状況に応じてエラー処理のポリシー(どう振る舞うかの方針)を選ぶ。どこで正しさを最優先し、どこで止まらないこと(堅牢性)を優先するのかをはっきりさせておく。
  • その他(観点・戦略・手当)

    • 観点
      • 外部入力の確認(ファイル・ユーザー入力・ネットワークなど)…許してよい範囲をチェックし、サニタイズ(危険な部分を無害化)して「想定内エラー」として扱う。
      • 関数引数の確認…ここがおかしいのはプログラムのバグアサーションなどで検出し、必要なら処理を止める(=「想定外エラー」)。
    • バリケード戦略
      • ダーティルーム(外部からデータが入ってくる入口)→バリケード(検証・消毒をする場所)→クリーンルーム(中の安全な世界)の三段構えで役割を分ける。
    • 想定内エラーの処理例
      • 無害な値を返す(0 や空文字列、NULL など)。
      • 次のデータにスキップする(壊れているレコードは読み飛ばす)。
      • 前回の値を返す(センサー読み取りに失敗したときなど)。
      • 近い有効値に丸める(0~100 の範囲外なら 0 か 100 に直すなど)。
      • 状況をログに記録するだけにして処理は続ける(軽い問題のとき)。
      • エラー状態や例外などでエラーを返し、上位に判断をゆだねる
      • 共通のエラー処理に集めて処理する(ログ内容はそのままユーザーに見せない)。
      • ユーザーに必要最小限のメッセージを見せる(特にログインなど認証系では詳しい理由を出しすぎない)。
      • 処理を中止する(動き続けるほうが危険なとき)。
      • 場所ごとにいちばん妥当な方法を選びつつ、システム全体としては方針がバラバラにならないよう注意する。
    • 正当性 と 堅牢性
      • 医療システムなど安全最優先の世界では、多少止まっても正しい結果であることを優先(正当性 > 堅牢性)。
      • 文書編集ソフトなどユーザー体験最優先の世界では、多少結果があいまいでも落ちないことを優先(堅牢性 > 正当性)。
    • 「言語の中へ」
      • 言語に標準機能がなくても、ライブラリやマクロなどを使って契約や防御の考え方を取り込み、コードとして表現できる形で実装していく。
    • セキュリティ補足
      • エラー処理が雑だと、そこがセキュリティホール(攻撃の入口)になりやすい。入力チェック・例外処理・ログの扱いには特に注意する。

6.4 ドッグフーディング(Dogfooding)

  • 要旨

    自分たちが作ったソフトウェアを、自分自身がユーザーとして本気で使ってみること。
  • 理由

    開発者はついバグを避ける動き方(安全な使い方)をしてしまいがちで、本当のユーザーが起こすような変な操作や別視点の使い方の中にしか見えない問題がたくさんあるから。
  • 結論

    ユーザーになりきって使ってみて、「作り手から見た世界」と「使い手から見た世界」の差(ジョハリの窓)を意識しながら、そのギャップを少しずつ埋めていく。
  • その他(効果・実践)

    • 効果:隠れていたバグを早期に見つけられる/ユーザーにとって本当に大事な体験が分かる/どこから直すべきか優先順位がはっきりする。
    • 実践:実際の環境・実際のデータ・実際の端末で操作する。正常なケースだけでなく、あえて異常な操作や境界ギリギリの値も試してみる。

6.5 ラバーダッキング(Rubber Duck Debugging)

  • 要旨

    問題の状況を誰かに(ゴムのアヒルでもOK)説明することで頭の中が整理され、自分で答えにたどり着きやすくなるデバッグ手法。
  • 理由

    説明の途中で、状況を筋道立てて言葉にし直すことになるため、矛盾しているところや「うまく説明できない部分」に自分で気づきやすくなるから。
  • 結論

    行き詰まったときは、コードや状況を声に出して順番に説明してみる。相手は人でもぬいぐるみでもよく、いちばん大事なのは説明という行為そのもの
  • その他(コツ)

    • 「再現手順 → 期待していた結果 → 実際の結果 → その差 → 仮説」の順で話してみる。
    • コードの断片を読み上げつつ、自分の意図と実際の処理がズレていないかを一行ずつ確認する。
    • 説明しながら最小限の再現コードになるように、問題の範囲を少しずつ縮めていく。

6.6 コンテキスト(Context)

  • 要旨

    周りの状況や背景(文脈)を意識し、それを設計・実装・コミュニケーションの中に取り入れて、判断の質を高める。
  • 理由

    コンテキストを考えながら見ると、バラバラに見えていた情報がつながって意味を持ち、迷子にならずに正しい解決策へたどりつきやすくなるから。
  • 結論

    コンテキストをモデルとして整理・共有する(例:ドメインモデル=現実世界の構造を表したモデル)。さらにシステムシンキング(全体の関係を見る考え方)などの思考法を使って掘り下げ、チーム全体で共通の文脈(ハイコンテキスト)を育てていく。
  • その他(活用・例・指針)

    • コードの読み書きに利用
      • 階層原理(セクション/章/段落/文のように大きさで分ける)と驚き最小の原則(読んだ人が「えっ?」とならない自然な流れ)を意識して、読みやすい文脈を作る。
    • 思考のツールとして利用
      • 物事はお互いに影響し合っている。背景や周辺の事情も含めて考えることで、より正確に問題を解きやすくなる。
    • コンテキストと依頼作業
      • 経験豊富な人には「目的」だけ伝えれば動いてくれることが多いが、初心者には前提や手順までセットで伝える必要がある。=経験が文脈を補ってくれる
    • コンテキストの伝達能力
      • 言葉(コンテンツ)は、文脈と一緒になって初めて意味を持つ。例として、トイレに行った子どもの「お母さん!」という一言は、状況込みで「トイレットペーパーを持ってきて」の意味になる。
    • チームはハイコンテキスト志向で
      • 共通の文脈が増えるほど、説明のオーバーヘッド(余計な手間)が減り、品質も上がりやすい。
      • 新しく入ったメンバーには、「自明だと思っていること」も5W1H(いつ・どこで・誰が・何を・なぜ・どうやって)を意識して言葉にして伝える。
    • コード共通化はコンテキスト志向で
      • 見た目が似ている処理でも、役割や前提が違うものは安易に共通化しない(あとで別の変更が必要になりがち)。
      • 共通化すると依存関係が増えるので、システム全体の構造と文脈をよく見てから判断する。
    • プログラマのコンテキストスイッチ
      • 深く集中している状態(フロー)は中断に弱い。職場の文化として、むやみに中断しない・集中時間を尊重することを大切にする。
    • 「システムシンキング」とドメイン駆動設計
      • 全体を一つのシステムとして見る考え方を、ドメインモデル中心の開発(DDD=Domain-Driven Design)で形にする。
      • 現場の専門家と一緒にモデルを何度も更新し、言葉・図・コードをそのモデルと一体にしていく。
    • フロネシスと全体最適化
      • フロネシス(状況に応じて最善を選ぶ実践的な知恵)を働かせて文脈を読み取り、ユーザー価値にとって全体としていちばん良い選択を考える。
    • 「関係主義」と障害対応
      • 問題が起きたときは、コードだけでなくライブラリ・環境・他システムとの相互作用など、関係性全体の中から原因を探す。

プリンシプル オブ プログラミング(第6章:手法)

1. 【6.3.防御的プログラミング⑫】
防御的プログラミングにおける「アサーション」の目的はどれか?

2. 【6.3.防御的プログラミング⑮】
セキュリティ面で防御的プログラミングが重要とされる理由はどれか?

3. 【6.2.契約による設計(Design by Contract)⑩】
契約による設計の方針として正しいものはどれか?

4. 【6.5.ラバーダッキング④】
ラバーダッキング中に不具合箇所に差し掛かった場合、どのような現象が起こることが多いか?

5. 【6.6.コンテキスト⑮】
障害対応において「関係主義」の姿勢とはどれか?

6. 【6.2.契約による設計(Design by Contract)⑤】
「アサーションはユーザー入力の検証には使わないべき」とされる理由はどれか?

7. 【6.3.防御的プログラミング⑬】
防御的プログラミングにおいて、次のうち「想定外のエラー」に最も該当するのはどれか?

8. 【6.3.防御的プログラミング④】
防御的プログラミングにおける「バリケード戦略」の目的はどれか?

9. 【6.6.コンテキスト⑤】
依頼作業で初心者に詳細な指示が必要になる理由は何か?

10. 【6.6.コンテキスト⑧】
コードの共通化を行う際の注意点として最も適切なのはどれか?

次のクイズ(第7章:法則)へ

第6章:手法
採点結果

正答率:0%

-

-

参考文献・出典

  • プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
  • 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3

※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。

このページの著者

もちもちみかん(システムエンジニア)

社内SEとしてグループ企業向けの業務アプリを要件定義〜運用まで一気通貫で担当しています。

経験:Webアプリ/業務システム

得意:PHP・JavaScript・MySQL・CSS

個人実績:フォーム生成基盤クイズ学習プラットフォーム

詳しいプロフィールはこちら!  もちもちみかんのプロフィール

もちもちみかん0系くん
TOPへ

もちもちみかん.comとは


このサイトでは、コーディングがめんどうくさい人向けのお助けツールとして、フォームやCSSをノーコードで生成できる、
 もちもちみかん.forms
 もちもちみかん.css1
 もちもちみかん.css2
と言ったジェネレーターを用意してます。

また、このサイトを通じて、「もちもちみかん」のかわいさを普及したいとかんがえてます!