Slide 1

Slide 1 text

アプリ アーキテクチャ概論 @mhidaka 1 ソフトウェア開発におけるアーキテクチャの価値 ηογϣϯ !NIJEBLB ΞϓϦΞʔΩςΫνϟ֓࿦

Slide 2

Slide 2 text

アプリ アーキテクチャ概論 @mhidaka 2 ソフトウェア開発におけるアーキテクチャの価値

Slide 3

Slide 3 text

@mhidaka 日高 正博 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

今日の概要 Main points of my session 6

Slide 7

Slide 7 text

今日、伝えたいこと 7 ・アプリ開発に影響する外的要因 ・Androidアプリにおけるアーキテクチャ選択 ・進化するスタンダードへの追従 ・価値創出の中心になろう

Slide 8

Slide 8 text

はじめに Introduction : background of an application architecture. 8

Slide 9

Slide 9 text

9 CC-BY-SA https://www.flickr.com/photos/arturstaszewski/7048604301/ プロダクトへの貢献

Slide 10

Slide 10 text

プロダクトへの貢献 10 開発者は、どのようなかたちの貢献ができるか プロダクト ソフトウェア開発者

Slide 11

Slide 11 text

プロダクトへの貢献 11 ソフトウェア技術で開発速度に寄与すること。とくにエンジニアの生産 性は現代アプリ開発の大きな課題。スピードは価値へと直結 プロダクト ソフトウェア開発者 生産性の向上

Slide 12

Slide 12 text

アプリケーション開発での生産性 12 生産性を向上させるには? ソフトウェア技術以外の要素のほうが実は影響が大きい チーム 生産性 スキルセット 仕様 ドメイン知識 品質 プラット フォーム 納期 ビジネス 経験 言語 設計 アーキテクチャ

Slide 13

Slide 13 text

技術的背景 プロダクトとソフトウェアのかかわり 13 技術的背景のもと、アーキテクチャが選択される 完全に自由に選べるものではなく、プロダクトごとマッチする選択肢が異なる プラットフォーム アーキテクチャ プログラミング言語 ライブラリ

Slide 14

Slide 14 text

memo 14 エンジニア/チームの生産性が鍵 アーキテクチャは原動力 組織やドメインが強く影響

Slide 15

Slide 15 text

本講演の主眼 15 生産性を最大化するアプローチと、障壁となる課題について ソフトウェアの複雑性を下げるためアーキテクチャを使おう (難しくないというわけではない。課題を整理し、前に進むた めのもの)Androidアプリ開発でのアーキテクチャが何を解決し ようとしているのか、ソフトウェア開発の視点で解説します

Slide 16

Slide 16 text

アプリ開発に影響する外的要因 The first step is always the hardest. 16

Slide 17

Slide 17 text

背景にある要素 ソフトウェアと組織 17 アーキテクチャ選定に掛かる前にアプリ設計は前述のとおり、さま ざまな要因に依存している。とくに組織、ドメインとは密接 アーキテクチャ 組織構造 ドメイン領域 技術選択 プロダクト の前進

Slide 18

Slide 18 text

テクノロジーによる貢献 18 アーキテクチャは勝手には定まらない。ソフトウェアで解決するべき課題が存在する アプリ開発者の貢献 生産性を最大化する意思 思想をソフトウェアに反映 アーキテクチャ・開発手法の選択

Slide 19

Slide 19 text

開発のボトルネックはなにか 19 内的・外的要因のもつライフサイクルの違いが複雑化を呼び おこし、生産性低下の一因になる チームに所属しているエンジニアの異動・スキルセットの濃淡 要件の変更、納期の流動性、継続開発による過去資産の継承 プラットフォーム、ライブラリのバージョン更新への対応

Slide 20

Slide 20 text

20 CC-BY-SA https://www.flickr.com/photos/saverio_domanico/11197540475 アーキテクチャの役割

Slide 21

Slide 21 text

Androidアプリ開発における アーキテクチャ選択 The first step is always the hardest. 22

Slide 22

Slide 22 text

基本的なアーキテクチャ構成:MVVM 23 https://material.io/develop/android/ Fragment ViewModel Repository Data Source

Slide 23

Slide 23 text

これまでのアーキテクチャ選定の歴史 24 無法地帯→アーキテクチャの浸透→モデル・ドメイン分離の発達 God Activity Resources Leek Device Diff Version Diff Lifecycle MVVM AAC Data Bindings MV-*

Slide 24

Slide 24 text

基本的なアーキテクチャ構成 25 Viewへの変更はデータバインディングを経由する。ViewModel がドメイン領域と表示を分離する役割

Slide 25

Slide 25 text

ViewModelはAndroid独特の実装も吸収 26 class PostDetailViewModel(...) : ViewModel() { var commentIds: MutableLiveData> = MutableLiveData() fun showComments() { viewModelScope.launch { val thread = chatRepository.getChatThread(postId) if(thread.success) { commentIds.postValue(thread.comments) } } } override fun onCleared() { super.onCleared() // 後処理 } } Fragument ViewModel Repository Database

Slide 26

Slide 26 text

問題の分割 27 Data Source Repository ViewModel State Operations UI / View Activity Fragment 複雑なアプリケーション構成要素を分解する役割がアーキテクチャ。Android Specific / ResourcesをViewに閉じ込める

Slide 27

Slide 27 text

チームとアーキテクチャ 28 基本的には巨人の肩にのる戦略がコストパフォーマンスがよ い。しかしチーム(組織・技術背景)に依存する要因は残る。 スキルセット チーム構成 既存ライブラリ

Slide 28

Slide 28 text

チームとアーキテクチャ 29 よく開発で議論にあがる課題はDI、RxJavaのような技術要素 の習得コストや利用によるアプリ肥大化、OSバージョンアッ プの負荷など継続的かつ生産性の高い開発体制作り スキルセット チーム構成 既存ライブラリ

Slide 29

Slide 29 text

大規模開発とアーキテクチャ 30 CC-BY-SA https://www.flickr.com/photos/4nitsirk/6451156409

Slide 30

Slide 30 text

大規模開発とアーキテクチャ 31 どうしても…生産性は…おちるんですよ! 長期に渡って利用され、豊かなドメインを持ち、大規模たる組 織構造に支えられている。

Slide 31

Slide 31 text

大規模開発とアーキテクチャ 32 Flux、Reduxといったデータフローを単方向に整えるアーキテ クチャの利用、モジュライズを発達させたアプローチが一般的。

Slide 32

Slide 32 text

Androidアプリのミッシングリング 33 現代的なアプリ開発に適した0→1フェーズが素早く、10や100 に成長できるスケーラブルな設計手法は見つかっていない ・スケーラビリティがほどよく維持されて ・継続的に開発しやすく ・複雑性が増加しにくい

Slide 33

Slide 33 text

進化するスタンダードへの追従 The first step is always the hardest. 34

Slide 34

Slide 34 text

解決への取組:Android Jetpack 35 Googleによるライブラリ集。プ ラットフォームのAPIから独立し、 互換性の維持やボイラープレート の排除、Androidアプリのベスト プラクティスを提供。Play Service API機能の統合も https://developer.android.com/jetpack?hl=ja

Slide 35

Slide 35 text

Androidの分断をライブラリで吸収 36 プラットフォームが提供するAPIはよりソリッドかつ中間表現 にちかい命令的なものへ変化。ライブラリの役割が増加 ドメインなど 重要な要素へ集中 アプリケーション 表示やプラットフォーム依存 Android Specific AppCompat, LifeCycle, Camera

Slide 36

Slide 36 text

エコシステムの変化を生み出す 37 互換性維持やライフサイクル管理もライブラリが隠蔽してくれ るように。単機能提供にとどまらない プラットフォーム アーキテクチャ プログラミング言語 ライブラリの役割が拡大

Slide 37

Slide 37 text

38 CC-BY-SA https://www.flickr.com/photos/46999807@N03/4644884138/ Jetpack Compose

Slide 38

Slide 38 text

より良いアーキテクチャへの挑戦 39 https://developers-jp.googleblog.com/2019/06/whats-new-with-android-jetpack.html Jetpack Compose 新しいUI Toolkit ライブラリ

Slide 39

Slide 39 text

新しいアーキテクチャへの取り組み 40 Jetpack Composeがある場合の解決できる課題 Kotlinで書ける 変化を観測 自動で更新 再利用性の高さ 状態管理 XML不要のシンプルさ 宣言的UI 独立性 ボイラープレートの排除

Slide 40

Slide 40 text

memo 41 Jetpack Composeはpre-α ・まだまだ開発中 ・既存資産が利用できない ・学習コスト

Slide 41

Slide 41 text

設計のギャップをなくす 42 アプリの規模拡大の衝撃を緩和するアーキテクチャへの進化 MVVM → Redux、Flux…からリアクティブプログラミングへのシフト

Slide 42

Slide 42 text

memo 43 アーキテクチャの注意 ・アプリの成長に対応する ・背景が変わることがある ・複雑性の増加を抑え、生産性 を高める運用が不可欠

Slide 43

Slide 43 text

価値創出の中心になろう Flavor text abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg 44

Slide 44

Slide 44 text

アプリケーション開発での生産性 45 ソフトウェア技術でプロダクトの価値向上に寄与すること。 生産性は現代アプリ開発の大きな課題 チーム 生産性 スキルセット 仕様 ドメイン知識 品質 言語 アーキテクチャ プラット フォーム 納期 設計 ビジネス 経験

Slide 45

Slide 45 text

ジャンプ台を作らない 46 ・技術的な変化は随時取り入れていくことが大事 停滞すると最新のものとの乖離が進み、追従が困難に ダメなら戻せるのがソフトウェアの強み CC-BY-SA https://www.flickr.com/photos/plastique/6249087375

Slide 46

Slide 46 text

アーキテクチャを理解する 47 ・取り組んでいる課題について議論する ・今あるアーキテクチャに従うだけではなく理解と活用を。 ・生産性向上のレシピを探して試してみる CC-BY-SA https://www.flickr.com/photos/plastique/6249087375

Slide 47

Slide 47 text

アーキテクチャの選定 48 開発の背景に合わせて最適な選択が異なる • エコシステムに支えられている部分が多いため、標準的手法 であれば失敗は少ない(バグも減る!) • 導入だけでなくプロダクトとの二人三脚で更新するもの • 将来的にはリアクティブプログラミングのパラダイムがくる

Slide 48

Slide 48 text

最新技術が集まるカンファレンス 49

Slide 49

Slide 49 text

Thank You! [email protected] 50