0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

10年越しで理解した『アナリシスパターン』― なぜ"わかりにくい設計"が最強の仕様変更耐性を生むのか

0
Posted at

はじめに

これまで読んできた技術書の中で、最も感銘を受けた一冊を挙げるとしたら、私は迷わずマーティン・ファウラーの『アナリシスパターン』を選びます。

ただし、この本を「最も感銘を受けた」と言えるようになるまでには、実に10年以上の歳月がかかりました。最初は挫折し、実務で再会しても全く歯が立たず、有識者に教わっても理解できませんでした。それでもある瞬間、すべての疑問が一気に繋がった――今回はその体験を、実務で出会った具体例とともに振り返ってみたいと思います。

1. 2003年、読書会での挫折

私が『アナリシスパターン』を手に取ったのは2003〜2004年頃のことです。当時、業界内で高く評価されていたこともあり、購入して読書会まで開きました。

しかし、結果は惨敗でした。何度読んでも腹落ちしませんでした。「知識レベル」「操作レベル」――まるで暗号のような言葉が並んでいました。

正直なところ、当時の私はこう思っていました。

なんであえてこんな分かりづらい設計にするのだろう? 具体的に設計した方が、よっぽど分かりやすいシステムになるはずなのに。

読書会のメンバーも同様で、議論は深まらないまま、いつしか本は本棚の奥にしまわれることになりました。

2. 10年後、プロジェクトでの再会と衝撃

それから約10年後。私はドメイン駆動設計(DDD)のプロジェクトに参画することになりました。

普段であれば、テーブル構成を見ればある程度その業務内容を推測できます。テーブル名やカラム名から「これは受注に関するテーブルだな」「これは在庫管理だな」と当たりをつけられるからです。

ところが、このプロジェクトのテーブルやクラスは、抽象度が高すぎて全く読み解けませんでした。具体的な業務用語がほとんど登場せず、「資源」「移動」といった抽象的な言葉ばかりが並んでいたのです。

長年の経験が全く通用しない感覚。これは正直、衝撃でした。

3. 有識者のレクチャーでも理解できなかった

さすがにこのままでは仕事にならないので、プロジェクトの有識者からレクチャーを受けることにしました。

しかし――それでも理解できませんでした。しかもこれは私だけの話ではなく、他のプロジェクトメンバーも同じ状況でした。丁寧に説明を受けても、「なぜこの設計にする必要があるのか」という核心の部分が、どうしても腑に落ちないのです。

レクチャーというインプット型の学習だけでは、このパターンの本質には届かない。今振り返ると、そう感じます。

4. 疑問が一気に繋がった瞬間

転機が訪れたのは、要件定義書とデータモデルを地道に突き合わせていた時でした。

「なぜあえてこんな分かりづらい設計にするのだろう?」という、最初に抱いた疑問と向き合いながら作業を続けるうち、あるとき、いろいろな疑問が一気に繋がりました。

気づいたのは、次のようなトレードオフの存在です。

  • 具体的な設計:分かりやすいシステムになる。ただし、仕様変更のたびにコードを具体的に修正する必要がある
  • 抽象的な設計:一見分かりにくい。しかし、仕様変更に圧倒的に強くなる

この二つは、どちらが正しいという話ではなく、トレードオフの関係にあったのです。そして、このトレードオフを最も分かりやすく体感させてくれたのが、次に紹介する「資源」の抽象化という考え方でした。

5. ビール輸送に見る「資源」の抽象化

例えば、缶ビールをトラックで輸送するとき、次のような階層構造になっているとします。

  • トラック(輸送・設備資源)
    • パレット(荷役・循環資源)
      • 段ボール箱/ケース(梱包・在庫資源)
        • 缶ビール(350ml/500ml)(商品・単品)

ビール輸送の階層構造

一見すると、これらはまったく別の物です。トラックと缶ビールを同じ概念で扱うなんて、直感的には不自然に感じるかもしれません。

しかし、これら全てを 「資源」という一つの抽象概念 で捉え直すとどうなるでしょうか。

ここに新しく「マルチパック(6本パック)」という商品を追加したくなったとします。具体的な設計であれば、新しい商品区分ごとにテーブルやコードを追加する必要が出てくるかもしれません。しかし、すべてを「資源」として抽象化しておけば、マルチパックもまた一つの資源として扱えます。つまり、コードを1行も変更することなく、データを追加するだけでこの仕様変更に対応できるのです。

このことに気づいた瞬間、10年来のすべての疑問が解けたような感覚がありました。「知識レベル」とは、この"資源とは何か"というルールや種類を定義する層であり、「操作レベル」とは、実際に起きた事実(このトラックにこのパレットが積まれた、等)を記録するだけの層だったのです。また、このモデルに基づいた実装もかなりシンプルになりました。

ちなみに、最初に面食らった「移動」という言葉も、こう考えるとすんなり繋がります。「移動」とは、パレットからトラックへ、あるいはトラックから倉庫へと、資源が場所や保有者を変えるたびに記録される、まさに操作レベルの中心にある事実そのものです。

このビール輸送の例を「知識レベル」と「操作レベル」に整理すると、次のようになります。

  • 知識レベル(ルールや構造の定義)
    • 資源の種類(トラック、パレット、ケース、缶ビール、マルチパック)
    • 包含関係のルール(ケースには缶ビールが24本入る、等)
  • 操作レベル(日々の事実の記録)
    • どのトラックに、どのパレットが載せられたか
    • A倉庫からB倉庫へ、どの資源が移動したか

新しい商品(マルチパック)が増えたときは、「知識レベル」にデータとして新しい資源の種類を定義するだけで済みます。「操作レベル」の「移動する」という処理ロジックやテーブル構造には1行も手を加える必要がありません。

6. 実務で実感した効果

この考え方を理解してからは、実務でも次のような効果を実感しました。

  • 実装の統一化:資源という共通の抽象概念で扱うことで、似たような処理をパターンごとに個別実装する必要がなくなった
  • 仕様変更への圧倒的な強さ:新しい種類の資源が追加されても、コード変更ではなくデータ追加で対応できる場面が非常に多かった

最初は「わかりにくい」としか思えなかった設計が、理解した瞬間から「圧倒的に強い」設計に見えてくる。この逆転体験こそが、アナリシスパターンの真骨頂だと思います。

まとめ

『アナリシスパターン』との付き合いは、2003年の挫折から数えると実に20年以上になります(理解に至ったのはその半分の10年後でした)。この経験から、私が得た教訓は次の一つです。

抽象度の高いパターンほど、最初は理解しにくい。しかし、理解できたときのリターンは計り知れない。

有識者のレクチャーを受けても分からなかったものが、要件定義書とデータモデルを自分の手で突き合わせる中で、ある日突然繋がる。これは、知識として「教わる」ことと、経験として「腹落ちする」ことの違いなのかもしれません。

もし今、抽象的な設計に「なぜこんな分かりづらい作りにするんだ」と感じている方がいたら、それは理解の途中段階にいるだけかもしれません。諦めずに、実際のデータや要件と向き合い続けてみることをお勧めします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?