🐧

IT実装と代数の関係 ― これだけわかれば設計ミスは半分になる

に公開

IT実装と代数の関係

― これだけわかれば設計ミスは半分になる

業務システムの設計ミスの多くは、
ロジックの誤りではありません。

例えば――
・UIイベントに業務ロジックを書きすぎて誰も直せなくなった
・トランザクションの外でDBを触って不整合が出た
・「とりあえずロック」でデッドロック地獄になった

心当たりがあるなら、それは技術不足ではありません。

扱っている構造を間違えているだけです。

本記事では、UI・トランザクション・ロック・DB設計といった
一見バラバラに見える IT 実装要素を、
代数構造(半群・モノイド・群) という一本の軸で整理します。


なぜ設計は破綻するのか

よくある設計破綻は、だいたい次のどれかです。

  • UIイベントのロジックが肥大化する
  • トランザクション境界が曖昧
  • ロックが増えて理由が分からなくなる
  • DB 更新が不可逆になり破綻する

これらはすべて
「副作用地帯」と「代数的に扱える世界」を混同している」
ことが原因です。


副作用地帯という考え方

UI・IO・ネットワーク・ユーザー操作は、

  • 時間 t に依存する
  • 同じ操作でも結果が変わる
  • 再現性がない

つまり 数学的に閉じていない世界 です。

これを本記事では 副作用地帯 と呼びます。


半群・モノイド・群で見る IT 実装

半群(Semigroup)

  • 演算は合成できる
  • 単位元・逆元はない

例:

  • UIイベント
  • イベントハンドラ
  • ViewModel
  • 集計処理

👉 副作用を減衰させ、「扱える演算だけ」にする層

※「合成できる」というのは
「処理を小さく分けても、順番に積める」という意味です。


モノイド(Monoid)

  • 半群 + 単位元

例:

  • Repository
  • トランザクション単位の処理
  • 空操作(No-op)

👉 操作を「まとめられる」ようになる層

※ 単位元がある=
「何もしない」を安全に表現できる、ということです。


群(Group)

  • 単位元
  • 逆元
  • 閉包性

例:

  • 群として扱うと宣言されたテーブル
  • 可逆な更新
  • 論理削除 + 履歴

👉 数学的に最も安定し、壊れにくい層

※ テーブルは自動的に群になるわけではありません
群として扱う制約を宣言したときにだけ群になります


トランザクションとは何か

トランザクションの定義は驚くほどシンプルです。

操作全体の時間を 0 とみなすことで、
現実世界が時間 t に依存することを
その操作対象について打ち消す宣言

言い換えると、
「途中経過が観測できない世界を作る」ための宣言です。

つまり:

  • 中間状態を見せない
  • 一瞬の写像として扱う

これは実装技法ではなく、構造の射影です。


ロックとは何か

ロックは「排他制御」ではありません。

群の境界を一時的に閉鎖する宣言

  • この集合に対する演算は、今は私だけが行う
  • 群の閉包性を壊さないための装置

楽観ロックは
「境界を閉じず、事後に群条件を検証する」
というだけの違いです。


IT実装と代数構造の対応表

以下は、実務でよく出てくる概念を
「代数構造として何をしているのか」で整理した対応表です。

IT実装・概念 代数的対応 説明
UI / IO 副作用地帯 時間依存・非決定
UIイベント 非閉集合 再現性なし
イベントハンドラ 半群 合成は可能
ViewModel 半群 ノイズ除去
集計処理 可換半群 順序不変
Repository モノイド 単位元あり
Transaction 時間射影 時間を潰す
Commit / Rollback 射影確定 / 破棄 現実反映
Lock 群境界閉鎖 構造保護
楽観ロック 事後検証 境界非閉鎖
テーブル(素) 集合 まだ不安定
群として宣言されたテーブル 群 可逆・閉包
破壊的 UPDATE 群破壊 逆元消失
物理 DELETE 定義域破壊 構造崩壊
デッドロック 境界閉鎖循環 演算不能

これを知っていると防げること

  • UIに業務ロジックを書かなくなる
  • トランザクション境界が自然に決まる
  • ロックが「なぜ必要か」説明できる
  • DB設計で不可逆操作を避けられる

つまり、

設計ミスの半分は、構造を正しく選ぶだけで消える


おわりに

この考え方は、

  • 言語に依存しない
  • フレームワークに依存しない
  • 時代に依存しない

一度理解すれば、
同じ設計ミスを二度としなくなるはずです。

もし
「なんとなく正しい設計」に違和感を感じてきたなら、
その違和感はたぶん正しい。

構造を疑ってみてください。

Discussion