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

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

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

ko2ic

May 19, 2021
Tweet

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名体制を構築のためいろんなタイプの人を積 極採用中 創造性がなければ意味がない 異能は才能