メルカリアプリのコードベースを置き換える GroundUP App プロジェクトの話

@1000ch です。Merpay Advent Calender 2022 1日目の記事でも触れられていますが、メルカリグループではこの数年、クライアントサイドのアプリのコードベースを刷新し、開発生産性の向上やその後の技術的な投資を支えるソフトウェア基盤を作ることを目的とした GroundUP というプログラムに取り組んできました。

GroundUP プログラムの対象となるのは iOS と Android のネイティブアプリ、そして Web アプリでした。そのうち Web アプリ版のメルカリを書き換える GroundUP Web プロジェクト(以下、GroundUP Web)は 2021 年の夏に完了していましたが、ほぼ同時期に開始したアプリ版のメルカリを書き換える GroundUP App プロジェクト(以下、GroundUP App)は 2022 年の秋に、開始からおよそ2年半を経てついに完了しました。

GroundUP App の成就は GroundUP Web 以上の困難を伴いました。GroundUP Web に続いて GroundUP App でもメルペイでのリードを担当したので、その一部始終について記します。

メルカリグループの事業とアプリの構造

メルカリグループには C2C マーケットプレイス事業を担うメルカリをはじめ、マーケットプレイス事業のうち B2C 部分を担うソウゾウ、決済や与信事業を担うメルペイ、暗号資産事業を担うメルコインといったように領域に応じて会社が存在し、マーケットプレイス領域とフィンテック領域として近接する事業同士が協調しながら、それぞれの事業領域の推進を担っています。次の図は、2022 年 12 月時点でのメルカリグループの事業とメルカリアプリの概略図です(iOS アプリと Android アプリそれぞれのアーキテクチャを正確に表すものではありません)。

メルカリグループにはマーケットプレイスに分類されるメルカリとソウゾウ、フィンテックに分類されるメルペイとメルコインがある。1つのメルカリアプリに、各社が担当する事業の機能へコミットが行われている

メルペイやメルコインは比較的後発であり、機能としてもマーケットプレイスとは疎にできる部分が多いためライブラリやモジュールとして存在しています。ソウゾウも素早く PDCA サイクルを回せるように Web ベースの技術で構築されています。それぞれの組織がある程度の独立性を保って開発できるようになっています。メルカリが発足した当初は、この図で表現されているところの Mercari という事業体と C2C Marketplace しか存在していない状態でした。

これらを内包する本体とも言えるメルカリ部分のコードベースは創業から 10 年近く開発を続けるなか、様々な事業的・組織的要因によって抜本的なリファクタリングを実施できていない状況でした。古く複雑で肥大化したコードベースは変更による影響範囲を読みづらく、コードオーナーの退職などにより仕様や背景を理解する人がいない機能なども存在しており、開発生産性を高める上での足かせになっていました。このコードベースの刷新を目指して立ち上がったのが GroundUP App です。

メルカリグループを跨いだプログラムの進行

GroundUP プログラムのコンセプトは「提供しているルックアンドフィールや機能性を損なわずに、コートベースを置き換えること」で、アプリも Web と同様です。GroundUP Web の記事で「リリースまでだけではなくリリース後も、組織として Web に対して継続的にコミットする体制になっていること」と掲げたことを紹介しましたが、アプリはこれまでも注力してきたプラットフォームであり、積極的な事業開発が行われてきました。

GroundUP App では、既存のコードベースを段階的に書き換えていくのではなく「等しい機能性を担保した新しいアプリをゼロベースでもう1つ作り、古いコードベースをアーカイブし、新しいコードベースに切り替える」というアプローチを取ったため、いずれかのタイミングで最新の機能性に開発状態が追いついていなくてはなりません。この点については、旧アプリの機能開発が進む傍ら新アプリの機能開発を進めて、徐々に2つのアプリの機能差分を減らしていき、最終的にはメルカリグループ全体で新アプリへコミットするという段階的なステップを踏みながら進行しました。

コードベースの書き換え対象はメルカリが担当する部分(図中の Mercari app および C2C Marketplace)で、その他のメルペイ・メルコイン・ソウゾウ部分は含まれていません。もちろん、GroundUP App の進行中もメルカリと同様に各社の事業が前進し続けています。メルカリグループとしては GroundUP App を成功させる必要がある一方で、書き換え対象ではないメルペイ(だけではありませんが)としては事業開発を出来る限り止めない方法を模索しました。幸い、メルペイのコードベースはライブラリやモジュールといったように再利用可能な形で整理されていたので、それぞれを旧アプリと新アプリ両方に組み込み、メルペイのアップデートが自動的に新旧両方のアプリに取り込まれるようなアーキテクチャを提案しました。

旧アプリと新アプリの両方が切り出されたメルペイやメルコインのライブラリを参照している

このアーキテクチャによって、メルペイとしては新アプリへ機能を実装し直すことなく、その他のリスクにも対応しやすい状況を実現できました。ちなみにソースコードをコピーして移植するという代替案もありましたが、バージョン管理された同一のコードベースを参照する案を強く支持し、意思決定しました。これに伴って、旧アプリと新アプリの両方で使っているライブラリを揃えるなどのタスクも発生しましたが、結果として様々なリスク要因を減らすことに繋がり、とても良かったと思っています。

新アプリのリリースに向けたメルカリグループとしてのコミット

新アプリの実装が進んで現行バージョンである旧アプリとの機能差分が小さくなってくると、いよいよターゲットとなるリリース日を決めて、いよいよメルカリグループ全体のコミット先を新アプリに集中させる必要が出てきます。

メルカリの機能開発が旧アプリで続けば、新アプリでも同様に実装してテストすることになりますし、新旧アプリから参照しているメルペイのソースコードに変更がなくとも実装上接合している部分があるので、繰り返しテストしなくてはなりません。GroundUP App の中心であるメルカリは半年間の機能開発停止期間を設けて、未実装機能の開発を完了させながらテストを実施しながら、社内限定のアルファバージョンとして公開してドッグフーディングを行いました。

ある程度品質が担保された先に、どのようにお客さまに新アプリを公開していくのかという論点があります。当然ながら App Store と Google Play Store それぞれに新アプリをいきなり 100% リリースするのはリスクが高すぎます。方向性としては、プラットフォームが提供するベータ版アプリのリリース機能を利用して、社内限定のアルファバージョンから一般のお客さまが限定的に参加できるベータプログラムとして始め、フィードバックを集めてさらなる不具合改善や品質向上を行い、更に 1%, 5%, 10%, … 最終的には新アプリを 100% 公開するという段階的なステップを計画しました。プラットフォームが提供しているベータプログラムの他には、新旧アプリの実装を単一バイナリに含めて Feature Flag で新旧を切り替え、段階的に開放していくというアイデアもありました。しかし、お客さまに提供するアプリのバンドルサイズが著しく増えてしまうことや、その他にも新旧アプリの実装が混在できない技術的な理由があったためベータプログラムを活用していく方針になりました。

この基本的な方針に加えて、どのような変数がつきまとうかを洗い出すと、

  • 新アプリで致命的な不具合が発生したり、旧アプリに比べて著しく KPI が低い時に、どのように旧アプリを再配布するのか、何をどのように判断するのか
  • 新アプリのリリースが、同時に進行しているメルペイ・メルコイン・ソウゾウの事業開発に対してどのような影響があるか、各種トレードオフとメルカリグループとしての事業ポートフォリオを考えた時にどうするべきか
  • 新 iOS アプリと新 Android アプリの進捗が異なる中でどのような順序でリリースするのか
  • サポートする OS が異なる新旧アプリが混在する時に機能やデータの整合性は問題ないか。新旧アプリのデータマイグレーションは可逆的か
  • これらの状況下において、お客様からどういった問い合わせが想定され、どういったサポート体制が必要か

などなど、リリースに際して非常に多くのことを考慮する必要がありました。いくら熟考して入念に準備しても、想定外の出来事が起こるのは常で、GroundUP App に於いても例外はなく様々な問題が起こりお客様にご不便・ご迷惑をおかけしてしまいました。リリース前の数ヶ月間はメルカリグループの最重要事項として位置づけられ、そういった状況に対しても会社全体が一丸となって GroundUP App へコミットしてきました。

GroundUP App プロジェクトを振り返って

旧アプリに比べて大幅に小さくなり先進的な技術が用いられたコードベースは、これからのメルカリグループの事業を支える強固な基盤になるでしょう。iOS では SwiftUI、Android では Jetpack Compose といった宣言的な UI 実装に書き換えられていますが、この規模のソフトウェアを完全に新しい技術で置き換えるのは、挑戦的な出来事だと思います。コードベースの刷新だけでなく、次のような効能もありました。

  • ブラックボックスになっていた実装を排除し、不明確だった仕様を明らかにした
  • メルカリグループ内にも関わらず、会社間で滑らかに連携できていない課題を浮き彫りにした
  • 基盤となる実装技術が置き換えられたことで、さらなるソフトウェア投資の足がかりになった
  • 先進的な技術的取り組みが、プラットフォーマーに取り上げられた

そして何より、テックカンパニーとして「大規模なソフトウェア投資を経営として意思決定し、様々な困難がある状況下でリスクテイクし、メルカリグループで一丸となってプロジェクトを完遂した」実績 が重要です。

前述の通り GroundUP App は終始問題なく進行していたわけではなく、多くの反省点があります。上記のような副次的に顕在化した課題へのアクションも含めて、改善の余地を残すところですが、こうした取り組みは開発組織として更なる進化を遂げる布石になりました。特に UI 実装部分が SwiftUI と Jetpack Compose に置き換わったことでサポートする OS バージョンが更新され、メルペイでもこれらの技術を導入していく下準備になっています。先日メルカードが発表されましたが、プロダクトとしても更に多様な価値提供をしていきますので、是非ご期待ください。

  • X
  • Facebook
  • linkedin
  • このエントリーをはてなブックマークに追加