アーキテクチャとは、抽象的な概念としてのソフトウェアを視覚化したものです。
ソフトウェアは、相互に関連する複数の要因が組み合わされて、全体としてなんらかの性質や振る舞いを見せる「複雑系」の一つの形です。
そのような「複雑系」であるソフトウェアのアーキテクチャは、以下の2つの観点で考えます。
①ソフトウェアが動作する環境
ソフトウェアが存在できる以下の環境において、そのソフトウェアは、どこに位置し、どのような関係と役割で動作するのか。
コンピュータ(オンプレミス):自前で用意したPCやサーバ
デバイス:組み込み機器、スマホ
クラウド:インターネット上のクラウド環境
②ソフトウェアの構造
どんなソフトウェアのコンポーネント(部品)で構成され、どのように配置し、どのような関係と役割で動作するのか。
具体的に、アーキテクチャを図示する場合、高さ・横・縦の3つの階層で描きます。
■ 高さ:全体構成図
既存の全体システムを調べ、それらの中で、開発するソフトウェアの位置づけを明確にします。これは、「高さ」のアーキテクチャに相当します。これにより、開発するソフトウェア全体の役割と持つべき機能などについて認識できます。
全体のシステムが動いている中で、タイミングをとらえて外部から必要なデータを入手し、迅速に結果を返却することが、全体の一部として開発されるソフトウェアが実現すべき機能です。
連携が必要となる外部のシステムとのインターフェースについては、要求定義の段階で詳細まで確定させておかねばならなりません。
その理由は、要件定義が終わると、通常、外部システムに関連する第三者とは疎遠となり、コミュニケーションをとることが難しくなるからです。インターフェースでやり取りするデータ、手順、タイミングについて決定し、合意をとっておくきます。すでに、外部システムのインターフェースが存在するなら、その詳細仕様についての詳細資料を入手します。
■ 横:システム構成図
開発するソフトウェアが動作するハードウェアを中心とした物理的な構成を描きます。これは、「横」のアーキテクチャに相当します。
システム構成には、クライアント・サーバ型というお決まり「型」があり、クライアント、サーバ、ネットワークの3つのコンポーネントに分けられます。これらのコンポーネントには、Webシステムを例にとると、図のようなコンポーネントがあります。これらのコンポーネントを配置し、それぞれをつなげることでシステム構成とします。
・クライアント
Webブラウザ
・サーバ
Webサーバ、DBサーバ、Webアプリケーションサーバ、DNSサーバ、PROXYサーバ、メールサーバ
・ネットワーク
インターネット、イントラネット
システム構成図では、開発の対象となるコンポーネントを指し示し、それらの間のデータの流れと、プロトコルなどの接続方法を明記します。コンポーネントの配置を決めるため、以下の点について考えます。
・データを蓄えるデータベースサーバの配置
蓄積されるデータ量を見積もって、ハードディスクなどの容量を決める。
データ量を見積もるには、一日当たりのアクセス件数と、1アクセスあたりのデータ量を想定し、掛け合わせることで見積もる。
インターネット上のクラウドは、イントラネット上のオンプレミスより安全ではない。
セキュリティ対策に関して、シビアに検討する必要がある。
・データを使って機能を実現するアプリケーションサーバの配置
データにアクセスしやすくするため、イントラネット内のデータベースサーバに隣接して配置する。データベースサーバは、アプリケーションサーバと一体化されることも多い。
・ユーザがアクセスするクライアントの場所
インターネットにつながったパソコン、スマホなどで動作するWebブラウザ経由でのアクセスとする。
・ユーザからのアクセスを受け付けるサーバ
フロントエンドにあるためFEP(フロントエンドプロセッサ)と呼ばれる。インターネットとイントラネットの境界に配置する。インターネットからのアクセスを随時受け付けるWebサーバとして機能し、背後(バックエンド)のイントラネットにあるアプリケーションサーバに処理を依頼する役割を担う。
■ 縦:ソフトウェア構成図
システム構成が決まれば、ソフトウェア開発において主役となるのは、「どんなソフトウェアをつくるのか」を表現したソフトウェア構成です。これは、「縦」のアーキテクチャに相当します。
物理的なバウンダリである「ハードウェア境界」の中で動作する個々のソフトウェアを明示します。各々のソフトウェアは、「同じ技術」を使ってつくられる機能的な集合、および、データの集合です。したがって、使える技術(テクノロジー)を選ぶことは、ソフトウェアの配置を決めることに等しいと言えます。
まず、使えるテクノロジーの候補を調べる。例えば、Webシステムであれば図のような候補があげられます。
候補を選ぶにあたって、技術的なトレンド(流行)を追うことがセオリーです。最新の技術を採用することは、新しく開発するソフトウェアにとって、陳腐化の速度を避けるには、最新を採用することしかかありません。ただし、その技術をもったエンジニアが調達できるように、ある程度普及している「最新技術」を選択していきます。
一方、既存システムを拡張する場合は、レガシー(遺産)と呼ばれる過去のソフトウェアやデータとともに、過去の技術を使うしか選択肢はありません。過去のシステム構成とソフトウェア構成をそのままコピー&ペーストしたものになります。言い換えれば、これは過去に作られたアーキテクチャの範疇(はんちゅう)でしかつくれない技術的な制約とも言えます。過去の構造というしがらみの中で、最新技術を自由に使えないというジレンマに悩まされることも出てくるでしょう。
さて、システム構成からソフトウェア構成へと展開すると、これまで見えなかったソフトウェアが登場してきます。
これらのソフトウェアは、OS、ブラウザ、Webサーバ、RDBMSのようなすでに完成されているパッケージソフトウェアと、ゼロから作るカスタムソフトウェアに分かれます。重要なのは、これからつくるカスタムソフトウェアであり、何をつくるべきかを明確にすることです。
以後、何度となくその名前が使われることになるので、カスタムソフトウェアには、必ず機能や処理など役割を示すような名前をつけ、その名前から機能などを連想できるようにしておきます。
Webシステムを例にとると、一般的に図のようなソフトウェア構成となります。
・クライアント
GUIをWebブラウザで動作させる。JavaScriptとHTMLによって画面のデザインと操作を実現するアプリケーションをつくる。
・Webサーバ
Webアプリケーションサーバ内で動作するCGIという技術を使ったCGIアプリケーションを つくる。このCGIアプリケーションは、Webブラウザからの要求に対応したJavaScriptとHTMLを生成し、返却する。このアプリケーションは、実際の処理はせず、隣接するアプリケーションサーバに処理を 依頼する。そのために、アプリケーションサーバとの通信をつかさどる通信ライブラリ(クライアント)を使う。
通信ライブラリ(クライアント)は、TCP/IPプロトコルを使ったソケット通信によって、アプリケーションサーバと接続し、要求の送信と、結果の受信をする。
・アプリケーションサーバ
通信ライブラリ(サーバ)でWebサーバからの接続と要求を受けつける。アプリケーションは、コアとなるソフトウェアであり、各種要求毎に処理を実行した結果を、通信ライブラリ(サーバ)により Webサーバに返す。アプリケーションは、処理を実行する過程でRDBMSを使って、マスタデータを参照し、トランザクションデータを登録していく。
ソフトウェア構成の中にあるソフトウェア間をつなぐインターフェースは、「矢印」で表現します。矢印の方向によって、インタフェースの機能を示します。両方向の矢印は、コマンドとレスポンスのように双方向のやり取りがあることを示し、通知などのイベント、コマンドだけ、レスポンスだけを表記するのであれば、片方向だけになります。その場合、イベントを出す側から受ける側に矢印を引きます。
■ まとめ
「アーキテクチャは、情報から価値を得るための仕組みである」
アーキテクチャは、類似の要件を実現している既存の構成をまねて、他とは異なる独自のカスタムポイントを考えることから発想できます。