ソフトウェアアーキテクチャとは?重要性や種類を分かりやすく解説
COLUMN
最終更新日:2023年06月05日 / 投稿日:2023年03月24日
建物を建てる場合、実際の作業を始める前に建築会社はお客さまの望みに合わせて図面を引き、建物をデザインする必要があります。もし設計図なしに建物を作り始めた場合、まともに完成しないか、工事が完了したとしても住みづらく災害に弱い建物ができてしまうでしょう。
ソフトウェア開発も同様に、プログラミングを始める前に要件定義に合わせた設計図が必要です。ソフトウェアアーキテクチャとは、ソフトウェアの設計図を指す言葉です。
この記事ではソフトウェアアーキテクチャの意味や重要性、主要な種類について解説します。
1.ソフトウェアアーキテクチャとは?
ソフトウェアアーキテクチャ(software architecture)とは、ソフトウェアの構築方法・設計スタイルであり、ソフトウェア全体の設計図を抽象的に表したものです。
アーキテクチャ(architecture)には、3つの意味があります。
【アーキテクチャの意味】
- 総合建築を専門とする学問としての「建築学」
- 建築そのものに関連した「建築様式」「建築術」「設計思想」「構造」「構成」
- 「構築する」から派生した、ハード・ソフトウェアやシステムなどの設計概念
IT業界ではシステム開発の設計概念として用いられるケースが多く、ソフトウェアアーキテクチャもその1つです。ソフトウェアに持たせる機能要件や性能、構成要素のバランスなどを、将来の技術や市場を織り込んで設計するためにソフトウェアアーキテクチャは作られます。
テスト自動化ツールならATgo
1か月トライアル無料:詳細はこちら
2.ソフトウェアアーキテクチャの重要性
ソフトウェアを開発すること自体は、ソフトウェアアーキテクチャがなくても可能です。しかし、計画の初期段階でソフトウェアアーキテクチャを考えておけば、開発現場に一貫性が生まれる他、リスクが低減できるなど数多くのメリットが得られるでしょう。特にソフトウェア開発に複数のプログラマが関わる場合、ソフトウェアアーキテクチャの重要度は上がります。
2-1.コンフリクトを防げる
大規模システムを開発するときに、複数の人間が設計を考えた場合、現場でコンフリクト(衝突)が起こります。共有できる前提がないままで開発が進むと、予期しない実装が発生したり、開発の方向性がばらばらになったりする可能性があります。
ソフトウェアアーキテクチャは、複数人での開発を行うときの前提です。事前にソフトウェアアーキテクチャを共有し、合意を形成しておくことでコンフリクトの発生リスクを小さくできます。もしも開発チームでコンフリクトが起きたとしても、前提となる設計があれば客観的な優劣の判断が可能になります。
2-2.テストがしやすくなる
ソフトウェアの開発では、テスト容易性の確保も重要です。ソフトウェアアーキテクチャを考えておけば、機能テストの手間を削減できます。
テスト容易性とは、ソフトウェアテストのやりやすさを示す品質特性です。例えば、下記のような特性が、テスト容易性を図る指針とされます。
【テスト容易性が高い特性の例】
- テストの実施をブロックする要因の数
- 合否判定に必要な情報取得の容易さ
- テストのセットアップにかかる手間の少なさ
- テスト対象の切り出しやすさ
- 必要なテスト数自体の少なさ
- テストへの影響がある変更の少なさ
- テストすべき対象の分かりやすさ
テスト容易性に優れていれば、テストにかかるコストが最小限で済む上、品質改善サイクルの高速化・高精度化が可能です。
2-2.開発がスムーズに進む
ソフトウェアアーキテクチャを設計しておくことにより、ソフトウェア開発者や保持に関わるメンバーが同じ基本方針を共有でき、開発がスムーズになります。
開発チームが拡大すると、どうしてもシステム全体を理解することが難しくなり、引き継ぎや学習のコストが肥大化します。開発者が少人数であれば意思疎通を頻繁に行うことである程度共通認識を作れますが、大人数の開発で全員がソフトウェア全体の構造に共通認識を持つのは困難です。
ソフトウェアアーキテクチャが事前に作られていれば、引き継ぎや学習にかかるコストを抑制できます。
また、多人数での開発で変わりがちな記述やネーミングのルールをソフトウェアアーキテクチャによって定めておくことで、実装やチェック時の手間を省ける点もメリットです。
3.ソフトウェアアーキテクチャの種類
一口にソフトウェアアーキテクチャと言っても、さまざまな種類があります。ソフトウェアアーキテクチャを活用するためには、アーキテクチャの種類と役割を理解しておくことが重要です。
近年使用頻度の高いソフトウェアアーキテクチャパターンの概要と特徴を紹介します。
3-1.レイヤードアーキテクチャ
レイヤードアーキテクチャは、ソフトウェアアーキテクチャモデルの中でもっともスタンダードな形のアーキテクチャです。レイヤードアーキテクチャは構造がシンプルで分かりやすく、導入しやすいアーキテクチャであり、N層アーキテクチャとも呼ばれます。
レイヤードアーキテクチャは関心事の分離と依存方向の制御を設計指針としており、下記4種類の層(レイヤー)から構成されるのが一般的です。
【レイヤードアーキテクチャを構成するレイヤー】
・プレゼンテーション
ユーザーとシステムのやりとりを行う、ユーザーインターフェース部分のレイヤーです。
・アプリケーション
プレゼンテーションレイヤーからの指示に対してCRUD・ELTなどの処理を行うレイヤーです。
・ドメイン
ユースケースや仕様など、システムが扱う業務領域に関わる値や振る舞いについてのレイヤーです。
・インフラストラクチャー
具体的な技術に関する処理部分をまとめるレイヤーです。
レイヤードアーキテクチャの関係は、上の層から下の層へと依存します。プレゼンテーション層が変更されてもアプリケーションやドメイン、インフラストラクチャー層は影響を受けません。インフラストラクチャー層が変更された場合、すべての層が影響を受けます。
依存方向が一定のため変更やメンテナンスへの柔軟性が高く、役割の割り当てが容易になる点がメリットです。一方で、ソフトウェア開発チームの共通認識が作りにくく、記述量が増えやすいデメリットもあります。
3-2.マイクロカーネルアーキテクチャ
マイクロカーネルアーキテクチャは、システムのコア部分と複数のプラグインで構築される、比較的シンプルな構成のアーキテクチャです。プラグインアーキテクチャとも呼ばれており、アプリケーションにおけるカスタムロジックの結合と分離を実現できます。
マイクロカーネルアーキテクチャは、主に下記2種類の用途で使用されるのが一般的です。
【マイクロカーネルアーキテクチャの主な用途】
- モノシリックな(分割せず、同一のモジュールで作られた)アプリとしてパッケージ化し、ダウンロードして使用するソフトウェア
- 使用言語ごとのローカライズが発生するなど、カスタムが必要なソフトウェア
搭載する機能を最小限に抑え、ソフトウェアのサイズを抑えられるメリットがあります。デメリットは、拡張性や耐障害性、弾力性の弱さです。
3-3.イベント駆動アーキテクチャ
イベント駆動アーキテクチャは、状態変化(イベント)が発生した際にソフトウェアが対応できるようにシステムを組むためのアーキテクチャです。例えば、特定のプログラムが読み込まれる・マウスボタンがクリックされるといったアプローチが検出されると、その情報が記録・通知されるなどの仕組みが該当します。
汎用性・柔軟性が高く、プログラムの拡張やスケールアップの容易さがイベント駆動アーキテクチャのメリットです。一方で、複数のモジュールで相互作用がある場合、テストが複雑かつ困難になりやすく、システムによってはデータ処理性能を低下させる恐れもあります。
3-4.マイクロサービスアーキテクチャ
マイクロサービスアーキテクチャは、大きなソフトウェアを1つ作るのではなく、小さなプログラムをたくさん作るシステム設計のスタイルです。個々のプログラムを的確に組み合わせ、適切なプロセスを経ることで、1つのソフトウェアとして成立させます。
プログラム同士の互換性はあるものの、一つひとつのツール自体は独立して動作するのが一般的です。タスクの分割やプログラムの追加が容易で、開発やメンテナンスに必要なコストを削減しやすい、大規模化しやすいなどのメリットがあります。一方、プログラムの組み方によってはシステムの負荷が増大しやすい、遅延が発生しやすくなるといった点はデメリットです。
まとめ
ソフトウェアアーキテクチャとはシステム開発の設計概念であり、ソフトウェア全体の設計図を抽象的に表したものです。
ソフトウェア開発に複数のプログラマが関わる場合、ソフトウェアアーキテクチャは重要です。ソフトウェアアーキテクチャを開発に取り入れることで、チームのコンフリクトを防げ、テストも容易になるため開発がスムーズになります。
主要なソフトウェアアーキテクチャの種類として、レイヤードアーキテクチャ・マイクロカーネルアーキテクチャ・イベント駆動アーキテクチャ・マイクロサービスアーキテクチャが存在します。