Kentaro Imai

ノートアプリのおおまかな設計段階ですでに悩んでいる

先月部屋を片付けた後、Riverpodをさらっと勉強したりしたが、取り立てて面白い話もない。

その後、サーバサイドの勉強をしていた。

作ろうとしているアプリはノートアプリなのでクライアントだけで完結するアプリにしても良いのだが、マルチデバイス対応をするつもりなのでやはりサーバベースで作りたい。この辺りは意見が分かれるところなのかもしれないが……。

もしかすると例えばRealmなどを使って作るのが正解なのかもしれないが、Realmのことはよく分かっていないし、こういうコア部分をプロプライエタリなもので賄うのは怖い。

そういう訳で、サーバサイドを書かねばならない。

問題は、僕がサーバサイドのコードを書いていたのはもう10年以上前ってことで、さすがに勉強をしなおさないといけないだろう。

そこで、当時はRuby on Railsをさわっていたが、もう随分前のことでもあるし、まっさらな気持ちでサーバサイドの技術を選ぶことにした。

とは言っても中々難しい。

で、とりあえず、やって損はないだろうということで、Elixirの勉強をしていたのが最近の話だ。

ただ、今悩んでいることは、ノートの整合性保持で、ここの部分の設計をどうすべきなのか、決めきれないでいる。

例えばウェブアプリであれば、ユーザはおそらくオンラインだし、オフライン編集ができなくてもユーザは納得してくれるだろう。オンラインであれば、おひとり様用ウェブアプリの場合、編集後即サーバにPOST/PUT/PATCH/DELETEすれば整合性の問題はほぼ起こらないだろう。

逆に、スマホアプリの場合、ユーザはオフラインでノート編集できることを期待する。ということは何らかのデータの競合解消ロジックが必要になる。

複数人で編集する場合はもちろん整合性の問題が起きるが、そうでなくても、ひとりが複数のデバイスから編集する場合、コンフリクトが起こる可能性は高い。

この整合性問題を解決するための技術がOT(Operational Transformation:操作変換)とかCRDT(Conflict-free Replicated Data Type)とか呼ばれるもので、この辺の知識が全く足りていない。

この辺の実装はJavaScriptで書かれているものが多い気がするので、もしかするとサーバサイドはそういうライブラリを利用してJavaScriptで書くべきなのかもしれない(折角Elixirの勉強をしていたところではあるが)。

ということで、サーバサイドを何で書くかということすら未だ確定できていないのである。

とりあえず、泥縄ではあるが、今からOTCRDTの勉強をしようと思う。ただ、例えばCRDTと言ってもいろんなやり方が提案されているらしいので、それらの中から自分のアプリに合ったものを選ぶ必要がある。

もし詳しい人がいたら、何らか情報をもらえると嬉しいです。

あと、あんまり大変なようなら、とりあえずは個人使用を想定したノートアプリなのだから、競合解消ロジックなしで一旦リリースしてから考えるということも考えてはいる。