はじめに
僕らはONEとZero、dim.の3つのプロダクトを作っています。2018年に1人目のエンジニアとして入社してから、これまでどういった技術を使って、どういった技術的意思決定をしてきたかについて紹介していきます。前提として、エンジニア数人のスタートアップなので、コスパが良い選択をすることを心がけてきました。
このタイムラインは主にONEのお話になります。
2018年
まずはONEリリース時(6/12)の技術スタックです。
Server: Ruby on Rails
Infra: Heroku
その他: Google VIsion API, Firebase
当時は同じデザインコンセプトで、いろいろなサービスをリリースしていく構想があったため、iOSのUIコンポーネントをまとめたFrameworkを作って、別リポジトリで管理していました。幸いなことにONEが大きく伸びたので、ONEに注力することになり、この構想はなくなりました。
サーバーサイドに関しては、CEOがRubyで書いてくれていて、API仕様書もカッチリしたものはなく、Postmanで叩いて確認するくらいでした。僕がサーバーサイドの開発も巻き取ってから最初にやったことはRSpecでテストを書いていくことでした。リリース時には書いていなかったテストですが、2021年9月時点でカバレッジは87%で、ある程度は安心してリリースを行える環境になっています。手でテストをするのではなく、テストコードにテストをさせる開発をしていたので、その後のリリースのスピード向上に繋がっています。
実はリリース日にはOCRは全くしておらず、全ての画像を例えそれが人の顔でも10円で買取していました。OCR自体はGoogleのVision APIである程度は読み取れることがわかっており、Vision APIを利用しながら、購買日時やお店の電話番号などを返すAPIを想定したマイクロサービスを開発していきました。最初は単純にOCRした生のテキストを返すことに留めて、徐々に機能を追加していきました。
metabaseでダッシュボードを作り、各々がSQLを書いて数字を見る文化がONEのリリース当初からありました。この文化は今も続いており、簡単なクエリなら自分で書ける人の方が多い組織になっています。
2019年
前半
OCRのマイクロサービスが強化されていった時期です。購買日時やお店の電話番号をレスポンスとして返し、Google Map APIと組み合わせることで店舗の特定ができるようになりました。
そして、ONEの管理画面を作るプロジェクトが走り出しました。ONEの運用自体はPostmanでAPIを叩くことで行っていましたが、これからメンバーが増えていくことを考えて作ることに決めました。将来的には、別プロダクトの管理画面も担うことや、Railsに依存しない形で作るために、Reactで作る意思決定をしました。しかし、リソース不足や経験不足もあり、結果的にはリリースもできず、途中で打ち切りになっています。
後半
2人目のフルタイムのエンジニアが入社したのが夏ごろです。入社直後からONEのAndroidアプリを開発していきました。API仕様書もなく、Kotlinのコードレビューもせず、とにかく泥臭くアプリを触っては細かいところを修正することを繰り返しました。レイアウトのズレはもちろん、アニメーションのdurationも細かく議論しながら、調整を続けました。
このタイミングで、OCRでの購買データの抽出に関して重要なロジックを開発していきます。購買した商品の抽出です。現時点でも改善点はたくさんあるのですが、このときにレシート内の文字と位置情報まで考慮したロジックを作っていたことが、次のプロダクトのZeroでも生きています。細かい話は別の記事に任せようと思います。
さらに、インフラをHerokuからGCPへ完全にリプレースするプロジェクトを始めました。意思決定の理由はこれらです。
- 今後のプロダクトの成長に合わせてインフラを柔軟に構成できるようにしておきたい
- 会社のアカウントはGoogleでSSOするようになっており、権限をGoogleアカウントだけで管理したい
- FirebaseやVision APIなどGoogleのサービスをすでに利用しており、1つに集約したい
SREの業務委託メンバーに構築してもらいました。Terraformやk8sのコマンドや運用方法などはドキュメント化して、社内のメンバーでも触れるようにして、日々運用していきました。
また、この頃から新しいAPIを作ることがあり、Ruby以外の言語で開発をしていこうという話になりました。最初に候補に挙がったのがGoだったのですが、次に流行りそうな言語ということでRustも検討しました。公式ドキュメントを読んで、いくつかWebのフレームワークなども探して、最終的にGoになりました。Rustは言語としては素晴らしいのですが、学習コストが掛かるのと、そこまで利用例がなかったため、Goにしました。
この時点での技術スタック
2020年
続きはこちらです。