Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビジネス中心に7年間走り続けたAndroidをリアーキしてる話

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 ビジネス中心に7年間走り続けたAndroidをリアーキしてる話

Avatar for ko2ic

ko2ic

May 19, 2021

More Decks by ko2ic

Other Decks in Programming

Transcript

  1. 優秀なAndroidエンジニアで構成され ているチーム (私は別チーム所属) • 社員 • 長く参画してくれてるフリーエンジニア • 業務委託の方(最近参加) NewsPicksのアプリを使っていた人ならわかる。

    技術力がないとできないUI。そしてスピード感あるリリース頻度 01 | なぜ変えるのか 8 ユーザの理想から始める スピードで驚かす
  2. 01 | なぜ変えるのか 11 具体的な技術構成 / 問題点 • 巨大な1つのモジュール。ルールベースでレイヤーが切られている。 ◦

    ルール違反はPRで指摘するしかない。ルールってなんだっけ? • カスタムApplicationクラスへの依存が多い ◦ テストコードも書きづらいし、容易に循環参照しちゃう • 単体テストがほぼなし ◦ 気楽にリファクタできない • ライブラリなどのバージョンを気楽にあげられない ◦ 上げると思わぬクラッシュ • いろんなアーキテクチャが混在 ◦ HttpClientだけみても、Volley, Ktor, Retrofit2 • EventBusの乱用 ◦ 追いづらい • 属人性のあるコード ◦ レビューで指摘されるのは過去を知らないと書けないやつとか • ABテストの残骸 ◦ 消そうぜ • ViewModelの中でViewを使っちゃてるよ ◦ ・・・
  3. 02 | どのように変えていったか 18 大前提 • 法人向け機能はザ・ビジネス。握ったスケジュールは絶 対。できるだけ速く機能を出して解約させない・獲得確 率を上げたい •

    Androidチームも他のビジネスの実装を進めているし人 数も少ない。誰も頼れない。 • 俺はこのまま実装続けるの嫌だ。絶対アーキテクチャを 変えたい (統一したい) • 俺、法人開発リーダだし責任重大。遅延、ダメ
  4. 02 | どのように変えていったか 20 こう進めた • Androidチームに「法人の新機能で新アーキテクチャを使い たい」と頭出し。一般的に知られている文言でざっくり説明 (抽象的) (MVVM/Databinding/Repositoryとかとか)

    • 2週間ぐらいで実践で使えるレベルのサンプル実装を作成。 一般論だったアイデアを現実の世界に耐えられるレベルま で作成し、Androidチームに合意 • 法人チームは他のメンバーにリーダー業務やiOS開発をで きる部分は委譲 • で、孤独の中で法人の機能の実装開始
  5. 02 | どのように変えていったか 23 結果 • 法人機能はスケジュール通りリリース(休暇取れたよ) • NewsPicksの経験がない外部委託の開発者でも問題なく実装できて いるし、Android経験がない開発者も実装可能に

    • 法人機能以外も新アーキテクチャに移行が決定 • Androidチームが負債解消のため2人 -> 5人体制になる • 採用時に優秀な人を採用しやすくなっている • iOSも技術的負債解消のプロジェクト開始(SwiftUIなど)
  6. 03 | このように変えてます 25 • NewsPicks -> 元々全てのコードが入っていたモジュール。 Applicationクラスだけに依存 するように変更中

    • ui -> UIに関連する全て。Activity,Fragment,ViewModel。ViewModelは全くViewに依存さ せない • infrastructures -> 永続レイヤー。HttpやDBにアクセスする • domains -> ビジネスロジック, ValueObject, EntityなどDDDの考えを取り入れた • マルチモジュール化 • 明確な役割のあるレイヤーで分 割することで依存させるライブラ リを変える • コンパイラーに任せる • 古いコードは一旦legacyモ ジュールに突っ込む • legacyは洗練されてないので無 駄なコードが多い(ビルドが遅 い) • 新コードはlegacy依存がないの でビルドが早い
  7. 03 | このように変えてます 26 • 依存性逆転を容易にしたいので DI導入(Dagger Hilt) • 非同期処理はCoroutines

    Flow • LiveDataは使わない。Coroutinesだけ。(独自クラスでやってるが StateFlowにするかも) • Databindingは、@BindingConversionや@BindingAdapterをフル活用。
  8. 04 | 今後の展望 29 • 新アーキテクチャに移行を進める • テストは必須にして、進化し続けるアーキテクチャを目指す • iOSも同様

    • NewsPicksで技術的ブランドを確立したい • 20%ルールを作る!(役員も合意) • Android / iOS ともに 5名体制を構築のためいろんなタイプの人を積 極採用中 創造性がなければ意味がない 異能は才能