昔、clockload名義でRoundtableというチャットクライアントを作っていた。clockloadの閉鎖とともに配布終了していたが、最後にコードを書いたのは 2002年のことだと思う。7年前のことだ。これはJavaを使って、チャットなど、一つのワークスペースを共有するもので、かなり柔軟なモジュラー形式にしていたことが自慢であった。もっとも、その柔軟性を使うことはほぼなかったため、無駄といえば無駄だったが。

ところが最近Google Waveという同様のツールが出てきて世間をにぎわせている。触ったこともなければちゃんとデモも見ていたわけではないので正確なことはいえない。が、幾多のちがいはもちろんあれど、大筋で似たようなことをやっているなと感じた。Roundtable自体、せいぜい10000行にも満たないJavaアプリケーション、実質1ヶ月ぐらいで書いたもので、特にWaveletが多数動作している部分の設計は似ているだろうと想像に難くなく、新ためて自分の設計の正しさを思い知ったしだいである。

一方で、RoundtableはGoogle Waveになれなかった。あれで1ヶ月なら、1年まじめにやれば近い部分までたどり着くことは可能だったかもしれない。今日はなぜたどり着けなかったか考察しつつ、自戒としたい。

-同じだったもの

クライアントサーバ型であるとか、データ差分を利用することとかが非常によく似ている。またXMPPをベースにしたWaveのプロトコルは、実際にかなりRoundtableのプロトコルと似ている。waveのほうがシンプルに絞り込まれていること、RoundtableはSerializationに頼りっきりな100%Java依存なところとかがまあ違いである。

どちらも基本的にデータは差分であり、差分から全体を構成するところもそっくりである。そのようにすることで、ヒストリーの保存や再生もかなり簡単に可能である。

プロトコルの構成から見て、コアとWaveletの関係もたぶん予想の範疇である。これだとWaveletは通信をあまり意識せずに書け、しかも依存性も低いだろう。

- 異なる競合性解決

この種のアプリケーションで面倒なのは、同時に同じ部分を編集しようとしたりしたときの解釈である。Roundtableでは、これは解決していなかった:) なにしろ、同時にいじる人数は少ないので、さほど工夫をする必要もないのである。それゆえデータはすべてのクライアントノードでばらばらに持っていた。これは比ゆ的にいうと、SQLデータベースにおけるクエリベースのレプリケーションに似ている。ただし、この場合はSQLよりもずっと競合は少ない点は救いか。その先として考えていたのは、各アクションに対して必要なだけpessimistic lockをとらせ、取れた後行動可能にさせるというものだ。今考えると、デッドロック時の挙動が怖い。そして、作ったときには考えていなかったが、クエリベースの不安定さというのは、2004年ごろから強く身にしみて学ぶことになる。

次にWaveだが、InfoQの記事のGoogle Wave アーキテクチャに詳しい。Waveの核はOperation Transformationというものであるらしい。これは単一のエンティティをサーバ上に用意する共有型である。こいつのなにがすごいかというと、UIのような高速さが要求される部分に対して、すばやく文字単位で更新を受け入れつつ、しかも最終的につじつまを合わせられるようなトランザクションモデルを提供していることだ。

一連の動作に対して、まずxidをすばやく取得に走る。取得は非同期で、運よく受け入れたれた場合はその更新をサーバに伝え、さらにその間の更新についても再び同じように問い合わせる。最後にサーバから最終バージョンへの差分が投げられて、これでクライアント間の整合性もばっちりだ。

これに二年かかったというのもうなずける。リカバリーだのなんだのを含めると、このすばやく反応可能な、完全なトランザクションモデルを実現できるサーバプロトコルは、ちょっとやそっとのしろものではない。データモデルこそ単純だが、BigTableよりも高度なことをやっているのではないかと思ってしまう。

- 洗練されたUIと機能

そしてもちろんGoogleの18番、きっちりと機能とUIを作りこんでいるところである。RoundtableはL.starの知りうるSwingテクニックを全部盛り込んだ野心作であったといえるが、一方でGoogleのUI作りこみはそんなL.starのプライドなどゴミくずにしか見えないようなクールなのを作っているので定評がある。サーバに盛り込める機能といい、それに対するチューニングといい、彼らのほうが数十段よい仕事をしているのは間違いないだろう。

こんなところだろうか。もちろん知名度とかそういうのは、正直言ってもともと天と地の差があるので、同じように作れたとしても有名になったとは思えない。しかし、それ以前にやはり大きな差もまた感じてしまった。L.starはいったい8年間、どれだけ時間をどぶに捨ててきたのか考えてしまう。

というか、まさか自分が昔やったトランザクション技術と、UI技術がこんなところで融合されうるとは、到底考え付かなかった時点で負けなのだろう。素直にあらためてRoundtableを引っ張り出して、Operational Transformationもどきを実装するとか、そういう勉強から復帰すべきだろう。