iOSDC2023で発表した「メルカリ10年間のiOS開発の歩み」のトークスクリプトを公開します

はじめに

こんにちは。メルカリ Director of Engineering の @motokiee です。この記事は、Mercari Advent Calendar 2023 の21日目の記事です。

メルカリのサービス開始から10周年ということで、2023年9月にiOSDC Japan 2023 カンファレンスで「メルカリ10年間のiOS開発の歩み」について発表を行いました

この発表は、10年間のiOS開発の歴史を40分のトークにまとめたものです。メルカリはこの10年多くの技術的なチャレンジをして断続的にアプリケーションをアップデートしてきました。自分が見てきた歴史と、見ていない歴史については git log を手繰りながら調査した集大成となっています。

サービスの歴史が長くなると、アプリケーションのリファクタリングはもちろん、作り直す話も出てくると思いますが、そういった意思決定の際の参考になればと思い作成しています。

なお発表のアーカイブ動画もありますが、動画を見るのも以外と腰が重かったりするため、文章のほうが自分の都合で見やすく、良い選択である場面もあると思います。また、テキストの方がChatGPTなどLLMでサマリを作るコストも低くなりタイパ(タイムパフォーマンス)重視の方には良いのではないかと思い、トークスクリプトを公開してみると良いのではないか、と考えました。

ぜひご覧ください。

トークスクリプト全文


よろしくお願いします。「メルカリ10年間のiOS開発の歩み」というタイトルで発表します。


自己紹介です。motokieeといいます。
現在は株式会社メルカリで Director of Engineering をしています。メルカリには2016年に入社し、丸7年が経過しました。
メルカリでは、メルカリ本体や新規事業にエンジニアやエンジニアリングマネジャーとして携わってきました。
現在はMobile, Web, Backend の アーキテクトチームをDirector of Engineeringとして管轄しています。ちなみに現在はiOSの開発はしていません。なのでお手柔らかにお願いします。
iOSDCは2016年から2019年までコアスタッフをしていました。スピーカーとしての参加も久しぶりなのでとても緊張しています。よろしくお願いします。


まずはこのトークでオーディエンスのみなさんが得られるものについて簡単にご紹介します。
メルカリはこの度10周年を迎えることができました。
これもひとえに使っていただいたお客さまのおかげではありますが、この10年間でどのように会社、サービス、そしてiOS関連技術が変化してきたかをご紹介します。
また10年間のメルカリアーキテクチャやTech Stackの変遷についてもご紹介します。これまでの10年に負けないくらいの変化が今後も起こるはずだと考えており、エンジニアとしてこれからの変化にどう対応していくかのヒントが得られるのではないかと思います。
そして最後に、昔からiOS開発をしている方々には温故知新、少し懐かしい気持ちになってもらえるのではないかと思います。
最近iOS開発を始めた方々には、昔の出来事を振り返って、自分たちがこれから取り組むかもしれない開発へのヒントにしていただければ幸いです。


それではトークに移りますが、メルカリについて簡単にご紹介させてください。
私達はミッションとバリューをとても大切にしています。

まずミッションですが、今年10年を迎えミッションが「あらゆる価値を循環させ、あらゆる人の可能性を広げる」にアップデートされました。


そしてバリューです。Go Bold, All for One, Be a Proです。
日本語に訳すと、大胆にやろう、全ては成功のために、プロフェッショナルであれ、をValueとして掲げています。


続いてはサービスについて、特にフリマ事業がサービス開始から10年でどのような立ち位置にいるか簡単にご紹介します。


2023年7月時点で、メルカリの月間利用者数は2200万人以上となっています。累計でメルカリに出品された商品は30億品以上、さらに 2022年の取引件数を1年間の秒数で割ったところ、1秒間に7.9個売れていることがわかりました。


サービス開始当初の2013年は20-40代の方を中心に使われていましたが、現在ではシニア層の方も含め幅広くバランスよくご利用されています。


続いて取扱いカテゴリですが、2014年にはレディースファッションカテゴリが最もシェアが大きかったのですが、現在は、本・ゲーム・おもちゃといったインドア向けアイテムがトップシェアを占めています。


メルカリはアメリカでも事業を展開していますが、日本のフリマから国境を超えて取引が展開されています。代理購入サービスで海外のお客さまでもメルカリの商品を購入できるという取り組みが行われており、世界110か国以上の国・地域のお客さまに「メルカリ」でのお買い物をお楽しみいただけるようになっています。

以上、簡単なメルカリのフリマサービスについてのご紹介でした。


続いて今日のトークの全体像についてご紹介します。


今回、10年分の歴史を振り返るにあたって独自に年表を作成しました。使用されていた技術、重要なプロジェクト、その時々のスクリーンショットを集めて参考資料として作成しました。


少し文字が小さいですが、ざっくりと流れをご紹介します。
1年ごとの取り組みを分析してみてタイトルを付けてみました。2013年から2015年は Build 期 だったと言えそうです。

このころはフリマサービスに必要な機能を次々と実装していた期間でもありますが、同時に新しい事業・技術ともに新しい領域への探索がスタートした時期でもありました。立ち上げ期、Buildにフォーカスした時期だったのかなと思います。


続いて2015年から2017年あたりは、Explore, 探索期ですね。次々と新規事業が生まれていった時期だったと思います。
Swiftはもちろん、Reactive Programming の導入も始まっていて、新しい技術の探索を始めた時期だったのかなと思います。


2018年から数年は Re-architecture and Foundation 期です。
2018年には Re-architecture が始まり、2019年頃から Design System, Weekly Release, ログの改善など、アプリ開発周辺基盤の強化に力を入れていた期間でもありました。この間、開発基盤のために事業を止めていたわけではなく、スマホ決済のメルペイもサービスローンチされたりしています。


そして2020年-2022年はRewrite期です。
日本のメルカリアプリをRewriteする取り組みの期間でしたし、US、新規事業でもフルスクラッチで開発を行っていました。


2023年現在、いまは Post Rewrite と呼べる時期で、また新しいことに取り組んでいたりします。
以上が10年をフェーズに分けた全体像となりますが、ここから各年掘り下げてご紹介していきたいと思います。


まずは2013年です。この年はメルカリが誕生した年です。最初にiOS周辺技術での出来事を簡単に振り返りましょう。


2013年はiOS7が発表された年です。いわゆるスキューモフィズムからフラットデザインへの大きな変更が行われた年と言っても良いでしょう。
iPhone 5s、iPhone 5c が発売リリースといった出来事がありました。


メルカリのサービスとしては、2013年7/2にAndroid版が、少し遅れて2013年7/23にiPhone版の提供がスタートしたようです。
iPhone版はわずか半年後に 「App Store Best of 2013 今年のアプリ」を受賞していて、急速にサービスが伸びていったことがうかがえます。


ちなみにメルカリで最初に売れた商品は「ドット柄のカットソー」みたいです。
サービス開始当初はどんなUIだったかというと…


こちらは当時のプレスリリースに掲載されていた画像です。ロゴやUIに時代を感じますね。


また、 App Store Connect API を使ってApp Storeに設定されたスクショを全て取得しています。こちらは2013年7月にリリースされた際、App Store に設定されていたスクリーンショットです。2013年って感じですね。
続いて メルカリのiOSリポジトリの git log から2013年がどんな年だったか見てみましょう。


主要なデータとして、コミッター数、コミット数、そしてdiffを1年ごとに集計しています。コミッター数は重複を含むため、正確な数字ではありませんが、スタートアップらしい少人数体制で開発をしていた時期です。


そしてこちらが記念すべき最初のコミットログです。タイムゾーンがなぜか(アメリカ・カナダ)の山岳部標準時 – MSTになっているのですが、JSTでは2013年03月15日(金) 21:17でした。ちなみに調べたところ大安でした。


また、メルカリiPhone版が提供されたのは7/23のv1.0.1ですが、それより以前に App Store で v1.0.0が審査を通過しています。メルカリ最初のiOSエンジニアのoobaさんに背景を伺ったところ、当時 App Store の審査に 2週間から1ヶ月かかることもあったため、rejectされないかの確認のためのサブミットを行った、とのことでした。


先程のv1.0.1の配信開始が2013年7/18、その後7/23にプレスリリースを出しています。2013年3月の最初のコミットから約4ヶ月の開発期間を経てのリリースでした。


ちなみに7.23のリリース初日はわずか2000ダウンロードでした。これが2013年末までの半年弱で100万ダウンロードを突破することになるので、すごいスピードだと思います。


2013年の技術トピックをまとめてみました。
このころは Objective-C かつ MVC でアプリケーションが書かれていました。なぜならSwiftは2014年発表だからですね。ちなみに iOS4~iOS7がサポートバージョンとなっていました。
メルカリの商品リストは CollectionView で実装されましたが、UICollectionViewは iOS6で登場したAPIだったため、それ以前のバージョンにはPSTCollectionViewというOSSが使われていました。昔からiOS開発をしている皆さんにはおなじみではないでしょうか。
また、AFNetworking, SVProgressHUD などお馴染みのライブラリに加え、まだ Apple に買収される前のTestflight SDK も利用されていました。


あとはスキューモフィズムデザインですね。本物の物質に寄せてディテールを細かく施すデザインですかね。メルカリiOSの最初のPull Request をチェックしてみたら、こんな感じで立体感のあるデザインになっていました。
この点もoobaさんに伺ったところ、iOS7が発表されて「やばい」となって急いでフラットデザイン対応をされたとのことでした。


また最初期はWebViewベースのガワアプリを検討していたようですが、結果的に体験を重視してネイティブアプリの開発に切り替えています。
WebViewベースで押し切った時にメルカリがサービスとしてどうなったのか知るすべはありませんが、とても気になりますね。


続いて2014年です。この年、初のTV CM放映がされました。2013年末までに100万ダウンロードを突破していましたが、さらに加速的にサービスが成長していきます。


先に2014年のiOS周辺技術の出来事を見てみましょう。
この年Swiftが発表されます。iOSアプリの開発に携わる皆さんにとってエポックメイキングな出来事だったと思います。メルカリも例外ではなく、この後数年、Swiftを軸に様々な技術的な取り組みが続くことになります。
またiPhone6, iPhone6 Plusが発売された年でした。フォームファクターが増えたことは大きな出来事ですが、@3x 画像の登場で画像アセットの更新が大変だったり、AutoLayoutに対応せず 3.5inch と 4inch 画面で分岐するようなコードを書いていた方には思い出深いできごとではないでしょうか。僕もたくさんの画面のAutoLayout対応を行った覚えがあります。


サービス、会社として2014年の大きな出来事はこちらです。なんと500万ダウンロードを突破します。またUSでのサービススタートなど2年目にしてかなりの打ち手がありました。


App Store のスクショはこんな感じになりました。


まずGit log を見てみましょう。
そこまで大きな変化はないですね。コミッター数としては増えていますが、ユニーク数ではないので実際にエンジニアが増えたどうかは分かりません。


このスクショはv3にメジャーアップされた後のものです。v3へのメジャーバージョンアップはデザインリニューアルを主な理由としています。
2014年7月にリリースされた v3系 は2019年にメルペイがリリースされるまで5年弱続くことになるとても長寿なバージョンとなりました。


引き続きObjective-Cが使われていました。2014年はSwiftが発表された年ですが、この年のコミットにSwiftのコードは入っていませんでした。
一方この年、メルカリでReactiveCocoaがライブラリとして取り入れられ、一部の画面がMVVMで実装され始めていました。また cocoapods が package manager として取り入れられていました。


また、USのサービス開始に伴い、日本とアメリカのサービスでソースコードが共有されるようになったことも大きな出来事です。コードは共有しながら、国ごとにターゲットを分けて別バイナリを配布するアプローチを取っていました。
以上が2014年です。サービスとしてはかなり伸びていましたが、まだまだ技術を見直すようなタイミングにはなっていません。

そして2015年です。
この年は commit log や チケットなどをたどるとフリマサービスとしての基礎体験の磨き込みに力を入れていた時期だったように思います。


iOS周辺技術としてはこんな感じです。


サービスとしては2015年1月に1000万ダウンロードを突破します。機能的には、「らくらくメルカリ便」という便利な配送方法の提供を開始した時期でもあります。
また、2015年後半には新規事業を手掛ける子会社ソウゾウが設立されました。


App Store のスクショはあまり変化がないですね


Git log もそこまで大きな変化はありませんが、コミッターが増えています。
この頃からiOSの勉強会に行くと、メルカリで働いているという人を見かけるようになった覚えがあります。


技術トピックとしては、この年からSwiftが実戦投入され始めます。新しい画面や Extension がSwiftで実装され始めています。
Git logをたどると、機能開発ですごく忙しかったような印象を受けましたが、チケットのタイトルを見てもUXを向上させるような施策に集中して数多く実装していた時期だったようです。


また新規事業でフルSwift, RxSwiftでの開発が始まり、新しい技術の探索が始まったタイミングとも言えるのではないかと思います。
以上が2015年のできごとです。
このあと数年メルカリの規模に合わせた開発を模索していくことになるのですが、振り返ってみるとその礎がこの2015年あたりに築かれたような気がしています。


続いて2016年です。この年はUSへのフォーカスと、メルカリ初の新規事業がローンチした年でもあります。


そんな2016年はiOS10, iPhone 7 が発表されました。ジェットブラックありましたね。
そして、 第一回 iOSDCである iOSDC Japan 2016 が開催された年でもあります。ちなみに第一回は早稲田キャンパスではなく、練馬のココネリホールでの開催だったんですね。


僕も当時スタッフとして関わっていたのですが、「みんな来てくれるかな〜」「スポンサーさん集まるのかな〜」
「まぁでも、誰も来てくれなかったら会場費用自腹でもくもく会をやればいいだけだしね」と度々主催者の長谷川さんが言っていました。
ちなみにそんなiOSDCをメルカリは第一回はもちろん、かれこれもう8年連続でスポンサーとして応援しております!
というわけで本題に戻ります。


2016年は匿名配送の提供開始、あとはアメリカのApp StoreでUS版メルカリがTop3にランクインするという出来事もありました。
それからメルカリアッテというクラシファイドサービスのリリースですね。こちらのサービスはすでにクローズしております。


スクショはこんな感じです。ちょっとだけ変わりました。


git log はこんな感じです。なお新規事業のリポジトリは含んでいません。
Diff がかなり多いのですが、ちょっとなぜこんなに多いのかまでは追いきれませんでした。


この年から、メルカリ本体でも新規事業でも リアクティブライブラリを使っての開発が行われるようになり、リアクティブライブラリの知見が社内に溜まっていくことになります。
メルカリ本体はObjective-CとSwiftの併用、新規事業がこのあと続々立ち上がっていくのですが、そちらはフルSwift + RxSwift での開発となっていきました。また Carthage がこの年導入されていました。
以上が2016年のできごとでした。


続いて2017年ですが、この年は新規事業がたくさん立ち上がります。


iOS周辺技術の出来事としては、iPhone Xが登場します。ノッチの登場ですね。


サービスとしてはAI出品機能、「ゆうゆうメルカリ便」が提供開始となり、さらにアプリは世界1億ダウンロードを突破します。


この年はニュースが多くて、USメルカリアプリが書き直されてリニューアルされます。
またイギリスでもサービスがスタート、他にも新サービス・新機能が続々とリリースされますがこれはすでにクローズされています。後半にはメルペイが設立され、数年後のスマホ決済サービスの準備がスタートします。


スクショはこんな感じです。あんまり変わらないですね。


Git log はというと、増えてはいますが、これもそこまで変わりません。


この年はUSアプリを書き直す・リライトする “Double” というプロジェクトがUSメルカリアプリで行われました。Swiftで書き直されたのですが、ネイティブのコードに加えて React Native も導入されていました。
また、2015年に立ち上がったメルカリ アッテの設計をベースとして、Swift/RxSwift/MVVMでいくつも姉妹アプリが立ち上がりました。
メルカリ本体のメルカリNow、メルカリチャンネルのような新機能もSwiftがメインで開発されるようになりました。


このころから少しずつ技術的な課題が出てきます。
Objective-C と Swift だったり、新しい画面と古い画面が混在するようになってきたため、コンテキストスイッチのコストが高くなってて少しずつ課題となってきていました。また、事業として重要なコンポーネントや画面のメンテナンスがかなり困難になってきていました。
エンジニアの人数も順調に増えていたので、複数人が同じ画面に改修を入れるケースも増えていき、結果コンフリクトが発生しやすくなり、他の人の作業に自分の作業がブロックされるようなことも増えていき、結果として開発の速度が上がりづらくなっていました。


そして2018年、ここから技術基盤を強化するプロジェクトがいくつも走っていくことになります。その最初のプロジェクトが Re-Architecture でした。


2018年のiOS周辺技術の主な出来事としては、iOS12, iPhone Xsの発売ですかね。


サービスとしてはシェアサイクルサービスであるメルチャリがリリースします。こちらは現在事業譲渡済みです。
また6月にマザーズ上場、メルカリロゴのリニューアル、2016年から2017年で立ち上げたサービスが2018年の間にいくつもクローズされました。
そして日本のメルカリチームでも海外からの採用が加速してきます。僕もこのころから仕事で英語を使う機会がかなり多くなりました。


Git log は激変しました。2017年は6000台だったコミット数が3倍強に増えています。
コミッター数も90を超えましたが、これはユニークではないため数十人いた、くらいに捉えていただければ良いと思います。


そしてロゴはこのようにリニューアルされました。2013年当初から続いていた箱が開くデザインから変更されました。このロゴは現在も使われています。


こちらは2018年7月ごろ、ロゴが変わる前のApp Storeのスクショです。ロゴが変わった後の2018年10月のものをみてみましょう。


ちょーーーっと変わりました。翌年に大きなサービスローンチを控えていたため、この段階で大幅なデザインのアップデートまでは行いませんでした。文字ロゴが変わっただけでそこまで大きな変化はないですね。


この年の大きな技術トピックは Re-architecture です。
方針としてはアプリのフル書き換えは選択せず、王道の少しずつ画面を書き換えていくアプローチをとりました。MicroViewController と読んでいたのですが、コンポーネントベースで同時並行での開発を可能にするアーキテクチャへのアップデートでした。
複雑な画面の書き換えを目的とし、テストや仕様書を充実させながらプロジェクト進行させていきました。


このときのアーキテクチャについては、2018年にtarunonさんがiOSDCで発表を行っています。ご興味のある方はぜひご参照ください。


Re-architecture のロールアウトプランについてもご紹介します。
書き換えを行う際、どのようにロールアウトしていくかは判断の難しい問題だと思います。
我々のアプローチは全く同じ画面を実装し、新旧でA/Bテストを行いながらKPIに劣後が出ないかを確認しながらロールアウトしていきました。
全く同じ画面だったので、細かすぎる微妙な仕様の差を知っていないと自分の端末にどちらが表示されているのか本当に分かりませんでした。
また、Feature Flag で新旧画面の比率を調整しながら徐々に公開していきクラッシュやエラーを監視しました。
クラッシュ等以外のビジネス指標は、BIチームとも連携してトラッキング、KPIに異常が出たらすぐにFeature Flagで旧画面に切り戻すという運用を行いました。


Re-architecture は全体として良い結果をもたらしました。主要画面の書き換えを完了できたことはもちろん、一部の画面では旧画面よりもパフォーマンスが向上し、事業KPIに良い影響を与えたことも分かりました。


赤いドットがRe-architecture 後の画面、青いドットが旧画面のある指標です。なにが良かったかは公開できませんが、パフォーマンス向上によってビジネス上の指標に良い影響があったとご理解いただければよいかと思います。


取り組みとしては結果的に1年を掛けてターゲットとしていたすべての画面の書き換えが完了することができました。また、テストも Re-architecture 前に比べてかなり充実しました。
特にロジックを含むようなコンポーネントは80%のカバレッジを持つようOKR(Objectives and Key Results)を設定して達成していきました。
残念な点としては、仕様書については継続的にアップデートが行われず、数年後に行われるリライトプロジェクトでも課題となりました。


エンジニア観点で一番大きな効果はスケーラブルな開発体制を構築できたことではないでしょうか。エンジニアの人数も増えたのですが、並行して開発ができるようになったこともあり、コミット数が前年比3倍に増えています。
Re-architectureで画面を書き換えていったことも大きいと思いますが、コードの追加・削除もかなり増えています。


GitHubのContributersのグラフを見ても、Re-architectureを前後でトレンドが大きく変わっていることが分かります。


また、この年から全員プロダクト開発を行うエンジニア、という体制に変化が訪れます。
横断的な改善の重要度が上がり、 iOS Coreチームが組成されます。
2023年現在、このCoreチームは iOS Architect チームとして継続しています。


この年はバックエンドでも大きな変化がありました。PHPのモノリスアプリケーションからマイクロサービスアーキテクチャへの移行を目指すMicroservice Migrationがスタートしています。バックエンドでgRPCが使われ始めたこともあり、クライアントでは Protocol Buffersが利用され始めました。
2018年は技術的な取り組みとしてはRe-architectureという大きな動きがありました。会社全体としても技術刷新に取り組む環境へと大きく変わった年でもありましたが、2019年も大きな変化が起こることになります。


それがメルペイというスマホ決済事業のスタートです。


メルペイは2019年2月にスタートしました。タイムラインとしては、2018年にはかなり本格的に開発が行われていていました。


iOS周辺技術においては、SwiftUIが発表され、これもエンジニアリングとして後に重要な出来事となります。


こちらがメルペイリリース時のApp Storeのスクリーンショットです。
これまでフリマアプリがメインでしたが、スマホ決済機能を強く打ち出しています。


2018年はRe-architectureが進行していましたが、メルペイはどのように開発を進めていたのでしょうか?
メルカリ社内ではRe-architectureと同時進行で “Merpay Integration” というスマホ決済機能をメルカリのアプリに取り込むプロジェクトが2018年頃から進行していました。
Re-architecture への影響を考慮し、 Merpay 機能を SDK としてモジュール化して提供する手法を選択し、Re-architectureもメルペイの開発も止まらないようプロジェクトが進行されました。


またアプリ上のUIの大きな変化として、メルペイスタートと同時に、メルカリアプリは下タブUIへと変更されています。
2013年のリリース当初からハンバーガーメニューのUIが続いていましたが、メルペイリリースとともに現在も続く下タブへのアップデートが行われました。


Re-architeture後も開発はさらに加速してきました。
なお Merpay は別リポジトリで管理されていたので、メルカリグループ全体としてはさらに大きい数字になっていたと思います。


主要画面以外のRe-architectureも完了、さらに 下タブ化をともなう Merpay Integration が終了し、Re-architectureは約1年で一区切りとなりました。


Re-architecture によって大部分が書き換えられました。Re-architecture前の2018年と2019年末を比較すると、プロジェクト内の Swift 比率は約20%から約85%にまで高まりました。
Objective-Cは75%から15%に減少していますが、それでもObjective-Cはプロジェクト内に残っていました。


また、Re-architecture をベースとして Design System プロジェクトがスタートしました。
Design System を進めた理由としては、スケーラブルな開発の実現と一貫したデザインと体験の両立と、そのためのPM/Designer/SWEの共通言語の導入、の必要性があがっていったためです。
この年は、Re-architecture 済みの画面に対して Design System コンポーネントを全社で適用していきました。
以上が2019年のできごとでした。

2018年以降の流れとして、スケーラブルな開発の重要性が上がった、ということが上げられます。採用も日本だけではなく海外にも目を向け、より広い市場にアプローチしていくことになりました。
一方でスケールする開発を実現するためのアプリ開発基盤のアップデートが重視された期間であり、この流れはいまに至るまで続くことになります。

2020年。Re-architectureが一旦の終わりを迎え、Design System などアプリ開発基盤の強化に力を入れ始めたタイミングで、GroundUpというプロジェクトが始動します。これは何かというと、アプリをゼロから書き直すプロジェクト です。


2020年はiOS14, iPhone12等、あとはApple Silicon が発表された年です。


2020年7月 App Storeのスクショがこちらです。2019年に引き続きメルペイを前面に据えています。


引き続きかなりたくさんのコミットが行われていました。


2020年の技術トピックとしては、先程も触れた通りアプリ開発周辺基盤の強化が挙げられます。
2019年にスタートした Design System に続いて、 Test Automation強化、Weekly Release の検討開始、 Client Event Logging の刷新などがプロジェクト化され、投資が行われました。


これらを進める理由として、エンジニアを取り巻く環境が変わったことも挙げられます。
サービスとしてはシングルアプリですが、メルカリとメルペイは別の会社になっています。スマホ決済事業が導入されたことにより、結果として、メルカリ・メルペイのグループ会社をまたぐ活動が増えました。
両者で求められるガバナンスも異なるのですが、足並みをそろえ、機動力を維持しながら開発する体制が求められていました。


そのような動きもありますが、2020年はGroundUp App の始動が最も大きな出来事であったと言えるでしょう。
リーアキテクチャのようなリファクタリングを行うアプローチではなく、アプリをゼロから書き直し、”式年遷宮”を行う意思決定でした。


2019年に発表されたSwiftUIで書き直すことが方針として設定されました。
また、Re-architectureを選択しなかった理由として、今後数年、プラットフォームの提供する新機能に素早く対応していけるようにベースから書き直す判断をしました。
このプロジェクトは、プロダクト開発を行うチームから独立して開発がスタートしました。


また GroundUp では Bazel をビルドツールとして採用し、 Bazel のビルドキャッシュなどの強みを生かした Micro Modular Architecture を採用しています。
この Micro Modular Architecture については、 いまも iOS Lead Architect を務める Aoyama さんが iOSDC Japan 2020 で発表を行っているので、興味があればそちらをご参照ください。

さて、git log をこの年から2種類見ていくことにしましょう。

これまで見てきた初代iOSリポジトリはレガシーリポジトリと呼んでみましょう。引き続きすごい数のコミットが行われています。

こちらは Ground Up リポジトリです。まだまだ産声を挙げたばかりのプロジェクトと言えそうですが、コミッターはそれなりにいたように見えます。

以上が2020年のできごとでした。

俯瞰してみると、Re-architecture が終わった後すぐに Rewrite プロジェクトが開始されており、とても決断が早かったように感じます。やはり、2019年に発表されたSwiftUIはメルカリのiOS開発においては大きな転換点だったと言えます。


さて、2021年は再チャレンジが行われた年と言えるかもしれません。


まず iOS周辺技術では、iOS15などが発表されました。


2021年7月のスクリーンショットはこちらです。フリマ機能が再度押し出されています。


レガシーリポジトリは少しコミット数が落ち着いてきます。前年3万近くあったコミットから1万6千にまで減少しています。


一方、GroundUpはコミット数こそあまり変化がありませんが、コミッター数が増えているように見えます。


この年からメルカリはアプリのリリース周期を2週に一回から毎週アップデートに頻度を上げる改善を行いました。
Delivery の頻度を増やすということが目的だったのですが、これを実現するためにはいろいろなものを整備する必要がありました。
約半年ほど掛けてプロセスやオペレーションのアップデート、QA期間短縮のための自動化などの準備を行い実現されました。


サービス的には事業者向けのメルカリShopsが立ち上がりました。
メルカリShopsは、クライアントアプリだけでなくバックエンドもフルスクラッチで開発しました。この機能はネイティブではなくWebViewでメルカリアプリ内に提供されています。
WebViewへのチャレンジは2013年にWebViewベースでの開発を諦めてからの再チャレンジとも言えるものでした。


メルカリUSでは、2017年のDouble以来、2度目の書き直しプロジェクトである Denali がスタートします。
以前の Double プロジェクトでは部分的に採用していた React Native をフルで使って書き直すプロジェクトです。プロジェクト名のDenaliは、北アメリカ大陸の最高峰の山の名前らしいです。
以上が2021年の出来事です。
振り返ってみると、USメルカリ、日本のメルカリ、メルカリShops という3つのプロジェクトがフルスクラッチで開発を行っていたことになります。


そして2022年はエンジニアリングとしても会社としてもGroundUpにフォーカスした年となりました。


この年はiOS16, iPhone14が発表されました。PassKey についてもこの年WWDCで発表が行われました。


2022年はメルカリIndiaが設立されたり、メルカードの提供を開始したりと、組織、サービスとしてもさらなる広がりを持った年になりました。
そしてメルカリアプリのリプレースの完了です。


こちらが GroundUp リリース前の 最後のv4系、4.106.0 のスクリーンショットです。GroundUp でリプレイスされた v5系を見てみましょう。


はい、何も変わってません。でも裏側は全部変わっているんですね。


Git log チェックしましょう。
2022年途中でレガシーリポジトリにはコードフリーズが入ったため、コミット数が16,000から十分の1以下に減っています。


Ground Up は逆に約2000から倍以上に増えています。


GroundUpのリリースについてご紹介します。
先程説明した通り、Legacy リポジトリにコードフリーズを実施しました。これまで Legacy で機能開発に取り組んでいたエンジニアも全員が GroundUp の開発に移りリリースを目指しました。会社としては GroundUp を前提に取り組んでいたサービスもあったため、全社を挙げての取り組みとなりました。


ロールアウトプランですが、Re-architecture のときのように画面ごとにロールアウトしていくという戦略は取れません。
4月からTestflight で外部テスターを募り、βテストを実施し、ここでバグリポートを集め修正を行っていきました。
その後、 7月にApp Store で実際にGroundUpアプリをリリースするフェーズに移ります。ここでは Weekly Release は維持しつつ、v4系のレガシーアプリのストアリリースを停止、v5系のGroundUpを実際にストアにリリースしていきます。
この際、段階リリースを行い 1%, 2% など小さいパーセンテージでリリースを停止し、バージョン浸透率をコントロールしながら徐々にロールアウトを実行していきました。もちろん、この段階ではKPIの監視も行いました。

これを1ヶ月ほど続け、9.20に v5系GroundUpアプリを100%公開し、2020年にスタートしたリライトプロジェクトであるGroundUpが2年をかけて完了しました。


このリライトプロジェクトにより、Objective-Cはメルカリのアプリから完全になくなりました


さらにこれまで別リポジトリで管理されていた Merpay SDK などを、 GroundUpリポジトリに統合する モノレポ化が実施されました。
また、USアプリの React Native への書き換えも4月に完了しています。


GroundUpプロジェクトについては、CTOLead Architect のインタビュー記事が出ていますので、興味があればご参照ください。
以上が2022年のできごとでした。
日本とUSどちらもリライトプロジェクトが完了したという年で、モバイルアプリに関わるチームにとってはハードな1年となりました。
しかし、書き換えて終わりというわけではありません。


そして、2023年、メルカリは10周年を迎えました。


今年はiOS17が発表されましたね。
そして Apple Vision Pro, visionOSも発表されました。


メルカリはすでに次の10年に向けて動き出しています。
ビットコインが買えるようになりました。
また、パスキーの対応も開始しています。ChatGPTプラグインの提供も開始などなど、 Go Bold にチャレンジを続けていきます。
そして、7月にアプリローンチ10年を迎えました。GroundUp が終わったあと、レガシーリポジトリはどうなったのか見てみましょう。こちらです。


はい、全て0です。
GroundUp でのコードフリーズ以降、レガシーアプリでの開発がストップしたため、2023年には誰もコミットを行っていません。


レガシーアプリであるv4系アプリはサポートが続いていたため、メンテナンスのためにリポジトリは残されていました。
しかし、2023年に入り、v4系アプリのサポートを切る強制アップデートが実施されました。これにより、 レガシーiOSリポジトリは役目を終え、アーカイブされることになりました。
2013年3月の Initial Commit から10年を経てその歴史に幕を降ろしました。


10年間の歴史を振り返ってみました。
通算コミッターはボットや重複を含みますが213、通算コミット数152,456、通算Pull Request 35,969 という数字でした。


GroundUpはこの様になっています。7月時点での数字です。
元気に開発が続けられていますね。

※GroundUpリポジトリ は Squash and merge で運用しているため、Squash and merge を使っていなかったレガシーリポジトリよりもコミット数が少なくなっています。


7月時点のApp Store上のスクリーンショットはこの様になっています。
2013年と比べてみましょう。


デザインを見てもかなり歴史、月日の流れを感じますね。


2023年、いまiOS開発として力を入れていることをご紹介します。
Architecture v2という、すでに新しいアーキテクチャに取り組み始めています。GroundUpという取り組みが終わってすぐのように見えますが、いまの設計自体は3年前の2020年に考えられたものなんですね。
これまでの歴史を振り返ってみると3年という月日は決して早すぎるわけではないとも思っています。

それから2022年にWWDCで共有されたPassKeysも重要な取り組みの一つ。すでにメルカリのプロダクションで導入が開始されていますが、シームレスな認証を提供していきたいと考えていて、これからサポートを増やしていきたいと考えています。

アプリの Observability の強化にも取り組んでいます。これは DataDog Real User Monitoring (DataDog RUM) を使い、エラーやクラッシュはもちろん、API Latency 含めてe2eの読み込み速度の計測などを行う取り組みです。

またリリースサイクルについても、週一回をキープしているものの、人の手で解決していることが多い状況で、改善に取り組んでいます。

まだ2023年は終わっていませんが、7月までの動きを振り返りました。

かなり長かったですが、以上が10年間の振り返りです。


最後にまとめていきたいと思います。


10年振り返ってみて感じたことは、変化は徐々に起こることも、突然表れることもある、ということです。技術の変化はもちろん、プロダクトやビジネス、そして組織の変化もあります。
エンジニアはどのようにこれらの変化に適応していけば良いのでしょうか?ということについて考えてみました。


まずは技術変化への適応ですが、幸い、iOSアプリ開発では、一定のリズムがあります。だいたい2-3年を掛けて新しいスタンダードへの適応が行われていきます。
メルカリの場合、2014年にSwift が発表されてから2年後の2016年にフルSwift アプリが登場しています。
また、2019年にSwiftUI 発表されてから3年後の2022年にアプリが SwiftUIへ書き換えられています。


プロダクト、ビジネス、組織による環境の変化への適応はどうでしょうか。
ここに関しては会社や組織によって課題感が異なると思いますが、メルカリではご覧のような取り組みが行われてきました。
Re-design, re-architecture, re-write, さらに横断的な取り組みを行うチームの設立や、周辺基盤の強化が環境の変化に適応するための取り組みでした。


今回あらためて振り返ってみて、メルカリは変化に対してかなりプロアクティブに対応してきたことを再認識しました。
ただ、振り返ってみると当たり前のように感じるターニングポイントも、当時はそこまで確信を持って意思決定が行われたわけではなかったと感じています。

Q. Re-architecture が終わって間もなくゼロから書き直す判断ができるか?すべきか?
Q. いま Cross Platform や WebView を選択すべきか?

もしかしたらプロダクトにいま携わっている方は、いままさにこのような問いにさらされているかもしれません。


完璧な答えはないものの、それでもエンジニアとして最善と思える答えを僕らは一つに絞って出さなければならない。きっと迷うこともあると思います。
そんなとき、「メルカリはあんなことやっていたな」「この課題にはこうやってアプローチしたのか」「ちょっと参考にしてみるか」と言う感じでですね、この10年の振り返りが少しでもみなさんの力になれば嬉しいと思っています。


はい、ということで以上になります。
今回スライドの中で紹介できなかった取り組みもたくさんあります。今回紹介した取り組みも全てが大成功だったわけではありません。
たくさんの失敗もありましたが、そういった失敗を糧にこれまでメルカリは取り組んできています。
これからもメルカリは Go Bold, All for One, Be a Pro を掲げながら チャレンジを続けていきます!
もしこのトークを聞いてメルカリに興味持っていただけたら、ぜひお気軽にお声がけください。


以上となります。それではご清聴ありがとうございました!

おわりに

以上、「メルカリ10年間のiOS開発の歩み」でした。

プレゼンテーションは40分と比較的長いトーク時間のように感じますが、10年の歴史をまとめるには40分は非常に短く、初期段階のトーク時間は60分を超えてしまっていました。余計な内容を削り規定の時間内で終わらせるべくトークスクリプトを準備し、本番ではきっちり40分でトークを終わらせることができました。

文章以外でのフォーマットで参照したい方は、当日発表を行った際のスライドと動画をこちらから参照することができます。

2023年はありがとうございました。2024年もよろしくお願いいたします!

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