『プリンシプル オブ プログラミング』アーキテクチャ非機能要件を10問で学べるクイズサイト

6つの非機能要件をクイズで学ぶ!
「アーキテクチャ非機能要件」要約&クイズ

公開日:
最終更新日:

システムの性能、セキュリティ、保守性など、「非機能要件」はアーキテクチャの品質を決定づけます。本ページでは、この非機能要件の要点を要約で整理します。

要約で要件の基本を習得し、10問のクイズで定着。システムの安定稼働と拡張性を考慮したプロの設計思考を確立しましょう!

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

アーキテクチャ非機能要件 目次

  1. アーキテクチャ非機能要件の要点・要約を読む(5分)
    1. 3.22 アーキテクチャ非機能要件(Architecture quality attributes)
    2. 3.23 変更容易性(Changeability)
    3. 3.24 相互運用性(Interoperability)
    4. 3.25 効率性(Efficiency)
    5. 3.26 信頼性(Reliability)
    6. 3.27 テスト容易性(Testability)
    7. 3.28 再利用性(Reusability)
  2. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. 第3章目次へ
  3. 次のクイズへ(7つの設計原理)
  4. 前のクイズへ(アーキテクチャ根底技法)
  5. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

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

第3章:思想③
~アーキテクチャ非機能要件~

3.22 アーキテクチャ非機能要件(Architecture quality attributes)

  • 要旨

    「ちゃんと動くか」という機能だけでなく、速さ・安全性・直しやすさなどの「非機能」の品質も、アーキテクチャ設計では同じくらい大事に考えるべきものだ、という考え方。
  • 理由

    非機能の良し悪しは、システムを動かし続けるコストや手間、トラブルが起きたときのリスクに直結する。ここが弱いと、たとえ今は動いていても、長い目で見たときのプロダクトの価値や寿命が大きく変わってしまうから。
  • 結論

    最初から非機能の観点も含めて設計し、要件定義→設計→テストのそれぞれの段階で、「何を満たせば合格なのか」という基準を決めて、実際に検証する。
  • その他(範囲・観点・実践)

    • 主要な観点(例)
      • 変更容易性(Changeability)…直しやすさ・変えやすさ。
      • 相互運用性(Interoperability)…他システムとつながりやすいか。
      • 効率性(Efficiency)…速さとリソース(CPU・メモリなど)の使い方。
      • 信頼性(Reliability)…トラブルがあってもちゃんと動き続けるか。
      • テスト容易性(Testability)…テストしやすい構造になっているか。
      • 再利用性(Reusability)…作ったものを別の場面でも使い回せるか。
    • プロセスとしての扱い方
      • 要件定義:各観点について「どのくらい必要か」という必要水準を関係者で合意する。
      • 設計:その水準を満たすための構造(境界・分離・標準化・冗長化など)を具体的な形に落とし込む。
      • テスト:非機能テストの合格ラインを数値や条件で決め、「どう実現されているか(How)」に注目して検証する。
    • セキュリティ(CIA の3つ)
      • 機密性 (Confidentiality):見ていい人以外には情報が見えないようにすること(アクセス制御・暗号化など)。
      • 完全性 (Integrity):データが勝手に書き換えられたり、壊れたりしていないことを守ること(改ざん検知・署名など)。
      • 可用性 (Availability):必要なときにちゃんとシステムが使える状態を保つこと(冗長化・攻撃対策など)。
    • 検証・運用上のポイント
      • 必要に応じてペネトレーションテスト(疑似攻撃による診断)を実施し、弱点を洗い出す(外部専門家に依頼するケースも多い)。
      • セキュリティ強化と同時に、利便性とのバランスも意識する(パスワード入力を増やしすぎてユーザー体験を壊さない、など)。

3.23 アーキテクチャ非機能要件①変更容易性(Changeability)

  • 要旨

    ソフトウェアをあとから修正・機能追加・構造の組み直し・他環境への移植などするときに、それを素早く・安全に行える力のこと。
  • 理由

    ソフトウェアは一度作って終わりではなく、長い期間にわたって変化し続けるのが当たり前。変更しやすい設計でないと、要望への対応が遅くなったり、直すたびに不具合を生んだりしやすくなるから。
  • 結論

    設計をレビューするときは、保守性拡張性再構築性移植性といった観点から、「変えやすさ」を意識して評価・改善していく。
  • その他(観点別の設計指針)

    • 保守性
      • 変更の影響が局所で済むようにする(影響範囲の封じ込め)。
      • モジュールの境界やインターフェースをはっきりさせ、テストもその境界ごとに用意しておく。
    • 拡張性
      • クライアント側をほとんど変えずに、モジュールを差し替え・追加できるようにする(OCP・DI・プラグイン構造など)。
    • 再構築性
      • 具体的な実装に依存しすぎないようにし、システム構成を柔軟に組み替えられるようにする(レイヤ分離・設定ファイルやコードで構成管理など)。
    • 移植性
      • プラットフォーム依存の部分(OS・ハード・UI・特定APIなど)を専用モジュールにまとめて隔離し、他の部分からは直接触らないようにする。
  • その他(劣化対策)

    • ソフトウェアも時間が経つと複雑さがたまりやすく、経年劣化(ソフトウェアエージング)を起こす。
    • これを遅らせるために、以下を意識する
      • 正確で更新され続けるドキュメント。
      • アーキテクチャを壊さないようにする変更ルール。
      • きちんとしたコードレビュー文化。
      • 「どこがよく変わりそうか」を予測し、それに合わせた柔軟な設計。

3.24 アーキテクチャ非機能要件②相互運用性(Interoperability)

  • 要旨

    自分のシステムが、他のシステムやサービスとスムーズにやり取りできる力のこと(機能の連携・データの連携など)。
  • 理由

    多くのソフトウェアは、単体で完結せずに、他のシステムとつながって仕事をする部品になっている。高い相互運用性があると、新しい用途への展開開発期間の短縮コスト削減につながるから。
  • 結論

    外部の機能やデータにどうアクセスするかを仕様としてきちんと定義し、できる限り業界で標準的なプロトコルやデータ形式を採用する。
  • その他(実践・効果)

    • APIは契約ベースで設計し、OpenAPIやGraphQLのスキーマなどで仕様を明文化し、バージョン管理する。
    • データ交換には JSON / Avro / Protobuf などの標準フォーマットを使い、必要なら「互換レイヤ(変換層)」を用意して、相手の仕様が変わっても対応しやすくする。
    • 効果:機能の再利用がしやすくなり、新しいサービスとの連携も簡単になる。結果として、自前で全部作らずに済み、開発・運用コストを抑えやすくなる。

3.25 アーキテクチャ非機能要件③効率性(Efficiency)

  • 要旨

    限られたコンピュータ資源(CPU・メモリ・ディスク・ネットワークなど)の中で、必要な性能をきちんと引き出す力のこと。ここでは、時間効率資源効率の両方を含む。
  • 理由

    リソースはタダではなく有限なので、設計がまずいと遅い・重い・コストがかかるシステムになってしまう。効率よく設計できれば、ユーザーの体感速度も良くなり、インフラ費用も抑えやすくなるから。
  • 結論

    まずムダを減らす(節約)設計を心がけ、そのうえで必要に応じてスケールさせる(拡張)設計を組み合わせる。また、保守性や再利用性のために、あえて間接化(1枚レイヤを挟む)することも検討する。
  • その他(範囲・指標・設計の勘所)

    • 時間効率性
      • スループット:一定時間あたりにどれだけ処理できるか。
      • レスポンスタイム:リクエストしてから応答が返るまでの時間。
      • ターンアラウンドタイム:処理の依頼から結果が得られるまでの全体時間。
    • 資源効率性
      • CPU使用率・メモリ消費・ディスクI/O・ネットワーク帯域などを計測・監視し、ボトルネックを見つけて改善する。
    • 間接化の活用
      • キャッシュ層を挟んで、同じデータへのアクセスを減らす。
      • キューを挟んで、負荷の波をならす(バーストを直接本体にぶつけない)。
      • アダプタや抽象レイヤを挟んで、実装の差し替えを簡単にする。
      • レイヤを一段深くするだけで解決できる問題」も多いことを覚えておく。

3.26 アーキテクチャ非機能要件④信頼性(Reliability)

  • 要旨

    エラー・例外・不正利用・故障などの「異常な状況」が起きても、できるだけ正しく動き続ける力のこと(フォールトトレランス+ロバストネス※後述)。
  • 理由

    現実の運用では、バグ・障害・誤操作などを完全には防げない。異常時の設計が甘いと、すぐにシステムが止まったり、データが壊れたりしてしまい、サービスの可用性や安全性が大きく下がるから。
  • 結論

    冗長化(予備を持つ)、フェールソフト(一部が壊れても全体は動かす)、フェールセーフ(壊れるときは安全側に倒れる)といった考え方を設計に組み込み、可能ならフールプルーフ(そもそも危険な操作をしにくい設計)で誤操作も防ぐ。
  • その他(範囲・手当)

    • フォールトトレランス
      • 障害やエラーが起きても、できる限りサービスを継続できるようにする。
      • 例:トランザクションのロールバック、リトライ処理、多重化(2系統で動かす)など。
    • ロバストネス
      • 不正な入力や予期しない操作があっても、システムがおかしな状態に落ちないようにする(安全なデフォルト状態へ戻すなど)。
    • 設計パターンの例
      • サーキットブレーカ:連続エラー時は一時的に呼び出しを遮断して被害を広げない。
      • タイムアウト:返答がない相手をいつまでも待たずに区切りをつける。
      • アイソレーション:問題のある部分を他から切り離し、連鎖障害を防ぐ。
      • 優先度制御:重要な処理を優先し、軽い処理は後回しにするなどの制御。

3.27 アーキテクチャ非機能要件⑤テスト容易性(Testability)

  • 要旨

    ソフトウェアが正しく動いているかを、効率よく・確実に調べられる能力のこと。後付けではなく、設計段階からテストしやすさを織り込んでおくことが大切。
  • 理由

    「動くこと」だけでなく、「それを簡単に確かめられること」も品質の一部。テストしにくい構造だと、バグを見逃しやすくなり、開発スピードもどんどん落ちてしまうから。
  • 結論

    本体の設計の中にテストしやすくする仕掛け(依存の分離・インターフェース化・観測性の確保)を組み込み、必要であれば本番コード内にテスト支援用の工夫を入れることも選択肢とする。
  • その他(設計・検証の要点)

    • 依存の注入(DI)
      • 外部サービス・DB・時刻・乱数などを直接呼ぶのではなく、インターフェース経由で注入できるようにしておく。
      • モックやスタブに差し替えられるようにし、テストで環境を再現しやすくする。
      • 小さな純粋関数(入力→出力がはっきりした関数)を増やすと、テストが楽になる。
    • 観測性(Observability)
      • ログ・メトリクス(数値で見る指標)・トレース(処理の流れの記録)などを通して、「中で何が起きているか」をあとから追いかけられるようにする。
      • テストや障害調査のときに、原因を特定しやすくなる。
    • テスト戦略
      • ユニットテストを中心としたテストピラミッドを意識し、E2E(エンドツーエンド)テスト(端から端まで)だけに頼らない。
      • インターフェースやAPIについては、契約テストで「約束どおりの振る舞い」を確認する。
      • E2E(エンドツーエンド)テストは数を絞りつつ、ユーザーにとって重要なシナリオをカバーするようにする。

3.28 アーキテクチャ非機能要件⑥再利用性(Reusability)

  • 要旨

    すでにあるコードや部品を、別の場面でも繰り返し使える力のこと。既存のものを「使う側」として再利用するだけでなく、自分たちが作る部品も「使われる側」として再利用しやすくしておくことが大事。
  • 理由

    すでにある解決策をうまく活用できれば、作業量を減らしバグを減らし開発スピードも上げられる。ただし、本当に再利用しやすい汎用部品を作るのは、普通のコードを書くよりも難しく、設計の工夫が必要だから。
  • 結論

    3の法則」を目安にしながら汎用化に取り組み、APIの安定化・丁寧なドキュメント・きちんとしたバージョン管理などで、「この部品なら安心して使える」と思ってもらえるようにする。
  • その他(3の法則・実践)

    • 難易度3倍の法則
      • 特定の1つの用途のためだけに書くコードよりも、「いろいろな場面で使い回せる部品」を設計する方が、ざっくり3倍は難しいと考えておく(抽象度・境界・拡張方法などをよく考える必要がある)。
    • テスト3種類の法則
      • 共通部品にする前に、少なくとも3つくらい違うプロダクトや状況で試しに使ってみると、「本当に汎用的に使える形になっているか」が見えてくる。
    • 実践のポイント
      • APIやデータ形式を標準化し、セマンティックバージョニング(意味的なバージョン管理)などでバージョンをわかりやすく管理する。
      • READMEや使用例を用意し、「どう使えばよいか」「どこに注意すべきか」を明示する。
      • 後方互換性ポリシーを決め、利用者が安心してアップデートできるようにする。
      • 大きすぎず小さすぎないちょうどよい粒度でパッケージ化し、「この単位で使うと便利」という境界を意識する。

プリンシプル オブ プログラミング(第3章-アーキテクチャ非機能要件)

1. 【3.22.アーキテクチャ非機能要件④】
『セキュリティ要件』に含まれるCIAのうち、「Integrity」に対応する説明はどれか?

2. 【3.23.アーキテクチャ非機能要件①『変更容易性』③】
『移植性』を高める設計方針として**最も適切なもの**はどれか?

3. 【3.24.アーキテクチャ非機能要件②『相互運用性』③】
相互運用性の設計方針として『モジュール同士はインターフェース越しに通信させる』の目的は何か?

4. 【3.24.アーキテクチャ非機能要件②『相互運用性』④】
以下のうち、**相互運用性を高める技術要素として不適切なもの**はどれか?

5. 【3.26.アーキテクチャ非機能要件④『信頼性』③】
次のうち「ロバストネス(Robustness)」に該当する設計として適切なものはどれか?

6. 【3.22.アーキテクチャ非機能要件⑥】
『非機能要件』の「再利用性」を高める設計として最も適切なのはどれか?

7. 【3.26.アーキテクチャ非機能要件④『信頼性』②】
フォールトトレランスの具体例として**最も適切なもの**はどれか?

8. 【3.25.アーキテクチャ非機能要件③『効率性』③】
次のうち、効率性向上のための設計視点として**不適切なもの**はどれか?

9. 【3.24.アーキテクチャ非機能要件②『相互運用性』①】
『相互運用性』の定義として最も適切なものはどれか?

10. 【3.28.アーキテクチャ非機能要件⑥『再利用性』②】
次のうち『再利用性の高いモジュール』の特徴として**誤っているもの**はどれか?

次のクイズ(7つの設計原理)へ

アーキテクチャ非機能要件
採点結果

正答率:0%

-

-

参考文献・出典

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

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

このページの著者

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

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

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

得意:PHP・JavaScript・MySQL・CSS

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

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

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

もちもちみかん.comとは


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

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