サービスとビジネスを加速度的に成長させていくため、メルカリJPは今、2013年のアプリリリース以来となる「iOSリアーキテクチャ」に取り組んでいます。
アプリの機能を維持しながら、最先端のアーキテクチャに刷新していくこのプロジェクト。そこで今回、iOSエンジニアの山中大輔さんと齋藤暢郎さんに、マネージャーの多賀谷洋一さんがインタビューを実施しました。
歴史あるコードを前にしたエンジニアたちが「最高に楽しい状況」と語る理由とは?
多賀谷洋一(Yoichi Tagaya)※写真左
2017年1月に株式会社メルカリに入社。メルカリUSのiOSアプリ開発を担当した後、エンジニアリングマネージャーとして開発組織の強化に従事。SwiftのDIフレームワーク「Swinject」の作者でもある。@yoichitgy
山中大輔(Daisuke Yamanaka)※写真中央
2015年3月にメルカリに入社。メルカリJP/USのアプリ開発に携わり、直近ではメルカリチャンネルの開発を立ち上げから担当。「JPのiOSコードについて一番詳しい人」としてリアーキテクチャをリードする。@86
齋藤暢郎(Nobuo Saito)※写真右
LINE Fukuoka株式会社にてiOSアプリ開発に携わった後、2017年9月にメルカリに入社。メルカリUSのiOSエンジニアを経て、2018年からJPのiOSアプリ開発にジョイン。「本質を見極める人」としてリアーキテクチャをリードする。@tarunon
5年の歴史を持つコードベースを、スケール可能なアーキテクチャへ
ー2013年にJP版アプリをリリースして以来、初めてのiOSリアーキテクチャですね。まずは経緯を教えてください。
山中:実は今、iOS開発のスピードがなかなか上がらない状況なんです。アプリ内には古いコードと新しいコードが混在し、言語としてもObjective-Cがあり、Swiftがあり…これらのブリッジングも大変なんです。
齋藤:つまり、メルカリのエンジニアが十分にパフォーマンスを出せていないのが現状ですね。とはいえ、コードの寿命は長くても5年、短いものだと数ヶ月で終わるものもありますから、当然起こりうることなんです。
今の状況は、その時々のベストプラクティスを導入してきた結果なんです。言ってみれば「前借り」ですよね。未来の時間を借りて、サービスを加速させてきたんです。
山中:「コードは書いた瞬間からレガシーになる」という言葉もあるくらいですからね。開発パラダイムと言いますか、アーキテクチャもこの5年間でMVVM、FluxなどのMVCを置き換えるものが使われる時代になりましたし。
ただ言えることは、ベストプラクティスを重ねてきたからこそ、メルカリは大きく成長してこれたんだと。このタイミングで借りてきた時間を返済し、さらに成長していけるようになりたいですね。
ー技術的負債を返済し、成長をさらに加速させるためのリアーキテクチャですが、具体的に今どういったことが進められているのでしょうか?
山中:社内には約10人のiOSエンジニアが在籍しているのですが、ゆくゆくは100人規模を目指しています。しかし、今の設計だと1つの画面を複数人で同時に開発することが難しいんです。
齋藤:働ける人数のリミットが10人で、残りの90人が暇になってしまう状況ですね。開発に関わるエンジニアが限られてしまう問題は、アプリを扱う企業では往々にして起こりうることです。
山中:メルカリのiOSチームの場合、「10人」がパフォーマンスを保てるMaxの人数。その上限を突破し、100人が同時に開発できる設計にすることが、今のiOSリアーキテクチャチームの発足理由であり、課題ですね。
齋藤:そこで今、1つの画面を再帰的に細分化可能な構造にする取り組みを行っています。画面を小さなコンポーネントに分割することで、開発がスケールしやすくなるという非常にシンプルな発想です。
今回のアーキテクチャはまだ導入事例が少なく、いわばGo Boldなチャレンジなんです。それが今、ブロッカーやコンフリクトがとても少ない開発環境の中、自分たちの目の前で成功しつつある。エンジニアにとってこの上なく楽しいことなんじゃないでしょうか。
走りながらアーキテクチャを作り変えていく
ーiOSのリアーキテクチャと同時に、別チームがお客さまのための機能実装も進めていますよね。何か工夫していることはありますか?
齋藤:例えばですが、リポジトリは同じ場所にしつつ、モジュールは分けて書いています。既存のコードはそのモジュールをインポートしない限りは使えないため、トラブルなく進行できるんです。
また、全体に影響を及ぼしうる共通の内製ライブラリは、コミットを小さく分けて変更を加えています。さまざまなことを同時に進められるよう、当たり前のことを当たり前に、ですね。
山中:齋藤さんは淡々と説明していますが、実は難しいことでもあるんです。
例えば、新しいコードの中に古いコードが紛れ込まないように対策を講じるとします。単に各メンバーに注意してもらうだけでは、人に依存してしまい、決して良い対策とは言えませんよね。
そこで、新しいコードをすべてモジュールに分割することで、古いコードが混ざることを物理的に防ぐようにします。そういった問題に、齋藤さんは本質を見極めつつ対策を打っているのです。
齋藤:コンパイラに指摘してもらえるようにすることも、手段の1つですね。間違ったことをそもそもできないようにしたり、楽をすると正しいことができるようにしたり…といったように。
山中:はい、このように齋藤さんは秩序ある世界を作り上げていますね!
1つのプロダクトを全員でスケールしていく貴重な体験
ー最後に、このプロジェクトを進めていく上でどんな人と一緒に仕事をしていきたいですか?
齋藤:楽しく仕事ができる人ですね。今サポートとして新卒の冨永健(@ken0nek)さんが入ってくれているのですが、彼が定期的に「このコードが許せない!」「このコードは素晴らしい!」とレビューしてくれるのが楽しくて楽しくて。
中でも忘れられないのが、「齋藤さん、僕の書いた最強のコードを早くレビューしてください!」っていう(笑)。
山中:チームでわいわい議論しながら開発していける人がいいですよね。お互いのいいところを持ち合い、高め合っているプロジェクトなので、絶対に楽しいと思います!
あとは個人的に、齋藤さんみたいに本質を見極め、そして完璧に解決していくBe Professionalな人ですかね。
齋藤:完璧ではないですよ。現時点でのベストプラクティスを実践しているだけです。
山中:All for Oneで1つのプロダクトに全員で取り組み、そして全力でスケールさせていく。この体験はメルカリでしか得られないと思います。まさに今スケールする設計が整ってきているところです。まだまだ課題は残っていますが、ぜひ一緒に取り組んでいきたいですね。
齋藤:チームの人数が増えたら、内製化も進めていきたいですね。例えばReactiveSwift / ReactiveCocoaを内製のReactiveフレームワークに置き換えたいです。メルカリはテックカンパニーとして世界を目指しているので、ぜひ一緒に作っていきましょう!
【iOSチームでは一緒に働く仲間を募集しています】