AIが苦手な非機能要件をクイズで攻略!
第3章:思想|アーキテクチャ非機能要件
公開日:
最終更新日:
AIは機能の実装は得意でも、性能・保守性・信頼性などの非機能要件は抜けやすい領域です。本ページでは、『プリンシプル オブ プログラミング』第3章「アーキテクチャ非機能要件」で扱う6つの非機能要件を、要点を押さえた要約と4択クイズで整理します。
要約で判断ポイントをつかみ → 4択クイズ(10問・全問解説付き)で見落としを潰し → 気になったところは解説で復習。「読む→解く→わかる」で、AIには見えにくいシステムの頑健さを作る基準を身につけましょう。
3-3:AIが苦手な非機能要件クイズ! 目次
- プログラミング クイズ一覧へ
- 第3章:思想とセオリーの全体像をつかむ! 目次へ
- 次のクイズへ(3-4:AIリファクタの軸、7つの設計原理クイズ!)
- 前のクイズへ(3-2:AI共創の土台、10の設計技法クイズ!)
- 『プリンシプル オブ プログラミング』101の原理・原則総まとめ
第3章:思想③
~アーキテクチャ非機能要件~
3.22 アーキテクチャ非機能要件(Architecture quality attributes)
要旨
「ちゃんと動くか」という機能だけでなく、速さ・安全性・直しやすさなどの「非機能」の品質も、アーキテクチャ設計では同じくらい大事に考えるべきものだ、という考え方。理由
非機能の良し悪しは、システムを動かし続けるコストや手間、トラブルが起きたときのリスクに直結する。ここが弱いと、たとえ今は動いていても、長い目で見たときのプロダクトの価値や寿命が大きく変わってしまうから。結論
最初から非機能の観点も含めて設計し、要件定義→設計→テストのそれぞれの段階で、「何を満たせば合格なのか」という基準を決めて、実際に検証する。その他(範囲・観点・実践)
- 主要な観点(例)
- 変更容易性(Changeability)…直しやすさ・変えやすさ。
- 相互運用性(Interoperability)…他システムとつながりやすいか。
- 効率性(Efficiency)…速さとリソース(CPU・メモリなど)の使い方。
- 信頼性(Reliability)…トラブルがあってもちゃんと動き続けるか。
- テスト容易性(Testability)…テストしやすい構造になっているか。
- 再利用性(Reusability)…作ったものを別の場面でも使い回せるか。
- プロセスとしての扱い方
- 要件定義:各観点について「どのくらい必要か」という必要水準を関係者で合意する。
- 設計:その水準を満たすための構造(境界・分離・標準化・冗長化など)を具体的な形に落とし込む。
- テスト:非機能テストの合格ラインを数値や条件で決め、「どう実現されているか(How)」に注目して検証する。
- セキュリティ(CIA の3つ)
- 機密性 (Confidentiality):見ていい人以外には情報が見えないようにすること(アクセス制御・暗号化など)。
- 完全性 (Integrity):データが勝手に書き換えられたり、壊れたりしていないことを守ること(改ざん検知・署名など)。
- 可用性 (Availability):必要なときにちゃんとシステムが使える状態を保つこと(冗長化・攻撃対策など)。
- 検証・運用上のポイント
- 必要に応じてペネトレーションテスト(疑似攻撃による診断)を実施し、弱点を洗い出す(外部専門家に依頼するケースも多い)。
- セキュリティ強化と同時に、利便性とのバランスも意識する(パスワード入力を増やしすぎてユーザー体験を壊さない、など)。
- 主要な観点(例)
💡AIワンポイント
非機能要件は後付けしにくいので、AI提案時点で性能目標と可観測性要件を明記します。ログ項目とタイムアウト値を先に決めると手戻りが減ります。関連用語(用語集で復習)
3.23 アーキテクチャ非機能要件①変更容易性(Changeability)
要旨
ソフトウェアをあとから修正・機能追加・構造の組み直し・他環境への移植などするときに、それを素早く・安全に行える力のこと。理由
ソフトウェアは一度作って終わりではなく、長い期間にわたって変化し続けるのが当たり前。変更しやすい設計でないと、要望への対応が遅くなったり、直すたびに不具合を生んだりしやすくなるから。結論
設計をレビューするときは、保守性・拡張性・再構築性・移植性といった観点から、「変えやすさ」を意識して評価・改善していく。その他(観点別の設計指針)
その他(劣化対策)
- ソフトウェアも時間が経つと複雑さがたまりやすく、経年劣化(ソフトウェアエージング)を起こす。
- これを遅らせるために、以下を意識する
- 正確で更新され続けるドキュメント。
- アーキテクチャを壊さないようにする変更ルール。
- きちんとしたコードレビュー文化。
- 「どこがよく変わりそうか」を予測し、それに合わせた柔軟な設計。
💡AIワンポイント
変更容易性を上げるなら、AIが追加した依存を一覧化して影響半径を確認します。DI境界を越えた直接newが増えると改修速度が落ちます。関連用語(用語集で復習)
3.24 アーキテクチャ非機能要件②相互運用性(Interoperability)
要旨
自分のシステムが、他のシステムやサービスとスムーズにやり取りできる力のこと(機能の連携・データの連携など)。理由
多くのソフトウェアは、単体で完結せずに、他のシステムとつながって仕事をする部品になっている。高い相互運用性があると、新しい用途への展開や開発期間の短縮、コスト削減につながるから。結論
外部の機能やデータにどうアクセスするかを仕様としてきちんと定義し、できる限り業界で標準的なプロトコルやデータ形式を採用する。その他(実践・効果)
💡AIワンポイント
相互運用性では、AIにAPIスキーマ例とエラーフォーマットを固定させます。曖昧なレスポンス構造は連携先ごとの個別分岐を生みます。関連用語(用語集で復習)
3.25 アーキテクチャ非機能要件③効率性(Efficiency)
要旨
限られたコンピュータ資源(CPU・メモリ・ディスク・ネットワークなど)の中で、必要な性能をきちんと引き出す力のこと。ここでは、時間効率と資源効率の両方を含む。理由
リソースはタダではなく有限なので、設計がまずいと遅い・重い・コストがかかるシステムになってしまう。効率よく設計できれば、ユーザーの体感速度も良くなり、インフラ費用も抑えやすくなるから。結論
まずムダを減らす(節約)設計を心がけ、そのうえで必要に応じてスケールさせる(拡張)設計を組み合わせる。また、保守性や再利用性のために、あえて間接化(1枚レイヤを挟む)することも検討する。その他(範囲・指標・設計の勘所)
時間効率性
- スループット:一定時間あたりにどれだけ処理できるか。
- レスポンスタイム:リクエストしてから応答が返るまでの時間。
- ターンアラウンドタイム:処理の依頼から結果が得られるまでの全体時間。
資源効率性
- CPU使用率・メモリ消費・ディスクI/O・ネットワーク帯域などを計測・監視し、ボトルネックを見つけて改善する。
間接化の活用
- キャッシュ層を挟んで、同じデータへのアクセスを減らす。
- キューを挟んで、負荷の波をならす(バーストを直接本体にぶつけない)。
- アダプタや抽象レイヤを挟んで、実装の差し替えを簡単にする。
- 「レイヤを一段深くするだけで解決できる問題」も多いことを覚えておく。
💡AIワンポイント
効率性では、AI最適化案を採る前に計測値を比較します。体感ではなくp95遅延やメモリ使用量で判断し、効果が無い変更は戻します。関連用語(用語集で復習)
3.26 アーキテクチャ非機能要件④信頼性(Reliability)
要旨
エラー・例外・不正利用・故障などの「異常な状況」が起きても、できるだけ正しく動き続ける力のこと(フォールトトレランス+ロバストネス※後述)。理由
現実の運用では、バグ・障害・誤操作などを完全には防げない。異常時の設計が甘いと、すぐにシステムが止まったり、データが壊れたりしてしまい、サービスの可用性や安全性が大きく下がるから。結論
冗長化(予備を持つ)、フェールソフト(一部が壊れても全体は動かす)、フェールセーフ(壊れるときは安全側に倒れる)といった考え方を設計に組み込み、可能ならフールプルーフ(そもそも危険な操作をしにくい設計)で誤操作も防ぐ。その他(範囲・手当)
フォールトトレランス
- 障害やエラーが起きても、できる限りサービスを継続できるようにする。
- 例:トランザクションのロールバック、リトライ処理、多重化(2系統で動かす)など。
ロバストネス
- 不正な入力や予期しない操作があっても、システムがおかしな状態に落ちないようにする(安全なデフォルト状態へ戻すなど)。
設計パターンの例
- サーキットブレーカ:連続エラー時は一時的に呼び出しを遮断して被害を広げない。
- タイムアウト:返答がない相手をいつまでも待たずに区切りをつける。
- アイソレーション:問題のある部分を他から切り離し、連鎖障害を防ぐ。
- 優先度制御:重要な処理を優先し、軽い処理は後回しにするなどの制御。
💡AIワンポイント
信頼性を高めるなら、AI生成処理の失敗モードを列挙します。例外時に再試行するのか停止するのかを分けないと、障害時に挙動がぶれます。関連用語(用語集で復習)
3.27 アーキテクチャ非機能要件⑤テスト容易性(Testability)
要旨
ソフトウェアが正しく動いているかを、効率よく・確実に調べられる能力のこと。後付けではなく、設計段階からテストしやすさを織り込んでおくことが大切。理由
「動くこと」だけでなく、「それを簡単に確かめられること」も品質の一部。テストしにくい構造だと、バグを見逃しやすくなり、開発スピードもどんどん落ちてしまうから。結論
本体の設計の中にテストしやすくする仕掛け(依存の分離・インターフェース化・観測性の確保)を組み込み、必要であれば本番コード内にテスト支援用の工夫を入れることも選択肢とする。その他(設計・検証の要点)
依存の注入(DI)
- 外部サービス・DB・時刻・乱数などを直接呼ぶのではなく、インターフェース経由で注入できるようにしておく。
- モックやスタブに差し替えられるようにし、テストで環境を再現しやすくする。
- 小さな純粋関数(入力→出力がはっきりした関数)を増やすと、テストが楽になる。
観測性(Observability)
テスト戦略
- ユニットテストを中心としたテストピラミッドを意識し、E2E(エンドツーエンド)テスト(端から端まで)だけに頼らない。
- インターフェースやAPIについては、契約テストで「約束どおりの振る舞い」を確認する。
- E2E(エンドツーエンド)テストは数を絞りつつ、ユーザーにとって重要なシナリオをカバーするようにする。
💡AIワンポイント
テスト容易性では、AI実装に観測点を仕込みます。相関ID付きログやメトリクス名を先に決めると、失敗原因の追跡が短くなります。関連用語(用語集で復習)
3.28 アーキテクチャ非機能要件⑥再利用性(Reusability)
要旨
すでにあるコードや部品を、別の場面でも繰り返し使える力のこと。既存のものを「使う側」として再利用するだけでなく、自分たちが作る部品も「使われる側」として再利用しやすくしておくことが大事。理由
すでにある解決策をうまく活用できれば、作業量を減らし、バグを減らし、開発スピードも上げられる。ただし、本当に再利用しやすい汎用部品を作るのは、普通のコードを書くよりも難しく、設計の工夫が必要だから。結論
「3の法則」を目安にしながら汎用化に取り組み、APIの安定化・丁寧なドキュメント・きちんとしたバージョン管理などで、「この部品なら安心して使える」と思ってもらえるようにする。その他(3の法則・実践)
難易度3倍の法則
- 特定の1つの用途のためだけに書くコードよりも、「いろいろな場面で使い回せる部品」を設計する方が、ざっくり3倍は難しいと考えておく(抽象度・境界・拡張方法などをよく考える必要がある)。
テスト3種類の法則
- 共通部品にする前に、少なくとも3つくらい違うプロダクトや状況で試しに使ってみると、「本当に汎用的に使える形になっているか」が見えてくる。
実践のポイント
- APIやデータ形式を標準化し、セマンティックバージョニング(意味的なバージョン管理)などでバージョンをわかりやすく管理する。
- READMEや使用例を用意し、「どう使えばよいか」「どこに注意すべきか」を明示する。
- 後方互換性ポリシーを決め、利用者が安心してアップデートできるようにする。
- 大きすぎず小さすぎないちょうどよい粒度でパッケージ化し、「この単位で使うと便利」という境界を意識する。
💡AIワンポイント
再利用性を狙うなら、AIが作る共通関数の入力契約を厳密にします。曖昧な型を許すより、受け付ける形を狭めた方が利用側の事故が減ります。関連用語(用語集で復習)
プリンシプル オブ プログラミング(第3章-アーキテクチャ非機能要件)
1. 【3.22.アーキテクチャ非機能要件③】
解説: 非機能テストは「**どのように**動作するか(How)」を評価するものであり、性能や可用性、セキュリティなどが対象となる。
2. 【3.26.アーキテクチャ非機能要件④『信頼性』②】
フォールトトレランスの具体例として**最も適切なもの**はどれか?
解説: **フォールトトレランス**は、障害があっても正常動作を続ける力であり、**冗長構成**などが典型である。
3. 【3.23.アーキテクチャ非機能要件①『変更容易性』④】
『ソフトウェアエージング』の説明として最も適切なものはどれか?
解説: 『ソフトウェアエージング』とは、**時間とともに構造が複雑化・劣化し、保守が難しくなる現象**を指す。
4. 【3.26.アーキテクチャ非機能要件④『信頼性』⑤】
「確認ダイアログで操作ミスを防ぐ」設計は、次のうちどの考え方に該当するか?
解説: **フールプルーフ**は「人間はミスをする」ことを前提とし、**誤操作が起こりにくい設計**を目指す考え方である。
5. 【3.27.アーキテクチャ非機能要件⑤『テスト容易性』②】
テスト容易性を高める設計方針として**適切でないもの**はどれか?
解説: **テストコードは本番コードと共存してもよい**とする価値観がテスト容易性の基礎であるため、完全分離は必須ではない。
6. 【3.22.アーキテクチャ非機能要件⑨】
『機密性(Confidentiality)』を守る手段として最も適切なものはどれか?
解説: **暗号化通信(TLS/SSL)**は、機密性を守る最も基本的な手段のひとつである。
7. 【3.23.アーキテクチャ非機能要件①『変更容易性』③】
『移植性』を高める設計方針として**最も適切なもの**はどれか?
解説: 『移植性』を高めるには、**プラットフォーム依存の要素を独立モジュール化**し、再利用や環境変更に備えることが重要。
8. 【3.25.アーキテクチャ非機能要件③『効率性』②】
効率性における「時間効率性」の指標に**該当しないもの**はどれか?
解説: 「ストレージ使用量」は**資源効率性**の指標であり、時間効率性とは異なる分類である。
9. 【3.28.アーキテクチャ非機能要件⑥『再利用性』⑤】
次のうち『再利用する側』の立場で重要な行動として最も適切なものはどれか?
解説: **再利用する側**は、モジュールの内部に依存せず、**インターフェースとドキュメントを頼りに安全に使う姿勢**が重要である。
10. 【3.25.アーキテクチャ非機能要件③『効率性』①】
アーキテクチャにおける『効率性』の定義として最も適切なものはどれか?
解説: 『効率性』とは、CPU・メモリ・時間といったリソースを無駄なく活用し、最大限の成果を得る能力である。
参考文献・出典
- プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
- 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3
※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。
このサイトの運営者
経験:Webアプリ・業務システム
得意:PHP・JavaScript・MySQL・CSS
制作・運用中:フォーム生成基盤・クイズ学習プラットフォーム・htmx逆引きレシピ 等
AI時代のエンジニアタイプ診断:CSPF/とろとろみかん
詳しいプロフィールはこちら! もちもちみかんのプロフィール