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

【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門Unity Technologies Japan K.K.
 
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみよう【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみようUnity Technologies Japan K.K.
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説するTaishiYamada1
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介torisoup
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Yoshifumi Kawai
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」U-dai Yokoyama
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話torisoup
 
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装Koji Morikawa
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lttorisoup
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Yuta Matsumura
 
ゲームAIの基礎と事例
ゲームAIの基礎と事例ゲームAIの基礎と事例
ゲームAIの基礎と事例Tomoaki TSUCHIE
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件Grenge, Inc.
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るUnity Technologies Japan K.K.
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
とあるPiXYZの備忘録
とあるPiXYZの備忘録とあるPiXYZの備忘録
とあるPiXYZの備忘録ssuserce29c6
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 

What's hot (20)

【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門
 
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみよう【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lt
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
 
ゲームAIの基礎と事例
ゲームAIの基礎と事例ゲームAIの基礎と事例
ゲームAIの基礎と事例
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
とあるPiXYZの備忘録
とあるPiXYZの備忘録とあるPiXYZの備忘録
とあるPiXYZの備忘録
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 

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設計話