SlideShare a Scribd company logo
1 of 77
Download to read offline
Architecture
vs Product
P E T C U B E E P I C B AT T L E
Dmytro Denysenko
Objective
Objective
To help you.
Objective
To help you. Hopefully.
Prologue
Petcube Android app 2.0+
Petcube Android app 2.0+
✦ Rapidly changing team squad
Petcube Android app 2.0+
✦ Rapidly changing team squad
✦ 3+ years of active development
Petcube Android app 2.0+
✦ Rapidly changing team squad
✦ 3+ years of active development
✦ Startup spirit
Lost battles
Lost battles
✦ Tight coupling
Lost battles
✦ Tight coupling
✦ Spaghetti
Lost battles
✦ Tight coupling
✦ Spaghetti
✦ Callback hell
Lost battles
✦ Tight coupling
✦ Spaghetti
✦ Callback hell
✦ Legacy
War is
not yet
lost
Choosing 

a pattern
Choosing a pattern
Choosing a pattern
✦ Scalable, modular and testable (sic!)
Choosing a pattern
✦ Scalable, modular and testable (sic!)
✦ Dependency Injection
Choosing a pattern
✦ Scalable, modular and testable (sic!)
✦ Dependency Injection
✦ Reactive Programming
Choosing a pattern
✦ Scalable, modular and testable (sic!)
✦ Dependency Injection
✦ Reactive Programming
✦ Control the spreading
Choosing a pattern
MVC, MVP, MVVM
Choosing a pattern
Architecting Android… The clean way?
Why Clean 

Architecture?
Why clean architecture?
Why clean architecture?
✦ Architectural (obviously)
Why clean architecture?
✦ Architectural (obviously)
✦ Layers
Why clean architecture?
✦ Architectural (obviously)
✦ Layers
✦ Dependency rule
Why clean architecture?
✦ Architectural (obviously)
✦ Layers
✦ Dependency rule
✦ Basics
Why clean architecture?
Why clean architecture?
Adoption
process
Adoption process
Adoption process
✦ Communication
Adoption process
✦ Communication
✦ Divide and conquer
Adoption process
✦ Communication
✦ Divide and conquer
✦ KISS
Adoption process
✦ Communication
✦ Divide and conquer
✦ KISS
✦ Packaging
Adoption process
✦ Communication
✦ Divide and conquer
✦ KISS
✦ Packaging
Adoption process
✦ Communication
✦ Divide and conquer
✦ KISS
✦ Packaging
Results
Cons
Cons
✦ Dependency on UseCase implementation
Cons
✦ Dependency on UseCase implementation
✦ RxJava is 3rd party
Cons
✦ Dependency on UseCase implementation
✦ RxJava is 3rd party
✦ Quite a lot of code
Pros
Pros
✦ Code reuse
Pros
✦ Code reuse
✦ Complex flow without callback hell
Pros
✦ Code reuse
✦ Complex flow without callback hell
✦ Presentation separated from business
Pros
✦ Code reuse
✦ Complex flow without callback hell
✦ Presentation separated from business
✦ Evolution
Pros
Before
Pros
After
There
is no
battle
Code time
UseCase.java
public abstract class UseCase<T> {
private final Scheduler mThreadExecutor;
private final Scheduler mPostExecutionThread;
private Subscription mSubscription = Subscriptions.empty();
public UseCase() {
mThreadExecutor = Schedulers.io();
mPostExecutionThread = AndroidSchedulers.mainThread();
}
protected UseCase(@NonNull Scheduler threadExecutor,
@NonNull Scheduler postExecutionThread) { … }
public void execute(Subscriber<T> useCaseSubscriber) {
mSubscription = setupObservable()
.subscribe(useCaseSubscriber);
}
…
}
UseCase.java
…
public void unsubscribe() {
if (!mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
}
}
protected Observable<T> setupObservable() {
return buildUseCaseObservable()
.subscribeOn(mThreadExecutor)
.observeOn(mPostExecutionThread);
}
protected abstract Observable<T> buildUseCaseObservable();
}
GetCurrentUserUseCase.java
GetCurrentUserUseCase.java
class GetCurrentUserUseCase extends UseCase<Profile> {
private final LoginRepository mRepository;
public GetCurrentUserUseCase(@NonNull LoginRepository repository) {
mRepository = repository;
}
@Override
protected Observable<Profile> buildUseCaseObservable() {
return mRepository.getCurrentUser();
}
}
GetUserUseCase.java
GetUserUseCase.java
class GetUserUseCase extends UseCase<User> {
private final UserRepository mRepository;
private long mUserId;
GetUserUseCase(@NonNull UserRepository repository) {
mRepository = repository;
}
void setUserId(@IntRange(from = 1) long userId) {
mUserId = userId;
}
@Override
protected Observable<User> buildUseCaseObservable() {
try {
if (mUserId < 1L) {
throw new IllegalArgumentException("invalid user id: "
+ mUserId);
}
return mRepository.getUser(mUserId);
} finally {
mUserId = 0L;
}
}
}
FriendsPresenter.java
class FriendsPresenter extends BasePresenter<FriendsContract.View>
implements FriendsContract.Presenter {
…
private final Map<Long, Subscriber<User>> mIdSubscribersMap = new HashMap<>();
@Inject
public FriendsPresenter(@NonNull GetUserUseCase getUserUseCase,
@NonNull ErrorHandler errorHandler) {
/* bind params to fields */ }
@Override
public void loadFriend(long userId) {
Subscriber<User> friendSubscriber = mIdSubscribersMap.get(userId);
if (friendSubscriber == null) {
friendSubscriber = new UserSubscriber(userId);
mIdSubscribersMap.put(userId, friendSubscriber);
}
mGetUserUseCase.setUserId(userId);
mGetUserUseCase.execute(friendSubscriber);
}
@Override
public void destroy() {
for (Subscriber<User> subscriber : mIdSubscribersMap.values()) {
subscriber.unsubscribe();
}
mIdSubscribersMap.clear();
super.destroy();
}
…
FriendsPresenter.java
…
private class UserSubscriber extends Subscriber<User> {
private final long mUserId;
private UserSubscriber(long userId) {
mUserId = userId;
}
@Override
public void onCompleted() { /*NOP*/ }
@Override
public void onError(Throwable e) {
Log.e(TAG, "User loading failed, id =" + mUserId, e);
e = mErrorHandler.handleException(e);
getView().showError(e.getMessage());
}
@Override
public void onNext(User user) {
getView().displayFriend(user);
}
}
GetFriendUseCase.java
Friend.java
class Friend {
private final User mUser;
private final List<Petcube> mPetcube;
public Friend(@NonNull User user, @Nullable List<Petcube> petcube) {
mUser = user;
mPetcube = petcube;
}
}
GetFriendUseCase.java
class GetFriendUseCase extends UseCase<Friend> {
private final UserRepository mUserRepository;
private final PetcubeRepository mPetcubeRepository;
private long mUserId;
GetFriendUseCase(@NonNull UserRepository userRepository,
@NonNull PetcubeRepository petcubeRepository) {
mUserRepository = userRepository;
mPetcubeRepository = petcubeRepository;
}
void setUserId(@IntRange(from = 1) long userId) {
mUserId = userId;
}
…
GetFriendUseCase.java
…
@Override
protected Observable<Friend> buildUseCaseObservable() {
try {
if (mUserId < 1L) {
throw new IllegalArgumentException("invalid user id: " + mUserId);
}
return Observable.zip(mUserRepository.getUser(mUserId)
.subscribeOn(Schedulers.io()),
mPetcubeRepository.getPetcubes(mUserId)
.switchIfEmpty(Observable.just(null))
.subscribeOn(Schedulers.io()),
Friend::new);
} finally {
mUserId = 0L;
}
}
GetFriendsStatusesUseCase.java
GetFriendsStatusesUseCase.java
class GetFriendsStatusesUseCase extends UseCase<UserStatus> {
…
private final UserRepository mUserRepository;
private final PublishSubject<UserStatus> mStatusPublishSubject
= PublishSubject.create();
private final Map<Long, Subscription> mSubscriptionsIdMap = new HashMap<>();
…
@Override
protected Observable<UserStatus> buildUseCaseObservable() {
return mStatusPublishSubject.asObservable();
}
…
GetFriendsStatusesUseCase.java
…
void addUserId(final long userId) {
if (mSubscriptionsIdMap.get(userId) == null) {
final Subscription subscription =
Observable.interval(POLLING_DELAY, TimeUnit.SECONDS)
.flatMap(aLong -> mUserRepository.getUserStatus(userId))
.filter(userStatus ->
mSubscriptionsIdMap.containsKey(userStatus.getId()))
.retry()
.distinct()
.timeout(POLLING_TIMEOUT, TimeUnit.SECONDS)
.subscribe(mStatusPublishSubject::onNext, throwable ->
Log.e(TAG, "user status load failed, id = " + userId, throwable));
mSubscriptionsIdMap.put(userId, subscription);
}
}
GetFriendsStatusesUseCase.java
…
void removeUserId(long userId) {
Subscription subscription = mSubscriptionsIdMap.remove(userId);
if (subscription != null) {
subscription.unsubscribe();
}
}
@Override
public void unsubscribe() {
for (Subscription subscription : mSubscriptionsIdMap.values()) {
subscription.unsubscribe();
}
mSubscriptionsIdMap.clear();
super.unsubscribe();
}
Project
evolution
Project evolution
Project evolution
✦ Architecture components
Project evolution
✦ Architecture components
✦ RxJava2
Project evolution
✦ Architecture components
✦ RxJava2
✦ Data Binding
References
Architecting Android… The clean way?
Architecting Android… The evolution
Clean Architecture
Заблуждения Clean Architecture
APK dependency graph
Thanks

More Related Content

What's hot

Reactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureReactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureGyuwon Yi
 
Vaadin 7 Today and Tomorrow
Vaadin 7 Today and TomorrowVaadin 7 Today and Tomorrow
Vaadin 7 Today and TomorrowJoonas Lehtinen
 
Reverse Engineering 안드로이드 학습
Reverse Engineering 안드로이드 학습Reverse Engineering 안드로이드 학습
Reverse Engineering 안드로이드 학습Sungju Jin
 
안드로이드 데이터 바인딩
안드로이드 데이터 바인딩안드로이드 데이터 바인딩
안드로이드 데이터 바인딩GDG Korea
 
The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181Mahmoud Samir Fayed
 
The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84Mahmoud Samir Fayed
 
The Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionThe Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionFITC
 
Sustaining Test-Driven Development
Sustaining Test-Driven DevelopmentSustaining Test-Driven Development
Sustaining Test-Driven DevelopmentAgileOnTheBeach
 
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013Raimundas Banevičius
 
My way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon SpainMy way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon SpainChristian Panadero
 
The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212Mahmoud Samir Fayed
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With RobolectricDanny Preussler
 
Vaadin today and tomorrow
Vaadin today and tomorrowVaadin today and tomorrow
Vaadin today and tomorrowJoonas Lehtinen
 
Vaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-javaVaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-javaJoonas Lehtinen
 

What's hot (18)

Reactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel ArchitectureReactive Model-View-ViewModel Architecture
Reactive Model-View-ViewModel Architecture
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
Vaadin 7 Today and Tomorrow
Vaadin 7 Today and TomorrowVaadin 7 Today and Tomorrow
Vaadin 7 Today and Tomorrow
 
Reverse Engineering 안드로이드 학습
Reverse Engineering 안드로이드 학습Reverse Engineering 안드로이드 학습
Reverse Engineering 안드로이드 학습
 
안드로이드 데이터 바인딩
안드로이드 데이터 바인딩안드로이드 데이터 바인딩
안드로이드 데이터 바인딩
 
The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181
 
The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84
 
My way to clean android V2
My way to clean android V2My way to clean android V2
My way to clean android V2
 
The Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionThe Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework Evolution
 
Sustaining Test-Driven Development
Sustaining Test-Driven DevelopmentSustaining Test-Driven Development
Sustaining Test-Driven Development
 
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013
The Next Step in AS3 Framework Evolution - FITC Amsterdam 2013
 
Mvc express presentation
Mvc express presentationMvc express presentation
Mvc express presentation
 
My way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon SpainMy way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon Spain
 
The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212
 
mvcExpress training course : part1
mvcExpress training course : part1mvcExpress training course : part1
mvcExpress training course : part1
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 
Vaadin today and tomorrow
Vaadin today and tomorrowVaadin today and tomorrow
Vaadin today and tomorrow
 
Vaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-javaVaadin7 modern-web-apps-in-java
Vaadin7 modern-web-apps-in-java
 

Similar to Petcube epic battle: architecture vs product. UA Mobile 2017.

TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java DevelopersYakov Fain
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsDebora Gomez Bertoli
 
How much do we know about Object-Oriented Programming?
How much do we know about Object-Oriented Programming?How much do we know about Object-Oriented Programming?
How much do we know about Object-Oriented Programming?Sandro Mancuso
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)Jose Manuel Pereira Garcia
 
Architecture components - IT Talk
Architecture components - IT TalkArchitecture components - IT Talk
Architecture components - IT TalkConstantine Mars
 
Architecture Components
Architecture Components Architecture Components
Architecture Components DataArt
 
How to code to code less
How to code to code lessHow to code to code less
How to code to code lessAnton Novikau
 
Five android architecture
Five android architectureFive android architecture
Five android architectureTomislav Homan
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaPratama Nur Wijaya
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureAlexey Buzdin
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureC.T.Co
 
Djangocon 2014 angular + django
Djangocon 2014 angular + djangoDjangocon 2014 angular + django
Djangocon 2014 angular + djangoNina Zakharenko
 
Building End-to-End Apps Using Typescript
Building End-to-End Apps Using TypescriptBuilding End-to-End Apps Using Typescript
Building End-to-End Apps Using TypescriptGil Fink
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuningAOE
 
10 ways to make your code rock
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rockmartincronje
 

Similar to Petcube epic battle: architecture vs product. UA Mobile 2017. (20)

TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java Developers
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture components
 
How much do we know about Object-Oriented Programming?
How much do we know about Object-Oriented Programming?How much do we know about Object-Oriented Programming?
How much do we know about Object-Oriented Programming?
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Architecture components - IT Talk
Architecture components - IT TalkArchitecture components - IT Talk
Architecture components - IT Talk
 
Architecture Components
Architecture Components Architecture Components
Architecture Components
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
How to code to code less
How to code to code lessHow to code to code less
How to code to code less
 
Five android architecture
Five android architectureFive android architecture
Five android architecture
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta Indonesia
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Djangocon 2014 angular + django
Djangocon 2014 angular + djangoDjangocon 2014 angular + django
Djangocon 2014 angular + django
 
Clean code
Clean codeClean code
Clean code
 
Building End-to-End Apps Using Typescript
Building End-to-End Apps Using TypescriptBuilding End-to-End Apps Using Typescript
Building End-to-End Apps Using Typescript
 
CDI in JEE6
CDI in JEE6CDI in JEE6
CDI in JEE6
 
Legacy is Good
Legacy is GoodLegacy is Good
Legacy is Good
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
Android development
Android developmentAndroid development
Android development
 
10 ways to make your code rock
10 ways to make your code rock10 ways to make your code rock
10 ways to make your code rock
 

More from UA Mobile

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...UA Mobile
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019UA Mobile
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019UA Mobile
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019UA Mobile
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019UA Mobile
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019UA Mobile
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019UA Mobile
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019UA Mobile
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019UA Mobile
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019UA Mobile
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019UA Mobile
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019UA Mobile
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019UA Mobile
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019UA Mobile
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019UA Mobile
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019UA Mobile
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.UA Mobile
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.UA Mobile
 

More from UA Mobile (20)

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.
 

Petcube epic battle: architecture vs product. UA Mobile 2017.