Firebaseは難しい

Firebaseを使うと簡単に開発がはじめられる一方思ったように使いこなすのは大変という問題がある。

この大変さは以下のように分けて考えている

  1. Firebase特有の機能を正しく理解するのが難しい
  2. ドキュメント指向データベースで開発していくのが難しい

1. Firebase特有の機能を正しく理解するのが難しい

Firebaseを使って開発する時に

  • データベースにCloud Firestoreを使い
  • ブラウザやネイティブアプリからSDKでアクセスし
  • ユーザー認証をする

という要件を満そうと思うと

が付いてくる(厳密にはFunctionsなしにできるケースもある)。

SDKでFirestoreにアクセスするにはクライアントサイドでクエリを実行しデータを取得する。

このクエリでアクセス制御を実現するためにAuthenticationでアクセス元ユーザーを特定し、Security Rulesを設定しクエリに登場するパスごとの権限を設定する。

要するに従来サーバーサイドで行っていた処理をプラットフォームとクライアントサイドで分担することで、データを取得するための認証やAPIエンドポイントの中身の実装を開発者が省けるようになっている。

このSecurity Rulesの設定自体はドキュメントや開発ツールもありよくできた仕組みではあるんだけど、意図した動作にするためにDBのドキュメント構造も含めて試行錯誤しないといけないので従来のサーバーサイドのWebフレームワークを使って実現するのと比べるとハードルが高い。

なのでそれを回避するために、Cloud Firestoreは使うがAPIエンドポイント内のアクセス制御ロジックは自分でコードで実装しSecurity Rulesは使わないという方法を好む人もいる。

その場合クライアントサイドのSDKが用意したオフラインキャッシュ解決やデータ変更のリアルタイム監視の機能などもあきらめることになる。

2. ドキュメント指向データベースで開発していくのが難しい

リレーショナルデータベースは正規化したデータを要求に応じて柔軟にクエリで読み書きしていくが、ドキュメント指向データベースではデータモデルを要求に合わせないといけないという事情がある。

加えて取得する対象のドキュメントにどんな値が格納されているのか、とかドキュメントの定義を変更したら既存のデータを新定義に移行、などをデータベースへの命令ではなくてアプリケーション側で管理する必要がある。

Firebaseでのアプリケーション開発はクライアントサイドに寄っているので、時系列のことなるドキュメント同士をクライアントサイドジョインしたり、データモデルを都合よく調整するためにCloud Functionsでの非同期処理を繋ぎあわせて工夫したりと、ここが実際に開発している時に難しいと感じている点になっている。

リレーショナルデータベースでのORMなどの周辺ツールの充実によってある程度楽になりそうな予感はあるけど今のところ自分は難しい。

初心者に薦められがち問題

Firebaseはフロントエンドのみで無料でサーバー構築なしに開発を始められるので、プログラミング学習コンテンツのデプロイ先として薦められることが結構ある。

しかし前述のようにFirebaseは難しいので、安全でないアプリケーションが世に放たれるとか、開発の継続や引き継ぎが困難になることを懸念している声もある。

クラウド破産問題

Firestoreはしばしば「実装の問題で高額請求が発生してしまった」というニュースを見かけることがある。

現状DynamoDBのプロビジョニングモードようにキャパシティを設定してコストをコントロールする機能がないので、「閾値アラートを飛して監視」ぐらいしか手段が用意されていない。