SlideShare a Scribd company logo
1 of 89
Download to read offline
失敗から学ぶ設計話
~Android編~
chigichan24
Android ロボットは、Google が作成および提供している作品から複製または変更したものであり、
Creative Commons 3.0 Attribution ライセンスに記載された条件に従って使用しています。
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
今日の話
Android版 iOS版
https://github.com/cyder
• 端的にいうと
• 同じルームに入った人と動画を同期して再生する.
• 動画を見ながらコメントすることができる.
• 誰でも入れるルームの作成,人気ルームのサジェストなど.
• Androidだけ先行でリリースしていた,iOSをリリース
するタイミングでAndroidの技術的負債を一気に改修
(回収)したかった.
• 機能追加が常にアドホックで命懸け(?)な状態から
いつ不幸にもバズっても運用できるように.
A lot of Problems
Copy and Paste
No external Library
Fat Activity
Smart UI
Null Pointer Exception
Mysterious Bug
No ViewModel
No Architecture
Broken naming convention
Broken directory partition
No Repository
Java
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
• ジェンガ論
• 地盤の段階(ジェンガの下の層)がゆるゆるだと,機能追加や
改修(ジェンガの上に新しく置く操作)はつらい.ジェンガが
崩れる可能性(プロジェクト終了のお知らせ)を秘めている.
• 逆に基盤をしっかり作っていれば(下の層がきっちり積まれて
いれば),機能追加が少々荒くなっても(上の層に繁雑にジェ
ンガを置いても)しばらくは耐えられる.
一から書き直す必要があると判断
どういう構成にしよう
🤔
様々なアーキテクチャやライブラリ,思想論
いろいろありすぎ
とても困った
MVC
MVP
MVVM
Flux
Redux
AAC
The	Clean	
Architecture
DDD
SOLID
Jetpack
Hexagonal
Architecture
Onion
Architecture
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
様々なアーキテクチャやライブラリ,思想論
いろいろありすぎ
とても困った
MVC
MVP
MVVM
Flux
Redux
AAC
The	Clean	
Architecture
DDD
SOLID
Jetpack
Hexagonal
Architecture
Onion
Architecture
VIPER
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
MVC
• Model-View-Controller
• rails,ios projectとかがデフォルトで使ってるやつ.
• アプリに実装しようとするといろいろ厄介.
• 全体的に密結合になる.(Controllerの肥大化)
• Androidに適用しようとするとActivityはControllerなの?
Viewなの?あれれ...ってなる.
View
Controller
Model
MVP
• Model-View-Presenter
• 方向を単一方向にする.
• ViewとActivity,Fragmentが対応する.
• PresenterではViewに依存する処理はinterfaceとしてもらう.
• データの更新等の処理はModelに投げる.
• ViewではPresenterのメソッドを呼ぶ.
View Presenter Model
MVPの雰囲気(iOS × Swift)
protocol HogeView: class {
func updateLabel(text: String)
}
final class HogeViewController: UIViewController, HOGEView {
@IBOutlet private weak var labels: UILabel!
@IBOutlet private weak var button: UIButton!
private lazy var presenter = HogePresenter()
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(presenter,
action: #selector(presenter.changeText), for: .touchUpInside)
}
func updateLabel(text: String) {
label.text = text
}
}
MVPの雰囲気(iOS × Swift)
final class HogePresenter {
private weak var view: HogeView
func changeText() {
// ここからmodelをいじりに行く
view.updateLabel()
}
}
Presenterが生のViewへの参照を持つのは危なすぎるので,
適宜機能制限した BaseViewClassを継承するべき.
MVPの問題点
Presenterがviewを持っていて何やらかされるか分からない.
MVVM
• Model-View-ViewModel
• MVPと似た構造をしているが,ViewとViewModelは
databindingで双方向につながっている.
• databindingとは?
• protocolやinterfaceでcallback的に層を繋げず,
通知を流す仕組み.viewへの参照を持たない!!!
• Android : databinding,ButterKnife,KotterKnife
• ios : RxSwift,Bond
• C# : WPFにおけるxamlとかの仕組み
View ViewModel Model
↑
databinding
Flux
Action Dispatcher Store View
Action
• Flux
• MV *ではデータの流れに双方向性があって大変だった問題を
解決した.js由来.
• 一方向にデータが流れ,Dispatcherで様々な振り分ける.
• (現在FluxアーキテクチャでAndroidアプリ作ってるので作り
上げたら感想がわかりそう)
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
アーキテクチャ思想のキモ
• 変更への強さ
• 層の数はそれぞれだが,達成したいことは変更に強いこと!
• 層の分離はテスタビリティの向上
• 層で分離できる ≈ 層をmockにしてテストができる.
変更への強さ
偉い人
旧アーキテクチャ編
変更への強さ
あのAPIのレスポンス
ちょっと変えます
偉い人
旧アーキテクチャ編
変更への強さ
あのAPIのレスポンス
ちょっと変えます
偉い人
え!
UIと直接紐付いてるか
ら変更は至難の業だ
旧アーキテクチャ編
怖い話
昔のアーキテクチャであった怖い話
昔のアーキテクチャであった怖い話
• 1 画面1 API( 1 エンドポイント )しか叩けない
• なぜそんな設計をしたのか...
• ごりごり実装メインでやっていたらこうなった.
昔のアーキテクチャであった怖い話
• 1 画面1 API( 1 エンドポイント )しか叩けない
• なぜそんな設計をしたのか...
• ごりごり実装メインでやっていたらこうなった.
• 使い回しできそうなコードが全部コピペによって生成
されている.
• 抽象化して...
• 全部に対して変更があったらどうするの...
昔のアーキテクチャであった怖い話
• 1 画面1 API( 1 エンドポイント )しか叩けない
• なぜそんな設計をしたのか...
• ごりごり実装メインでやっていたらこうなった.
• 使い回しできそうなコードが全部コピペによって生成
されている.
• 抽象化して...
• 全部に対して変更があったらどうするの...
• 謎のマジックナンバーによって管理されるfragment
• それfragmentの表示順かえるのでも一苦労やで...
The Clean Architecture
Android10CoderのMVPによる解説
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
設計原則
• このことばが正しいのかはちょっと怪しい.
• 設計手法や実装していく上でのルールの話.
• DDDではドメインの世界観をきちんときめてそれを体
現するコードを書く.
• SOLID原則はコード実装時のルール
SyncPodという世界観を作っているもの(Entity)はなにか?
Chatなの?,Roomなの?,Videoなの?,Userなの?
これらの関係は?,なにがValueObjectなの?
取り入れた例
publicなmethod名とユビキタス言語を紐付ける.
fun post_to_hoge( )とかはありえない.
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
ごっちゃになってるので整理する
設計パターン
MVC
MVP
MVVM
Flux
Redux
AAC Jetpack
ライブラリ群
DDD SOLID
設計原則
The	Clean	
Architecture
Hexagonal
Architecture
Onion
Architecture
アーキテクチャ思想
さて,どういう構成にしよう
🤔
MVVM + The Clean Architecture
• 超最新トレンドから一歩引いた感じに落ち着いた.
• 使用技術としてやりたかったことはまだまだいろいろあった.
• MVVMは実装コストや学習コストは高いが最も堅牢
• MVPにしてもよかったが,可能な限りviewの要素と
切り離したいという思い.
• Clean Architectureに載せることで依存を解消
• レイヤー化の恩恵は大きい
• 今後様々な変更があることを加味して変更に強く!
• 適宜SOLIDやDDDの原則を適用(code reviewで共有)
• エンジニア間で意識・アプリの世界観を共有.
主な使用技術
with KotlinRxJava(RxAndroid,RxKotlin)
Dagger2
DI Container Jetpack
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
構成図
例外的に
呼んでる時ある.
View
ViewModel
Repository
SyncPodApi SyncPodWsApi SharedPreference
databinding
I
I II
I
Interface(抽象)に依存するようにする
… Interface Class
method	call
method	call
stream
stream
… method call
… stream
MVVM的には
View
ViewModel
Repository
SyncPodApi SyncPodWsApi SharedPreference
I
I II
View
ViewModel
Model
基本的には
設計・実装時のポイント①
• PresenterをViewModelとしてViewとbind
• StreamはViewModelまで流れてそれより上はdatabinding
• UseCaseをなくした.
• 設計時にUseCaseの存在の意味を見いだせなかった.
• ViewModelが直接Repository参照して大丈夫でしょ(?)
• 抽象に依存する.
• 依存関係逆転の法則(DIP)
• DI Containerのdagger2で解決
• ViewとViewModelは1対1で.
• Viewでは基本的に何も操作しない(smartUIにならないように)
設計・実装時のポイント②
• Rxの型としてObservableは使わない.
• 意味がわかりにくくなるので,Single,Compleatable,
Flowableのみに.
• むやみにFlowable使ったら👊
• ViewModelで使うメソッド名はユーザー目線(ユビキタ
ス言語で表現できるもの)に
• websocketを扱う部分もなんとかstreamに.
• そういうライブラリが存在しないので,websocketでのレス
ポンス(listenerで取る形)を全部Rxのstreamに書き直す.
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
良かった点👍
• 機能追加が楽
怖い話
リリース初日で機能追加決定
リリース初日で機能追加決定
• コードをどう書くべきか
はすぐに思いつく.
• ちょっとデザイン考える
のがしんどいかなー.
• 一週間あれば確実に問題
ないし,
ロジックは1時間くらい
で実装できた.
Android
リリース初日で機能追加決定
• コードをどう書くべきか
はすぐに思いつく.
• ちょっとデザイン考える
のがしんどいかなー.
• 一週間あれば確実に問題
ないし,
ロジックは1時間くらい
で実装できた.
• あああああああああああ
あああああああああああ
あああああああああああ
あああああああああああ
ああああ
• もうどうせ汚いコードだ
ししょうがないやろ(最悪
Android iOS
良かった点👍
• 機能追加が楽
良かった点👍
• 機能追加が楽
• 身をもって体感.
良かった点👍
• 機能追加が楽
• 身をもって体感.
• 新しいメンバーがjoinしやすい
• ファイルごとの役割を明確にしているので
どこに何を書くのかがはっきりしている.
良かった点👍
• 機能追加が楽
• 身をもって体感.
• 新しいメンバーがjoinしやすい
• ファイルごとの役割を明確にしているので
どこに何を書くのかがはっきりしている.
• Kotlinで書いてるからJavaの呪いから開放されている.
良かった点👍
• 機能追加が楽
• 身をもって体感.
• 新しいメンバーがjoinしやすい
• ファイルごとの役割を明確にしているので
どこに何を書くのかがはっきりしている.
• Kotlinで書いてるからJavaの呪いから開放されている.
• 意味不明なバグも起きなくなった.
• バグ数,クラッシュ数が明らかに減った!!!
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
悪かった点👎
• UseCaseをやっぱり作るべきだった.
設計・実装時のポイント①
• PresenterをViewModelとしてViewとbind
• StreamはViewModelまで流れてそれより上はdatabinding
• UseCaseをなくした.
• 設計時にUseCaseの存在の意味を見いだせなかった.
• ViewModelが直接Repository参照して大丈夫でしょ(?)
• 抽象に依存する.
• 依存関係逆転の法則(DIP)
• DI Containerのdagger2で解決
• ViewとViewModelは1対1で.
• Viewでは基本的に何も操作しない(smartUIにならないように)
設計・実装時のポイント①
• PresenterをViewModelとしてViewとbind
• StreamはViewModelまで流れてそれより上はdatabinding
• UseCaseをなくした.
• 設計時にUseCaseの存在の意味を見いだせなかった.
• ViewModelが直接Repository参照して大丈夫でしょ(?)
• 抽象に依存する.
• 依存関係逆転の法則(DIP)
• DI Containerのdagger2で解決
• ViewとViewModelは1対1で.
• Viewでは基本的に何も操作しない(smartUIにならないように)
自分でやってるやん...
UseCaseが無い問題
• Repositoryパターンの肥大化 & やることが多い.
• このパターンではそもそもデータのソースを考えず
CQRS操作ができるようにするべき.
UseCaseが無い問題
• Repositoryパターンの肥大化 & やることが多い.
• このパターンではそもそもデータのソースを考えず
CQRS操作ができるようにするべき.
Repository
UseCase
command,queryを投げる
データソースを吸収して, →
上に流すだけ
データを加工する.
ビジネスロジックを委ねる.→
よしなにデータを取ってくる
悪かった点👎
• UseCaseをやっぱり作るべきだった.
• Clean Architectureは正しいなあと痛感.
• Repositoryは肥大化してしまっている.
悪かった点👎
• UseCaseをやっぱり作るべきだった.
• Clean Architectureは正しいなあと痛感.
• Repositoryは肥大化してしまっている.
• ライブラリの選定をミスった.
ライブラリ選定の話
ライブラリ選定の話
リリース直後はAndroid 6.0未満の端末では動かなかった
😱
ライブラリ選定の話
• websocketを扱うために使っていたライブラリの
バグだと判明.
• ライブラリは全然整備されていない.
• star 1で,一年近くなにも更新されていない.
ライブラリ選定の話
• websocketを扱うために使っていたライブラリの
バグだと判明.
• ライブラリは全然整備されていない.
• star 1で,一年近くなにも更新されていない.
ライブラリの選定はコミュニティの活発度を見よう!
悪かった点👎
• UseCaseをやっぱり作るべきだった.
• Clean Architectureは正しいなあと痛感.
• Repositoryは肥大化してしまっている.
• ライブラリの選定をミスった.
• 活発なものを選ぼう!
• Androidバージョン違いで起きるバグを事前に検証しよう!
悪かった点👎
• UseCaseをやっぱり作るべきだった.
• Clean Architectureは正しいなあと痛感.
• Repositoryは肥大化してしまっている.
• ライブラリの選定をミスった.
• 活発なものを選ぼう!
• Androidバージョン違いで起きるバグを事前に検証しよう!
• DIコンテナで(dagger)で無理やり依存関係を作ってい
る.
• なるべく疎になるようにしよう.
悪かった点👎
• UseCaseをやっぱり作るべきだった.
• Clean Architectureは正しいなあと痛感.
• Repositoryは肥大化してしまっている.
• ライブラリの選定をミスった.
• 活発なものを選ぼう!
• Androidバージョン違いで起きるバグを事前に検証しよう!
• DIコンテナで(dagger)で無理やり依存関係を作ってい
る.
• なるべく疎になるようにしよう.
• MVVMの限界を感じた
MVVMの限界問題
• SnackBarやToast(下からポップアップで出るような通
知バー)は,本来viewmodelで作るべきだがこれらを作
るのにviewが必要.
• callback的にやることで解決.
←設計のバイブル本でも
むずいと言ってるので多分むずい
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
Agenda
• SyncPodについて
• 改修の理由
• 様々なアーキテクチャの紹介
• 使用技術
• 構成について
• 良かった点
• 悪かった点
• 最後に
最後に
最後に
• いろんな事を考え成功・失敗したが大事なことはエン
ジニア・プランナー・利用者のことを考えて設計する
こと.
• 無理に高尚なアーキテクチャを使ったからといっていい結果
になるとは限らない.
最後に
• いろんな事を考え成功・失敗したが大事なことはエン
ジニア・プランナー・利用者のことを考えて設計する
こと.
• 無理に高尚なアーキテクチャを使ったからといっていい結果
になるとは限らない.
• ここで改善点を生かしてiOSを絶賛リファクタ中.
最後に
• いろんな事を考え成功・失敗したが大事なことはエン
ジニア・プランナー・利用者のことを考えて設計する
こと.
• 無理に高尚なアーキテクチャを使ったからといっていい結果
になるとは限らない.
• ここで改善点を生かしてiOSを絶賛リファクタ中.
• 開発にも活かせることをたくさん学んだ.
最後に
• いろんな事を考え成功・失敗したが大事なことはエン
ジニア・プランナー・利用者のことを考えて設計する
こと.
• 無理に高尚なアーキテクチャを使ったからといっていい結果
になるとは限らない.
• ここで改善点を生かしてiOSを絶賛リファクタ中.
• 開発にも活かせることをたくさん学んだ.
• でも何より,動いているコードは偉い.リスペクトを.
昨日
• 類似アプリが見つかって絶望してた
ネイティブでの設計の知見を生かして
インターンもまだまだがんばります!
おわり

More Related Content

What's hot

リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?Yoshitaka Kawashima
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Yuya Yamaki
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンKentaro Yoshida
 
脱 Excel設計書
脱 Excel設計書脱 Excel設計書
脱 Excel設計書rai
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込むYoshiki Hayama
 
ユーザーストーリーの分割
ユーザーストーリーの分割ユーザーストーリーの分割
ユーザーストーリーの分割Arata Fujimura
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計de:code 2017
 
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方naoto teshima
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
나의 이직 이야기
나의 이직 이야기나의 이직 이야기
나의 이직 이야기종립 이
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得Reimi Kuramochi Chiba
 
いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンYuta Matsumura
 

What's hot (20)

リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
脱 Excel設計書
脱 Excel設計書脱 Excel設計書
脱 Excel設計書
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
ユーザーストーリーの分割
ユーザーストーリーの分割ユーザーストーリーの分割
ユーザーストーリーの分割
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
 
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
나의 이직 이야기
나의 이직 이야기나의 이직 이야기
나의 이직 이야기
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
 
いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターン
 

Similar to 失敗から学ぶAndroid設計話

Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Kazumi IWANAGA
 
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境Kazumi IWANAGA
 
勘違いだらけのAndroid UIデザイン
勘違いだらけのAndroid UIデザイン勘違いだらけのAndroid UIデザイン
勘違いだらけのAndroid UIデザインNobuya Sato
 
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」Kenichi Yoshida
 
ALMツールたべくらべ
ALMツールたべくらべALMツールたべくらべ
ALMツールたべくらべKaoru NAKAMURA
 
Droidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceDroidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceKenichi Kambara
 
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!Kazumi IWANAGA
 
XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08孝文 田村
 
Chromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはChromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはgoccy
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!Masaki Muranaka
 
うちの開発におけるXD利用法
うちの開発におけるXD利用法うちの開発におけるXD利用法
うちの開発におけるXD利用法Kazuma Sekiguchi
 
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!Kazumi IWANAGA
 
Google io2011報告
Google io2011報告Google io2011報告
Google io2011報告cat kaotaro
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発日本マイクロソフト株式会社
 
Php Conference 2012 concrete5
Php Conference 2012 concrete5Php Conference 2012 concrete5
Php Conference 2012 concrete5Hishikawa Takuro
 
Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Masakazu Muraoka
 
Unity/CSharp 1 - pptx
Unity/CSharp 1 - pptxUnity/CSharp 1 - pptx
Unity/CSharp 1 - pptxtagawakiyoshi
 

Similar to 失敗から学ぶAndroid設計話 (20)

Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
 
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
 
勘違いだらけのAndroid UIデザイン
勘違いだらけのAndroid UIデザイン勘違いだらけのAndroid UIデザイン
勘違いだらけのAndroid UIデザイン
 
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」
姫路IT系勉強会「ADB接続でかんたんフィジカルコンピューティング」
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
ALMツールたべくらべ
ALMツールたべくらべALMツールたべくらべ
ALMツールたべくらべ
 
Inside Android N
Inside Android NInside Android N
Inside Android N
 
Droidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceDroidcon London2012 Speaker Experience
Droidcon London2012 Speaker Experience
 
Unity ゲーム開発
Unity ゲーム開発Unity ゲーム開発
Unity ゲーム開発
 
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
GitHub Codespaces が拡げる開発環境、いつでもどこでも Visual Studio Code で!
 
XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08XamarinStudio勉強会 2014/09/08
XamarinStudio勉強会 2014/09/08
 
Chromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するにはChromeでストレージ永続化を実現するには
Chromeでストレージ永続化を実現するには
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
うちの開発におけるXD利用法
うちの開発におけるXD利用法うちの開発におけるXD利用法
うちの開発におけるXD利用法
 
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
 
Google io2011報告
Google io2011報告Google io2011報告
Google io2011報告
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
Php Conference 2012 concrete5
Php Conference 2012 concrete5Php Conference 2012 concrete5
Php Conference 2012 concrete5
 
Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1
 
Unity/CSharp 1 - pptx
Unity/CSharp 1 - pptxUnity/CSharp 1 - pptx
Unity/CSharp 1 - pptx
 

失敗から学ぶAndroid設計話