ざっくり Google Wave (1)

★ この説明は Google Wave Federation Protocol の Draft Protocol Spec (June 8, 2009) を読んで、僕なりに噛み砕いたものです。感覚をつかむ事を目的としているので、説明には間違いや不正確な部分があるかもしれません。ご了承ください。

Wave ≒ Mail

ツールとしての「メール」は現役ですが、古い技術です。Google は、この「メール」をもっとマシなものにできないかと考えて、この「Google Wave」を生み出しました。

Google が定義した取り決め*1では、Wave サービス をユーザーに提供する Wave プロバイダ(または Wave サーバー)が存在します。これは、メールサービス を提供する メールサーバー と似ています。

ユーザーはそれぞれ、Wave プロバイダからもらった Wave アドレス を持っています。これは jane@nicewave.com のように、メールアドレスと全く同じものです。nicewave.com の部分が、Wave プロバイダのドメインです。

Wave プロバイダは誰でも立ち上げる事ができます。Google が新サービスとして始める Google Wave は、Gmail のように単なる Wave プロバイダであり、それに便利なUIをくっつけたものです。*2しかし、Google はこの Wave プロバイダ間でやりとりするための取り決めや、開発者が利用できる API なども含めて Google Wave と呼んでいるようです。

Wave ≠ Mail

このように、旧来のメールそっくりな Google Wave ですが、違うところもあります。

まず、メールはやりとりしません。Google Wave では、皆で1つの文書に対して、あーでもないこーでもないと書き込みをしていきます。それだけだと、ただの掲示板と大した違いがありません。ここからが Google Wave のすごいところ。

他の人たちの書き込みが、見ているだけで、リアルタイムに更新されていったらどうなるでしょう?

それはつまり、届いた内容が次々に表示されていって、こちらが返信を書くと即座に相手にも伝わるという事です。まるでチャットをしているような迅速なやりとりができます。

では、Google Wave はチャットなのでしょうか?

かなり近いのですが、チャットではありません。文書に対しての書き込みは全てサーバーに保存されて、相手がオンラインでもオフラインでも関係ありませんし、チャットでは文書を作る事は出来ません。

みんなが編集する文書の集まりを、Wave (ウェーブ)と呼びます。逆にいえば、みんな Wave の上でやりとりをするわけです。


Wave の中身

Wave の中身を見てみましょう。

Wave の中には、「会話の単位」となる Wavelet (ウェーブレット)が集まっています。実際には、ユーザーは Wavelet を読み書きします。

Wavelet の中には、その会話(または文書の編集)に参加しているユーザーのリストがあります。参加者しか Wavelet を読み書きする事はできません。

また、Wavelet は他にも、みんなが編集している文書の中身をあらわす ドキュメント を持っています。この実体は XML 文書です*3

Wave と Wavelet の区別について、疑問に思う方もいらっしゃるでしょう。Wavelet の参加者は、同じ Wave 内に新たに自分専用の Wavelet を作る事ができます。自分専用なので、他の参加者は許可されない限り Wavelet の内容を読み書きできません。

これだけだと何のことかわかりませんね。例えば、インスタントメッセンジャーを使って、複数人でチャットしている様子を思い浮かべて下さい。ある参加者だけに、こっそりと伝えたい事があったらどうするでしょう? その参加者だけとの間で、新たに会話を始めますよね? あなたが今新しく始めたのが Wavelet です :)

Wave と Wavelet の管理者

Wave も Wavelet も、それを作ったユーザーが所属している Wave プロバイダ上で作られます。例えば、ユーザー jane@nicewave.com が新しく Wave を作ると、その Wave は nicewave.com によって管理されます。*4

では、nicewave.com によって管理されている Wave に、ユーザー me@mywave.com が参加して、Wavelet を新しく作るとどうなるでしょうか? その Wavelet は、今度は mywave.com によって管理される事になります。*5

つまり、Wave と Wavelet を管理する Wave プロバイダは、違う場合があるわけです。

管理するということ

「管理する」というのは、「オリジナルを持っている」という意味です。

文書を編集するためには、文書の内容を知る必要があります。自分が所属している Wave プロバイダが、文書を 管理 していれば、特に問題はありません。

ただ、他の Wave プロバイダが管理する文書の場合はどうでしょう?

文書を読むには、インターネット越しにダウンロードしてくる必要があります。それはつまり、文書の「コピー」を作っている事になります。コピーを持っておけば、わざわざ同じ文書を読む度にダウンロードする必要がありません。

このように、他の Wave プロバイダが持つ文書を読み書きする場合、一旦、自分の Wave プロバイダに文書のコピーを作り、それに対して読み書きする事になります。*6


Google Wave のスゴい所

Google Wave のスゴい所は何でしょう?

それは、1つの文書を、ネットワークをまたいで、みんなで一斉に編集できるところです。

1つの文書をみんなで編集するといえば Wiki があります。あまり経験がないかもしれませんが、Wiki の1ページを編集して保存しようとすると、他の人が同じページを編集していてエラーが出てしまう事があります。

同じファイルをみんなで編集しても、普通はお互いの修正を上書きしてしまいます。みんなで1つのものを編集するのは、簡単なようでとても難しいのです。ましてや、ネットワーク越しともなれば……。

そこで Google は考えました。

Operational Transformation

文書を作るには、以下のように、文字を入力したり消したりして進めていきます。

  1. Aを書く
  2. Bを書く
  3. Cを書く
  4. Bを消す
  5. Dを書く

逆に言えば、この一連の操作の流れと同じように文字を書き消しすれば、同じ文書を作る事ができるわけです。という事は、一連の操作を保存しておけば、いつでも同じ文書を再現できる事になります。

Wave プロバイダは、文書の内容ではなく、この一連の操作を保存しているのです。

誰かが文書に「Aを書く」と、Wave プロバイダは「Aを書く」を一連の操作に追加します。また、同時に他の Wave プロバイダにも「Aを書く」という操作を伝えます。*7すると、その Wave プロバイダ上のユーザー達に「Aが書かれた」事がリアルタイムに伝わるのです。

では、誰かが「Aを書く」のと同時に、他の人が「Bを書く」とどうなるでしょうか? 同時に編集しているので、そういう事もよく起こります。

XYZ

というテキストに対して

  • 「2文字目の前に A を書く」(XAY にするつもりで)
  • 「3文字目の前に B を書く」(YBZ にするつもりで)

という操作がある時、これらを順番に実行すると

XABYZ

となってしまい、「YBZ」にするつもりだった人は、思った位置に書けなかった事になってしまいます。

そこで登場するのが Operational Transformation 、直訳すると「操作の変換」という技術です(略して OT)。この技術を使うと、操作を矛盾のないように変換する事ができます。

  • 「2文字目の前に A を書く」(XAY にするつもりで)

という操作は特に変換をかけずにそのまま行います。

XAYZ

その次の

  • 「3文字目の前に B を書く」(YBZ にするつもりで)

という操作は、OT によって変換され

  • 「4文字目の前に B を書く」(YBZ にするつもりで)

となります。結果として

XAYBZ

となって、両者とも思った位置に書き込めた事になります。

このように OT を使うと、みんなが一斉に書き込んでも、出来る限り矛盾のないように一連の流れに変換する事ができるというわけです。*8

Google のスゴい所

実は Operational Transformation は10年以上も昔から研究されている技術です。

Google のスゴい所は、古くからある JavaScriptAjax という付加技術と組み合わせる事で Google Suggest というサービスにアレンジしたように、昔からある技術の価値を見抜き、現代風にアレンジしてしまう力なのだと思います。

メールが Google Wave としてアレンジされたように :)

*1:この取り決め (=Google Wave Federation Protocol) は、あくまでも「こんなのはどうだ」という下書きであり、仕様はオープンな場で議論により決定されている最中です。

*2:Comet や HTML5 を使ったフロントエンドはとても挑戦的で魅力的です。

*3:実際には XML 文書だけではなく、部分テキストの色などの装飾、ハイパーリンクなどを表現するための「スタンドオフアノテーション」と呼ばれる情報も持っています

*4:Wave には、それを識別するために Wave id という名前がつけられています。例えば nicewave.com$abc123 という Wave id だったら、nicewave.com によって管理されていて abc123 というIDを持つ Wave を指しています。

*5:Wavelet にも同様に、Wavelet id という名前がつけられています。例えば mywave.com/nicewave.com$abc123/xyz987 という Wavelet id だったら、mywave.com によって管理されている xyz987 というIDを持つ Wavelet があり、nicewave.com$abc123 という Wave に所属している事がわかります。Wave と Wavelet を同じ Wave プロバイダが管理している場合、mywave.com/abc123/xyz987 のように Wave id のドメイン部分と '$' が省略されます。

*6:逆に言えば、必要なければ他の Wave プロバイダには送信されないので、同一 Wave プロバイダ上での会話が他のプロバイダに漏れる事はありません。

*7:この時、プロバイダのサーバー間では XMPP というプロトコルが使われます。Google TalkJabber などのインスタントメッセンジャーで使われている通信方法です。

*8:もうちょっと技術的に言えば、排他ロックやトランザクション処理の必要がなくなるため、1つ1つの更新をとても高速に行う事ができます