ソフトウェアアーキテクチャ

ソフトウェアアーキテクチャ（Software Architecture）は、ソフトウェアコンポーネント、それらの外部特性、またそれらの相互関係から構成される。また、この用語はシステムのソフトウェアアーキテクチャの文書化を意味することもある。ソフトウェアアーキテクチャの文書は開発依頼主とのコミュニケーションを容易にするもので、概要レベルの設計に関する早期の決定を促し、プロジェクト間でのコンポーネントとパターンの設計を再利用することを可能にする。

**背景**
計算機科学の分野は、その草創期から複雑性に関する問題を扱ってきた。初期の複雑性の問題は、開発者が正しいデータ構造を使い、アルゴリズムを開発し、問題を分割する手法を用いることによって解決されていた。その一方で、「ソフトウェアアーキテクチャ」という用語は、業界でも比較的新しいものである。その分野の根本原理は、1980年代ごろからソフトウェア工学の先駆者たちによって散発的に適用されてきた。そのため、システムのソフトウェアアーキテクチャを説明する初期の試みは、不正確で混乱したものであった（四角形と線で描かれた図など）。1990年代、ソフトウェアアーキテクチャの根本的な記述方法の成文化が集中的に行われた。その結果、初期のデザインパターン、ベストプラクティス、記述言語、形式論理などが開発された。
ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減らすことを主に念頭に置いたものである。ただし、今までのところ「ソフトウェアアーキテクチャ」という用語に関して、万人が合意した厳密な定義は存在しない。
ソフトウェアアーキテクチャは、分野としては円熟してきていながらも、明確な規則がない。そして、技術者はそのような環境の中でシステムを設計しなければならないため、その作業は未だに科学と技能の混合となっている。ソフトウェアアーキテクチャの「技能」的側面は、商用ソフトウェアシステムがビジネスに使用されているという点によるところが大きい。また、システムがビジネスの重要な一部を担っているため、システムの要求仕様は機能仕様ではなく、品質レベルなどで記述されることが多い。システムは、ビジネスの性質に依存するため千差万別であり、品質特性のレベルもシステムによってさまざまである。例えば、フォールトトレラント性が求められたり、互換性が重視されたり、拡張性、信頼性、保守性、可用性、情報セキュリティ、ユーザービリティなどといった面が重視されたりする。
ソフトウェアアーキテクチャは、システムが備えるべき複数の洞察の混合物である。そのようないくつかの観点がソフトウェアアーキテクチャに組み込まれるということは、ソフトウェア開発が具体化する前に、ソフトウェアアーキテクチャを作成することの正当性を示している。

**歴史**
概念としてのソフトウェアアーキテクチャの起源は、1968年のエドガー・ダイクストラの研究や1970年代初期のデイビッド・パーナスの研究である。科学者たちは、ソフトウェアシステムの構造が重要であり、構造を正しくすることが肝要であることを強調した。1990年代初期には、この領域の研究は盛んになり、アーキテクチャ上のスタイル（パターン）、アーキテクチャ記述言語、アーキテクチャの文書化、形式手法などが主に研究されるようになった。カーネギーメロン大学やカリフォルニア大学アーバイン校(UCI)など多数の研究機関がソフトウェアアーキテクチャの研究を行っている。カーネギーメロン大学の Mary Shaw と David Garlan の著書 Software Architecture: Perspectives on an Emerging Discipline（1996年）で、コンポーネント、コネクター、スタイルといったソフトウェアアーキテクチャ上の概念を提唱した。UCI の Institute for Software Research では、アーキテクチャ上のスタイル、アーキテクチャ記述言語、動的アーキテクチャなどを主に研究している。
ANSI/IEEE 1471-2000:  Recommended Practice for Architecture Description of Software-Intensive Systems（ソフトウェアシステムのアーキテクチャ記述のための指針）は、ソフトウェアアーキテクチャの領域での世界初の標準であり、最近 ISO によって ISO/IEC DIS 25961 として採用された。

**アーキテクチャの記述法**

**アーキテクチャ記述言語**
アーキテクチャ記述言語(ADL) は、ソフトウェアアーキテクチャを記述するための言語である。これまで、いくつかの ADL がそれぞれ異なる組織によって開発されてきた。例えば、Wright（カーネギーメロン大学）、Acme（カーネギーメロン大学）、xADL（UCI）、Darwin（インペリアル・カレッジ・ロンドン）、DAOP-ADL（マラガ大学）などがある。また、ADL の基本要素として、コンポーネント、コネクター、コンフィギュレーションなどがある。

**ビュー**
ソフトウェアアーキテクチャは、一般に複数のビュー（Views）で構成される。これは、建築で複数のさまざまな設計図が使用されるのに似ている。ANSI/IEEE 1471-2000によれば、ビューはビューポイント（viewpoints、観点）のインスタンスであり、ビューポイントとはそのシステムの関係者がそれぞれの立場で必要とするアーキテクチャを記述したものである。
以下のようなビュー（1471 ではビューポイント）がある。
*機能/ロジックビュー
*コードビュー
*開発/構造ビュー
*並列性/プロセス/スレッドビュー
*物理/配置ビュー
*ユーザー行動/フィードバックビュー
ソフトウェアアーキテクチャを記述するための言語は、いくつか考案されているが、どれも広く受け入れられてはいない。

**アーキテクチャのフレームワーク**
Department of Defense Architecture Framework (DODAF)
*MODAF
*The Open Group Architecture Framework (TOGAF)
*ザックマンフレームワーク
*Federal Enterprise Architecture (FEA)

**アーキテクチャの例**
コンピュータソフトウェアのモジュール群を設計し、それらの間で通信を行う共通的な手法は数々存在する。以下に例をあげる。
*クライアントサーバモデル
*分散コンピューティング
*Peer to Peer 
*パイプとフィルター
*プラグイン
*SSADM （モジュールベースだが、通常モノリシック）
*ソフトウェアコンポーネント （モジュールベース。オブジェクト指向プログラミング）
*サービス指向アーキテクチャ
*三層モデル
*コアドメインの独立
**Hexagonal_architecture_(software)
**クリーンアーキテクチャ
*UIの分離
**Model-View-Controller/MVC: ドメイン・表示・入力の分離
**Model-View-ViewModel/MVVM: 状態をもつModelと宣言的Viewの分離、view stateをもちModel↔Viewを仲介するVM

**関連項目**
ソフトウェア工学
*デザインパターン
*アンチパターン
*標準データモデル
*エンタープライズアーキテクチャ
*システムアーキテクチャ

**脚注**

**参考文献**
Len Bass, Paul Clements, Rick Kazman: Software Architecture in Practice, Second Edition. Addison Wesley, Reading 5/9/2003 ISBN 0-321-15495-9 （現在は第二版。基本概念を詳述している。テーマは主に品質に関すること）- Garzás, Javier, and Piattini, Mario. An ontology for micro-architectural design knowledge, IEEE Software Magazine, Volume: 22, Issue: 2, March-April 2005. pp. 28 – 33.
*Philippe Kruchten: Architectural Blueprints - the 4+1 View Model of Software Architecture. In: IEEE Software. 12 (6) November 1995, pp. 42-50 （オンライン版は  Rational website(PDF))

**外部リンク**
  Software architecture definitions at Carnegie Mellon University Software Engineering Institute-  Software architecture vs. software design-  Worldwide Institute of Software Architects-  Grady Booch's Handbook of Software Architecture project-  SoftwareArchitectures.com この分野に関する独自の情報源-  International Association of Software Architects-  Microsoft Architecture Journal