皆様あけましておめでとうございます、CTOの赤沼です。
昨年は多くの方に開発者ブログをご覧いただき、誠にありがとうございました。 今年もがんばって更新していきたいと思いますので、皆様引き続きよろしくお願いいたします。
さて、昨年最後の記事に引き続いてで何を書こうかと思ったのですが、総括的なことはすでに書いたので、今回は改めてユニファの主要な技術スタックを簡単にご紹介させていただこうと思います。 特に何か珍しいものがあるわけでもないのですが、保育をハックするためのICTサービスがどのような技術スタックで提供されているのかご興味お持ちいただけると幸いです。
サーバサイド・インフラ
Ruby / Ruby on Rails
サーバサイドの言語/フレームワークの大半は Ruby/Ruby on Rails で実装されています。Rubyしか使わないと決めているわけではないので、今後開発するプロダクトにより適していれば他の言語を使う可能性も十分にありますが、現在のメンバーのスキルセットも考慮すると当面は Ruby/Ruby on Rails での開発になるかと思います。バージョンについては最近開発している新規プロダクトについてはその時点での最新に近いものを使っていますが、昔開発されたプロダクトで現在は使用頻度が低いものなどは、ROIを考慮してあまり積極的にはバージョンアップの対応はしていません。
Vue.js / TypeScript
以前ルクミーフォトをリニューアルした際に導入し、それ以降フロントについては基本的には Vue.js を使うようになりました。エンジニア間での検討時に React とどちらにするか迷ったのですが、今後新メンバー加入時などに学習コストが低そうだった Vue.js を採択しました。TypeScript と組み合わせて使用しています。
Nginx / Passenger
Ruby on Rails アプリのWebサーバ、アプリケーションサーバは Nginx / Passenger を使用しています。前職でも Passenger, Unicorn, Puma をベンチマークして Passenger を選定していました。Webサーバは初期は Apache を使っていましたが、軽量でロギングなどの柔軟性もある Nginx に切り替えました。
Amazon Aurora / Amazon RDS
AWSへの移行前から Postgresql を使っており、RDS も Postgresql 互換のものがほとんどで、一部 MySQL のものもあります。最近新しく開発したプロダクトについては Aurora を使うようになっています。基本的には Master/Slave のマルチAZでのレプリケーションの構成を取っています。
Amazon DynamoDB
DBは基本的に Aurora/RDS を使用していますが、午睡チェックなどの一部ではアクセス特性やデータ特性などから DynamoDB を使用しています。
Amazon ElastiCache
永続化のためのDBとしては Aurora/RDS もしくは DynamoDB を使っていますが、キャッシュ用途等のためのKVSとして ElastiCache の Redis 版を使っています。
Amazon ECS on AWS Fargate
最近開発しているプロダクトではコンテナを活用しているので、 ECS on Fargate を使うのがデフォルトになっています。古いサービスで ECS on EC2 のものが一部あるのですが、リソースの効率的な活用という点では難があるので、やはり Fargate が良いですね。EKS の利用については今のところ未定です。
Terraform
IaC を推進しているので、最近開発しているプロダクトでは Terraform で全て管理しています。古いプロダクトも徐々に Terraform 管理に移行していっています。
サーバサイドのアーキテクチャについては以前のMeetupでも発表させていただいていまして、アーカイブもありますので、よろしかったらご覧ください。
iOSアプリ
Swift
iOSアプリは全て Swift で開発しています。過去に Objective-C で開発したものも Swift に移行済みです。バージョンは最新 -2 までのサポートを基本としています。
MVVM/RxSwift
アーキテクチャとしては MVVM で、RxSwift を使用して構成しています。将来的には SwiftUI + Combine への置き換えも検討予定です。
Realm
ローカルにデータを保存する場合にはローカルのDBとして Realm を使用しています。
Alamofire
ネットワーク通信用のライブラリとして Alamofire を使用しています。
Bitrise
CI/CDプラットフォームとしては Bitrise を使っています。以前は CircleCI を使っていたのですが、費用面の兼ね合いなどあり、 Android と一緒に Bitrise に切り替えました。
iOSアプリの技術スタックについては以前のMeetupでの私の発表の中でも触れていますので、ご興味ありましたらご参照ください。
Androidアプリ
Kotlin
Androidアプリは全て Kotlin で開発しています。過去に Java で開発されていたものも Kotlin に移行済みです。バージョンは iOS アプリと同様に、最新 -2 までのサポートを基本としています。
MVVM / Clean Architecture / Kotlin Coroutines / Kotlin Flow
アーキテクチャとしては MVVM/Clean Architecture で、 Kotlin Coroutines, Kotlin Flow など公式にならったスタックになっています。
Bitrise
CI/CDプラットフォームとしては iOS アプリと同様に Bitrise を使っています。こちらも以前は CircleCI でした。
Androidアプリの技術スタックについても以前のMeetupでメンバーからの発表の中でも触れていますので、こちらもご参照ください。
まとめ
ということで、細かいものまで上げ始めるとキリがないのですが、主な技術スタックを紹介させていただきました。 ユニファの最初のサービスが立ち上がってからだいぶ時間も経ってきていますので、上記のスタックに沿っていないものもあるにはあるのですが、裏側にある技術だけを変更しても事業的に直接のメリットがあるわけではないので、エンジニアリングとしての理想を目指すだけではなく、スタートアップが事業を展開していく上で今何を優先すべきかという視点で、敢えて古いまま残してあるものもあります。 一方で、AWS上でのサポート終了など、新しいアーキテクチャを追随しないことによるリスクもありますので、どこまで追随するかのバランスが重要だと思っています。
また、将来的に上記の技術スタックに固定しているわけではないので、今後より良い技術が出てくれば活用していきたいと思いますし、プロダクトの特性による向き不向きもありますので、エンジニアメンバーと相談しつつ、技術選択をしていければと思います。
今後の開発で技術選定に加わっていきたい、もしくは技術負債の返済に力を発揮していきたい、と思っている方はぜひ一度カジュアルにお話ししましょう。エンジニア絶賛大募集中です。