PHPカンファレンスレポート：MVCにおける「モデル」とはなにか

# 前提
PHPカンファレンスに参加してきたので、
トークを聞いた感想というかレポート記事になります。
その他の記事は [ここ](https://qiita.com/sh_tomato/items/8029ea6cb5db570223e1)にあります。

# MVCにおける「モデル」とはなにか
個人的には聞いていて最も面白かったのがこれです。
内容としてはかなり難しく、聞いていてかなり疲れたのですが、、、

具体的にこういうものがモデルだよって話というよりは、
かなり抽象度の高い哲学的な話にも聞こえてきたので、すごく面白かったです。

話の展開としては、
・ドメインモデルは個人を束縛する
・メンタルモデルは個人が世界に抱く内面的なモデル
・パーソナルコンピュータは社会と個人の関係を変えようとした
という前提があったうえで、
MVCモデルに対する説明がなされます。
前提部分から順を追ってレポートしてまいります。


## ドメインモデルは個人を束縛する
ドメイン駆動開発などを聞いたことがない人は、ドメインと聞くとURLの話？となりそうですが、
ここでは異なる文脈となります。
天重さんのセッションの中では「問題領域（ドメイン）＝ ビジネス／目的 」という言葉で説明されています。

そもそもソフトウェア開発をする目的は何かしらの問題／課題を解決するためにあります。
この解決したい問題／課題そのものがドメインであり、
問題／課題を解決する手段／システムをドメインモデルといいます。

例えば、天重さんが例題でも仰られていた飲食店でいうと、
・顧客が食べたいものを出す
・利益を上げる
といったことが目的であり、

・料理を出す
・顧客から注文を取る
・注文伝票による情報伝達
といったことが手段となります。

そういう意味ではドメインモデル（手段）が個人の行動を決める（束縛する）というのは、
非常に理解できる内容かと思います。


## メンタルモデルは個人が世界に抱く内面的なモデル
>メンタルモデル（英: mental model）とは、頭の中にある「ああなったらこうなる」といった「行動のイメージ」を表現したものである[1]。

 [ウィキペディア（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB)

これも言わんとする事はなんとなくわかります。
ボールペンをかちっとしたら芯が出てくるとか、
ペットボトルのキャップを左回りでひねったら蓋があくとか、
説明なしにイメージできるようなものだと解釈できます。

このような適切なメンタルモデルを構成するためには、
・可視性
・よい概念モデル
・よい対応付け
・フィードバック
が重要となります。
日常の生活のなかで、ボールペンをかちっとすると芯が出てくるというイメージを持ちながら、
実際にボールペンを触ってみるとそうなる（フィードバック）や、
押したら別のところが出るという対応付けなどなどが該当するのかなと思います。

一方で、
コンピュータに目を向けると、
何をやっているかがわかりにくいので、間接的なものであり、
メンタルモデルを構築するのが難しいものです。
特に非エンジニアなどであればあるボタンを押すとよくわからないけど、
結果が出力されるといったケースは往々にしてあります。（非エンジニア時代の懐古）

そのため、コンピュータに必要なのは、コンピュータを操作しているのではなく、
コンピュータを通して行っている作業そのものに取り組んでいるとユーザーに感じさせることです。
そういった錯覚のことをユーザーイリュージョンといいます。

天重さんの例としても出ておりましたが、
よいユーザーイリュージョンが発揮されているソフトウェアの１つにEXCELがあります。
A1+A2の結果がC1 に出力されるといった可視性や、
その場でエラーが変えるフィードバックといった部分が適切であり、
コンピュータを操作しているというよりは表計算をしているという
作業そのものに集中することができます。


# パーソナルコンピュータは社会と個人の関係を変えようとした。
1984年のマッキントッシュのCMが代表するように、
パーソナルコンピュータは社会から個人を解放することを目的として作られているとのことでした。
また、それを達成するためにはコンピュータにコントロールされるのではなく、
自分たちが制御可能な言語で作られている必要があります。



# MVCについて
ここまでで以下の点を記載してきました。（発表から抜粋）
>・ドメインモデルは情報システムがもつモデル
　社会的システムとして個人を束縛する。
・メンタルモデルは個人が世界に抱く内面的なモデル。
　メンタルモデルを形成するためには良い道具が必要、特にコンピュータにあってはユーザーイリュージョンが重要。
・パーソナルコンピュータは社会と個人の関係を変えようとした。
　自分の力でシステムを書き換えられることが重要だった。
　そのためにはコンピュータの言語を個人が理解できなければならない。

上記の前提の上MVCとはの話に移ります。
基本的なエコシステムの中では、
各個人がパーソナルコンピューターを通して、
何かしらの情報システム（ドメインモデル）にアクセスをします。
情報システムが掴みずらければAmazonなどのソフトウェアサービスを思い浮かべてください。
各個人のパーソナルコンピュータからAmazonにアクセスしているイメージです。


ここで問題となるのは、
この情報システムと個人の間にギャップが生じている点です。
例えば、Amazonが（情報システム）が使いづらいなど。。

これは先程のメンタルモデルが形成されていない状態であり、
メンタルモデルが形成されていなければ、
情報システム（ドメインモデル）が持つ本来の目的である
問題／課題を解決する手段／システムものとしての役割を果たせていません。


そうならないように、
メンタルモデルを形成してあげる必要がありますが、
そのためには各個人が操作可能なようにツールとモデリング言語を導入する必要があります。
このツールはMVCモデルにおけるViewとControllerにあたります。

>仕事の対象がそこに見えていて、
それに対して行えるアクションが見えていて、
その結果の状態が常に見えるようになっていれば、
ユーザーはその道具を使ってできること、
その道具の役割を自ら発見し、妥当性を感じながら仕事を組み立てることができます。
そのような仕事は楽しいものです。

 [OOUIの目当て](https://www.sociomedia.co.jp/8740)

つまり、ツール（View,Controller)を通して、
ユーザーがドメイン（目的）の情報を直接操作しているように感じさせることが、
MVCモデルとしては重要となります。

# おわりに
天重さんから最後の一言は、
「そのデザインは、いったい誰に力を与えるものなのか」
でした。

私自身もエンジニアとして働き始めるまえから、
特に組織においては人の行動は仕組みで決まるなーとうっすらと考えていたので、
今回のセッションを聞いて、
より具体的な方法に近づいたのかなと思いました。

考えられていないMVCでは個人のメンタルモデルとの乖離が発生し、
ユーザーは提供者の思惑とは異なる動きをするようになると思いますし、
それを防ぐためにはユーザーのメンタルモデルを考慮し、
メンタルモデル通りにモデルを動かせるようにツール（View,Controller）を設計する必要があると
現時点では感じました。

とはいえ自分の知識量ではさらに深い話へと持っていけないというのも事実であるので、
ドメイン駆動開発など少し学んでみようかなーという気になりました。


# 参考
 [君はインターフェイスではない方のUIを知っているか](https://wirelesswire.jp/2019/06/71052/)