2019年に発表された論文「Local-first software: You own your data, in spite of the cloud」を読んだ.論文は Ink & Switch のウェブサイトや著者 Martin Kleppmann のウェブサイトに公開されている PDF で読める.本論文を読んで気になったことをまとめる❗️
「Local-first software」を簡単に表現すると「ユーザーのコラボレーションと所有権を可能にするソフトウェア原則」で,本論文では Local-first software を提案する背景や思想,そして実際にプロトタイプを実装した評価結果などがまとまっている.なお,本論文は The Changelog Podcast のエピソードで "Muse" の話を聴いていたら Local-first software の話題が出てきて興味を持った👂
📝 Muse
そして現在,Local-first software の思想はノートアプリ「Muse」で活用されているとのことだった.実際に Muse を iPad で使ってみたけど,驚くほど UI はリッチだし,オフラインでも使えるし,今後もっと人気になりそう🎨
📝 背景
まず,Local-first software を提唱する背景として「ウェブサービスのデータに所有権はあるのか」という問題提起があり,本論文を読みながら僕自身とても気付きが多かった.例えば Google Docs / Figma / Slack / Trello など(実際に論文に載っていたサービス名)のデータはサービス側で管理されているため,サービスが障害で落ちてしまったら使えなくなってしまうし,サービスが終了したら失ってしまう.よって,実はユーザーは「データを所有できていないのではないか」という背景があるとのことだった.
📝 7つの理想
そこで「データの所有権を持ちつつコラボレーションを実現できるソフトウェア」のことを Local-first software と表現し,ソフトウェアに求める「7つの理想」が紹介されていた.
1. No spinners: your work at your fingertips(意訳: スピナーなし!手の届くところで作業する)
"スピナー" はよく画面に出てくるローディングアイコン(くるくる)のことで,待ち時間をなくそうという理想のこと.クライアント側での作業を優先することによって,サービス側には非同期的に同期し,クラウドサービスとのラウンドトリップををなくす.サーバー上にプライマリデータを保存するのではなく,クライアント側のローカルデータをプライマリとして扱う.
2. Your work is not trapped on one device(意訳: 作業は1つのデバイスでするわけじゃない)
ユーザーはラップトップ・スマホ・タブレットなど様々なデバイスで作業をするので,それに対応するという理想のこと.
3. The network is optional(意訳: ネットワークはあくまでオプション)
ウェブサービスはオフラインで使えるべきという理想のこと.Offline First(オフラインファースト)という用語も載っていたけど,案外オフラインだと使えないサービスもあると書いてあった.それは確かにその通りかも.
4. Seamless collaboration with your colleagues(意訳: 同僚とのシームレスなコラボレーション)
コラボレーションをするときに「テキストファイル」だとしてもマージは難しく,例えば,Dropbox / Evernote だと競合ファイル (Conflicting) になってしまう.Git だと比較的簡単にマージできるけど,テキストファイル以外だと難しすぎる.コラボレーション観点だと Google Docs の「提案モード」と GitHub の「プルリクエスト」は便利だと紹介されていた.確かに Google Docs も GitHub も「コラボレーション」観点での体験はよく設計されているよなぁーと思う.コラボレーションを円滑に行えるべきという理想のこと.
5. The Long Now(意訳: 長く続く)
もしウェブサービスが終了したとしてもデータにアクセスし続けることができるべきという理想のこと.言ってることはわかるけど,実際には難しそうだなと思った.本論文では Google Docs はすぐにはなくならなそうだけど,Google Reader は実際に終了したし,Killed by Google というサイトだってあると書かれていた.Google Reader は僕も当時よく使っていて,終了するときはショックだったけど,実際には RSS さえバックアップできれば問題なく,そこまで「所有権」を感じるサービスの例ではないように思った.
また「エクスポート(バックアップ)」を機能として提供してるサービスもあるけど,あくまで「スナップショット」的なエクスポートになるため,エクスポートしただけではサービスと同じ体験を得られることは少なく,最終的にはサービスをローカル環境で動かせないと「所有しているとは言えない」と書いてあって,確かになぁ...❗️と考えさせられた.しかし実際にやろうとするとアプリケーションを公開する必要もあるし改めて難しそう.
6. Security and privacy by default(意訳: セキュリティとプライバシーをデフォルトに)
サービス側に全てのデータが保存されるため,攻撃者にとって魅力的なターゲットになってしまう.よって,クライアント側にデータを保存し,サービス側には暗号化をしたデータを保存する.結果的にセキュリティとプライバシーを高めるという理想のこと.
7. You retain ultimate ownership and control(意訳: ユーザーが究極の所有権と管理権を持つ)
サービス側にあるデータはサービス側の事情によってアクセスできなくされてしまう可能性もあるし,利用規約によって制限されてしまう可能性もある.ユーザーがデータの所有権を持つべきという理想のこと.
📝 比較
次にいくつかの既存手法と「7つの理想」を比較していた.詳細は本論文を読んでもらうとして,以下のどの手法もトレードオフで「7つの理想」全てを満たすことはできないという結果だった.あくまで「2019年時点」というのは念頭に置いておくと良さそう.
印象に残った点は Git と GitHub の評価が高く「Local-first software に最も近い」と書かれていた.また Git に関連して,コードを実装する開発環境に関しても「遅すぎる」や「コードをローカルに置きたい」という要望が多く,AWS Cloud9 / Replit / Colaboratory が流行らない理由だと書かれていた.さらに PWA (Progressive Web Apps) を使ったアプリにも可能性はあるけど,まだまだサーバーに依存していると書かれていた.MBaaS 的には Firebase の評価は高かった.オフラインで使えるようにもなっている.しかし,ウェブサービスが終了する可能性に関して評価が下がっていた.
- Files + email attachments
- Web apps: Google Docs, Trello, Figma, Pinterest, etc.
- Web apps: Dropbox, Google Drive, Box, OneDrive, etc.
- Web apps: Git and GitHub
- Web app (thin client)
- Mobile app with local storage (thick client)
- Backend-as-a-Service: Firebase, CloudKit, Realm
- CouchDB
📝 CRDT (Conflict-free Replicated Data Type)
そこで CRDT❗️CRDT (Conflict-free Replicated Data Type) は2011年に提唱されたデータ構造(仕組み)で,簡単に表現すると「コンフリクトしにくく複製できるデータ型」と言える.ソフトウェア実装だと Redis / Riak / Azure Cosmos DB などでも使われていて,Local-first software を実現するために使える.CRDT こそ「次世代のコラボレーションソフトウェア基盤になる可能性がある」と書かれていた.そして「7つの理想」全てを満たすことができるとのこと.
実際に Ink & Switch では,以下のように CRDT の実装や Local-first software のプロトタイプを実装して,検証していた.結果的に CRDT は機能し,Local-first software としてオフラインを重視しながらコラボレーションも実現可能だったとのこと.パフォーマンスなどにはまだ課題も多くあり,本論文には今後に関する言及もされていた.
✏️ Automerge
Automerge は JavaScript の CRDT 実装とのこと.
✏️ Trellis
Trellis は Local-first software を意識して Trello ライクなプロトタイプを実装したサービス.WebRTC を使っているとのこと.
✏️ pixelpusher
pixelpusher は Local-first software を意識してドット絵サービスを実装したサービス. github.com
✏️ PushPin
PushPin は Local-first software を意識して Miro ライクなプロトタイプを実装したサービス.方向性としてはとても似ていて,PushPin を進化させて Muse を開発したという可能性もありそう.
📝 まとめ
2019年に発表された論文「Local-first software: You own your data, in spite of the cloud」を読んだ.日々何かしらのウェブサービスを使っているし,必需品のようになっているけど「データの所有権」というものをあまり意識したことはなく,気付きが多かった.また技術的に CRDT (Conflict-free Replicated Data Type) を知れたのも良かった.是非本論文を読んでみてもらえればと❗️ちなみに Muse アプリのポッドキャストで Local-first software について語っている回もあって,気になるから聴いてみよう📻