ダイニーのエンジニアリング 3 カ条という記事
【エンジニアブログ】ダイニーのエンジニアリング 3 カ条| dinii(ダイニー)公式| note
これ読んだんだけど面白かった。
サービスについて
初めてダイニーという社名を聞いたんだけど、モバイルオーダーのサービスを出しているらしい。
んだけど、モバイルオーダーのサービス以外に色々プロダクトを持っていて、モバイルオーダーだけでなく店舗運営全般を支えるようなサービスを提供しているとのこと。
リストアップされていたけど、プリンターの制御アプリやハードウェアのモニタリングシステムなど、本当に色々なサービスを開発していてすごかった。
なんでこんなにサービスがあるのかは書いてあったけど、「伝統的な POS の仕組みのほぼすべてがないと店舗運営は回らず、その POS をモダンな技術を使ってプロダクトとして再開発している」ということらしい。すごい。
そもそも「エンジニアの人数 < プロダクトの数」ってすごすぎません?
1. 使用言語を JavaScript(TypeScript)に統一する
普通は 1 つのプロダクトにつき複数人のチームで構成されるが、ダイニーの場合は 1 人が複数のプロダクトを持つという逆転現象(?)が起きている。ええ……すごすぎる。
そうなるとどうしてもプロダクトごとに言語やフレームワークや使用するライブラリが大きく異ると難しいというのは想像に難くない。複数の言語を取り扱うというのもそうだし、そもそもコンテキストスイッチの切り替えが大変なイメージ。
それを考慮し、かつマルチなプラットフォームでの利用実績があるという理由で JavaScript と React をベースにしたスタックを採用しているとのこと。
Web / iOS / Android は React と React Native がやはり有名だけど、サーバーサイドは NestJS を使っているらしい。自分は Express.js のみで NestJS は全然触ったことがないので気になる。
このように技術スタックを一本化することで、
- すべてのヒト・チームが自己完結的に機能開発できる
- エンジニアの流動性が高まりチームサイズの変更が容易になる
- ナレッジの蓄積速度が早い
- 採用を一本化できる
といったメリットがある。
プロダクトの数が多いのでメンバーがプロダクト横断で開発をしやすいというメリット以外にもチームサイズの変更が容易なのは良いことだし、技術選定の幅が狭くなるのもいい。
2. バックエンドをモノリスに保つ
これだけプロダクトが多いとマイクロサービス化されているものだという先入観があったがモノリスに保たれているらしい。
また、サービスごとの機能のモジュール化に NestJS が役立っているらしい。ここで役立つのか。気になる。
マイクロサービスはサービスごとに担当するチームが責任を持って管理できるが、ダイニーはチームが 1 つだからサービスも 1 つということらしい。なるほど。
3. クライアントは Hasura を介して GraphQL でリソースを取得する
REST でリクエストを捌くとクライアントで表示したいリソースを増やすたびにエンドポイントを増やさなくてはいけないが、GraphQL であれば必要なリソースをフロントエンド側で明示することができて、ページの内容が変わるたびにバックエンドを編集する必要がないので、フロントエンドとバックエンドのズレによるバグが減るし開発も高速化するとのこと。
そして Hasura がすごいっぽくて、DB に接続して GraphQL エンドポイントを直接提供できるミドルウェアであり、導入コストも僅からしい。Hasura はデータベースのスキーマを解釈してリゾルバーを定義してくれる(本来はそれぞれのリソースに対してリゾルバーを定義する必要がある)し、データベースクエリに対応する GraphQL の input も定義してくれるので、SQL で書けるクエリであればサーバーサイドで実行した上でクライアントに返却してくれる、とのこと。すご……。
Hasura、権限やページネーションに関しても機能を提供してくれているらしく、バックエンドの実装工数は体感で 95%ほど削減されたらしい。実装工数が(体感だとしても)95%削減されるってどういうこと?数字のインパクトがすごい。
まとめ
ダイニー、すごい。