トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」など、飲食業界のVertical SaaS企業です。

トレタ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

6年目エンジニアが1年間アウトプット駆動開発をしたら"圧倒的成長"した件について

本記事はトレタアドベントカレンダーの23日目の記事です。

始めに

皆さま、こんにちは!
念願のスプラトゥーンのサーモンランカンストを達成したハイカラスクエアのタコガール兼佐久間まゆちゃん・北条加蓮ちゃんのプロデューサーの@hiroki_tanakaです。
本記事では私が今年1年間実践してきたアウトプット駆動開発に関して振り返ります。
丁度1年前の自分がこんな記事を書いていたので、アンサーソング的な意味合いも込めて笑
tech.toreta.in

アウトプット駆動開発とは

私は2020年の目標に「インプットとアウトプットのスループットを良くする」を設定しました。
この目標を立てた理由はここ1~2年程全く外部へのアウトプットを怠っていた結果、エンジニアとしての成長曲線が止まってしまった感覚があり、その成長曲線を再度動かしたかったためです。
そこでアウトプットを自発的に増やすためにアウトプット駆動開発を導入してみました。
アウトプット駆動開発を一言で言うと、アウトプットする前提でインプットするというマインドセットです。

一般的なメリットとして、以下のようなことが挙げられます。

  • アウトプットを意識することで、注意深くインプットするようになり体系的な理解に繋がる。
  • アウトプットに対するフィードバックやコメントをもらうことで、より深く学ぶ事ができる。
  • 数年後の自分が簡単に振り返ることができる。

そのため、私は具体的には業務・業務外問わず学んだことはすぐに何らかの形でアウトプットして発信していくこととしました。
アウトプットの形は様々でトレタテックブログQiitaでの技術記事投稿から、社内勉強会での発表・社外勉強会のGotanda.rbでの発表という社内外での発表もありました。
他にもトリッキーなものだと読んだ本の書評をAmazonレビューを書いたり、資格取得をしたり、社外の友人と技術書典に合同誌を出品したりしました。

ただ、私はSNSを殆どやっていないのでそこからの発信は全くしていなかったです。
そのため、アウトプットの拡散力という意味では正直イマイチでしたが、バズることや有名になることが目的ではないのでそこはあまり気になりませんでした。
(今思い返すとSNSを効率的に活用した方がよりフィードバックは得られたかもです。)

実践したこと

そんな今年一年のアウトプット駆動開発の成果ですが、下記の通りです。

  • トレタテックブログの記事投稿:4記事
  • Qiitaの記事投稿:8記事
  • Amazonへの書評レビュー:9レビュー
  • 技術書典への出品:1冊
  • 社内勉強会での発表:5回
  • 社外勉強会での発表:3回
  • 資格取得:1資格

改めて数字として数えてみると「よくやったなぁ…」というのが率直な感想です笑

これらのアウトプットは勿論、どこかの月にまとめて行ったという訳ではなく、1年間を通じて満遍なく行ってきました。
強いてあげれば、上半期はQiita・トレタテックブログ・Amazonへの書評レビューといった記事投稿がメインでしたが、下半期は社外勉強会での発表がメインでした。
おそらく、これは最初は記事投稿といったある種、一方通行なアウトプットで満足していたのですが、 徐々にアウトプットした際に見てくださった方からのフィードバックというインタラクティブなコミュニケーションが恋しくなったためです。

発表に関してはネタがなくてもまず「発表します」と手を挙げることを常に意識していました。
挙手してからネタを考える方式だったので、発表1~2週間前は毎回「ネタどうしよう…」と悩んでいました。
今振り返るとこの挙手してからネタ考えるというのは、アウトプット駆動開発に非常にマッチしていました。

実践して感じたこと

1. 学んだ技術の深い理解

記事や発表共に何かしらのネタが見つかると色々試行錯誤しながら、記事や資料を作っていきます。
外部へのアウトプットを意識すると「外部に発信するのだから、下手なこと言えない…」という気持ちにもなり、丁寧に調べるようになりました。
そうすると自然と今まで自分が知らなかったことや曖昧なままの何となくの理解だった部分もしっかり理解出来るようになりました。

例えば、私は下記の発表をするまでRailsの権限管理に関して断片的な知識しかなかったのですが、まとめていく中で体系だった知識が身につきました。

また、よく言われることですが、勉強会は発表者が一番勉強になるということを身に沁みて実感しました。
下手でも聞く側にいるよりも発信する側にいる方が断然良いです。

2. わかりやすく説明できる力の向上

記事でも発表でも自分の学んだこと・経験したことを読み手や聞き手にわかりやすく伝わるように論理立ててまとめる必要があります。
勿論、普段の業務の中でも例えば、Pull Requestの概要や仕様のまとめドキュメントなどわかりやすく伝えるといったことを心がけることはありますが、
あくまでも社内の人は前提や背景を知った上で読み取ってくれる部分も正直、小さくはないです。

しかし、外部の人は前提や背景を一切知りません。
その人たちにわかりやすく伝わるように私は以下のことに気をつけました。

  • 「自分が知ってるのだから、相手は絶対知っている。」という思い込みを捨てる。
  • 言葉だけで説明せずに、サンプルコードを適度に使用する。
  • 記事で伝えたいことや発表で話したいことを最初に書くようにする。また、伝えたいことも最大3つまでに絞る。

このような工夫を行った下記の発表は「わかりやすかった」というフィードバックを頂けて、かなり嬉しかったです!

3. 高いモチベーションの維持

1人で粛々と勉強していてもモチベーションを維持するのはとても難しいです。
(勉強の最大の敵はモチベーションの維持だと思っています。)

しかし、外部にアウトプットすると記事の場合はLGTMやスターが・発表の場合は聴衆からのフィードバックが貰えるようになります。
これがモチベーション維持に役立ち、「自分の記事が誰かの役に立っているんだ!」や「発表後に活発な議論が起こったということは皆気になってたんだ!」と感じることが出来、かなり励みになりました!

また、アウトプットすると自分の理解が深まると同時に、自分の知らなかったことも見えてくるので次はこういうことを勉強しよう・やってみようと思い、それがまたモチベーションUPに一役買いました。

まとめと今後

総括するとアウトプット駆動開発を通じて、成長速度は2段階くらいギアが上がったように感じたので、やってみて本当に良かったです! そのため、来年もアウトプット駆動開発は続けていきます!

今年は上期は記事投稿中心・下期は発表中心のアウトプット媒体のバランスが悪かったので、来年は記事投稿と発表をバランス良く両立させていきたいです。
そして、外部での発表は社外勉強会だけではなくより大きなカンファレンスなどでも登壇したいです。
勿論、勉強会での発表も続けていきたいです!

また、自分が発表するだけでなく、他のエンジニアが発表出来る場も提供出来るようになりたいです!
(このアドベントカレンダーもその1つです!)

終わりに

正直に言うとアウトプット駆動開発はやっぱり、かなりしんどくて「休日なんだから、ダラダラしたい…」といった誘惑や「こんな記事書いても誰も見てくれないでしょ…」といったネガティブ感情に囚われたことは数え切れません。
ただ、業務と同じで発表(・ものによっては記事投稿も)は発表日という明確な締切があり、かなり強制力が働くのでかえって良かったのかなと思います。
おかげで継続する事ができ、1年間のアウトプット駆動開発を通じて圧倒的成長することが出来たと胸を張って言えます!
これからもこの2つの言葉を胸に来年も邁進していきます。

インプットは必要、でも差別化要因にならない。
しかし、アウトプットすることで差別化になる。
~@yukihiro_matz~


自分と同じくらいの能力がある人間はいくらでもいる。
学び続ける姿勢を止めればかつての恐竜と同じ末路をたどることになる。
~『プログラマが知るべき97のこと』~

プログラマが知るべき97のこと

プログラマが知るべき97のこと

  • 発売日: 2010/12/18
  • メディア: 単行本(ソフトカバー)

終わりの終わりに

トレタに少しでも興味を持っていただいた方がいれば、ぜひ遊びに来てくださいヾ(o・ω・)ノ
仲間も募集しています!

© Toreta, Inc.

Powered by Hatena Blog