トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」、モバイルオーダー「トレタO/X」などを運営するトレタの開発メンバーによるブログです。

2021 年の振り返りと今後の展望

初めに

こんにちは。トレタ CTO の鄧(でん)です。 今年も残り少なくなってきたので、少し早いかもしれませんがこの怒涛のような一年の振り返りをさせて頂ければと思います。

プロダクト

2021 年は主に 3 本の柱に絞って開発を進めております。

  • O/X(Order Experience、より良い顧客体験を実現するためのメニュー / POS システム)
  • B/X(Booking Experience、より良い顧客体験を実現するための予約管理システム)
  • CC(飲食店向けのコンタクトセンター)

それぞれ事業として違うフェーズになっていたり、技術的な制限が異なってたりするので事業を横断するときのコンテキストスイッチはそこそこ大変だったと記憶しております。

O/X

「2021 年は第二の創業期」という代表の思いと、「お客さまとお料理の幸せな出会いを最高に演出できるメニュー」というコンセプトを元に

  • 各法人、各ブランド毎にメニューの演出をフルカスタマイズする(SES)
  • 裏側のインフラ、サーバー、店舗スタッフが操作する管理画面などは共通のものを使うことによってコスト面とリリース速度のスケールメリットを得る(SaaS)

というぱっと見相反する要件を実現させるため、メニュー画面とバックエンドの仕組みを分離させたヘッドレス(headless)な構成として作っており、こちらは 2020 年の後半から案を練ってましたが、今年 2021 年の 2 月から開発が活発になって一足先に導入テストなども行い、7 月 26 日ようやく一般公開できるようになりました (1)。

技術的に工夫したところとしてはリリースのプロセスを高速化しつつ、高い信頼性を担保するために車輪を再発明せず、市販の SaaS をレゴブロックのように組み合わせて限られたスケジュールの中で高速に組み立てる手法を採用しており、おかげさまで 12 月 1 日現在、システムに登録されている店舗は 90 を超えており、利用している法人は 4 法人となっており、我々は開発手法とツールを工夫することによって小規模な開発組織を維持しながらこの一年でフロントエンドを 6 案件(各ブランドの UI x 4 + 管理コンソール x 2)、且つサーバーサイド多数 (2) をリリースしたことになります。

ただ、タイトなスケジュールがあるとはいえ、品質やパフォーマンスを妥協することは考えてなく、テストの書きやすさを前提に設計を進める、早めにデザインと API 仕様を擦り合わせる、早めに DB 構造と分析要件を擦り合わせる、全般的に QA が情報や流れをキャッチできるようにするなど、開発手法を工夫してチームとしてのアウトプットを底上げするのを狙っております。

参考資料

  1. 弊社代表中村のブログ
  2. O/X を総括しているエンジニアの北川さんの紹介記事
B/X

今までトレタの主力商品であった予約台帳ですが、コロナの影響もあり、正直ここ一年伸び悩んでおりました。その中で SRE やサーバーサイドエンジニアの努力もあり、直近一年間のダウンタイムは合計 9 分間、稼働率に換算すると軽く 99.99% を超えております。

もし 2021 年を守りの一年と例えると、来年に関しては一部コロナオミクロン株の懸念もあるものの、攻めに転じる一年だと考えており、飲食業界が回復した際にちゃんとその成長を支えられるように、API 周りの改修、特にメディア連携と店舗を横断した在庫検索を強化しようと考えておりゆくゆくは O/X のようにカスタマイズしやすい予約システムを目指しております。

技術的にはデータ連携のためのストリーム処理や検索エンジンを中心に開発を進めておりますので、もしご興味がありましたらぜひご連絡ください。

ストリーム処理

検索エンジン

CC

飲食店には電話でのやり取りがまだ多く残っておりますが、その負担を少しでも軽減できるようにトレタでは別途 Amazon Connect を通して、音声認識をベースとしたコールセンターサービスを展開しております。

まだ発展途中の分野で、障害や誤認識がまだ多少残ってはいるものの、飲食店のサーポートツールとしては十分利用可能だと考えており、来年以降はより自然なやり取りとより高度なシナリオを実装することによって、より多くのタスクをこなせるように目指しております。

組織と開発手法

トレタでは限られた時間内で手戻りや良くない意味でのサプライズを減らすためにユースケース整理、DB 設計、API 設計、UI 設計、QA などを実装する前にすり合わせております。一部のシステムにおいては実装する前に先に API 仕様をリリースしたり、あるいはテスト仕様を先に書くような開発手法を採用しております。

また、サービスの設計思想として、ただアプリケーションが正常に実行しているだけではなく、行動履歴や購買履歴など、データが正しく蓄積され、それを集計・分析した上で飲食店のオペレーションにフィードバックするところまでが商品価値であり、それを実現するためには早い DB 設計の段階で分析メンバーにもレビューが入るようにしており、コアなデータベースに関しては初期リリースから分析基盤や BI ツールが全て繋がった状態でリリースされておりますので、ある意味分析を前提としてシステム設計をしていると言っても過言ではないと考えております。

B/X の紹介でも少し触れたように、トレタではリリースのプロセスを高速化しつつ、高い信頼性を担保するために車輪を再発明せず SaaS をレゴブロックのように組み合わせて限られたスケジュールの中で高速に組み立てる手法を採用しております。こちらに社内で使っている技術を幾つかリストアップしておりますので、もしご興味ありましたらぜひご感想、ご指摘などお聞かせいただければと思います。

ご連絡お待ちしております。チームの仲間を募集しています!

フロントエンド

  • Contentful - CMS
  • Firebase - データベース
  • Vercel - CI/CD・CDN・Serverless インフラ
  • Angular / Next.js / TypeScript

サーバーサイド

SRE

データ分析

トレタO/Xの開発の裏側

はじめに

こんにちは、Half-Vaccinatedなフロントエンドエンジニアのkitagawaです。接種2回目にビビりながら今から備えています。

この度トレタの新しいサービスとして、トレタO/X(トレタオーエックス)が正式リリースされました。O/Xは「Order Experience(注文体験)」の略で、飲食店に来店したお客様がご自身のスマートフォンで注文から決済までを行えるモバイルオーダーアプリです。

f:id:mkitagawa-312:20210803101040p:plain

サービスの本格立ち上げから今回のリリースまで、約1年ほど主にバックエンドのマネジメントに携わってきたので、その振り返りとして開発内で行った数々の挑戦について、この記事では紹介しようと思います。

サービスの詳細や背景については代表のひとしさんのブログをぜひご一読ください。

トレタO/Xの特徴

タブレット据置機でのオーダーや、テイクアウトのモバイルオーダーなど、オーダーアプリを目にする機会は近年急激に増えてきました。

そんなレッドオーシャンの中でトレタO/Xの最大の特徴は、導入する各飲食法人ごとにUIを完全カスタマイズした専用アプリを開発している点です。これはSaaSとして提供してきたトレタの予約台帳とは全く逆のアプローチで、予約台帳では個社ごとのカスタマイズは行わないポリシーで行っていましたが、今回は逆に完全に個社向けに作り込むアプローチをとっています。

事例に沿ってご紹介していきます。

最初に導入したのはワンダーテーブルさまのよなよなビアワークスで、クラフトビールのよなよなエール公式のビアレストランです。そのためアプリでは、画面のレイアウト、フォント、カラー、注文後のアクションなど、細部までよなよなビアワークスの世界観を表現するために作りこんでいます。

f:id:mkitagawa-312:20210803101055p:plain

ダイヤモンドダイニングさまの焼鳥IPPON向けアプリでは、好きな焼き鳥の組み合わせや味付けを串一本ずつ自由にカスタマイズして注文する仕組みや、各々が注文した分を会計できる個別決済など、店舗開発の時点から携わらせていただき新しい注文方式をアプリへと落とし込んでいきました。

f:id:mkitagawa-312:20210803101115p:plain

これらを実現するため、開発の構成としてはフロントエンドとバックエンドの明確な分離を行いました。Shopifyなどのヘッドレスコマースを参考にし、バックエンドは注文と決済をコアにしたAPIを提供するSaaSの構成となっています。

フロントエンドは各社ごとに個別に開発し、メニューなどのマスターデータはCMSなどを利用して各アプリごとに持たせています。導入する店舗は居酒屋やカフェ、ファミリーレストラン、ファストフードなど、業態や店舗形態に応じて様々なメニューの構造や注文フローを想定した結果、画一的なデータ構造ではそれらに対応できないと考え、マスターデータを共通バックエンドでは扱わずに各社ごとに最適なデータ構造のマスターを持つことで、柔軟なUI表現を可能にしています。 f:id:mkitagawa-312:20210803101145p:plain

トレタO/Xの技術スタック

トレタO/Xの技術スタックは、プロトタイピングを隔てて、製品版向けに一度リプレイスを行っています。

PoC期間のプロトタイプでは開発スピードが求められるため、フロントエンドにFlutter、バックエンドにFirebaseを採用しました。フロントは主に来店したお客様が利用するユーザー向けアプリと、店内のホールスタッフが利用するスタッフ向けアプリの2種類があります。両方ともFlutterで作っていますが、Flutter Webを使用しています。

ユーザー向けアプリは来店時にお客様自身のスマホでQRコードを読み込んで開始してもらう流れとしているため、アプリインストールの強制は避けるためにWebアプリとしています。

スタッフ向けアプリに関してはそういった制約はないのですが、ネイティブアプリだとアップデートごとにiOSやAndroidのマーケットへの審査が必要となってしまうため、開発スピードを優先してこちらもWebアプリとしました。ネイティブの機能が必要になったときにiOS/Androidアプリへ切り替えられるようにFlutterを採用しています。

f:id:mkitagawa-312:20210803101200p:plain

プロトタイプ後の製品版では、プロトタイピングで検証したデータ構造やドメイン境界を基に、バックエンドは各種ドメインに分割したマイクロサービスにしています。トレタでは長らくRuby on Railsを使用したモノリシックなシステム構成が主だったので、トレタとしては今回初めてのマイクロサービスを採用となりました。

マイクロサービスは銀の弾丸ではないことは肝に命じた上で、マイクロサービスを選んだ経緯についてご紹介します。

メンバーの技術スタックに合わせた並行開発

限られた開発リソースの中でいかに早く開発できるかという点で、各自が独立して開発を進められるように、マイクロサービス単位でチームの分割を行いました。(弊害として、システム間の結合時にはコミュニケーション不足による問題も多く発生しました...)

プログラミング言語や各技術要素の選定には、それらの特性を踏まえつつ、挙がった候補の中から何を使うかはメンバーの技術領域に合わせて選んでいます。

例えば、Node.jsはフロントエンドのメンバーでも扱いやすいため、フロントとバックを兼任する場面で選択しています。Goについては、Rubyと違い型付きという利点があるため、社内では最近RubyからGoを選択する場面が増えています。またデータベースには、強いACID特性を持つDatomicを使うために社内ではあまり使われないClojureも使用しています。

f:id:mkitagawa-312:20210804123139p:plain

サービスの再利用

トレタO/Xの開発を開始をする時点で、コロナによる飲食業界の急激な状況変化に対応すべく、トレタでは多くの新規プロダクトの開発を行い、クローズを行いました。トレタは飲食業界のVertical SaaSを目指すため、各プロジェクトで似たような機能が車輪の再発明されていた状況がありました。そこから、今後別プロジェクトでも再利用が行えるようにトレタO/Xに捉われない形で個々サービスの設計を行っています。

モノリシックからの脱却

やはりモノリシックな予約台帳での教訓としての一面があります。

エンハンスを長く続けていくと、どうしても当初の設計とは外れた機能追加が行われてしまうものです。都度うまく負債を返却できるとよいのですが、歪みが積み重なるとがんじがらめになり、追加開発が日に日に難しくなります。

マイクロサービスで綺麗に解決するわけではないですが、開発初期から疎結合を前提にドメイン境界を意識した設計を行っておくで、この後のエンハンスのしやすさは大きく変わってくると感じています。

さいごに

トレタO/Xはまだリリースされたばかりのプロダクトです。導入店舗数を増やしつつ、各店舗が表現したいメニューブックを実現するために、より深く入り込み洗練されたUIへの磨き込みを行っていきます。 また、トレタO/Xとトレタの予約台帳や他のサービスとも連携し、お客様が店探しをする段階から来店して退店した後までの一環のライフサイクルをトレタが提供する未来も描いています。

そんな開発に参画してくれる開発メンバーを募集しています。各ポジションがオープンになっていますので、興味をお持ちになったらまずは気軽に話を聞きにきてください。

株式会社トレタの採用/求人一覧 - Wantedly

トレタでエンジニアがワイワイやっている取り組みの紹介

はじめに

本記事はトレタ Advent Calendar 2020の 24 日目の記事です。

こんにちは、パパ iOS エンジニアのkentaroです。最近 Flutter やりはじめました。
(ちなみに2019 年2018 年も 12/24 に記事を書いていました。 )

トレタではテックトーク(LT 会)や勉強会等が行われています。
今回はそのようなエンジニアがワイワイやっている取り組みについての紹介です。

テックトーク(LT 会)

1 時間の枠で2〜3 人が自由に LT をする会で、週 1 回くらいのペースで実施されています。
社内でハードルが低いので、LT の練習の場としても役に立っていると思っています。

特にエンジニアに限定しているわけではなく、PM からプロジェクトマネジメントの話が聞けたりもして面白いです。

詳細はこちらの記事にまとまっています。 note.com

自分は Swift について話したりしました。
qiita.com

Go 勉強会

@tenntennさんが講師をしてくださっている、Go を基礎から体系的に学ぶことができる勉強会です。
隔週くらいのペースで実施されています。

Playground等を利用して実際のコードを交えて説明いただけるので勉強になります。
たまにクイズが出ますが、大体サーバーサイド石谷くんが指名されます。

RDB 勉強会

@lagenorhynqueさんが講師をしてくださっている、11 月からはじまった新しい勉強会です。
リレーショナルなデータの設計や各 DB 構造に落とす場合のコツとかを共有する場となっています。
こちらも大体隔週ペースでの実施です。

輪読会

読みたい本があるときに、週 1 くらいのペースで開催されています。
直近は『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』でした。
www.shoeisha.co.jp

正に DDD 入門にふさわしい良書だったのでオススメです。

次回は『Clean Architecture  達人に学ぶソフトウェアの構造と設計』を読もうかという話になっています。

輪読会についてはこちらの記事に詳しく書かれています。
tech.toreta.in

アドベントカレンダー

12 月は大体アドベントカレンダーやってます。

おわりに

得意な技術や担当するプロダクトの枠を超えて共に学べるのはとてもいいですね。
今回挙げたような取り組みが技術力向上にプラスになるのはもちろん、普段の仕事であまり接点がない人とも関わる機会にもなっていると思います。

トレタが気になる方は…

ぜひ遊びにきてください!
仲間も絶賛募集中です。
corp.toreta.in

HR 部門が note で発信していますので、そちらもぜひ御覧ください!
note.com

© Toreta, Inc.

Powered by Hatena Blog