ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

モデリングについて

カフェで設計を考えていたらいろいろ思うところがあったので、カフェでのツイートを中心にしつつ自分向けにまとめてみる。

モデリングとは

ここで言うモデリングは「人間の営みをコンピュータで実装するために分割して名前をつける行為」くらいの意味を意図している。 また、普段書いているのが Web アプリケーションなので、その前提を含んでいる。

人間の営みを理解するためには分析や対話を通じて概念を見出していく必要がある。

そして、実装するためにはだいたいロジックとデータが必要なんだけど、良い振る舞いをするモデルを得るためにはどちらかに偏ることなく総合的に考える必要があると思っている。 プログラムにはプログラムの、データベースにはデータベースの都合があるが、どちらかに寄せてしまうともう一方の表現力がなくなったり得意なことが活かせなくなったりしてしまう。

これ自体は前から意識していたことだが、自分で思っているよりも遥かに頻繁に意識の切り替えを行なっていたことに気付いた。

良いモデリングをするためには概念を発見する力を磨くとともに、プログラムとデータベースの両方に対する知見を深めていく必要がある*1

モデリングの難しさと個人的な感覚

上の定義では「分割して名前をつけるだけ」のモデリングだが、個人的にはかなり難しいことだと思っている。

半ば冗談でよく言っているのだけど、これは人間が高性能すぎるのが悪い。

だから、直感に基いてモデリングすると、実は分割が足りなかったみたいなことがよく発生する*2

もちろん、初めからより良いモデルに到れれば良いんだけど、神ならざる身である我々が完璧なモデルをつくれるわけはないのでモデルを修正する必要が生じること自体は問題じゃない。 むしろ、現在のモデルが現実をうまく扱えないときはより良いモデルに至るチャンス。

こういった「初めから100%は無理」「少しずつ良くしていく」というような心境があって「ドメインを掘る」「モデルを磨く」といった語法を使うことが多い。

さらにポエミーなツイートを引用しておくと、こんな感じ。

モデリングの重要性

こんなにも難しいモデリングだが、モデリングを頑張ると何がうれしいのか。 大きく3つあると思っている。

ドメインに対する理解

モデルを考えていく過程でドメインを掘っていく必要がある。 この営みはだいたい「◯◯とは?」のような問いを通して概念を明確にしていく作業になるので、結果としてドメインに対する明確な理解が得られるようになる。

堅牢さと柔軟性

残る2つ、堅牢さと柔軟性は相反するように見えて相関しているのではないかという仮説が浮かんだのでまとめて書く。

明確に認識された概念に基づいたモデルは「それが何であるか」が非常に明瞭になっている。

そのため、各モデルに対してしっかりとした制約を課すことができるし、仕様変更や認識のアップデートが発生した場合にもどの箇所にどういった変更を加えるかが明白になる。

一方、適切に分割されていない貧弱なモデルを元に実装すると、柔軟性を確保するためにデータをゆるく持つことで対処する必要が生じてデータのカタさが失われるし、分割されていないモデルに対してロジックを追加していくと神モデル的な何かが生まれたりする。

難しさを伝える難しさ

ここまでいろいろと書いてきたモデリングだが、その難しさを人に伝えるのも難しいと思っている。

貧弱なモデルを元に実装してもとりあえずのところは動くし、生産性の測定などをするにしても生産性の測定自体が難しいのに生産性に対するモデルの影響となるともっと難しいので、価値を示しにくい。

また、仕事で行なったモデリングは大半の場合において公開できないだろうし、モデルはドメインがあって初めて存在するので単体で OSS にするなどは難しそうなので、外部から観測することも難しい。

このあたりはなんとかしていかないといけないと思っている。

おわりに

コーヒー代830円の代わりに得たいろいろな気付きや思いをつらつらと書いてみた。

難しく大変な領域だと思うが、昔から好きな領域なので今後も引き続きやっていきたいと思う。

*1:ここではよく使う RDB を挙げてツイートしているが、他のデータストアももちろん考慮する必要がある。

*2:逆の「別だと思っていたことが実は同じだった」もあるけど、相対的に少ない。