アラン・ケイとMVC
MVCについての記事なんてまたかと思われる向きもあるかもしれません。ですが、いままでMVCについての解説記事で、ここに書いたような内容のものを見なかったので(自分が調べ足りないだけかもですが)、書いておこうと思います。この記事は、一番最初のMVCの出発点について確認しておこうという内容です。特に論争的な意図を持った記事ではないですが、マサカリは歓迎します。
Trygve Reenskaug
MVCの発明者はトリグヴェ・リーンスカウク(Trygve Reenskaug)氏だと言われています。
MVCの初出(といってもおそらく体裁からメールかなとおもいます)は多分これだと思われます。
http://heim.ifi.uio.no/~trygver/1979/mvc-2/1979-12-MVC.pdf
翻訳はこちらにありますあります。原著者の了解も得ているとのことで、感謝しかありません。
実際に読んでみましょう。試しに、いくつか抜粋します。
モデルは知識の表象です。
こういうことはプログラマーをやっているとよく聞くような気はします。ですが、よくわからないです。知識の表象ってなんでしょうか。
モデルとその一部には一対一の対応関係がある一方で、モデルとその所有者によって知覚された世界の表象との間にも一対一の対応関係があります。したがって、モデルの各ノードはその問題における識別可能な一部分を表象しているのです。
まあよくわからないですね。
実際にこのモデルの概念を理解するには補助線が必要です。
トリグヴェ・リーンスカウクさん自ら、MVCの背景について次のように語っています。
1978年の夏から1979年の夏にかけて、私は客員研究員として、ゼロックス・パロアルト研究所でLearning Research Group(LRG)の研究者たちとともに、幸福でインスピレーションに満ちた一年を過ごした。このグループはアラン・ケイのダイナブックというビジョンに捧げられていた。ダイナブックは、所有者/ユーザーが興味あるすべてのデータを保持しているポータブルコンピュータだ。とても重要なことだが、これらのデータには、所有者がデータを操作するために使用したプログラム自体が含まれていた。所有者/ユーザーは、プログラムを理解し記述できるべきで、そうでなければコンピュータへの優位性が獲得できない。
MVCについてのノートはこういった背景で読まれるべきである。ユーザーは皇帝なのだ。LRGで行われたすべてのことは、彼をサポートすることだった。
http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
すでに本題なのですが、MVCはもともとはダイナブックを実現するための実装アイデアです。その後MVCにはさまざまな拡張が施されますが、ダイナブック抜きにオリジナルのMVCについて語ることはできません。
ダイナブック
アラン・ケイは「あらゆる年齢の「子供たち」のためのパーソナルコンピュータ」にてダイナブックという構想について詳述しています(こちらも翻訳に感謝。原文はこちらから)。
このテキストはゼロックス社に商品化してもらうことを意識してか、様々なコスト計算やメリットなども述べていますが、ケイのコアコンセプトである「子供のためのパーソナルな」コンピュータがビジネスになるとは誰も信じられなかったことでしょう。スティーブ・ジョブズがパロアルト研究所を訪れて、当時開発中だったAlto(暫定ダイナブック)のデモンストレーションに度肝を抜かれたのは、リーンスカウクがパロアルト研究所を去って約半年後のことです(当時MVCの実装系がSmalltalkに搭載されていたかどうかはわからないです)。
「あらゆる年齢の「子供たち」のためのパーソナルコンピュータ」では、特に「知識」のあり方について詳しく述べられています。ケイが知識や学習について特に参考にしているのは発達心理学で著名なジャン・ピアジェです。ピアジェの「操作モデル」という概念についてケイは次のように述べます。
特に若年の子供においてはそうですが、知識は一連の操作モデル(operation models)として保持されます。それぞれのモデルはアドホックで、他のモデルと論理的に一貫している必要はありません(それらは本質的にアルゴリズムやストラテジであって、論理的公理や述語、定理ではない)。論理が使用されるようになるのは発達段階のずっと後半で、その段階でも論理を超えたストラテジが取られ続けます。
ピアジェの考えでは、子供は成長すると実際に行動した手順などを内在化して再現できるようになります。この内在化された行動を「操作」と呼ぶそうです。ケイがピアジェに興味を持っている点は、この内在化された行動としての「操作」こそが「知識」だという点です。「それらは本質的にアルゴリズムやストラテジであって、論理的公理や述語、定理ではない」とあるように、ケイは「○○とは☓☓だ」という形で記述する「述語的な」知識に対して考えを改めるよう促し、操作の手続き(アルゴリズム)こそが知識なのだとしています。
さて、この説明でさきほどのMVCにおける「モデル」の説明:
モデルは知識の表象です。
この意味は明らかではないでしょうか?
ここで言う「知識」は先程書いたとおりで一連の操作の手続き(アルゴリズム)です。「モデルは知識の表象です」をパラフレーズしてみると、「モデルが表象すべき知識とは世界についてユーザーが知っている一連の操作手順だ」とでもなるでしょう。知識とは、「ユーザーが世界、環境、事物をどうやったら動かせるかについて知っていること」であって、その知識=操作を表象するのがモデルです。
MVC
さて、ここまででモデルについてはなんとなくわかったのではないでしょうか。全体像についても見てみましょう。MVCの背景について語ったリーンスカウクのページにこんな画像があります。
Userが骸骨なのがイカしてますね。最高に意味不明で好きです(画像はReenskaugのサイトより引用)。
Userのところにはmental modelとかいてあり、MVCでいうModelのところにはcomputer modelと書かれています。mental modelと書かれたものこそユーザーが知識としてもっているものとしての操作モデルのことで、computer modelはその写像でしょう。
では、ControllerとViewはどうでしょう?
アラン・ケイが考えていたダイナブックは次の画像のようなものです。
このイラストには、ディスプレイとキーボード、それから記憶媒体を差し込むスロットがあります。
ダイナブック構想とMVCを紐付けるなら、Controllerはキーボードのような入力デバイス、Viewはディスプレイに対応しているのではないかと思います(ソフト - ハード的な対応)。ついでにいえばModelは記憶媒体に対応させることができそうです。
先程のリーンスカウクの図を見ると、ControllerとViewはワンセットでToolとして扱われています(これはReenskaugがあとから整理したもの)。Tool(ControllerとView)とはモデルにアクセスするためのユーザーインターフェースそのものでしょう。
ところで、ControllerとViewがUIを実現するものだからといって、これらは「なにが良いUIか」といった議論には関与しません。仮に「良いUI」とは「ユーザーのメンタルモデルと合致するもの」のことだとすると、MVCが提供しようとしたものはこの考えとかけ離れたところにあります。
リーンスカウクはMVCの目的について次のように説明します。
MVCの本質的な目的は、人間であるユーザーのメンタルモデルとコンピュータの中にあるデジタルなモデルとの間にあるギャップを埋めることです。理念的なMVCのソリューションは、ユーザーがドメインの情報を直接的に視認して操作しているという幻想を支えることでした。
人間のメンタルモデルとコンピューター上のモデルは必ずしも一致しませんが、そのズレを解消する手段としてMVCは考案されています。Controllerを通してユーザーはモデルの書き換えを行い、その結果をViewを通して確認する。モデルの書き換えはディスク内の情報の書き換えを意味しますが、このディスク内の情報には自身を表示するためのプログラムも含まれています。
「良いUI」とは、デザイナーによって先取りされたユーザーのメンタルモデルのことです。アラン・ケイやトリグヴェ・リーンスカウクにとって、ユーザーのメンタルモデルとシステムにずれがある時、ユーザー自らメンタルモデルに合わせてシステムを書き換える必要があります。こういうプロセスを踏ませることこそがダイナブックというメタメディアに込められていたものでしょう。
「あらゆる年齢の「子供たち」のためのパーソナルコンピュータ」には、子供が宇宙戦争のゲームで宇宙船の動きが実際とは違うはずだと不満を漏らして、それを書き換えて修正する描写があります。登場人物の子供は、自分が持っている知識とコンピュータ上のモデルの振る舞いとのズレを見つけて修正するのですが、まさにこのストーリーこそがMVCが実現したいと願ったストーリーでしょう。
終わりに
推測も交えながらですが、MVCのもとの形が何だったのかについて説明してきました。これからどういったアーキテクチャが主流になっていくかはわかりませんが、当のリーンスカウク自身はダイナブックという原点を離れてここまでMVCが拡張されつつ利用されるとは想定していなかったことでしょう。
たしかに「モデル」のあり方は、DDDなどを通じて現在でも似たような形を保ってはいます。ただ、そこから重要な契機としての「ユーザーが自らプログラミングする」というビジョンはすっぽり抜け落ちてきました。アラン・ケイにとってもリーンスカウクにとっても、「モデルは知識の表象だ」というとき、想定されているのは「ユーザー自ら知識を書き込み更新していく」ということです。たしかにユーザーのメンタルモデルとコンピュータが提示するものとのずれを調整するには、これが一番いいですよね。他人のメンタルモデルなんて直接知りようがないのですし。
その後リーンスカウクはパタン・ランゲージの観点からMVCの拡張/再解釈を試みたり、DCIアーキテクチャを唱導していたりなどしていますが、「ユーザーはどうシステムと関わるか?」という観点からアーキテクチャのあり方を探る態度は一貫しているようです。
特に結論めいたものもなく、締め方もいまいちわからないのでこのあたりで終わります。