自己紹介
この度Retty2022サマーインターンに参加しました、(男前)マンチカンチームです。メンバーはそれぞれ、
- 筑波大学の表 (@yj7tj)
- 明治大学の石田尾 (@backtestl)
- 京都大学大学院の平野 (@hiran_ery)
です。
サマーでRettyを選んだ理由
Rettyのサマーインターンを選んだ理由としてチームの3人で共通していたのは、今回のインターンで取り扱う技術に興味があった点です。後にも書きますが、今回のサマーインターンでは「Go / gRPC / CleanArchitecture」といった、既存マイクロサービスで採用されている技術スタックを扱います。
3週間というある程度長期的なスパンで、これらの技術と向き合うことができるのが魅力的で参加を決めました。
また、タイトルにもある通り昨年のサポーターズさんの「参加してよかったエンジニアサマーインターンランキング」で「技術力の向上」部門の1位だったのも熱かったです。
振り返ってみると、参加する部署や業務に関わらず、社内の色々なエンジニアの方とお話をする機会を設けていただけるのも魅力の一つでした。
インターンの1日の流れ
10:29 Discord集合
10:30 ~ 朝会
11:00 ~ モブプロ
12:30 ~ 昼休憩
13:30 ~ モブプロ
15:00 ~ 休憩
15:30 ~ モブプロ
17:00 ~ 休憩
17:30 ~ モブプロ
19:00 ~ 帰りの会
朝会、帰りの会
1日の始まりは朝会から始まります。この朝会ではその日のやることの洗い出しや目標などを決めます。
帰りの会では今日の進捗や明日以降やることを整理、その日の感想をもとに明日以降気を付けることや意識することを決めます。毎日行うことで細かく課題の発見→解決のサイクルが早く回せました。
朝会と帰りの会ではオンラインホワイトボードアプリであるmiroを使用しました。
全員が同期的に作業を進めることができるのでオンラインインターンとの相性は最高...
モブプロ
モブプロとは3人以上のメンバーで行うプログラミングの手法です。ドライバー(コードを書く人)一人とナビゲーター(コードを見ながら意見する人)複数人で行います。モブプロのメリットとしてはチーム全体で知識を共有しながらコーディングを進めていけることやメンバー間のコミュニケーションが促進されることがあげられます。
今回のインターンでは30分ごとにドライバーを交代しました。比較的短い時間で交代したことによってメンバー全員が今何をしているかや何に気をつけなければならないかをより共有できたのではないかと思います。 また、他の人がコーディングしている様子を見ていると、コーディングのスタイルや便利なエディタの機能を知ることができるのも良かったです。
今回のインターンは基本的にオンラインだったためコミュニケーションツールとしてdiscordを使いました。 VisualStudioCodeの拡張機能であるLiveShareを使うことでメンバー全員でエディターを共有でき意思疎通もしやすかったのではないかと思います。
全体方針
image-serviceという、投稿画像を管理するマイクロサービスを解体するというのが今回の課題です。当初はお店とも投稿とも切り離して画像を管理する責務が重要と考えられていましたが、投稿画像は「お店」または「口コミ」に紐づかないと存在し得ない、かつ並び替えなどのロジック実装を考えると責務がまたがってしまい、マイクロサービスとしてうまく分割できません。そこで、image-serviceで行っていた処理をrestaurant-service(お店サービス)、report-service(口コミサービス)の中に移行し、api-gatewayもそちらにリクエストを送るようにしました。image-serviceはKotlinで実装されているのですが、restaurant-serviceとreport-serviceはGoで実装しているため、Kotlinの処理をGoで実装するということも行いました。
今回行うことについての簡単な図を用意したのでご覧ください。
miscellaneous-serviceは「雑多なサービス」という意味で、モジュラーモノリスとなっています。この中に口コミサービスも含まれています。
実際にやったこと
口コミに投稿された画像を取得するgRPCと、Rettyのお店会員が保有する画像を取得するgRPCを移行しました。
- 既存のservice(Kotlin)の仕様把握
- protoファイルにスキーマ追加
- 移行先のserviceでの実装
- Entitiesレイヤー
- Usecasesレイヤー
- Interface Adaptersレイヤー
- repository
- controller
- テストコード
- 移行先のserviceの変更箇所をgrpcuiで動作確認
- テストケースの洗い出し
- 既存の実装と実行結果の比較
- api-gatewayでの呼び出し先を移行先のserviceに変更
- GraphQL Playgroundによる動作確認
- リリース!
学び
Go言語
Goを普段から書き慣れていない中で、Goが得意なメンバーやメンターの方のアドバイスをもらいながら、実装を進めていきました。 linterのWARNINGにも1つ1つ丁寧にフィードバックをいただけたので理解が捗りました。mockを使ったテストの書き方も学びました。
Clean Architecture
一つのサービスをClean Architectureで実装する中で、「この処理はどの層の責務か?」「ビジネスロジックが実装の詳細に依存していないか?」といったことを意識しながら手を動かすことで、解説記事を読んだだけではわからなかったClean Architectureの思想に触れることができました。また、リファクタリングを行う際、修正する必要がある箇所などがわかりやすく、影響範囲も小さかったためアーキテクチャの恩恵を感じることができたのではないかと思います。
gRPC
protoファイルの書き方やGoogle製のパッケージによるコードの自動生成、リクエストの送受信についての実装方法が経験できました。
感想
今回は本番で動いているマイクロサービスの開発をすることができました。自分達が書いたコードが実際のプロダクトで動かす経験ができるインターンは少ないのではないのでしょうか。
直接関わることのなかったエンジニアの方からもGitHub上のレビューやslackを通したアドバイスなどもいただくことができ、社内全体としてインターン生へのフィードバック体制が整っていると感じました。
チームでの開発以外にも社内ランチや週一回の1on1、社内mtgへの参加などrettyの雰囲気を知るという意味でも良い機会になったと思います。
サマーインターンを通して、他ではできない最高の経験をさせていただきました。 メンターを担当してくださった堤さん、迎えてくださったRettyの皆様、ありがとうございました!