「キャリトレ」では「アーキテクチャファースト」を軸に据えて、Androidリニューアルプロジェクトを進めました。結果的に、プロジェクトの進行がスムーズに終わり、リリース後10ヶ月経った今でもなお、リニューアルをした効果を感じています。この記事では、アーキテクチャファーストの施策を振り返り、現在、どのような効果につながっているのかを紹介します。

「キャリトレ」は2022年12月21日をもってサービス終了しました。

ゼロからの出発となったリニューアルプロジェクト

キャリトレ事業部スマートデバイスグループにて、「キャリトレ」Androidアプリの開発を担当しております萩尾と申します。2020年12月、挑戦する20代の転職サイト「キャリトレ」は、スマートフォンアプリをフルリニューアルしました。

「キャリトレ」のリニューアルプロジェクトは、単なるアプリケーションの作り直しにとどまらず、多くの機能追加・変更を伴いました。20代が主たるユーザーであるからこそモバイルアプリの重要性は高く、サービス全体を包括するインターフェイスとして失敗は許されませんでした。このプロジェクトを進めるうえで、以下のような困難がありました。

「挑戦する20代」に伴走し続けるサービスへの進化としての機能追加のみならず、WebViewベースのアプリケーションをフルネイティブで刷新を行い、技術的にも大きな挑戦となったリニューアルプロジェクトでした。

リニューアルプロジェクトの詳細についてはこちらの記事も併せてお読みください。

挑戦する20代に伴走し続けたい。「キャリトレ」アプリのリニューアル実現に至るまで。|ALL VISIONAL

「心をつかむ」転職アプリの世界観ができるまで | Visional Designer Blog

キャリトレアプリリニューアルで追加した機能
キャリトレアプリリニューアルで追加した機能

アーキテクチャとは

この記事ではアプリの一つの機能を実現するための役割分担を定義するデザインパターンのことを指します。

GoogleがAndroidアプリ開発において推奨している代表的なアーキテクチャであるMVVMをはじめとして、MVC、MVI、Flux、VIPERなどなど、様々な種類があります。

個人的にはある世界観(≒ UI/UX)を実現するための登場人物と人物相関図のようなイメージを持ってます。

アーキテクチャで最も重要なことは「制約」

アーキテクチャという形で実装に制約を設けることで、リリース時点のコードからチームメンバー全員の書いたコードに統一性を与えることを目指しました。 その動機として、以下のようなAndroid開発における固有の問題があります。

開発を始める前にこれらの課題への解決策として、アーキテクチャ選定という形でスタンスを固めておく意味が大きいと思います。 仮にアーキテクチャを決めずに実装を進めていった場合、エンジニア各々でこれらの課題解決方法を発明していく、という状況に陥りがちです。

Fluxの採用を骨格とし変更の伝播に「制約」を課す

「キャリトレ」リニューアルプロジェクトでは「Droidkaigi2019」アプリを倣って、Flux1を採用しました。 「Droidkaigi2020」ではMVVMが採用されているという背景もありますが、あえてFluxを採用した理由は大きく2点あります。

  1. MVVMにおけるViewModelに相当する処理を担う登場人物が多い
  2. 参画メンバーはFluxを採用しているアプリの開発経験があり、キャッチアップコストを低く見積もれる

FluxはFacebookが提唱している、情報が円環のように単方向に伝播するのが特徴であるアーキテクチャです。 詳細な実装はこの記事では割愛しますが、Androidアーキテクチャコンポーネント2を活用して実装しました。

Flux概念図
Flux概念図

リニューアル中に現れた効果

Fragmentのレイアウトファイルにして145個(≒画面数)もの開発を、3人のメンバーで着手し、3ヶ月という期間で開発を完了することができました。これだけの短期間で開発を完了できたので、アーキテクチャがあったことで、高い生産性を実現できた、ということが言えるのではないかと思います。求人の情報を表示する画面や、履歴書を更新する画面のような比較的単純な画面から、メッセンジャー画面や動画再生画面などの複雑な画面まで、バラエティのある開発も問題なく進捗できました。

もちろん膨大なテストケースをこなしていたQAチームや、Webチーム、iOSチームの尽力があって成し遂げられたことではありましたが、これだけの規模の開発ができたのは、画面間の相似形をアーキテクチャとして整理できたことが大きかったのではないかと思います。 デザイナーが描く世界観をを詰め込んだUIを実現するために多くのUI変更工数を割くこともできました。

リニューアル時に実装された画面一覧
リニューアル時に実装された画面一覧

リニューアル後に現れた効果

メンバー全員が全ての画面を修正できる状態

新規開発の時に設計の足掛かりになる、というのはもちろんアーキテクチャのメリットの一つですが、他の人が書いたコードを修正する場合の足掛かりとしても役立っています。 現在、「キャリトレ」Androidアプリは私を含め3人体制で開発を行なっていますが、全員が全ての画面を修正することができます。

Fluxの世界観が画面単位で構成されており、他の画面における処理の構成を、他方の画面における処理の相似系と見なすことができることが大きいです。 例えば、「新規の画面を作る」場合にはどういったクラス設計をすべきか、という思想が以下など随所に埋め込まれています。

これらの資料により、実装する上で考えることが絞ることができるため、単なるエンジニアリングのコストを逓減し、細かなUI調整などのより価値のあることに注力することができます。 また、ある機能を実現するために書くべきコードが明確であるということから、新規参画メンバーのオンボーディングにも貢献していると思っています。

一つの画面に多くのメンバーがContributeできている様子
一つの画面に多くのメンバーがContributeできている様子

エンジニア間で共通言語ができた

チーム内で共通言語を用いながらコミュニケーションをとれるのが、アーキテクチャの存在意義の一つだと思います。 コードレビューやライブラリの導入において議論を進める上で、アーキテクチャ固有の単語を使ってコミュニケーションが取れています。

Androidアプリの周辺技術はとても変化が激しく、特にこの2021年はJetpackComposeのリリースにより、開発のパラダイムが大きく変化した1年となりました。このような状況の中では、共通言語を媒介変数として用いて目線があった議論ができるところが良いところだと思っています。

Jetpack Composeのドキュメントは基本MVVMアーキテクチャを採用した形式で書かれているのですが、チームで読み合わせしていると、以下のようなアーキテクチャに関する議論で盛り上がることができたのは驚きでした。(逆に盛り上がりすぎて、ドキュメントの読み合わせはなかなか進まないということもあるのですが…笑)

JetpackComposeへの移行もスムーズに進み、想像以上の効果がありました。

終わりに

最後に、メンバーに「アーキテクチャがあってよかったと思うことはありますか?」と質問し、返ってきた回答を紹介します。

アーキテクチャがあることで、どこでどのような処理を行うのかを迷わずに書くことができ、プロダクトの本質的な開発に集中することができました。 また、バグが出た際も、すぐにコードを理解することができたので、非常に早く改善サイクルを回すことができたと思います。

リニューアル途中から参画しているメンバー

私がキャリトレプロジェクトを触り始めて一番に感じたのが、データの流れが理解しやすく、どこでどんな処理をしているか把握しやすいということでした。 そのため、どう実装するか設計のイメージがしやすく参画してすぐに機能開発をすすめることができたと思います。

2021年5月からキャリトレAndroid開発に参画しているメンバー

おはぎ
おはぎ

Androidエンジニア。スポーツ観戦が好きなお彼岸の供物。You'll never walk alone.