アーキテクチャは暗黙知の1表現

平鍋氏のアーキテクチャとはを読んで私のアーキテクチャに対して感じていることを以下に書きます。

https://blogs.itmedia.co.jp/hiranabe/2008/10/grady-booch-dd7.html

Booch氏のアーキテクチャはデザインであるが、すべてのデザインがアーキテクチャであるわけではない、という深い意味を持つ言葉は、アーキテクチャは暗黙知を表現する1形態であって、連続する意思決定から構成されていると、解釈します。暗黙知だから、創発されることもあり、また、パターン化のような形式化に限界があることが説明できます。またすべての意思決定の意図が表現できるものでもないことが分かります。こうした表現形態は形式的にUMLなどのモデルで表現できたとしても、意図を正確に伝えることには限界があります。

では、我々はアーキテクチャをどう扱えばいいのでしょう。僕はできる限り科学に基づくべきだと考えています。そうであるなら、ある程度の合理性と客観性を持つことができるでしょう。アーキテクチャは多くの場合、箱と線による抽象的なモデルで表現されるので、分かりにくく、あいまいだと考えてしまうことも多いのですが、抽象化はあいまいとは違います。抽象化したとしても、厳密な定義は可能です。

いつもはモデルを見せて、アーキテクチャは「はい、これです」みたいなトップダウンのパターンですませてしまい、深い意味を犠牲にしてしまうので、ここではアーキテクチャを科学に基づかせる例を具体的に示しましょう。

例1: .NETのコードアクセスセキュリティのアーキテクチャ

コードアクセスセキュリティ(CAS)の詳細な説明はここをご覧ください。

https://www.atmarkit.co.jp/fdotnet/technology/idnfw11_index/index.html

アーキテクチャとして、コンポーネントとOOPを採用する前提でコードアクセスセキュリティを提供する機構を考えてみれば、コード実行に信頼性を上げる方法は、物理的に以下の段階でのセキュリティチェックに決まることになります。

(1)コンポーネントのロード時のチェック

(2)クラスのロード時のチェック

(3)メソッドがJITコンパイル時のチェック

(4)メソッドの呼び出し実行時のチェック

この段階は、コンポーネントとOOPを組み合わせてソフトウェアを開発するという前提で、ローダーやJITコンパイラのような機構を使うとしても、実行のタイミングとして必然的に現れます。いわば物理法則で決まるタイミングです。そして、それぞれのタイミングでのチェックは、チェックにかかる計算コストをできるだけ減らすという指標をとれば、また、おのずと決まってくるのです。後は、(1)ではコンポーネントのメタデータを記述する宣言、(2)はクラス間の継承関係の制約、(3)はリンク時のチェック、(4)はスタックの呼び出し順に従う制限を考えればいいことになります。

 

例2: IIS の拡張アーキテクチャ

現在のCPUアーキテクチャは、スレッドの実行予想やキャッシュの有効化を考えるとパイプライン処理が有効となります。IISの拡張性はこのパイプラインを前提としたアーキテクチャです。パイプラインアーキテクチャを採用する場合、パイプラインを構成する各ステージは時間順序の制約から物理法則で決まります。たとえば、ページの実行前には、認証や認可のチェック、キャッシュが利用可能かどうかのチェック、URLのマップ、各種サーバ状態(コンテキスト)の設定などが必要です。こうしたプログラムの実行、リソース間の制約関係、で決まる一貫性の制約を守ることは、誰が考えても必然的な結果を得ることができます。

https://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

は、IIS 7.0の画面遷移のアーキテクチャの比較の例です。URLの書き換えによっても、ルーティング制御を持つ機構とマッピングを組み合わせた機構を使ったとしても、それぞれの優劣の比較はありますが、根本的には物理法則に依存していることが分かるでしょう。

アーキテクトの意思決定は非常に多くの技術選択肢の中から最良と思うものを選択します。属人的な決定かもしれませんが、科学の世界に基づくことで、ブレを少なくすることは可能です。

以上のような考慮と意図を具現化したアーキテクチャは、しかし、多くの仮定、前提、制約条件から成り立つ暗黙知の一種であることには変わりません。