皆さん、抽象化好きですよね。抽象化するのはとても難しいけどめちゃちゃ大事ですしコミュニケーション能力にもかかわるところです。でも具体ももってないのに抽象すると"ITコンサル風"になるので気を付けなければいけないです。
会社でTwelve-Factor Appの勉強会(なのか?)を行った。このサイトを見てただの抽象的な概念の読み合わせがあり、WebアプリやSaasはこう作りべきと抽象的に書かれているものを淡々と読んでいくが、確かに大事なことが書かれてるんだけどただ読み流しなだけでみんな本当に理解してるのか?と感じたので、一瞬で理解できるよう一言でまとめて概念を理解してスッキリしようと思います。
あと、2012年に提唱されて少し古いので、すでにクラウドを扱う上での考慮を加えたBeyond the Twelve-Factor App(2016年)があるので長いしわかりずらいので一言にする。間違い指摘は歓迎します。
1. One codebase, one application
1つのプロジェクトに1つのリポジトリにしようね。
2. API first
APIのコアな設計を固めてから開発しようね。
3. Dependency management
依存ライブラリは管理しようね
4. Design, build, release, and run
設計、開発、運用、手順をはっきりさせようね
5. Configuration, credentials, and code
設定/環境情報はコードには書かないでね
6. Logs
ログはちゃんと取るようにしようね
7. Disposability
サクッと起動、サクッと停止できるようにしてね
8. Backing services
外部サービス特にDBとかバックサービスは簡単に切り替えられるようにしようね
9. Environment Parity
どの環境でも同じように動くようにしようね
10. Administrative Processes
管理タスクはラクにできるようにしようね。管理画面作るといいよ
11. Port Binding
アプリはポート単位に分けると毎回サーバー構築しなくて済むから効率いいよ
12. Stateless Processes
情報はバックサービスで保持しとけ、ステートレスにしとけばリソース追加と削除が簡単になるからいいよ13につながるよ
13. Concurrency
12にすることで水平にリソース拡張できるから複数の同時並行でインスタンスを起動させるとかで役立つよ
14. Telemetry
パフォーマンスとかどのリソースが使われてるとかちゃんと見れるようにしようね
15. Authentication and Authorization
どこの誰が入っていいかちゃんと決めとこうね。
感想
言うまでもない当たり前なこともあるけど確かにそうだけど要件によってはそうじゃないこともある。例えばOne codebase, one applicationはこれに限ったことじゃないし、モノレポで管理する方が嬉しい場合もある。あくまで基本的な考え方の材料として、じゃあ私のPJはそれが最適か?と項目別に照合する材料にすればいいなと思いました。