コンテンツにスキップ

エピローグ — 技術の進歩は振り子ではなく、螺旋である

技術の歴史は、往復して見える。メインフレームとタイムシェアリングに集中した計算は、ARPANET のパケット交換で分散した。商用 RDBMS と DBA に集中したデータは、PC で手元に分散した。DNS は階層委任で分散しながらルートは13台に集中し、2002年以降は anycast でその13台が数百の実体に分散した。Web はサーバーへ集め、P2P と CDN は端へ散らし、クラウドは計算を再び集め、エッジはまた散らす。そしてアーキテクチャも同じ拍子で揺れる。モノリス → SOA → マイクロサービス → モジュラーモノリス。

これを「流行の振り子」と呼ぶのは簡単だ。しかしその見方は、横軸しか見ていない。

集中と分散は繰り返すが、螺旋は一周ごとに高度が上がる左へ振れると集中、右へ振れると分散。高さは年、円の広さは機械が守る範囲← 集中分散 →1964 メインフレームと TSS1969 ARPANET(パケット交換)1979 商用 RDBMS(Oracle)1981 PC(IBM PC)1984 DNS(委任、ルート 13 台)1991 Web(サーバーへ集まる)1996 分散オブジェクト1999 P2P と CDN2002 DNS ルートが anycast で数百台に2003-04 SOA/ESB と AR モノリス2006 クラウド(AWS)2008 NoSQL(Dynamo)2014 マイクロサービス2017 エッジ(Workers)2021 モジュラーモノリス2024 太い境界(セル)横軸だけ見れば振り子。同じ側に戻っても、高さと広さが違う

横軸だけを見れば、これは振り子だ。高さと円の広さを見れば、同じ側に戻った点は一つも同じ場所にない。

往復のたびに、何かが蓄積している。ARPANET が残したプロトコルの上に Web が集中し、Web が残した HTTP の上に P2P と CDN が分散し、それらが残した運用の知見の上にクラウドが集中し、クラウドが残したコンテナと IaC の上にエッジが分散した。往復の方向は交互だが、道具の蓄積は一方向だ。 振り子は同じ弧を往復するが、螺旋は一周ごとに高度が上がる。その高度が、この文書のテーゼでいう「機械が守る範囲」である。

同じ側に戻っても、同じ場所ではない

Section titled “同じ側に戻っても、同じ場所ではない”

アーキテクチャの一周で確かめる。2004年のモノリスと2024年のモジュラーモノリスは、円錐の同じ側(集中)にある。だが中身は違う。

2004年のモノリス2024年のモジュラーモノリス
モジュールの境界ディレクトリとレビューと人の記憶モジュールグラフ、依存の宣言、CI の赤
データの境界どのモデルもどのテーブルも触れるGRANT で自分のスキーマしか見えない
契約クラスを直接 import生成された client とスキーマ
デプロイ列車、操作1つ毎日、操作2つ(デプロイとリリース)
スキーマ変更深夜の祈り互換性の窓の設計
守る主体人機械

同じ場所に戻ったのではない。境界を機械に守らせる道具を獲得した上で、太い粒度を選び直したのだ。間にあった第3部と第4部 — 分散モノリスの授業料、適応度関数、2つの操作、エラーバジェット — がなければ、2024年のモノリスは2004年のモノリスと同じものになっていた。

SOA の思想も同じだ。2004年の SOA は ESB と WSDL で実装され、ベンダーの匠になった。2024年のモジュラーモノリスは、同じテネットをパッケージ境界と GRANT で実装する。思想は同じで、実装の層が一つ下に降りた。集中と分散のどちらを選んだかより、その選択を人が守るのか機械が守るのかの方が、システムの寿命を決める。

4本の線と契約記述の線を貫いて、進行方向は一度も変わっていない。

線起点寄り道現在
言語規約を人が守る(AR、動的)漸進的型付け構造が機械を縛る(型、生成)
データスキーマ変更=深夜の祈りスキーマレスの寄り道互換性の窓の設計(expand/contract)
アーキテクチャ境界=文書とレビュー分散オブジェクト、ESB、分散モノリス境界=コンパイル・GRANT・ルートの不在
組織統制=申請書(CAB)文化を変えよう(DevOps)統制=apply 順序とゲート、判断=数値契約
契約記述契約はドキュメントXML で宣言 → JSON で諦める実行されている定義から生成

「寄り道」の列が、この文書で授業料と呼んだものである。寄り道は無駄ではなかった。分散オブジェクトの失敗がなければ SOA のテネットは書かれず、NoSQL の失敗がなければスキーマの価値は言語化されず、分散モノリスがなければ3軸の分離は見つからなかった。螺旋の高度は、寄り道の代金で買われている。

各時代の概念が傷の圧縮であるなら、この文書は傷の相続書である。

  • expand/contract を「面倒な手順」と感じたら、第2部の深夜メンテナンスを思い出す
  • 3分岐の質問表を「大げさ」と感じたら、第3部の分散モノリスと、第1部の分散オブジェクトを思い出す
  • 生成された client しか共有しないことを「回りくどい」と感じたら、Don Box のテネット3と、それを破った ESB を思い出す
  • SPACE の多次元を「回りくどい」と感じたら、単一指標がゲーム化した組織を思い出す
  • OpenAPI からの生成を「大層」と感じたら、MDA の図とコードの乖離と、JSON 時代の「ドキュメントと実装のズレ」を思い出す

規約の一行一行に、それが無かった時代の夜がある。

最後に、我々自身の位置について。ActiveRecord のモノリスから Go のサービス群への移行は、この文書の言葉で言えば第2部から第5部への移住である。途中の第3部と第4部を、我々は住まずに通過する。それは幸運であり、同時に危険である。幸運なのは、授業料を払わずに領収書だけを受け取れるから。危険なのは、授業料を払っていない人は領収書の重みを感じないからだ。第3部を読まずにサービスを割ると、分散モノリスを作る。螺旋を一周飛ばすと、飛ばした周の高度は手に入らない。

移住者は特別な世代だ。両方の時代を生きて知る唯一の世代であり、第2部の構成が「当時の最適解だった」ことへの敬意と、第5部の道具で境界を引き直す責任の、両方を持っている。afterSave の中に何が埋まっているかを読めるのは、それを書いた時代を知っている人だけだ。この文書は、その記憶が人に宿ったまま失われないよう、構造に変換する試みのひとつである。

歴史は繰り返さないが、韻を踏む。次の一周 — おそらく AI エージェントが主要な書き手になる周回 — でも、集中と分散はまた揺れるだろう。そして進行方向は同じはずだ。破られたら困るものは、破る操作が存在しない形にする。60年前、Conway と Parnas と Codd が同時に見つけた真理は、書き手が誰であっても変わらない。