東大での講演

(ちょっとだけ追記しました。その他1/25のあたりも見てみてください。)
"Can programming be reinvented?"というタイトルでの発表。東工大と東大で似たような発表をしたのだが、ストーリーラインが比較的新しいため、先にやった東工大での発表には反省点がいろいろあり、それが東大での発表に生かされた形になったのは否めない、かもしれない。以下は、かなり再現性の低いメモ。詳細はさらに聞いてください。「私」はもちろんAlan Kayを指します。

近所の人から、「なんで新しいコンピュータのほうがWindowsの起動やMS Wordの起動が遅いの?」、「大きいディスクがついているはずなのに、なぜ使える容量が少なくなるの?」、「アップデートをしたら、何で再起動しなくてはいけないの?」という質問をされる。なかなか良い質問である。

私自身も、コンピュータに関する疑問がある。「なぜ、コンピュータの外側にあるインターネットは異機種接続されたノードが本物のメッセージを送りあって動いているのに、ある一台のコンピュータの中はそのように動かないのか」、「Shannonの定理によれば、ノイズの上限がわかってさえいれば、どんなにノイズの乗った回線であっても、信頼性のある通信が可能である。なのに、なぜソフトウェアがクラッシュすることがあるのか」、「なぜ、今のソフトウェアは必要であると思われるよりも100倍も1000倍も多くのコードで書かれているのか」、「子供が"agents of change"であるなら、なぜ本当の子供用コンピュータが無いのか」、というものである。

Encyclopedia Britannicaは11200冊からなる百科事典で、各分冊は1000ページほどでありそれぞれ1.5インチ(?)ほどの厚さである。積み重ねると、だいたいエンパイヤ・ステートビルディングくらいの高さになる。(1/25追記:
1.5インチで1000ページというのは第14版のやつで(だから相当に薄い)、それは全35巻くらいだったそうですが、11200冊と言うのは「もしエンパイヤステートビルディングと同じ高さまでそれを積み重ねることにしたら何冊いるか」という話でした。だからこそ、Windowsが如何に大きなコードであるかということになるわけですね。)

Windows XPは一億行のソースコードからなり、Windows Officeはアプリは1.2億行くらいである。これを印刷して積み重ねると、大体エンパイヤステートの半分くらいの高さになる。アドビのものなどを足すとだいたい同じくらいの高さになるだろう。だが、本当にそれだけの意味がWindowsにあるだろうか。

人体は60兆個位の細胞からなり、各細胞は6千億くらいの分子から成り立っている。各細胞はいろいろな物質のパターンマッチングをし、お互いにメッセージを送りあって協調して動作している。が、ワトソンとクリックの発見というのはそれを記述しているのが1000バイト程度のDNAであるということだった。 (1/25追記:
1000バイトというのは小さめのバクテリアでした。塩基対ひとつは2ビットで、バクテリアはあまりjunk DNAがなくて5000対とかあるということですね。)

マクスウェル方程式は4行だけで、(相対論はその時には理解できなかったが)高校生のときに理解して魅せられた。ひとつの国の中には、しばしばお互いに敵対しているような何億もの要素(つまり人間)がいるが、米国の独立宣言というのは、そのような組織の基本ルールを定めたカーネルであるといえる。だが、弁護士というのは今のプログラマのようなもので、個々の事例ごとに判例を作ってしまう。その判例は3立方マイルにもなるが、原告と被告が矛盾する判例をもとに物事を主張し、判事が良くわからないままに判決を出す、というようなことが行われている。

システムのデザインというのは、いかにして小さなものが大きなものと相互作用していくかを考えてそれを記述しなくてはならない。
このデモに使っているのはSqueakというソフトで、Xerox PARCで作っていたものの子孫である。当時はオーバーラッピングウィンドウも発明したが、複数のデスクトップを持つシステムも作っていた。新しい作業をするときは、新しいデスクトップを作り、それらが永続化されて、いったりきたりできる。(Project Sorterを見せて)ここにあるのはそういうシステムだが、それぞれのデスクトップはウェブページのようにサーバーにおいてアクセスすることもできる。Power Pointをプレゼンテーションに使うというのは本来ばかげている。人々が作っているものは、Power Pointよりも強力なもの(powerful)のはずなのに、Power Pointというより弱いものに載せために、もともと持っていたパワーを捨ててしまわないといけない。なぜ、自分が作っているそのものを見せるようにしないのだろうか。

Altoは2.5MBのディスクを持っていたが、その時代のSmalltalkは10,000行くらいのコードで、印刷すると185ページくらいだった。今使っているのはその子孫のシステムだが、任意のオブジェクトを埋め込んでテキストのまわりこみができるDTPもあるし、子供向けのプログラミングシステムもあるし、動画のようなメディアも操作できるし、パーティクルシステムもある。

これはダイナミックなシステムなので、いろいろなことをシステム自身に問い合わせることができる。すべての実行コードサイズの和は3.5M程度、メソッド数は60000程度なので、1メソッドあたり平均で59バイトである。全体の行数は23万行程度だが、どの数字も必要よりは多くて、同じことが2万行程度でできるはずである。2万行であれば一冊の本に印刷することができるし、数冊の説明をつければ1人の人間がすべてを理解することができるはずである。我々がNSFからの資金を受けてこれからやろうとしているのは、2万行でOS、グラフィックスシステム、ネットワークシステムからエンドユーザーシステムまですべてを書いたようなシステムを作ることである。

アーキテクチャについて。ピラミッドは、ひたすら大量のごみを何十年もかけて積み重ねて、表面を大理石で覆ったようなものだった。まるで今のソフトウェアのようである。エンパイヤ・ステート・ビルディングは、3000人以下の人が11ヶ月(前に建っていたビルを破壊するところも含めて)で建てたもので、非常によく計画されていたので、ピッツバーグの製鉄所から運ばれてきた鉄がまだ暖かいうちに使われていたくらいだった。これこそが"engineering"というものであろう。engineeringという言葉を聴くと、吊り橋やジェットエンジンのことを思い浮かべるが、ソフトウェア作りはまだそこまで達していないと思う。1968年にソフトウェアエンジニアリングという言葉が作られたとき、作った人々はまだソフトウェアはまだエンジニアリングと呼べるまでに達していないということは理解していて、「そちらを目指すべきだ」という意図を持っていた。が、問題なのは、今の人は「ソフトウェアエンジニアリング」というものがちゃんと存在していると思ってしまっていることである。

ソフトウェアが達成できているのは、建築で言えばゴシック建築のようなもので、アーチの発明によって百万分の一くらいの材料によってピラミッドと同じ高さのものが作れるようになったというくらいである。いくつか良いアーキテクチャとアブストラクションはある。が、アセンブラに対するFortranやAlgol、Algolに対するSimula、Lisp、Smalltalkのように、その前にあったものに対して質的に違う抽象化を提供するというアーチのような新しいものは30年ほど出てきていない。

我々のプロジェクトで目指していることのひとつは、Mooreの法則のソフトウェア版である。インターネットは最初からscalabilityを念頭において設計されたので、14桁15桁以上の拡張をし、いろいろな機械やいろいろな言語で書かれたものが混じっていても、一度もシステムをリブートすることなく動かし続けることができた。ソフトウェアも、そのような拡張性を念頭において設計できないだろうか。インターネットは、実際にメッセージを送りあって動作している唯一のものだが、ひとつのノード上では、境界を越えた最適化が行われてしまっているために拡張性が失われてしまっている。最適化というのはほとんど定義からして境界を破ってしまうことになる。

Don Knuthのせりふとして、「このコードにバグが無いことは証明したけど、まだ試していない」というものがある。数学が取り扱うのは、本当に小さなカーネルなので証明ができる。が、コンピュータが取り扱おうとしているのは、数学が扱うよりも何百万倍も大きなものであるために、証明できる規模を超えてしまっていて実際に試さないといけないものであるように思う。プログラムの仕様検証や証明をする際に、私が思う良いアプローチは、仕様とプログラムを分けて2度書くのではなく仕様自体を最適化を徹底的に排除した形で意図が完全にわかるようにして実行可能なものとして書くことである。

この漫画は、黒板の前に二人の科学者がいて相談しているところで、左のほうにはいろいろな基礎的知識が書かれており、右のほうにはそこから導かれる興味深いものが書かれている。それらの間には、"and miracle happens"と書いてある。

Energy QM Atoms Molecules Large M cells multi cells orgs intelligent civilization

という軸を考えると、400年前は物理的現象そのものが、物理学が無かったという意味で奇跡だった。なぜいろいろな現象が起こるのかということが判っていなかった。その後化学も発達した。私が生まれたころは、生物学も奇跡だったが、1953にDNAのらせん構造が解明されて、奇跡ではなくなってきた。多細胞生物、知的な多細胞生物、そしてその集合である行動学や、文明というがなぜ今のようになっているのか、ということはまだまだわかっていないことがある。

ソフトウェアでは

Power, Logic gates, Ops, Memory, OS, networking, graphics, word processing, Viewing

というような階層があって、電源や論理ゲート、命令やメモリというものはだいたい判っている。また、エンドユーザのコンピュータのビューがどうあるべきかということには少し経験があるのだが、OSがどうあるべきか、ワードプロセッサがどうあるべきか、言語が同あるべきかということはまだ判っていないと思う。これらのことはNSFの提案書を読んでもらった方が良い。その中には、13の原理が書いてあって、1から4までと、9から13まではどうあるべきかということはかなり判っていると思うのだが、5から8までのところはまだどうやればよいか判っていない。

デモはわかっていてもう作ったものしかできないので、まずエンドユーザのビューについて見せようと思う。

そのためにModel-Tについて話したい。Model-Tははじめて大量生産された車でだが、1940年代の田舎ではまだ使われていた。一番の理由は、本当に破壊してしまうのが難しかったからである。350個程度の部品からなっていて、10代の子供が週末に完全にばらしてまた組み立てることができたし、町の鍛冶屋が壊れた部品を作り直すことができた。スパークプラグの透き間は、10セントコインの暑さを使って測るようにできていた。Henry Fordにそれはなぜかを聞いたら、「みんなゲージはなくしちゃうだろうけど、ダイムはだいたいもっているからね」と言った。ソフトウェアでも、そういうものを作りたいと思っている。

車を書いて動かせるし、すべてのオブジェクトは同じタイプのものなので、スクリプタ用のスクリプトもかけるし、ビューワの中の部品も回せたりする。フィードバックを使って、道に沿って走る車が同じプログラミング環境で作れる。似た形で、鮭がふるさとの川の匂いをたどるシミュレーションも書けるし、それを数百、数万並列に拡張して、蟻がえさを仲間に教えるシミュレーションも書ける。

テキストのレイアウトも、同じように文字をパーティクルとみた並列プログラムとしても書ける。各要素は自分の前のやつについていくことだけを考えるが、単語の途中で切れたら、単語の先頭に次の行に行くように伝える。パラグラフエディターは10個ほどの短いスクリプトで書ける。

あとはincrease byをさまざまなメディアに使う例がいくつか。大事なのは、これらは別に新しい話ではないということだが、ただ動画もシンセサイザーもモデルの部分だけを捉えるようにすれば、どれも「数行のスクリプト+ディテイル」であるということである。

、エンドユーザー向けのプログラミング環境はそういう話であった。もうひとつは、下回りのほうで我々が判っていると思っていることの紹介である。まずは、Ian とAlexのGolen Box。このGolden Boxは、入力として150行程度のBNF的なものを食わせると、その言語からネイティブコードを生成して実行するシステムを作り出すことができる。さらに、1500行程度のそのGolden Boxのプログラムを入力として入れると、同じ働きをするGolden Boxを作り出すことができる。これによって、1700行程度でコンパイラ自身も含めてプログラミング言語の処理系を作ることができる。20000行のシステムを作ると言い出した背景には、Ianによるこのシステムが存在していたことが大きい。

もうひとつは、時間のモデルを持ったオブジェクトシステムである。ロックを使った同期はいろいろなやり方が提案されているが、もうひとつ別のやり方は、仮想時刻もモデル化して、微小時間ごとにトランザクションを繰り返すようなモデルである。これはDavid ReedのNETOSで提案されたものだが、David SmithとAndreas RaabのHedgeHogなどで実装されつつある。

googleで"wiring mess"をイメージ検索するといろいろな絵が出てくるが、抽象的なレベルでは、一本のイーサーがあって、すべてのノードがそこからぶら下がっているだけである。これも、モデルとその最適化を分けて考えると良いだろう。

シアトル近郊のTacoma Narrow Bridgeは、風速が100mile per hourを越えると共振するということを計算した教授がいたそのくらいの風が吹いたときに、その教授はカメラ屋に走ってその場で橋が落ちるところを録画した。ここから学ぶべき教訓は、late-bindingということである。Butlerが言ったのは、システム作りをするための学習曲線があるが、いろいろな問題点に当たってそれを解決して経験を得て、じゃあもう一度その経験を生かして新しいシステムをもう一度作り直そうと思ったときには、Mooreの法則が学んでいたパラメータをすべて変えてしまうので、結局新しいシステムを作っても良いものにはならない、ということである。late-bindingであれば、最初からすべてのことを知らなくてもシステムを作り出すことができて、新しい経験を得たときに最初から作り直すのではなく、そのシステムそのものを書き換えて、その経験を最初からしていたかのようなシステムに変えていくことができる。

Altoは当時の金額で、$20,000、今日の価値ならおそらくは$80,000程度である。同世代のコンピュータと比べて、Mooreの法則3回分位速かったので、最適化をしなくてもいろいろな実験ができたし、最適化をすれば、10年くらい先のソフトウェアを作ることができた。75年のBravoは、88年のMS Wordと同じようなものだった。今の人は車には$20,000払うが、コンピュータには$2,000以上は使わない。コンピュータに価値を見出してない。研究者なら自分で速いコンピュータを作るべきである。Altoを作ったChuck Thackerは、David Pattersonと共に2 cubic feetの最速コンピュータを作ろうとしている。これは筐体内の2/3くらいはFPGAである。LindaをFPGAで作ったりすることを考えると、メッセージングの処理などの性能ががらっとかわり、ソフトウェアの作り方が変わる可能性がある。

大事なのは、Squeakも含めて今のソフトウェアは駄目だということである。特に東工大のほうでの講演はやや話し方にあいまいさが合ったともいえるが、Squeakはすでに大きすぎるし、中身もIanのやつのように柔軟性が無いのであまりよろしくない。Squeakを卒業して、もっと良いものを作るのがこれからの目標である。Susan Sontagが言うように、理解というのは現状をそのまま受け入れるのをやめることから始まる。