リンクや編集の仕組みからハイパーテキストとジャーナルの設計を解く
TeamPageは、ダグラス=エンゲルバート氏 (Doug Engelbart) が発明した世界初のハイパーテキスト・システムである NLS (oN-Line System) が発祥の、「ジャーナル」と呼ばれる時系列データベースを採用しています。
今回のブログ記事では、当社CTOのChristopher NuzumがドイツのHyperkult 2015会議で行った講演の資料から、ハイパーテキストとジャーナルの関係や設計思想などについて紹介します。
リンクの仕組み
ハイパーテキストとは、文書(Web上のページ)と文書とをリンク(ハイパーリンク)で結びつけて相互に関連付け、結びつける仕組みのことです。TeamPageはハイパーテキストのシステムですので、まずリンクの仕組みから見てみましょう。
Webサイトのリンクをクリックしたとき、下図のような「ページがみつかりません」や「Not Found」エラーが表示されることがありますよね。これは、リンク先が見つからない場合に表示されるエラーで、リンク先のページが管理人によって移動されたり削除されたりした場合に起こります。いわゆる「リンク切れ」です。
TeamPageのデータベースである「ジャーナル」は、ダグラス=エンゲルバート氏による、「出来事を後から変更できない方法で時間順に記録しておく」「記録を最初の状態のまま保存しておき、なおかつ後で統合・整理して使用できる」という思想を元に、情報の追加のみができるように設計されています。過去の情報が改変せれないため、過去のどの時点へもリンクでき、リンク切れが発生せず、安定的な運用ができます。
下図では、記事2から過去の記事1へのリンクのイメージです。記事の番号(下図の1と2)は投稿順に増えていくので、記事2は記事1より新しく投稿されたことを表します。
多くのシステムでは、リンクは「記事2は、記事1を参照している」のような一方通行の仕組みです。対してTeamPageでは、「記事1は、記事2から参照されている」という逆方向のリンク関係も同時に定義されます。
実際にリンクを作ってみましょう。記事2に記事1へのリンクを作成しました。(「記事1」と書いた部分が記事のIDとして認識され、閲覧権限がある場合は自動的にリンクになります。)
リンク先の記事1を表示すると、記事2からリンクされている(参照されている)ことがわかります。
このような相互リンクの仕組みは、すべての記事の内容を調べてすべての記事のリンク関係を網羅すれば構築できますが、記事件数が多い場合にとても時間がかかります。記事1を表示するとき、どこからリンクされているかを、記事2、記事3、記事4…と延々に調べる必要が生じ、動作が遅くなってしまうのです。
そこで、予めリンク関係を索引(インデックス)として保存しておき、その索引の中から目的のリンク情報を素早く引き出すためのデータ構造を構築しました。このインデックスは、ジャーナルとは別のものです。先にも紹介したとおり、ジャーナルに記録された情報は「最初の状態のまま保存しておき、なおかつ後で統合・整理して使用できる」ものなので、インデックスに追加情報が必要になった場合、例えば「参照している」以外の関係(後述)を追加する場合でも、ジャーナルの構造や設計を変更することなく、ジャーナルから取り出した情報を元にインデックスを再構築できます。今日、私たちが「イベント・ソーシング」と呼んでいる仕組みです。(イベント・ソーシングについては、Shuhei Fujita氏のスライド「イベント・ソーシングを知る」をご覧ください。)
リレーションシップ
TeamPageのジャーナルでは、リンクを意味する「参照している/されている」の他に、いろいろな意味で記事と記事とを結び付けられます。この結び付きを「リレーションシップ」と呼んでおり、次のようなものがあります。
- コメントしている/されている
- タスクを追加している/されている
- 予定を登録している/されている
- 編集している/されている
- タグを付け替えている/られている
例えば、「Exec41」というIDの「2014/05/04 製品デザイン計画の打ち合わせ」という記事録の第4段落に「デザイナー募集広告を出す」というタスクを登録するとします。議事録とタスクとは、「タスクを登録している/されている」リレーションシップで結ばれます。
議事録から見ると「タスクが登録されている」という受動態のリレーションシップになります。
一方、タスクから見ると、「タスクを追加している」という能動態のリレーションシップになります。
この他のリレーションシップも必要に応じて定義・追加できます。例えば、TeamPageで顧客目録を作る場合、企業情報を担当者情報とを「所属している/されている」というリレーションシップを作って結び付けると良いでしょう。
編集とリンクの関係
ジャーナルでは情報の追加のみがサポートされているため、投稿済みの記事の内容(ジャーナルに記録済みの情報)は最初の状態のまま保存しておかれ、編集で改変されません。編集内容は新しい記事として投稿され、編集前の記事と「編集している」リレーションシップで結びつけられます。
アニメのセル画(古い…)やPhotoshopのレイヤーに例えると分かりやすいでしょうか。最初の投稿データはそのまま残しておき、編集内容を透明なシートに書いて上に重ねていきます。シートを上から見ると、それまでの編集の歴史が一枚に重なって見えます。通常、記事は重なりを上から見た状態で表示されますが、必要に応じて透明編集シートを剥がしていくことで、過去の状態を確認したり過去のバージョンに戻したりできます。
前述のとおり、TeamPageのジャーナルでは過去のどの時点へもリンクできます。面白いことに、編集によって「未来の」時点へのリンクを作ることができます。
下図の例で説明しましょう。記事1と、記事1へのリンクを含む記事2があるとします。記事2から見ると記事1は過去になるので、リンクできます。記事1を編集し、記事4へのリンクを挿入して投稿すると、変更内容は記事5として投稿されます。記事1の上に、記事4へのリンクを含む記事5が重なり、記事1'として表示されます。記事4へリンクしているのは記事5であり、記事5から見ると記事4は過去に当たります。けれども、ユーザーが記事1を表示すると、実際には記事1'が表示され、記事1からあたかも未来の記事4へのリンクが作成されているように見えます。
TeamPageでは、記事録や日報の中の段落にコメントしたりタスクや予定を登録したりできます。また、あらゆる編集内容が記録され、必要に応じて過去の状態に戻せるようになっています。今回は、これらの特徴的な機能の裏側の仕組みや設計思想についてご紹介いたしました。ご興味のある方は、下記関連資料のリンク先をご覧ください。
関連資料
ダグラス・エンゲルバート氏とトラクション・ソフトウェア社の歴史