ZEN Study Android アプリ 10年の技術的変遷

ZEN Study 10周年を記念した企画の第一弾として、Android アプリの10年の変遷についてお話します。

ZEN Study Android アプリは、リリース時の急ピッチな開発から始まり、MVP アーキテクチャの導入、Kotlin への移行、Single Activity 化、Jetpack Compose の導入など、継続的な技術改善を経て、現在は標準的なアーキテクチャへの刷新に取り組んでいます。

まず、簡単に私がどのように Android アプリに関わってきたかをまとめておきます。

2016年にドワンゴに新卒で入社し、研修を経て Android アプリの開発チームに配属されました。 ちょうど2016年の4月、つまり私が入社したタイミングでN予備校(ZEN Studyの旧称)がリリースされたところでした。 そのため、リリースの数カ月後から参画したことになります。

それから数年ほどは現場エンジニアとして、その後はリーダーやマネージャーとしてZEN Study Android アプリ開発に携わっています。 マネジメントをするにつれ実装に関わる時間は減っていきましたが、責任者としてずっと関わってきました。

注釈: N予備校は2024年に ZEN Study に名称変更しました(参考: 「N予備校」を「ZEN Study」に変えてみた件 〜 サービス名称変更の経験)。時系列上そぐわない場合もありますが、以降この記事内では ZEN Study という名称に統一します。

v

リリース前

リリース前は在籍していなかったため、コミットログや伝聞ベースの話になります。

教育事業はドワンゴの新規事業でN高の特異な名称も相まって注目を集めているところでした。 ZEN Study は、そのN高の開校と同時にリリースされている必要があることから、開発としてはリリース必達で急ピッチの作業が行われました。

チームは5~6名で、主要な機能ごとに Activity を分け、各 Activity の担当者1名が実装をする、という形でした。 といっても担当者が好き勝手に実装するという形ではなく、また全体のアーキテクチャを作ってくれる人もいました。 全体のアーキテクチャとしては MVP を採用し、 Repository パターンや手動 DI によってレイヤー間の分離を試みました。 レイヤー間の疎通のため、 RxJava を採用していたのは当時としては先進的だったと思います。

これらの工夫と体制により、無事期日までにリリースできました。 新規事業において何より大事な点をクリアできたといえるでしょう。

一方で、いくつかの技術的な課題の解決はリリース後に持ち越されることになりました。 各 Activity の中で、各担当者は画面ごとに Fragment を作って互いの作業が干渉しないようにしていました。 結果として、マルチ Activity マルチ Fragment という構造になり、画面遷移がやや煩雑になりました。 また、 MVP を採用していましたが、 Presenter 内でのロジックの分割がなく、 Fragment とも密結合してしまっていたため、1000行を超える神 Fragment / Presenter もちらほら見かけられました。 それらのクラスの中では、Rx のストリームが横断的に利用されており、処理の見通しを悪くしてしまっていました。

リリース後〜2022年

リリース後は、機能追加と並行して技術的な改善を進めていました。 2022年までの改善については、以下の記事で詳しく紹介しています。

blog.nnn.dev

主な改善点は以下のとおりです。

  • アーキテクチャを整備する(2017年2月 ~ 2021年4月)
  • Kotlin を導入する(2017年4月 ~ 2020年9月)
  • Jetpack Navigation を導入する(2020年1月 ~ 2021年4月)
  • Single Activity にする(2021年7月 ~ 2021年9月)
  • Jetpack Compose を導入する(2021年8月 ~ 2022年9月)
  • マルチモジュールを導入する(2022年1月 ~ 2022年10月)

これらの詳細は上記の記事に譲りますが、これらの取り組みを経て長期間のメンテナンスに耐えうる土台が構築されていきました。

テスト(試験)機能の開発とアプリ分割

前述の改善と並行して、 Android アプリで大きな変更がありました。 それがN高グループのテスト(試験)の機能です。

N高グループは高校ですので、試験があります。 学年末に実施される試験では、全国各地の学校やキャンパス等の会場で受験します。 このときに Android タブレットを利用しており、このタブレット上で動作するテストのアプリも私たちが開発しています。

最初にテストの機能を開発したのは2019年末でした。 当時は、ZEN Study にテストの機能を追加する形で実装していました。 しかし、何年かの運用を経て、リリースにあたっての課題がでてきました。

基本的にテスト期間中は安定稼働させる必要があり、アプリの更新は控えるほうが望ましいです。 一方で、N高グループには4月入学以外の生徒もおり、試験は規模の大小こそあれど年中実施されています。 特に、人数が多い4月生に関しては、年末から年度末にかけて多くのテストが実施されます。 すると、年末から年度末にかけての数カ月間、リリースがしづらいという状況が続いてしまいます。 ZEN Study は学校関連の機能も開発する都合上、新年度に向けて年度末にリリースするというケースが多いです。 開発サイクルと運用がマッチしないという状態になってしまいました。

この状況から脱却すべく、2021年にテスト機能を別アプリとして分離しました。 2021年末のテスト以降は、別々のアプリになったため、ZEN Study のリリースが制約されるという問題は発生しなくなりました。

2023年以降

2023年以降も、新規機能の開発と並行して技術的な改善に取り組んでいます。 代表的なものを挙げると以下です。

  • Kotlin Coroutines, Flow への置き換え(2022年11月 ~ 2023年6月)
  • LifecycleObserver 導入(2023年5月 ~ 2023年6月)
  • Composite Build の導入(2023年6月)
  • Bitrise から GitHub Actions への移行(2025年5月 ~ 2025年12月)
  • Dagger Hilt の導入(2025年12月 ~ )

目下のところ取り組んでいるのが、アーキテクチャの更新です(2025年8月 ~)。 技術的な要素としてはいろいろ改善していましたが、全体のアーキテクチャ自体は2017年2月に設計したものをずっと使い倒していました。 当時のアーキテクチャは、「当初の設計で課題となっていた Fat Presenter/Fragment をいかに分割し、テスト可能にするか」という観点で設計されていました。 翻っていえば、標準的なアーキテクチャという観点はありませんでした。 といっても、LiveData や ViewModel をはじめとする Architecture Components と公式のアーキテクチャガイドのリリースが 2017年11月 であるため、Android 開発としての標準的なアーキテクチャというものが黎明期だったようにも思います。

時は流れて2025年、チームとしてもこの「標準的でない」アーキテクチャについての課題感が高まり、より標準的なアーキテクチャへと刷新するプロジェクトが進行しています。 上記の Dagger Hilt の導入もそのひとつです。 これはまだ着手し始めた段階であり、詳細についてはもう少し導入が進んだ段階でまたこのブログでご報告します。

おわりに

今後、Android 以外の分野からも10周年の振り返り記事を公開する予定です。 お楽しみに。