- 2年前にモバイル/Web/バックエンドを作るために選んだ技術と、その振り返りを記録
- 非常にシンプルで一般的なSaaSだったので、最小限の労力とリソースで素早くブートストラップすることを目標にした
デザイン能力が限られていたため、モバイルアプリは自分で開発せず外注し、バックエンドとWebだけを開発した
技術選択
モバイルアプリ
- 長年の.NET開発者だったが、Xamarinで開発したいとは思わなかった
- iOS/Androidの同時サポートのためにFlutterを選択
- 数週間で両方で動くアプリができたので、Time to Marketの観点では素晴らしかった
- UIには多少の欠点があったが、私たちのようなB2Bユースケースでは無視できた
- Flutter自体にはバグや問題が多かったが、致命的なレベルではなかった
- 言語としてのDartはいまひとつだったが、問題ではなかった(どうせ自分が開発するわけではないので)
- Xamarinをそのまま使い続けるか、React Nativeを選ぶほうが良かったかもしれない
API
- スケールは重要ではなかった。最初の顧客の一部にだけ提供できればよかったからだ
- そのため、Kubernetesやサーバーレスなどはすべて無視し、単純にモノリスとして開発
- 単一だがモジュール化された.NETアプリケーションとして、F#でコーディングし、Onionアーキテクチャ(Ports & Adaptersパターン)に従った
- GraphQLのようなものも無視し、昔ながらのREST方式で進めた
- 結果
- APIは非常に堅牢で高速。デプロイ中もほとんど問題は発生しなかった
- 証明はできないが、この成功の大部分は自分が使った「Applied Functional Programming」アプローチのおかげだと思う
- また、F#のコードは非常に美しく、読みやすく、理解しやすい
- ごく少数のオープンソースライブラリにしか依存していないため、F#エコシステムが比較的小さく、動きが遅いことは問題にならなかった
Persistence
- SQL Serverを長く使ってきたが、DBにライセンス費用をかけたくなかった
- そこでPostgreSQLを選び、単一のDBサーバーをAPIが利用。多少のキューメカニズムも含めた
- 製品にBLOBストレージが必要になったため、単純にサーバーのファイルシステムを使うことにした
- 結果
- とにかく動く(It just works)。Postgresと付き合うのは楽しい
- JSONBデータ型によって、RelationalとNoSQLのテクニックを混ぜて使える。非常に安定していて快適なやり方だ
- JSONクエリ構文を覚える必要はなさそうだ
- BLOBを単純にディスクに保存するのは大きな決断だが、AWS S3のようなものを使っても、少ないユーザー数では大きな助けにはならなかっただろう
Web App
- Webアプリに関する技術的な決定にはかなり時間がかかった
- 直感ではFableとF#を選べと言っていたが、最終的にはReactとTypeScriptを使い、SPAを構築することに決めた
- 初期の決定の中で重要だったのはTailwind CSSを採用したこと
- 結果
- React just works, TypeScript just works
- Dartと同様に、TypeScriptを書くのもあまり好きではなく、読むのもそれほどではない
- ただしTSには素晴らしい機能がある。Discriminated unionsのような機能はF#にもあってほしい
- 全体として開発者体験は素晴らしい。ビルド時間はものすごく短く(F#と比べて)、複雑なUIの問題の大半にはすでにパッケージが存在する
- 関数型プログラミングの観点から見ても、Reactのアプリケーションモデル全体は理解可能だ
- Tailwind CSSは非常に多くの負担を減らしてくれる
Infrastructure
- モノリスで行くことにしたことで、選択は簡単になった
- HetznerでLinuxマシンを借り、3つのDockerコンテナを実行:Postgres、DotNet API、Nginx
- すべてGitHub Actionsでビルドされ、自動デプロイされる
- 結果
- クライアントとバックエンドを同時にデプロイするとダウンタイムが発生するが、現時点では短く、無視できる
- 全体のプロセスはスリムで安定しており、コスト構造も同様だ。Hetznerは本当に安い
まとめ
- 現在の決定には非常に満足している
- 以前のプロジェクトよりも広い規模で、F#および関数型プログラミングの作業に投資した
- プロジェクトにF#、TypeScript、Dartの3つの言語があるのは少し多い
Dotnet MAUIはFlutterほど成熟していないが、あまり使わない別の言語の代わりに選ぶことはできそうだ
3件のコメント
長期的に見て、人材の確保は円滑でしょうか?
おそらく一人で運営しているサービスなのでしょう。人員よりも、自分が保守しやすい方向で考えたようです。
自分には合わない部分も少しありますが……この人にとっては、それなりに実用的な選択だったように思います。