ノートアプリのおおまかな設計段階ですでに悩んでいる
先月部屋を片付けた後、Riverpod
をさらっと勉強したりしたが、取り立てて面白い話もない。
その後、サーバサイドの勉強をしていた。
作ろうとしているアプリはノートアプリなのでクライアントだけで完結するアプリにしても良いのだが、マルチデバイス対応をするつもりなのでやはりサーバベースで作りたい。この辺りは意見が分かれるところなのかもしれないが……。
もしかすると例えばRealm
などを使って作るのが正解なのかもしれないが、Realm
のことはよく分かっていないし、こういうコア部分をプロプライエタリなもので賄うのは怖い。
そういう訳で、サーバサイドを書かねばならない。
問題は、僕がサーバサイドのコードを書いていたのはもう10年以上前ってことで、さすがに勉強をしなおさないといけないだろう。
そこで、当時はRuby on Rails
をさわっていたが、もう随分前のことでもあるし、まっさらな気持ちでサーバサイドの技術を選ぶことにした。
とは言っても中々難しい。
-
MVCやその亜種をベースにしたサーバサイドのフレームワークがいろんな言語で出ているが、その中から選ぶなら以前使っていた
Rails
を選ぶのが一番楽な気がする。 -
最近は
JavaScript
をちょっと書いていたので、そういう意味ではJavaScript
/TypeScript
のサーバサイドフレームワークのいずれかを使うのも良いかもしれない。 -
一方で、実は僕には将来作りたいサービスがあって、それには
Elixir
とPhoenix
がフィットする気がしていて、そこに繋げる意味ではElixir
とPhoenix
で作りたい。
で、とりあえず、やって損はないだろうということで、Elixir
の勉強をしていたのが最近の話だ。
ただ、今悩んでいることは、ノートの整合性保持で、ここの部分の設計をどうすべきなのか、決めきれないでいる。
例えばウェブアプリであれば、ユーザはおそらくオンラインだし、オフライン編集ができなくてもユーザは納得してくれるだろう。オンラインであれば、おひとり様用ウェブアプリの場合、編集後即サーバにPOST
/PUT
/PATCH
/DELETE
すれば整合性の問題はほぼ起こらないだろう。
逆に、スマホアプリの場合、ユーザはオフラインでノート編集できることを期待する。ということは何らかのデータの競合解消ロジックが必要になる。
複数人で編集する場合はもちろん整合性の問題が起きるが、そうでなくても、ひとりが複数のデバイスから編集する場合、コンフリクトが起こる可能性は高い。
この整合性問題を解決するための技術がOT
(Operational Transformation:操作変換)とかCRDT
(Conflict-free Replicated Data Type)とか呼ばれるもので、この辺の知識が全く足りていない。
この辺の実装はJavaScript
で書かれているものが多い気がするので、もしかするとサーバサイドはそういうライブラリを利用してJavaScript
で書くべきなのかもしれない(折角Elixir
の勉強をしていたところではあるが)。
ということで、サーバサイドを何で書くかということすら未だ確定できていないのである。
とりあえず、泥縄ではあるが、今からOT
やCRDT
の勉強をしようと思う。ただ、例えばCRDT
と言ってもいろんなやり方が提案されているらしいので、それらの中から自分のアプリに合ったものを選ぶ必要がある。
もし詳しい人がいたら、何らか情報をもらえると嬉しいです。
あと、あんまり大変なようなら、とりあえずは個人使用を想定したノートアプリなのだから、競合解消ロジックなしで一旦リリースしてから考えるということも考えてはいる。