アプリの入り口となるホーム画面開発を支えるメルカリのPersonalization Coreチーム #TeamInterview

お客さまがアプリを開いたときに最初に目にするメルカリのホーム画面には数多くの情報が掲載されています。商品情報はもちろん、おすすめのキャンペーン情報など、お客さまそれぞれにパーソナライズされたコンテンツも必要です。

そんなメルカリの顔とも言えるホーム画面の開発を担当しているのがPersonalization Coreチームになります。この記事ではPersonalization CoreチームのEngineering Manager(以下、EM)である@stoufに、ホーム画面開発の中でも特にバックエンドサイドにフォーカスしてインタビューしました。

インタビュアーはEngineering Officeの@afroscriptになります。

6ヶ月で帰国するはずが、そのまま日本で働くことに

— まずは自己紹介からお願いします

はい。私はフランス出身で、現在はメルカリのPersonalization CoreチームとSearch QualityチームでEMを担当しています。元々日本文化が好きで、観光で来たことがありました。フランス在学中にインターンシップとして2社経験する必要があり、せっかくなので日本企業であるWizcorp社に入りました。元々6ヶ月経ったら帰国する予定だったのですが、帰りたくなくなってしまって、そのまま日本企業をいくつか経験しています。そしてメルカリへ2019年11月に入社しました。

— メルカリ入社前はどんなことをされていましたか?

Wizcorp社ではバックエンドとフロントエンドエンジニアをしていました。その次のCoursebase社ではフルスタックエンジニアとして、バックエンド開発やインフラ周りを担当していました。どちらも日本の会社ですが、外国人比率の高い会社になります。

ホーム画面の開発を担当するPersonalization Coreチーム

— チームはどのような開発を行なっていますか?

Personalization Coreチームでは、ホーム画面にコンテンツを表示する部分のシステム開発を担当しています。ホーム画面には各チームからさまざまな情報を表示させたいという要望が寄せられます。そのため、数多くのチームとの調整が必要で、一時は私たちのチームがボトルネックになっている時期もありました。そこでシステムのリファクタリングを進めて、他のチームの方が自分たちで表示したい情報を実装できるように改善しました。その結果、私たちの負担が減ってサポートに回れるようになったり、各チームが自分たちでコンテンツをコントロールできるようになっています。

— チーム体制について教えてください

Tech LeadとEMを除いて、それぞれ専属の担当というものは設けていません。柔軟性を維持するため、全員が全体のプロジェクトに関わり、サイロ化しないようにしています。

決して止められないホーム画面開発の裏側

— ホーム画面で表示されるコンテンツについて教えてください

2つのカテゴリーに分かれています。1つがパーソナライズドコンテンツで、普段の行動ログから予測されるお客さまの好みに沿ったコンテンツです。もう1つがディスカバリーコンテンツで、お客さまの興味を広げうるレコメンドコンテンツです。例えば、みかんを購入した人に、他の種類のみかんや他のフルーツを提案するのがパーソナライズドコンテンツで、より関連度の範囲を広げてフルーツジュースやデザートなどを提案するのがディスカバリーコンテンツになります。

各コンテンツの選定ロジックや、どのコンテンツをどのような条件で見せるかは、Machine Learningを取り扱う別のチームや、ホーム画面を担当するPM(Product Manager)たちが担当してます。

— 開発時に工夫していることはありますか?

エラーを返さない点が大きな特徴となっています。これはガイドラインレベルではなく、コードとしてエラーを返せないように設計しています。アプリの利用時にお客さまにエラーメッセージを見せるのは良くありません。そこで、データ取得時に問題があった際にはそのコンポーネントを表示させなかったり、別なデータを返したりなど、単純にエラーを返して終わりとしていません。もちろんエラー自体はチームでは検知しており、改善を行なっています。

あとは、ホーム画面はお客さまにとってのアプリの入り口となる非常に重要な場所なので、常に利用可能な状態(constant available)を維持しなければなりません。そのために、最初から正しいデザインを行なって、コードに落とし込む必要があります。もちろん最初からできていた訳ではなく、ベースをリファクタリングしながら進めてきました。

また、ホーム画面は表示回数がが多く、さまざまなチームがコンテンツを載せたがります。しかし、それに合わせた開発をすべて引き受けてしまうと、私たちのチームがボトルネックになってしまいます。

— 確かにすべてを受けてしまうと大変そうですね

そうですね。そこで、他のチームの人たちが自分たちでコンテンツを追加できるシステムを開発しました。ここで工夫していることは抽象化のバランスであったり、質の高いドキュメントを提供すること、そしてエンジニアリングサポートです。このシステムについては、自由度を上げすぎるとできることは増えますが、理解すべき部分も増えます。なるべく分かりやすく、コードを書きやすい状態を維持しながら開発しています。ドキュメントは特に重要で、それだけを読めば開発が進められるように、分かりやすい内容を心がけています。

メルカリのDNAとしてGo Bold(大胆にやろう)があります。もちろん私たちのチームでも数多くのチャレンジを行なっていますが、ホーム画面の場合は安全性や堅実性、確実性も重視しています。Go Boldと技術的なリスクを取るのは違うと思うので、その点に注意しています。エラーが出たら止めれば良いのかも知れませんが、ホーム画面の場合はお客さまの影響が大きいので、チャレンジとリスクコントロールは常に気をつけています。

— ホーム画面ではさまざまなコンテンツを載せるので、いろいろなチームと関わりがありそうですね

そうですね。数えてみると、ざっと12チームくらいはありそうです。たとえばレコメンデーションチームや検索チーム、メルペイの残高表示を担当しているチーム、商品情報を提供するチームなどです。そのためコミュニケーション量がとても多いチームになります。

チームの利用技術

— チーム内で主に利用している技術を教えてください

私たちが主に利用している技術は次のとおりです。

  • Golang
  • Terraform
  • Kubernetes
  • Google Cloud Memorystore
  • GitHub
  • Jira
  • Confluence
  • Google Drive

開発言語はGoになります。TerraformとKubernetesはインフラ管理に利用しています。Google Cloud MemorystoreはいわゆるRedis互換のサービスで、ホーム画面への大量のトラフィックに対してバックエンドの負荷を軽減するのに利用しています。

Personalization Coreチームでの働きがい

— @stoufにとってこのチームでの働きがいはなんですか?

自分たちのチームを含め他の関連する全てのチームがお客さまにどれだけスムーズに価値提供できるようなるかに挑戦し続けることです。もちろんそこには技術的な課題も数多くあるので、それらを解決するのもやりがいの1つです。ダイナミックに変化する訳ではありませんが、常に技術レベルを高く保ち続ける必要があります。

— 技術レベルを高く保つためにチーム内ではどのような工夫をしていますか?

例えば技術ニュースの共有であったり、コードレビューなどが挙げられます。良いコードレビューはお互いが成長できる重要な機会だと考えているので、チーム全体としてコードレビューにはしっかり時間割き、品質高く取り組むようにしています。

以前@stoufが書いたコードレビューのメリットに関する記事(英語)

最近は全員リモートワークなので、カジュアルトークをできる場としてコーヒーブレイクを用意して、自然と意見・情報の交換ができるようにしています。

私個人としては、EMとして心理的安全性の高い環境づくり、非難されない文化(Blameless Culture)の醸成、お互いに励まし合うチーム作りを心がけています。小さいことかも知れませんが、話し方も大事です。自分が発する言葉ひとつひとつに対して、この話し方で相手は動いてくれるのか、気持ちよく仕事をしてくれるだろうかと注意を払ったり、メンバーとのやりとりでも気になったところはしっかり指摘するようにしています。また、失敗は個人ではなく、そうできてしまうプロセスや環境の問題になります。そのため失敗があれば、環境を改善できるチャンスであるとメンバーに共有しています。

— では最後に@stoufが一緒に働きたいと思う方について教えてください

自律的、積極的に仕事に取り組める方が良いですね。エンジニアは勉強し続けないといけないと思いますので、学び続ける姿勢も必要です。メルカリは従業員を大切にし、素晴らしい職場環境を提供していると思います。新しいことを学ぶ機会はとても多いはずです。また、メルカリとして社会へ貢献したいという思いも強いので、そうした点に共感してくれる方に来て欲しいです。

— ありがとうございました!