Rettyのインターンでマイクロサービスを開発した話

この記事について

Rettyの2022サマーインターンのチームで書いた参加記になります。

自己紹介

私たち酸辣湯麺チームのメンバーを紹介します。

今回のインターンで作成したもの

Rettyで実際に提供されているオリジナルリストのシェア機能を作成しました。

背景

Rettyにはオリジナルリストという「ユーザーさんがお気に入りのお店をリストとして保存できる」機能が存在しています。

オリジナルリスト一覧(左)とオリジナルリスト詳細(右)

インターン参加時点ではオリジナルリストのシェア機能が存在しませんでした。シェア機能を実装することで、ユーザーさん同士でお気に入りのお店を共有し合うことができるようになります。今回はそのサーバーサイドの実装を行いました。

今までオリジナルリストに関する機能はモノリシックなAPIサーバで実装されていたのですが、Rettyのバックエンド全体をマイクロサービス化することを目指していることから、まずはシェア機能に関する要件を新規に作成し、最終的にオリジナルリストの機能を1つのマイクロサービスに集約させることを目標に設計を行いました。
このインターンではシェア機能を実装するところまで達成できました。

選定技術・開発形式

主な技術スタックは以下のとおりです。

また今回の開発は、以下の形式に則って行いました。

  • モブプログラミング・ペアプログラミング
    • 一人ドライバーが選出され、他の人達はそのドライバーに指示を出します
    • ドライバーは指示を出されたとおりにコードを組んでいきます
  • クリーンアーキテクチャ
    • 通信に関わる部分やビジネスロジックに関わる部分など、関心によって実装を分離してそれぞれの依存性を一方通行にします
  • TDD(テスト駆動開発)
    • まず実装に期待するふるまいをテストで定め、後から実装をする方式です
    • モックを使うことでレイヤーごとのテストを書けるように工夫しました
    • テストと実装は反復的に行いリファクタリングを行いました

全体方針

まずは必要なユースケースの洗い出しを行いました。

ユースケースの図

その上で、今回私たちは以下の機能をマイクロサービスで実現しました。

  • オリジナルリストの公開/非公開を切り替える機能
    • 公開するときにUUIDを生成するようにしました
      • UUIDが変更されるのを防ぐため、既に生成されている場合は生成しない方針を取りました
    • 非公開のときは公開状態のみ変更し、生成されているUUIDはそのままにしました
  • 共有されたURLに含まれたUUIDからオリジナルリストを取得する機能
  • オリジナルリストの内容を取得する機能
    • 公開時のみUUIDを元にシェアURLを発行し、レスポンスする形にしました
  • あるユーザーのオリジナルリストの一覧を取得する機能
    • Googleの推奨する設計を参考にページネーションを実装しました
      • 次のページのリクエストに必要な情報を暗号化したトークンとして発行し、セキュアなページネーションを実現しました
    • 1オリジナルリストに対してn個のレストラン情報を取得する必要があり、N+1問題が起こりやすい部分を工夫して1クエリで実現することができました

各メンバーの学び

今回のインターンで学んだことを参加者毎にまとめてみました。

アーキテクチャについて理解を深めることができた(もぎ)

今までアーキテクチャをすごく意識して実装することはあまりなかった中で、クリーンアーキテクチャの意義の理解から実装まで一通り行うことができたのはとてもいい経験になりました。依存性の逆転を意識することでテストも書きやすくなり、よりTDDを意識した実装ができたのも学びになりました。

またGoでの実務経験がなかった状態でもGoについて知見を深め、言語ごとの特性や適切なアーキテクチャを理解することができ、とても学びの多いインターン期間になりました。

個人開発ではできない経験ができた(松田)

個人でgRPCやマイクロサービスを採用する必要があるような大規模なプロダクトを開発する機会はほとんどないと思います。その中でgRPCを用いたマイクロサービスの開発を学生という立場でさせていただけたことは、非常に貴重な経験となりました。 また、Googleの設計ガイドを参考にしたnext_page_tokenを使用したページネーションの実装は難易度も高く、技術的な成長につながったと実感しています。 そして自分達が作ったPull Requestに対してたくさんの方にコードレビューしていただき、自分だけでは気づけなかった視点に気づくことができました。

複数人でプログラミングをしていく上で、重要なこと (山倉)

このインターンで複数人でプログラミングしていく上で気をつけなければいけないことがたくさんあることに気が付きました。 いままで一人でプログラミングをすることが多かったのですが、複数人で同時にする時に下記のような難しさがあることに気づきました。

  • 実装のスピード感が人それぞれではじめは足並みが揃わない
  • 議論がとっちらかってしまう
  • どこまで拡張性や可読性を追い求めるべきなのか人によってまちまち

時間が経つにつれて次第にメンバー同士の共通認識がとれてスムーズに実装が進むようになり、特に僕は一つのところにこだわりすぎてしまいがちだったんだなあという発見がありました。 また、このようなモブプロをする機会があれば初めから上に挙げたような点に関してみんなの共通認識はどうなっているのかな?ということまで想像を及ばせたいな、と思っています。

Rettyのインターンに参加して分かったRetty社の特徴(田中)

私はインターンに参加した一つの目的として「社風を知る」ということを目標に掲げていました。週に一度の人事の方やメンターさんとの1on1であったり社員さんとのランチ会など、会社の方と交流させていただく機会が多く設けられていたため、目標は概ね達成出来ました。

その上で私が感じたRettyの一番の特徴として、ランチ会等で私目線で誰が上司で誰が部下などが分からなかったり、社員さん同士で仲がすごく良かったり、私が人事の方との1on1で意見した事が即日反映されたりと、社員さん全員がかなりフラットであると感じました。そのため「新卒だから」とか「部長だから」とかで意見の通りやすさや、評価等が変わらないという特徴がありそうだなと考えてます。 ベンチャーとしての利点でもあると思いますが、そのような社風が好きな方には是非Rettyをお勧めしたいです。

総括

今回Rettyのサマーインターンに参加してみて、各個人が様々な学びを得られる機会になりました。
昨年のサマーインターン技術力向上ランキング1位を肌で感じることができてよかったです!
さらに技術的なことだけではなく、チーム開発を通してRettyの雰囲気を知ることができて選考を考える上での参考になりました。