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

Sansan Androidアプリ開発におけるマルチモジュール化の進め方 / Approaches to multi-module development in Sansan Android app

Sansan
January 13, 2022

Sansan Androidアプリ開発におけるマルチモジュール化の進め方 / Approaches to multi-module development in Sansan Android app

■イベント
iOS/Androidアプリ開発のマルチモジュール化【アンドパッド|クックパッド|Sansan】
https://sansan.connpass.com/event/232503/

■登壇概要

タイトル:Sansan Androidアプリ開発におけるマルチモジュール化の進め方

登壇者:技術本部 Mobile Applicationグループ Androidエンジニア 赤城 史哉

▼Sansan Engineering
https://jp.corp-sansan.com/engineering/

Sansan

January 13, 2022
Tweet

More Decks by Sansan

Other Decks in Technology

Transcript

  1. Sansan Androidアプリ開発における マルチモジュール化の進め方 i O S / A n d

    r o i d ア プ リ 開 発 の マ ル チ モ ジ ュ ー ル 化 【 ア ン ド パ ッ ド | ク ッ ク パ ッ ド | S a n s a n 】 Sansan株式会社 技術本部 Mobile Applicationグループ 赤城 史哉
  2. 2

  3. Sansan株式会社とは 名刺管理から、営業を強くする 名刺でつながる、 ビジネスのためのSNS 請求書受領から、 月次決算を加速する 設立年 2007年6月 拠点 表参道本社

    Sansan One Sansan パラシオ 関西支店 福岡支店 名古屋支店 資本金 63億33百万円 (2021年8月31日時点) 代表者 寺田親弘(代表取締役社長) 事業 働き方を変えるDXサービス (クラウド名刺管理サービス等)の 企画・開発・販売 グループ会社 Sansan Global Pte. Ltd. (シンガポール) Sansan Corporation (アメリカ) ログミー株式会社 東京証券取引所市場第一部 上場証券取引所 従業員数 979名(2021年8月31日時点) 3
  4. Sansan – 働き方を変えるDX – 4 新世代エントリーフォーム 新世代パンフレット 全文書き起こしメディア 名寄せエンジン Sansan

    Data Hub ピアボーナスサービス 契約書データ化サービス クラウド請求書受領サービス スマート受付 無人名刺受付システム 名刺作成サービス セミナー管理システム クラウド名刺管理サービス スマート署名取り込み AI名刺管理 オンライン名刺 同僚コラボレーション メール配信 イベント・セミナー 請求書 名刺 契約書 組織コミュニケーション 名刺印刷・発注 データ活用 反社チェックオプション powered by Refinitiv/KYCC 契約管理オプション for クラウドサイン 商談管理オプション for Salesforce アンケートオプション powered by CREATIVE SURVEY powered by MotionBoard 名刺分析オプション 業務連携
  5. - ファイル数 - Kotlin : 約3000ファイル - Xml : 約1000ファイル

    - コード行数(Kotlin) - Kotlin : 約16万行 - Xml : 約5万行 - モジュール数:80モジュール - エンジニア数:7名 - アーキテクチャ:Flux + Clean Architecture Sansanアプリ開発の現状 9
  6. - 開発の大規模化 - 複数人での並列的な機能開発による諸問題 > コンフリクトの増加 > アーキテクチャのルールが守られなくなる懸念 - コードの肥大化による諸問題

    > ビルド時間の増加 > コードの読みづらさ > 改修・調査するファイルの見つけづらさ アプリ開発における課題 11
  7. - 差分ビルドの時間が約半分に - legacyを触るときはまだ遅い - string.xmlやlayoutファイル、Android Manifest等の情報が 機能単位に集約され、見やすい - ノイズが少なく、担当している機能に集中できる

    - internal修飾子による、モノリスより柔軟な可視性の制御 - モジュール追加のタイミングで、アーキテクチャのレイヤーが 守られる事を担保 マルチモジュール化の恩恵 13
  8. :legacy :repository :data:repository_impl :data:local :data:network :resources :xx_util :router :domain :feature:bizcard

    :feature :company :feature :company_common Sansanアプリ開発の現状:マルチモジュールの構造 15 :app 全てのモジュールに依存 Daggerによる依存性の解決を行う
  9. :app :legacy :repository :data:repository_impl :data:local :data:network :resources :xx_util :router :domain

    :feature:bizcard :feature :company :feature :company_common Sansanアプリ開発の現状:マルチモジュールの構造 16 :legacy :feature:bizcard :feature :company :feature :company_common Presentationレイヤー Activity, Flux etc… Featureは画面・機能に切り分け
  10. :legacy :repository :data:repository_impl :data:local :data:network :resources :xx_util :router :domain :feature:bizcard

    :feature :company :feature :company_common :app Sansanアプリ開発の現状:マルチモジュールの構造 17 Domainレイヤー その他各featureモジュール が共通して使うクラス :repository :resources :xx_util :router :domain
  11. :legacy :repository :data:repository_impl :data:local :data:network :resources :xx_util :router :domain :feature:bizcard

    :feature :company :feature :company_common :app Sansanアプリ開発の現状:マルチモジュールの構造 18 Dataレイヤー SharedPreference, Retrofit など を取り扱う実装 Presentationレイヤーから 直接依存されない :data:repository_impl :data:local :data:network
  12. :legacy :repository :data:repository_impl :data:local :data:network :resources :xx_util :router :domain :feature:bizcard

    :feature :company :feature :company_common :app Sansanアプリ開発の現状:マルチモジュールの構造 19 実態は、featureがdataレイヤーを参照していたり、 その他のモジュールも存在していて複雑。こちらは基本的なコンセプト。 このコンセプトにそう実態になるよう、日々改修している。
  13. - STEP 1 : domainのみを分離 - STEP 2 : data関連のモジュールを分離

    - STEP 3 : UI関連のコードをlegacyに移動 - STEP 4 : Repository, Routerのinterfaceを切る - STEP 5 : UIのコードを機能ごとに分割 マルチモジュール化の5ステップ 21
  14. STEP5 : UIのコードを機能ごとに分割 :app :legacy 27 :data:local :data:network :resources :xx_util

    :domain :router :repository :data:repository_impl :feature :bizcard_common :feature :company :feature:bizcard
  15. STEP5 : UIのコードを機能ごとに分割(完成形) :app 28 :data:local :data:network :resources :xx_util :domain

    :router :repository :data:repository_impl :feature :company_common :feature :company :feature:bizcard :feature:piyo :feature:hoge :feature:fuga
  16. - モジュールの切り方が分からない - 作成方法のドキュメントを用意しておく - モジュールの切る粒度 - 都度議論して方向修正していく - 新規開発でのモジュールの切り方、モジュール名の付け方

    - 開発時に、詳細設計レビューを実施している。 その際にモジュール設計もレビューする モジュール化の認識をチームで合わせる必要性 31
  17. - 今までのセクションは、あくまでSansan Androidアプリ固有の話 - 様々な開発現場のシチュエーションを想像して、マルチモジュール機能を どのように使うか、考えてみましょう! - Twitterで #ANDPAD_cookpad_Sansan タグをつけて

    @ginyolith_tech の アカウントでツイートするので、同じくタグを付けて、お題に対する回答 を引用リツイートお願いします! - 経験豊富な方は初心者時代の自分と同じような人を助ける気持ちで、 マルチモジュール初心者の方は自分で考えるトレーニングとして、 ぜひツイートしてください! このセクションについて 43
  18. - エンジニアの人数:2~3人(あなた + 中堅エンジニア2, 3人) - 半年程度でアプリを完成させ納品する契約 - 要件やデザインは決まっており、これから技術選定する段階 -

    納期には多少余裕がありそう - 納品した後は大きなアップデートの予定は無い バグ修正程度の依頼がちょくちょく来る想定 開発現場2 中規模な受託開発案件 46
  19. - エンジニアの人数:4人(あなた + ベテラン、中堅、ジュニア各1) - 技術的負債が大きく、新機能の開発に工数がかかるのを解消したい - コードベースが大きくなっており、ビルド時間がかかるのがストレス - 最近はアーキテクチャを導入してきれいなコードになっているが、

    一部の昔のコードはFat Activityなどつらいコードが存在する - 定期的に新機能の開発を行っている - アーキテクチャやライブラリなどを刷新する計画が立っている。 その技術選定を考えるフェーズ 開発現場3 中規模な事業会社でのリアーキテクチャ 48
  20. - 計画的にマルチモジュール化に向き合ったほうが良い - アーキテクチャを考え直すのとセットで向き合うと良い - モノリス -> モジュール化は工数が結構かかるので注意 - featureモジュールも作ったほうが良い

    - 機能開発と並行してモジュール化をする場合 - ビルド速度に関しては、即時の対応としてマシンスペックを上げるのも手 > M1Macだと大分変わる 開発現場3 自分の考え 49
  21. エンジニア情報サイト「Sansan Engineering」 51 ・Sansanエンジニアのミッション ・プロダクト、テクノロジー概要 ・エンジニアインタビュー ・技術スタック ・働く環境、社内制度 ・募集職種 ・Blog

    ・イベント情報 ... and more Sansan Engineering Sansanのプロダクトやテクノロジー、カルチャー、採用情報など、エンジニアリングに関するあらゆる情報を掲載 https://jp.corp-sansan.com/engineering/