のんびり精進

調べた情報などをおすそ分けできれば。

Firebaseの学習教材(Cloud Firestoreなど)

学習開始の経緯

フリーランスの仕事で大きなアプリの設計をすることになりました。
バックエンドには慣れた技術を使って良いと言われているので、もし何も気にしなくて良ければデータベースには RDB を使いたいところです。

しかし同社からいただくお仕事は基本的に Firebase 利用です。
RDB なら API サーバなど一体的な開発になり、保守できる人の確保が難しいかもしれません。
費用面では RDB は高額になる可能性があります。

そんなわけで Firestore に決めました。

目標

問題は、私自身は Firestore のモバイルアプリのクライアント側しか経験がないことです。
下記のような不安ばかりなので、それがなくなって設計できる状態になるのが目標です。

  • 開発開始までに Firestore/NoSQL の特性を理解し、それに適した構造の設計ができるのか
  • 失敗すると…
    • Read/Write が多くなりすぎて費用が多額になる
    • 気づいたときにはもう直しにくい、等
  • 安全な作りにできるか(難しそうなセキュリティルールを適切に扱えるのか)
  • Cloud Functions など周辺のサービスまで把握してうまく連携させられるか

個人アプリ開発での活用

Flutter のアプリ開発者には Firestore の利用者が非常に多いです。
一方私は、他の DB を使っていて困ることがなく、費用も海外サーバで €3 程度で済ませているので、積極的に導入する動機がありませんでした。

それであっても、使えるようになれば自分でサーバを用意・保守していく手間が省けます。
これはとても大事で、生活のために多数のアプリを出していっても保守の負担を増やさずに済みます。
また、ユーザが少ない間は €3 どころか無料で済ませることができます。
RDB と NoSQL の両方を知れば、用途に合った使い分けができるようにもなります。

そういった使い方を念頭に置き、まずはシンプルなアプリに活用できるようになることを目指します。

学習内容

昨年末のクリスマス頃までの 4 ~ 5 日を Firestore +α の集中学習期間としました(動画とドキュメント)。
その後、年明けには実際に手を少し動かす形の実践も行いました。

Firestore の公式動画シリーズ

www.youtube.com

15 分前後の動画が 12 本だけ(単純計算でたったの 3 時間)なのでここから始めました。

ところが予想外に時間がかかりました。
新たなことを学ぶので、漏れなくしっかりと理解しようとすると流し見するだけでは不十分で、途中で止めつつ調べたり前の動画を見直したりしました。

動画は可愛いキャラクターや Todd さんの楽しいノリが織り交ざっていて苦痛でないのが幸いでした。
その後に読んだドキュメントだけでは理解しにくそうな大事な情報が詰まっているので必見です。
要点をしっかりと含めながら広範囲を平易に解説されていて素晴らしいです。

二種類の Cloud Functions

最後の 2 本は Cloud Functions for Firebase を組み合わせる話でした。
その一つ目で Functions には二種類あることを知りました。
こちらは Cloud Functions for Firebase であり、もう一つは Google Cloud Functions です。

使う言語は Go がいいと思っていましたが、後者でないと使えないとのことでした。
この記事 によれば使えないこともないようです。)

TypeScript は JavaScript 経験者向けの下記ガイドを読むだけで基本はわかったので、まあ OK です。

www.typescriptlang.org

この時点の理解度

頭に定着させるためにこれを二周し、いわゆる「完全に理解した」状態になりました。

Functions の公式動画シリーズ

www.youtube.com

Cloud Functions のほうのシリーズで、8 分前後の動画 9 本だけです。
前の動画で既に少し理解していたせいか、難しく感じることなくすぐに見終えました。

DB のほうは SQL 脳からの大転換が必要なので二周しましたが、こちらは一回で十分だと思いました。

この時点の理解度

特に変わらず「完全に理解した」ままです。

公式ドキュメント

firebase.google.com

動画シリーズも必見ですが、さらに重要なのはやはり公式のドキュメントですね。

動画はかなり広く対応しているのですが、それでも漏れがないわけではありません。
例えば Solutions のところの分散系の話やデータのエクスポート/インポートは重要ですが動画にありません。
また、コード例はドキュメントのほうが見やすいです。

料金例 もわかりやすく示されていました。
100 万件のインストールで DAU 10 万 のチャットアプリ(グループチャットも可)だと読み書きが月 2.7 万円くらいで、ストレージとネットワークは動画内でも言われていたとおり安くて 3 千円くらい。

なお、日本語版 もありますが、英語版にある情報がなかったり、 PC で見ていると遷移先に左カラムがなくて行き来しにくかったりしました(報告しましたが直っていません)。
英語版のほうがおすすめです。

この時点の理解度

「完全に理解した」ではなくなりました。
次の段階として「何もわからない」まで下がるとよく言われますが、そこまでではないにせよ情報量が増えて「所々わからない」まで下がりました。
自分で設計するとしたら相当見直さなければできそうにないと思える段階です。

Google I/O 2019 の Firestore に関するトークの動画

www.youtube.com

最初のシリーズと同じ方によるトークで、40 分間です。
ドキュメントを一週間前に読み終えて少し自信喪失していて、年明けに見ました。

飲食店情報のアプリを例にしていて、15 分頃までは既に見た動画とほとんど同じで見る意味がなかったかと思いましたが、その先は使う際の様々な制約ごとに対策を解説する構成になっていて見る価値がありました。

小難しいドキュメントや話が散らばっている動画シリーズと違い、40 分間にまとまっていて復習に最適ですし、再びわかった気になれます。
ただし全体をカバーしているわけではなくて設計面のみです。

特に参考になったのは、DB 構造の一つの方針として画面単位の Collection にすること(アプリによります)や、非正規化を理解しにくい RDB 寄りな人へのアドバイスでした。
前者は、画面単位と無関係だけれど一つの Collection にするもの(ユーザデータなど)もあって迷うこともありそうですが、大きく間違った設計にしないための指針にはなりそうだなと思いました。

この時点の理解度

「所々わからない」ままですが、少し不安が軽減されました。

初挑戦(リアルタイムチャットアプリ)

クリスマスの後くらいから Vue.js の集中学習に移っていて、大晦日まで取り組みました。
10個のアプリを作る動画で、その一つが Firebase Realtime Database を使ったチャットでした。
それを拡張しつつ Firestore に置き換えてみました。

頭で理解しても実践しなければ実用レベルになりませんし、やってみるほうが圧倒的に速く身につきますよね。

チャットアプリ画像

詳細は別記事にしました。

kabochapo.hateblo.jp

Cloud Functions を使った送信後の自動編集と、Firebase エミュレータの利用までやっておきました。

セキュリティルールの情報

セキュリティルールはちょっとしたミスでアプリが機能しなくなることがありました。
誤ったルールにしても機能はするままで無防備になってしまうこともあり得ます。😱

より良く知るための資料として、Firebase のブログの記事が非常に良かったです。

一つ目の「Tip #3」にある Authentication の custom claims は動画等に出てこなくて知りませんでした。
単に理解不足かもしれませんが、設定した role の設定・削除をコードで行う必要がありそうなのと、設定済みの role を一覧で確認する方法がなさそうなのが不便に思えました。
また、ID トークンのキャッシュのせいで role の変更が有効になるまで最長 1 時間かかるというのも困ることがありそうです。

この時点の理解度

作る間にドキュメントを見直したり Stack Overflow で情報を探したりしました(かなり)。
また、疑問点を曖昧なままにしておかないように自分で質問したりもしました。

そうしているうちに感覚がつかめてきた気がします。
もう少し大きめのアプリくらいなら設計できそうと思える段階です。

しかし最終形態の「チョットデキル」は遥か先です…。
それでも学習前と比較すると大きく進展しました。

他に学習に使ったもの

qiita.com

まとめ

動画 x 3(うち一つは二周)、ドキュメント x 1、実践 x 1(多くの検索等による調査を含む)。
一週間程度です。

私は集中力に難がありましたが、集中できる人はもっと短期間かもしれません。
また、RDB の経験がない人ならもっとすんなりと受け入れられる可能性もありますね。

これだけで概ね理解してちょっとしたアプリに使えるようになりました。
どこかの長期休暇の一つでもこれに充てるだけである程度実るわけです。
これからやってみようと思っている方は参考にしてみてください。

今後どの程度活用するか

NoSQL でやりにくいことや、できるけれど向かないことなどが少し見えました。
少し上に貼った Qiita の記事には

Cloud Firestoreだけでサービスを作ることは不可能ではない

でもしんどい。

と書かれていました。
また、下記 Q&A を見て RDS の良さを再確認しました。

jp.quora.com

作るものに適していて苦しいところがなければ Firestore を使い、そうでなければ RDB を使うと思います。
Firestore と RDB の併用も選択肢に含めておきます。
もし Amazon Aurora の機能性で Firestore 並みに安いものがあれば迷わず選ぶのですが…。

Firestore 以外の Firebase のサービスは、Authentication など自分で実装しないほうがいいものは積極的に活用していきます。