プロローグ 1968-1972 — 三つの創世
この文書で扱うほとんどすべての思想は、わずか5年間に同時多発した3つの発見の子孫である。組織・データ・コードの三面で、別々の人が、互いを知らずに、同じ真理に到達した。
1968年、組織 — Conway の法則
Section titled “1968年、組織 — Conway の法則”Melvin Conway は論文「How Do Committees Invent?」を Harvard Business Review に送り、断られ、Datamation 誌に載せた。主張は1文で要約できる: システムを設計する組織は、その組織のコミュニケーション構造を写した設計を作らざるを得ない。 見落とされがちなのは、Conway がこれを必然として導いていることだ。モジュール A と B が連携するには、A の担当者と B の担当者が話さなければならない。話さない担当者同士のモジュールは、連携しない。だからシステムのインターフェースの形は、人間同士の会話の形になる。これは観察ではなく、構造的な制約である。
同じ年、もう2つのことが起きた。NATO がガルミッシュで会議を開き、「ソフトウェア工学」という言葉とともにソフトウェア危機を宣言した。ハードウェアの能力は指数的に伸びているのに、ソフトウェアは予算と納期を守れず、完成しても動かない。そして Dijkstra が「Go To Statement Considered Harmful」で、無秩序な制御フローを告発した。プログラムのテキスト上の構造と実行時の振る舞いの対応が取れないとき、人間はプログラムを理解できない。だから goto を捨て、順次・分岐・反復だけで書け。人間が毎回注意して追うのではなく、追えない形を最初から書けないようにする。 本書のテーゼの最初の言明である。
1970年、データ — Codd の関係モデル
Section titled “1970年、データ — Codd の関係モデル”IBM の Edgar Codd が「A Relational Model of Data for Large Shared Data Banks」を発表する。それまでのデータベース(階層型の IMS、網型の CODASYL)は、データへの経路をアプリケーションが知っている必要があった。このレコードからあのポインタを辿り、次のセットへ進む。格納構造を変えれば、アプリケーションが全部壊れた。
Codd の提案は、物理的な格納方法を隠蔽し、宣言的な問い(後の SQL)だけを契約にすることだった。論文の冒頭が「データの独立性」を目的として掲げていることは、もっと知られてよい。内部表現の変更からアプリケーションを守る。データアクセスにおける情報隠蔽である。そして正規化は、「同じ事実を2箇所に書くと、いつか食い違う」という傷を、スキーマの形で起きないようにする技法だった。規約(両方更新するのを忘れない)を、構造(1箇所にしか書けない)に変える。
1972年、コード — Parnas の情報隠蔽
Section titled “1972年、コード — Parnas の情報隠蔽”David Parnas の「On the Criteria To Be Used in Decomposing Systems into Modules」は、同じプログラムを2通りに分割して比較する。第1の分割は処理の手順で切る(入力を読むモジュール、シフトするモジュール、ソートするモジュール)。第2の分割は、変わりそうな設計判断を隠すように切る(行の格納形式を知っているのは1モジュールだけ)。第1の分割はフローチャートに忠実で、理解しやすい。しかし格納形式を変えると全モジュールが変わる。第2の分割は、1モジュールを直すだけで済む。
ここから得られる教訓は、今日の境界設計の全部である。変更のコストは、コードの量ではなく構造が決める。 モジュールの境界は「何をするか」ではなく「何を知らなくてよいか」で引く。後のオブジェクト指向のカプセル化も、マイクロサービスの「データはサービスが所有する」も、DDD の境界づけられたコンテキストも、この論文の注釈である。
三面が同じ真理を見つけた
Section titled “三面が同じ真理を見つけた”3つの発見を並べると、同じ形をしている。
| 面 | 発見者 | 隠すもの | 契約にするもの |
|---|---|---|---|
| 組織 | Conway (1968) | チームの内部の会話 | チーム間のインターフェース |
| データ | Codd (1970) | 物理的な格納と経路 | 宣言的な問い(SQL) |
| コード | Parnas (1972) | 変わりそうな設計判断 | モジュールのインターフェース |
3人は互いを引用していない。面が違うだけで、隠すものと契約にするものの構図は同じである。
共通する真理はこう書ける: 構造が変更コストを決める。守るべきものは、破る操作が存在しない形にする。 以後60年は、この真理を実装する道具の歴史である。道具は変わるが、真理は変わらない。道具だけを追うと振り子に見え、真理を追うと螺旋に見える。
greenfield の現在形: Parnas → sqlc 生成型を repository 内に閉じる(check #2)。テーブルの形を知っているのは1パッケージだけ。Codd → GRANT 分離(#1)。サービスは自分のスキーマしか見えない。Conway → VPC vending の責任分担と6層ファネルの担当列。誰が誰と話すかを、先に決めている。