はじめまして。河村 (@KowerKoint2010)です。 この夏、エンジニアリンググループ AI・機械学習チームで2週間の新卒ソフトウェアエンジニアインターンに参加しました。
インターンでは、「Yucca」という内部サービスの改善を担当しました。 当初与えられた課題については設計・開発から本番環境へのリリース、そしてユーザーへの利用法説明まで行い、まだ時間に余裕があったので追加でデータベースの改善も検討しました!*1
ここでは私がやったことを簡単に紹介しつつ、エムスリーという会社で働いてみた感想を伝えます。 エムスリーでのインターンや就職を考えている他の学生の参考になれることを願っています。
Yuccaについて簡単に紹介
BigQueryに特定のフォーマットでデータを置くと、それをクローリングしてきて自動でAPIとして提供する。つまり、サービス企画者がBigQueryのsheduled queryを書くだけで、追加開発なしでレコメンド・ランキングなどのAPIが簡単に生やせるプロダクトです。
Yuccaは主にBatchとAPIの2つの部分で構成されています。
Batch
BatchはRustで書かれています! 新しい!*2
KubernetesのCronJobとして15分おきに、次の流れで実行されます。
- BigQueryの指定されたデータセットからすべてのテーブル名とその最終更新時刻をフェッチ
- DB (MySQL) への最後の書き込み以降に更新があったテーブルに関して、APIにあった形でDBに反映
API
APIはGoのAPI開発ライブラリであるGoaを用いて実装されています。
要求クエリに対応する情報をDBからSELECTして返すだけのシンプルなパートです。
やったこと1: 新APIの開発
まず、現在のウェブサイト用Yucca APIの仕様に問題があり、Yuccaを利用してウェブサイトを開発する人の負担が無駄に大きくなることがある話を受けました。
問題点を整理してどうすればよいか考えたところ、パラメータ違いの新バージョンのAPIを新たに作成するのが良いということになりました。
仮のデザインを提示して意見をもらったりしながら仕様を決定し、開発を開始しました。 新APIのためには新しい形式のDBが必要なためBatchも更新する必要がありました。
開発はBatch→APIの順番にそれぞれ「コーディング」→「ローカルテスト」→「デプロイ」→「外からのテスト」と順に行いました。
既存のコードが多いのでコーディング自体はそれほど大変な仕事ではなかったですが、Goは趣味で少し触ったくらいでRustもお仕事の場では触ったことがなく、TerraformやKubernetesに至っては完全に始めて触る代物だったので新しいことづくしのいい経験になりました。
6日ほどで完成して本番環境にもデプロイで来ました!嬉しいです。 無事に社内の利用者への負担が軽減されハッピーですね。 実際に利用者となるビジネスサイドの社員さんに新仕様を説明するミーティングも行い、喜んでいただくことができました。
やったこと2: DBの新しい持ち方を検討
はじめ提示されたタスクは「やったこと1」のほうですが、予定より早くやり終える事ができたので追加の課題に挑戦しました。
YuccaのDBサーバにはCloud SQLが使われていましたが、Yuccaで行う更新操作はテーブルまるごとのみ、検索操作は主キーでの検索のみであり、RDBMSにしかできない機能を使っているわけではありません。 他のNoSQLデータベースを使ったり、フルマネージドDBサービスを使わずにGKE上でサーブしたりすることを検討しました。
まず、現在Cloud SQLで使われているリソースの量や、DBへのアクセスの回数を調査しました。 アクセス回数は、BatchやAPIが動いているGKEの1週間分のログを拾ってBigQueryのテーブル情報を照らし合わせることで特定しました。
次に、候補となるDBの持ち方を列挙して、それぞれ実現可能性を検討したり、料金を計算したりしました。
結果としてYuccaの用途ではフルマネージドサービスを使ったほうが良いことがわかりました。 その中でもCloud SQLを使用する選択で悪くはなく、工夫すればFirestoreに移行したほうが安くなりそうという結論に至りました。 Firestoreを用いる場合の工夫についても考えましたが、実装するには至りませんでした。
今回KVS系の様々なDBサービスについて調査したので、今後のためにDBサービス選びの道筋をまとめてこのタスクは終了しました。
やったこと3: 社員と交流
エムスリーのインターンはオンラインながら社員の方と交流する機会がよくありました。 AI・機械学習チームでは毎日夕方に10分の夕会があり、技術に関係ないお題に沿って雑談をします。 それ以外にも、私と興味が近そうな方や今年の新卒エンジニアの方、PdMと1on1で話す機会を設けていただきました。1on1文化は初めてでしたが、気軽な会話で会社の雰囲気を知ることができました。
インターンを通しての感想
このインターンではRust, Go(Goa), Kubernetes, Google Cloud(BigQuery, GKE, Cloud SQL)などなど個人ではあまり触ることがないものも含めて多数の技術スタックに触れることができ、成長を感じました。 開発だけでなく、デプロイして実際に運用できるところまで介入できたのがおもしろかったです。
インターン期間中は他の社員と同じように定例のミーティングに参加するようにもなっており、現場の雰囲気を近いところで感じ取ることができたのも良かったです。
エムスリーのAI・機械学習チームは十数名の少人数で大量のプロダクトを開発し、デプロイから運用・保守まで支えている強い組織です。 私はコミュニケーションのハードルの低さがこれを実現していると感じました。 必要以上に1人で悩むことになりがちなのはリモートワークの問題点ですが、エムスリーは問題を抱え込まずにすぐに話すことができる環境になっていると感じました。
毎朝15分のミーティングで進捗を報告したり、他の人の業務に対して自由にアドバイスをしたりするようになっています。 その場で解決しなくてもそこですぐに1on1のアポが取られるので素早く問題が解決できるようになっていました。 特にミーティングが行われているときは皆さんすぐに思ったことをZoomのチャット欄に書くようにしているのでいつも賑やかでした。 私はDiscordなどのインターネットチャットツールで普段から会話をしまくっているので、この文化は受け入れやすかったです。
新しい技術に寛容なところも嬉しい点でした。 エンジニアが自身で技術選定をしているので先進的な技術も合理的であれば積極的に取り入れられていますし、役に立ちそうな新しい技術は毎週の技術共有会で共有されます。
すぐに役に立つような技術でなくても勉強できる雰囲気はありました。 隔週で行われているTech Talkでは人々が個人的に学んだ技術などについて短時間で発表します。 ユニークな面白い発表が見られていい刺激になったし、ここで発表するために勉強するというモチベも生えそうで良い感じです。 (Tech Talkの一部はYouTubeに上がってるので、見たことがない人は見てみてください!) また、私の在籍中には『Database Design and Implementation』の輪実装会があったので参加させていただきました。*3 毎週担当が変わっての実装というハードなことをやっていましたが、とてもギークを感じました。
最後に
私はもともとはアカデミックに近いところでのスタンドアロンアプリばかりを開発してきたため、エムスリーの事業とは離れた存在でした。 それでも自分の力には自信があったので、とにかくいろいろなことを勉強してできることを増やしたいという気持ちでインターンを志望させていただきました。
結果的にたくさんの技術や本番に近い環境に振れることができて技術力もついたし、Webバックエンドの世界でもやっていける自信もつきました。 10日間の間に濃密な経験を積むことができ、エムスリーについての理解も深まっていいインターンになりました。
メンターの北川さん (@kitagry)をはじめ、支えてくださったエムスリーの皆さんに感謝しています!
エムスリーに興味を持っている学生のみなさんもぜひインターンに参加してみてください! 私は大学院進学を決めたうえで学部生でも参加させていただいて就活にも繋げたれたと思うので、就活生以外の方もぜひぜひ! (たぶん)