✈️

令和トラベルでの挑戦🔥バックエンドエンジニアが語る入社5ヶ月のリアル

2024/06/21に公開

はじめに

こんにちは、令和トラベルでバックエンドエンジニアをしている中野です!
社会人4年目で、2024年1月に令和トラベルに入社しました。

この記事では、中野が入社5ヶ月で経験したプロジェクトについて書いていこうと思います。
バックエンドエンジニアとして、令和トラベルに入社したらどんな開発をするのか、どんな経験が得られるのかといった観点の解像度が上がれば幸いです。

この5ヶ月でセールツアーを管理する機能、送迎やアクティビティを旅程表に自動で反映する機能、そしてNEWTの新規プロジェクト(こちら公開時点ではまだリリースされてないので秘密です🙏)における開発、といった3つの機能についてバックエンジニアとして取り組んできました。
次章からそれぞれのタスクについてどんな開発をしたのか書いていきたいと思います!

セールツアーを管理する機能

プロジェクト内容

令和トラベルには、海外ツアーを販売するアプリの『NEWT(ニュート)』とNEWTで販売しているツアーを管理する社内システムがあります。
このプロジェクトでは、セールツアーを運用上のリスクを抑え、効率よく作成するための管理機能を開発しました。

今までは、セールツアーを作成する作業は、ツアーを作成した後にそのツアーをセール用に手動で書き換えるといった作業をしていました。
ただ手動でやっているため、販売期間の設定ミスや全ツアー共通のセールの説明文の反映漏れ、クーポン利用の制御など、どうしても運用でヒューマンエラーが発生するリスクがありました。

この課題を解決するために、販売期間やセールの説明などの情報を共通データとして管理し、セール情報とツアーを組み合わせて、セールツアーを作成するといった機能を開発しました。

このタスクはOJTの一貫ということもあり、メンターの飯沼さんに開発フローについて丁寧に教わりながら進めていきました。
前職ではGoとNoSQLのCassandraといった技術スタックで、TypeScript、MySQLといった令和トラベルで扱う技術スタックと異なっていたので、これらの技術の習得に手こずりそうだなと思っていましたが、Typescriptでのお作法や令和トラベルで使用しているTypeORMの書き方を研修やレビューで丁寧に教えていただけたので、技術スタックの違いで苦労することなく開発することができました

難しかった点、学び

コードファーストのGraphQLのスキーマ生成

令和トラベルでは、GraphQLのスキーマ生成でコードファーストの手法をとっています。
コードファーストとは、最初にサーバー側で型定義の実装を行い、その後スキーマを生成する手法です。スキーマを生成してからサーバー側の実装をするスキーマファーストは経験がありましたが、コードファーストの経験はありませんでした。

恥ずかしながらコードベースのアプローチをその当時は知らなかったので、スキーマを書く前にコードを書いてから生成すると言われた時はとても混乱しました 笑

令和トラベルではコードファーストのスキーマ生成のためにTypeGraphQLを採用しています。TypeGraphQLは、クラスにデコレータをつける形で簡単にコードファーストのアプローチを実現できます。このタスクではTypeGraphQLの実装方法を学びながら、コードファーストのアプローチのスキーマ生成を経験できました!

中野がコードファーストで感じたメリットは、先にサーバー側で型定義を実装することで、具体的な実装の解像度を上げてスキーマを生成できる点です。

スキーマファーストの場合、スキーマの生成後にサーバー側の実装をはじめてから、修正に気づくというパターンがよくありました。

例えば、商品のレビューを返すQueryを実装する場合に、userIDでフィルタリングしたレビューを返す関数があることに実装段階で気づき、あとからInputにuserIDを追加するといったことがありました。

コードファーストにしてから、型定義を実装している段階でに気づけたりすることが多くなりました。また実際にレスポンスのイメージが欲しい場合は、モックを実装することで解像度を上げられるので、非常に良いと思っています。

送迎やアクティビティを旅程表に自動で反映する

プロジェクト内容

NEWTではフライトやホテルの手配が完了すると、画像のような旅程表がアプリで見れるようになります。この旅程表では、フライトの出発時間、ホテルのチェックイン時間など、旅行に必要な情報を確認できるとても便利な機能です!

この旅程表は、フライトやホテルの手配状況に応じて自動生成されるようになっています。例えば、フライトの出発時刻が変化した場合、その変化した状況に合わせて自動で旅程表が作り直されます。

しかしながら、飛行機からホテルまでの送迎や、ダイビングなどのアクティビティなどに対しては未対応となっており、社内のツアー手配のメンバーが、手動で作成していました。今回のタスクでは未対応だったこれらの送迎やアクティビティを旅程表に自動で反映する機能を開発しました!

難しかった点、学び

ドメイン知識の理解

実施するにあたって、まず改修前の旅程表がどのように作成されるか理解する
必要がありました。これがものすごく大変でした。。。

旅程表はカスタマーがツアーを予約した時点で作成されます。その後、ホテル、フライトが手配されるとその状況に応じて旅程表は変化します。そのため、ホテルやフライトの予約情報、手配状況はどのように管理されているかという点を理解しないと旅程表作成のロジックが全く理解できませんでした。

これまで経験してきた既存システムの改修では、改修箇所の周辺を理解すれば、大体実装できましたが、このように複数のドメインにまたがるような複雑な改修の場合は、改修箇所の周辺だけでは何も理解できませんでした。
そのため、横着せずそれぞれのドメインを整理して理解していくことにしました。
まずなぜ複雑だと思うのか考え、その結果主に2点にまとまりました。

  • ホテル、フライトそれぞれに関する情報が膨大であること
  • 旅程表が時間ごとに変化していくこと

この2点を克服できれば理解できそうだと思い以下のフローで理解していきました

  1. ホテルとフライトを大雑把に理解
    • 幸いにも社内にホテル、フライトについてまとめられた資料があるので、
      それを元にそれぞれのドメインの大枠を理解しました
  2. カスタマーがツアーを予約してから旅程表が発券されるまでにどのようなイベントがあるのかを時系列にまとめる
  3. まとめたイベント毎にホテル、フライトの予約データがどう変化するのかを書き出す
  4. 変化していく予約データが旅程表にどのような影響を与えるのかを調査
  5. ある程度解像度が高くなった状態で旅程表のコードを読む
    • 分からない箇所はドメインに詳しい同僚に質問
    • 実際に社内システムでデータを作成し検証

このように、このプロジェクトでは複雑なドメイン知識をどう整理すれば良いかを考える経験を積むことができました!

NEWTの新規プロジェクト

プロジェクト内容

リリース前なので、何を開発したのかは言えないです🙏
このプロジェクトからNEWTの新機能のバックエンド開発をしました。

今までは社内システムの開発だったので、社内の旅行を手配するメンバーが、運用上のリスクなく、効率的にツアーを造成/手配するためにはそうすれば良いか、といった視点で設計/開発ていましたが、このプロジェクトからNEWTのカスタマーがどうすれば「使いやすい」と思ってくれるかといった視点の変化がありました。

前職でも社内システムの開発、運用を行っていたので、このプロジェクトでは新しい開発経験を積めたのではないかと思っています。

難しかった点、学び

チーム内のコミュニケーション

今までは、PM、バックエンドエンジニアの3人でプロジェクトを進めていましたが、このタスクから、PM、デザイナー、クライアントサイド(iOS/Android/Web)のエンジニア、QAと進めて行くことになり、一気にプロジェクトで関わる人が増えました。

それぞれのポジションが異なり、どの粒度でコミュニケーションを取ればベストなのかをミーティングやSlackで考えながら話す必要がありました。幸いにも、自分以外のメンバーは、このようなチーム体制で開発する経験が豊富なメンバーだったので、まずはミーティングでメンバーの会話などからチーム内の共通言語をキャッチアップしていき、チーム全体、または異なるポジションのメンバーとどういった粒度で会話するかを学んでいきました。

このチーム体制で開発できたことで、バックエンドエンジニアとして、今までより広い視野で考えコミュニケーションをし、チーム全体でプロジェクトを進めていく経験をすることができました。

クライアントエンジニアの視点を考慮した設計

社内システムは、UIもバックエンドエンジニアが実装しています。
そのため、セールツアー、旅程表のプロジェクトでは社内システムにしか改修が入らなかったので、クライアント側に影響するスキーマ設計はありませんでした。

しかし、このプロジェクトはNEWTの新機能のため、クライアント側が使用するスキーマ設計をすることになりました。社内システムの場合は、バックエンドだけでスキーマ設計をすることができましたが、今回はクライアントサイドのエンジニアともコミュニケーションをとりながら設計しました。
クライアントサイドのエンジニアが表示する内容をどうやってわかりやすく返すかという視点がこのプロジェクトで経験できました。この視点に関しては、今回プロジェクトでサポートしてもらったロドさんの記事がとても参考になるので、読んでみてください!
https://zenn.dev/reiwatravel/articles/cf8e8f9fe8789a

おわりに

いかがだったでしょうか?
5ヶ月という短い期間ですが、色々な経験ができました。技術的な成長だけでなくチーム開発、
ドメイン知識の習得といった点でも、非常に良い経験が積めたのではないかと思います。

令和トラベルにはまだまだ解決したい課題や挑戦が山のようにあるので、この記事や他の令和トラベルの記事を読んで興味を持っていただけたら、ぜひカジュアル面談に申しこんでください!

令和トラベルでは、技術や組織に関する情報発信やイベントを定期的に開催しています!今月は、「NEWT Tech Talk vol.9 ~10Xを実現する令和トラベルのプロダクトマネジメント術~」というテーマでLT会を開催します。ご興味のある方は、ぜひご参加ください!
https://reiwatravel.connpass.com/event/319970/

令和トラベル Tech Blog

Discussion