始めに
アーキテクチャ非機能要件について解説する。
尚、解説時には、以下の3つの形式に分けて解説する。
- what??
- why??
- how??
アーキテクチャ非機能要件とは??
what??
機能面以外の全ての要件のこと。
以下の6つの観点がある。
①変更容易性
②相互運用性
③効率性
④信頼性
⑤テスト容易性
⑥再利用性
why??
リリース後の運用の大きなトラブルのほとんどが、非機能的な特性に起因しているため。
how??
アーキテクチャ設計において非機能要件を考慮に入れる。
具体的には以下の3つのことを行う。
- 要件定義において、それぞれの観点についてどの程度必要とされるのか確認
- アーキテクチャ設計の時点で、この要件を考慮に入れた構造を考慮
- テストで要件を満たしているか確認
①変更容易性
what??
ソフトウェアの改善の容易性の観点。
以下の4点が求められる。
- 簡単に修正できるか
- 簡単に拡張できるか
- 簡単に組織化できるか
- 簡単に別のプラットフォームに移行できるか
why??
ユーザーの要求に、長期間にわたって、きめ細やかに、素早く対応していくため。
how??
以下の4点から考察を行う。
- 保守性
- 拡張性
- 再構築
- 移植性
保守性
障害が発生したコードの修正のしやすさのこと。
保守性を高めるためには、変更を局所にし、他のモジュールへの副作用を最小にすることが必要である。
拡張性
- 新しい機能の追加
- モジュールの新しいバージョンへの置き換え
- 不要な機能やモジュールの除去
等のしやすさのこと。
拡張性を保つためには、モジュール間の結合が弱いことが必要である。
再構築
モジュール間の関係の再組織化のこと。
再構築を行いやすくするためには、モジュールの実装には影響を及ぼさずに、モジュールを柔軟に配置することが必要である。
移植性
ソフトウェアの、以下の4点の適合のしやすさのこと。
- ハードウェアプラットフォーム
- ユーザーインタフェース
- オペレーティングシステム
- プログラミング言語
- コンパイラ
移植性を高めるためには、ハードウェア依存性を考慮しながら、ソフトウェアを設計することが必要である。
②相互運用性
what??
ソフトウェアが他のソフトウェアとやり取りできる能力のこと。
異なるソフトウェアが、同じ交換形式を介してデータをやり取りしたり、同じ形式のファイルを読み書きしたり、同じプロトコルを使ったりして、相互に接続できることが求められる。
why??
- 開発期間短縮のため。
- コスト削減のため。
how??
外部の機能やデータ構造へ、アクセスが明確に定義されたアーキテクチャを設計する。
その際のプロトコルやデータ形式の選定において、業界の標準的な規格を選択するようにする。
③効率性
what??
ソフトウェアが、実行に伴うリソース使用において、適切な性能を引き出す能力のこと。
以下の2つの観点に分かれる。
- 時間効率性
- 資源効率性
時間効率性
時間という観点から定義されたリソースの使用効率のこと。
主に以下の3点で計測する。
- スループット:一定の時間内に何件の処理を終えることができるか
- レスポンスタイム:ユーザーの入力操作から応答までにかかる時間
- ターンアラウンドタイム:ユーザーによる作業開始時から求められた情報の出力を終了するまでの時間。
資源効率性
コンピュータ資源という観点から定義されたリソースの使用効率のこと。
主に以下の4点で計測する。
- CPUの使用時間
- メモリの使用量
- ストレージ消費量
- ネットワーク伝送量
why??
リソースをうまく活用することで、ユーザーの使い勝手を良くするため。
アーキテクチャ設計の段階で、モジュールへの債務分散と、そのモジュール間の結合を適切に行う必要がある。
how??
コンピュータのリソース使用時において、節約するだけでなく、最大限有効活用するなどして、適切に利用する。
④信頼性
what??
ソフトウェアが、例外的な場面、予期しない方法や不正な方法で使用された場面においても、機能を維持する能力のこと。
以下の2点の側面がある。
- フォールトトレランス
- ロバストネス
フォールトトレランス
ソフトウェアに障害が発生したときに、正常な動作を保ち続ける能力
ロバストネス
不正な使用方法や入力ミスから、ソフトウェアを保護する能力。
why??
求められる機能維持レベルはさまざまであるため。
how??
フォールトトレランス
以下の2点がある。
- 内部に冗長性を持たせる
- 大事な機能のみを提供して処理継続を優先する設計であるフェースソフトを考慮
ロバストネス観点
以下の2点がある。
- 障害時に、その部分を切り離す設計であるフェールセーフを考慮
- 障害が発生しないように、ユーザーが誤った操作を行っても安全に稼働させる設計であるフールプルーフも考慮
⑤テスト容易性
what??
ソフトウェアに対して効果的かつ効率的にテストを行う能力のこと。
- 効果的 = テストによって、ソフトウェアの隅々まで、漏らさずにその品質を検証できること。
- 効率的 = テストのコストや労力が少ないこと。
why??
テストの品質が本体の品質であり、テストは非常に重要であるため。
how??
アーキテクチャ策定の時点から、検証方法の観点も含めて設計する。
モジュール間の依存関係があると、テストしにくい部分に、全体が足を引っ張られる可能性があるため、依存関係の排除がポイント。
⑥再利用性
what??
ソフトウェアを、全体でも一部でも、別のソフトウェアの開発に再利用する能力のこと。
以下の2つの側面がある。
- 再利用するソフトウェア開発
- 再利用のためのソフトウェア開発
再利用するソフトウェア開発
- プロジェクト内の既存モジュール
- 以前のプロジェクトのモジュール
- 各種ライブラリ
等を利用すること。
再利用のためのソフトウェア開発
将来のプロジェクトで再利用できるようなモジュールを、現在のソフトウェア開発で創出すること。
why??
再利用によって作る分量が減り、ソフトウェア開発のコストと期間が減少するため。
how??
再利用のためのソフトウェア開発
アーキテクチャの構成を、既存の構造やモジュールに「プラグイン」できるようにする。
再利用のためのソフトウェア開発
開発中のソフトウェアから、自己充足的な部分を取り出すことができるアーキテクチャにする。
自己充足部分を独立したビルドできるようなモジュールないしパッケージにしておく。