私がZustandの開発で学んだこと、Reactのライブラリ開発の話です
しばしば、「あなたがZustandを開発したのか」と聞かれて、どう答えようか迷っていた時期もありましたが、最近では「私がZustandの開発者です」と答えるようにしています。正確には、オリジナルの開発者は別にいて、私はv2からv3にバージョンアップする時に開発を引き継ぎました。当時、ZustandのGitHubスター数は2500くらいで、今ほどではないものの多少知られていました。その時、私が力を入れて開発していたReact-Trackedはスター数500ちょいだった(今はちょうど2500くらい)ので、それよりはだいぶ多かったことになります。Zustandはv2の開発が半年以上放置されている状態で、メンテナ不在でした。そこで私が引き継ぐことになったのですが、元々は他人のコードだったので馴染めない部分もありました。しかし、v3からv4でアップデートしていくにつれ、私および新しいコントリビューターが書いたコードでv2時代のものはほぼ完全に上書きされ、今ではオリジナル開発者も理解できない状況になっています。ただ、APIはv1の時代から引き継がれているものがあり、それが人気の秘訣になっているとも考えられます。さて、私がZustand開発で何を学んだかですが、当初私はライブラリというものは何かの機能を提供するもので、その機能は容易に実現することが難しいものと考えていました。しかし、Zustandはそれに該当せず、その意味では開発を引き継ぐことには少し乗り気でない部分もありました。Zustandのコードはあまりに小さく、類似品はいとも簡単に作ることができ、およそライブラリとして意味をなさないのではないかと思ったのです。蓋を開けてみれば、人々は、Zustandが簡単に作られているかそうでないかをあまり気にすることはなく、ZustandのAPIが使いやすいか、もっと言えば、理解しやすいかを重視するようでした。また、その実装コードが小さく簡単であることは、マイナスよりプラスに働くようでした。なるほど、ライブラリ開発のキモはAPI設計にあると。APIがシンプルであると、ドキュメントも少なくて済みます。読む方も書く方も楽です。Zustandのドキュメントは今でこそ多少充実してきましたが、長いことREADMEだけでした。v4に移行する時に初めてdocsフォルダができマイグレーションのドキュメントが置かれました。その時点でのGitHubスターはおよそ20k。ドキュメントサイトなしで、そこまで伸びたライブラリが他にあるでしょうか。結局その後、Zustandがこんなに使われているのにドキュメントサイトがないのはおかしい、とのことで、コントリビュータの方々が整備してくれました。話を戻すと、シンプルなAPIの精神は、JotaiとValtioの開発にも引き継がれました。いかに何も考えずに使えるかがポイントで、そのために関数名ですら何度も練り直します。ちなみに、Jotaiはかなり初期の頃からドキュメントを作成しました。ZustandのようにRedux脳では使えず、Jotaiは概念から伝える必要があったため(と言っても、Recoilと似てるからよろしく、で済ませる場合もあったり)です。ValtioはZustand流でしばらくドキュメントはシンプルなものだけでした。それでもValtioはZustandよりは複雑です。Zustandのシンプルさは異常なほどで、メインのJSコードはほんの数十行だと思います。それもあって、v4からはTypeScriptに力を入れることにしました。これもコントリビュータの力によるものですが、今のZustandのTSのコードはそんじょそこらのTSの知識では読めません。JSは簡単なのにTSが難しいのです。まあ、理由はAPIがTS以前の設計で、TSの考え方に沿っていないからですが。Jotaiは、その反省を活かしTSで自然に実装できる(利用コードもライブラリ自体も)ことを目指してAPIが設計されています。ところで、結果的にZustandはTSで見ると容易には真似できないレベルになっていて、つまり当初私が懸念した「簡単すぎてライブラリとしての意味を成さないのではないか」も解消されました。Zustandの次のリリースとしてv5も予定しています。利用者が多いライブラリは、たとえメジャーバージョンアップと言ってもBreaking Changesは慎重に扱わないといけないこともあり、この辺りも学びに繋がりました。この先に何が待っているか分かりませんが、ステージが進めばまた学びも増えることかと思います。とりとめないですが、思ったことをつらつらと書かせていただきました。以上
Discussion