SlideShare una empresa de Scribd logo
1 de 67
Architecture Components
Build your app right way and enjoy IT! :)
Constantine Mars
Team Lead, Senior Developer @ DataArt
#gdg_kharkiv_center
Android Has “Good Bones”
Components:
-Activities
-Fragments
-Services
-Content Providers
-Broadcast Receivers
#gdg_kharkiv_center
But… There are Everyday Problems to Solve
App-hopping
OS may kill app at random time
App components lifecycle is not under control
Components should not depend on each other
Can’t rely on data, stored in components
#gdg_kharkiv_center
Simply related to Activity Lifecycle
#gdg_kharkiv_center
Common Principles for staying in the mind :)
-Separation of concerns
-Provide solid user experience
-Keep UI lean and simple
-Keep UI free of app logic
-Drive UI from model
-Use persistent model
-Assign clear responsibilities for each model class
#gdg_kharkiv_center
Focus on Separation of Concerns...
image from fernandocejas.com
#gdg_kharkiv_center
Consider Clean Architecture approach...
image from fernandocejas.com
#gdg_kharkiv_center
Remember Good Architecture Goals...
-Modular app
-Each class responsible for one well-defined function
-Should be no god objects
-The app should be testable
#gdg_kharkiv_center
And Finally - Android Recommended Architecture
#gdg_kharkiv_center
Android Recommended Architecture. Another View
image from Guide to App Architecture
#gdg_kharkiv_center
Be together. not the same
#gdg_kharkiv_center
Be together. not the same
“It is impossible to have one way of writing apps that will be the best for every
scenario. That being said, this recommended architecture should be a good
starting point for most use cases. If you already have a good way of writing
Android apps, you don't need to change.”
Quote from Guide to App Architecture
Architecture Components
Building blocks
#gdg_kharkiv_center
Views = UI Controllers = LifecycleOwners
Purpose: Display data and pass on UI events
Neither contain the UI data, nor directly manipulate
data
Examples: Activity, Fragment
#gdg_kharkiv_center
LifecycleActivity, LifecycleFragment
After the lifecycles API in the Architecture Components
becomes stable, the Fragment class in the Android
Support Library will implement LifecycleOwner
#gdg_kharkiv_center
ViewModel
Data holder for Activity/Fragment
Survives configuration changes
NEVER references View / Activity / Fragment
#gdg_kharkiv_center
public class DetailActivityViewModel extends ViewModel {
private WeatherEntry mWeather;
public DetailActivityViewModel() {}
public WeatherEntry getWeather() { return mWeather; }
public void setWeather(WeatherEntry weatherEntry) { mWeather = weatherEntry; }
}
ViewModel
extend ViewModel
#gdg_kharkiv_center
ViewModel and Lifecycle
#gdg_kharkiv_center
public class DetailActivity extends LifecycleActivity {
DetailActivityViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
viewModel = ViewModelProviders.of(this).get(DetailActivityViewModel.class);
}
...
ViewModel and LifecycleOwner
Provider
#gdg_kharkiv_center
LiveData
Represent data needed for the UI to display
An observable data holder
Lifecycle aware
Automatic subscription management
#gdg_kharkiv_center
LiveData event propagation
#gdg_kharkiv_center
LiveData sample implementation
#gdg_kharkiv_center
public class DetailActivityViewModel extends ViewModel {
private MutableLiveData<WeatherEntry> mWeather;
public DetailActivityViewModel() {}
public MutableLiveData<WeatherEntry> getWeather() {
return mWeather;
}
public void setWeather(WeatherEntry weatherEntry) {
mWeather.postValue(weatherEntry);
}
}
Live Data
LiveData
#gdg_kharkiv_center
public class DetailActivity extends LifecycleActivity {
DetailActivityViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
viewModel = ViewModelProviders.of(this).get(DetailActivityViewModel.class);
viewModel.getWeather().observe(this, weatherEntry -> {
if(weatherEntry!=null) { bindWeatherToUI(weatherEntry); }
});
}
Live Data observing
Observe
#gdg_kharkiv_center
Repository
-Single source of truth
-ViewModels simply request
data from the repository
-Is a mediator between the
different data sources
image from fernandocejas.com
#gdg_kharkiv_center
Remote Network Data Source
Manages data from a remote
data source, such as the
internet
May use REST, Cloud
#gdg_kharkiv_center
Model
Manages local data stored in
the database
#gdg_kharkiv_center
Layered architecture pattern
Each class in the diagram only
stores a reference to the class
or classes directly "below it" and
not any classes above it
Room
ORooM :)
#gdg_kharkiv_center
Room?
#gdg_kharkiv_center
Room ORM purposes
-Less boilerplate compared to the built-in APIs
-Compile-time validation of SQL queries
-Data observation via LiveData, RxJava
#gdg_kharkiv_center
Room annotations
-@Entity
-@Dao
-@Database
#gdg_kharkiv_center
@Entity
#gdg_kharkiv_center
@Entity(tableName = "weather",
indices = {@Index(value = {"date"}, unique = true)})
public class WeatherEntry {
@PrimaryKey(autoGenerate = true)
private int id;
…
}
@Entity declaration
#gdg_kharkiv_center
//Room constructor
public WeatherEntry(int id, int weatherIconId, Date date, ...) {
//Json constructor - ignored by Room
@Ignore
public WeatherEntry(int weatherIconId, Date date,
// (!) Only one constructor should be exposed to Room
...
@Entity constructors
#gdg_kharkiv_center
@Dao
#gdg_kharkiv_center
@Dao
public interface WeatherDao {
@Query("SELECT * FROM weather") List<WeatherEntry> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(WeatherEntry... weatherEntries);
@Delete void delete(WeatherEntry weatherEntry);
}
@Dao declaration
#gdg_kharkiv_center
@Database
#gdg_kharkiv_center
@Database(entities = {WeatherEntry.class}, version = 1)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {
public abstract WeatherDao weatherDao();
}
@Database declaration
#gdg_kharkiv_center
private static final String DATABASE_NAME = "weather";
private static final Object LOCK = new Object();
private static volatile AppDatabase sInstance;
public static AppDatabase getInstance(Context context) {
if (sInstance == null) { synchronized (LOCK) {
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, AppDatabase.DATABASE_NAME).build();
}
}}
return sInstance;
}
@Database - a singleton
#gdg_kharkiv_center
class DateConverter {
@TypeConverter
public static Date toDate(Long timestamp) {
return timestamp == null ? null : new Date(timestamp);
}
@TypeConverter
public static Long toTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
Type converters
#gdg_kharkiv_center
Alternatives
Repository
Single source of trust
#gdg_kharkiv_center
public class WeatherRepository {
public synchronized static WeatherRepository getInstance();
public synchronized void initializeData();
private void deleteOldData();
private boolean isFetchNeeded();
private void startFetchWeatherService();
}
Repository pattern
#gdg_kharkiv_center
mWeatherNetworkDataSource = weatherNetworkDataSource;
LiveData<WeatherEntry[]> networkData =
mWeatherNetworkDataSource.getCurrentWeatherForecasts();
networkData.observeForever(newForecastsFromNetwork -> {
mExecutors.diskIO().execute(() -> {
mWeatherDao.bulkInsert(newForecastsFromNetwork);
Log.d(LOG_TAG, "New values inserted");
});
});
Repository - fetch data from network
Get and observe
#gdg_kharkiv_center
private WeatherNetworkDataSource(Context context, AppExecutors executors)
{
mContext = context;
mExecutors = executors;
mDownloadedWeatherForecasts = new
MutableLiveData<WeatherEntry[]>();
}
Repository - use LiveData
LiveData
#gdg_kharkiv_center
private boolean isFetchNeeded() {
Date today = CustomDateUtils.getNormalizedUtcDateForToday();
int count = mWeatherDao.countAllFutureWeather(today);
return (count < WeatherNetworkDataSource.NUM_DAYS);
}
Check when to fetch
#gdg_kharkiv_center
public synchronized void initializeData() {
if (mInitialized) return;
mInitialized = true;
mExecutors.diskIO().execute(() -> {
if (isFetchNeeded()) {
startFetchWeatherService();
}
});
}
Check when to fetch
Check if fetch needed
#gdg_kharkiv_center
Display the data
#gdg_kharkiv_center
public class DetailActivity extends LifecycleActivity {
DetailActivityViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
viewModel = ViewModelProviders.of(this).get(DetailActivityViewModel.class);
viewModel.getWeather().observe(this, weatherEntry -> {
if(weatherEntry!=null) { bindWeatherToUI(weatherEntry); }
});
}
And again - observe LiveData
Testing
Sneak peek :)
#gdg_kharkiv_center
UI Controller - Instrumentation
#gdg_kharkiv_center
ViewModel - JUnit
#gdg_kharkiv_center
Repository - JUnit, MockWebServer
Latest updates
From Alpha to Beta
#gdg_kharkiv_center
September - October updates
October 5, 2017 - Beta 2
- improved LiveDataReactiveStreams,
- FullLifecycleObserver for Java 8,
- Handling @Query methods with @NonNull annotations,
- Still requires proguard settings to keep android.arch.lifecycle.GeneratedAdapter
1.0.0 Alpha 9-1
- Support Library 26.1.0, AppCompatActivity and Support Fragment now implement the
LifecycleOwner interface
- LifecycleActivity & LifecycleFragment are now deprecated
- New Library: Paging
#gdg_kharkiv_center
Paging Library
- DataSource,
- PagedList
- PagedListAdapter
- KeyedDataSource if you need to use data from item N-1 to load item N
- TiledDataSource
- LivePagedListProvider
#gdg_kharkiv_center
Paging Library - Annotations on DAO
@Query("select * from users WHERE age > :age order by name DESC, id ASC")
TiledDataSource<User> usersOlderThan(int age);
@Query("SELECT * from users order WHERE age > :age order by name DESC, id ASC")
public abstract LivePagedListProvider<Integer, User> usersOlderThan(int age);
#gdg_kharkiv_center
Paging Library - flow
Almost there...
Scalability
#gdg_kharkiv_center
Typical questions
What if...
I use RxJava?
I already have MVP?
I love Kotlin?
I’m working on legacy project?
#gdg_kharkiv_center
The Answer is...
#gdg_kharkiv_center
What to read :)
Guide to App Architecture https://developer.android.com/topic/libraries/architecture/guide.html
Architecture Components
https://developer.android.com/topic/libraries/architecture/index.html
I/O ‘17 Architecture Components Introduction - https://youtu.be/FrteWKKVyzI
Solving the Lifecycle Problem - https://youtu.be/bEKNi1JOrNs
Persistence and Offline - https://youtu.be/MfHsPGQ6bgE
Architecture Components on GDD Europe - https://youtu.be/Ts-uxYiBEQ8
GDD Europe CodeLabs g.co/codelabs/gdd17
Google Github samples https://github.com/googlesamples/android-architecture-components
#gdg_kharkiv_center
Alternatives to consider
Moxy https://github.com/Arello-Mobile/Moxy
Mosby https://github.com/sockeqwe/mosby
Android MVP Helper https://github.com/Ufkoku/AndroidMVPHelper
Clean Architecture https://github.com/android10/Android-CleanArchitecture
Reark https://github.com/reark/reark
MVP + Dagger2 + Rx https://android.jlelse.eu/mvp-dagger-2-rx-clean-modern-android-app-
code-74f63c9a6f2f
Architecture the Lost Years by Uncle Bob https://youtu.be/WpkDN78P884
#gdg_kharkiv_center
Where to go :)
#gdg_kharkiv_center
Where to go :)
Constantine Mars
@ConstantineMars
+ConstantineMars
Thank you!
Q&A Mobile Architecture Club

Más contenido relacionado

La actualidad más candente

ヘルスケアサービスを実現する最新技術 〜HealthKit・GCP + Goの活用〜
ヘルスケアサービスを実現する最新技術  〜HealthKit・GCP + Goの活用〜ヘルスケアサービスを実現する最新技術  〜HealthKit・GCP + Goの活用〜
ヘルスケアサービスを実現する最新技術 〜HealthKit・GCP + Goの活用〜
DeNA
 

La actualidad más candente (13)

Effective Android Data Binding
Effective Android Data BindingEffective Android Data Binding
Effective Android Data Binding
 
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
 
ヘルスケアサービスを実現する最新技術 〜HealthKit・GCP + Goの活用〜
ヘルスケアサービスを実現する最新技術  〜HealthKit・GCP + Goの活用〜ヘルスケアサービスを実現する最新技術  〜HealthKit・GCP + Goの活用〜
ヘルスケアサービスを実現する最新技術 〜HealthKit・GCP + Goの活用〜
 
ヘルスケアサービスを実現する最新技術
〜HealthKit・GCP+Go〜
ヘルスケアサービスを実現する最新技術
〜HealthKit・GCP+Go〜ヘルスケアサービスを実現する最新技術
〜HealthKit・GCP+Go〜
ヘルスケアサービスを実現する最新技術
〜HealthKit・GCP+Go〜
 
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaTesting Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJava
 
Modern Android Architecture
Modern Android ArchitectureModern Android Architecture
Modern Android Architecture
 
My way to clean android V2
My way to clean android V2My way to clean android V2
My way to clean android V2
 
Interoperable Component Patterns
Interoperable Component PatternsInteroperable Component Patterns
Interoperable Component Patterns
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Advancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and GesturesAdvancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and Gestures
 
Android Architecture Components - Guy Bar on, Vonage
Android Architecture Components - Guy Bar on, VonageAndroid Architecture Components - Guy Bar on, Vonage
Android Architecture Components - Guy Bar on, Vonage
 
Android Architecture Components
Android Architecture ComponentsAndroid Architecture Components
Android Architecture Components
 
From iOS to Android
From iOS to AndroidFrom iOS to Android
From iOS to Android
 

Similar a Architecture components, Константин Марс, TeamLead, Senior Developer, DataArt

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
martincronje
 
Thomas braun dependency-injection_with_robo_guice-presentation-final
Thomas braun dependency-injection_with_robo_guice-presentation-finalThomas braun dependency-injection_with_robo_guice-presentation-final
Thomas braun dependency-injection_with_robo_guice-presentation-final
Droidcon Berlin
 
Mobile Software Engineering Crash Course - C04 Android Cont.
Mobile Software Engineering Crash Course - C04 Android Cont.Mobile Software Engineering Crash Course - C04 Android Cont.
Mobile Software Engineering Crash Course - C04 Android Cont.
Mohammad Shaker
 
Use Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDEUse Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDE
Benjamin Cabé
 
MobileCity:Core Data
MobileCity:Core DataMobileCity:Core Data
MobileCity:Core Data
Allan Davis
 

Similar a Architecture components, Константин Марс, TeamLead, Senior Developer, DataArt (20)

Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
 
Architecture components - IT Talk
Architecture components - IT TalkArchitecture components - IT Talk
Architecture components - IT Talk
 
Architecture Components
Architecture Components Architecture Components
Architecture Components
 
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
Comment développer une application mobile en 8 semaines - Meetup PAUG 24-01-2023
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Command Query Responsibility Segregation and Event Sourcing
Command Query Responsibility Segregation and Event SourcingCommand Query Responsibility Segregation and Event Sourcing
Command Query Responsibility Segregation and Event Sourcing
 
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
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
 
Advanced android app development
Advanced android app developmentAdvanced android app development
Advanced android app development
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Stmik bandung
Stmik bandungStmik bandung
Stmik bandung
 
Thomas braun dependency-injection_with_robo_guice-presentation-final
Thomas braun dependency-injection_with_robo_guice-presentation-finalThomas braun dependency-injection_with_robo_guice-presentation-final
Thomas braun dependency-injection_with_robo_guice-presentation-final
 
Mobile Software Engineering Crash Course - C04 Android Cont.
Mobile Software Engineering Crash Course - C04 Android Cont.Mobile Software Engineering Crash Course - C04 Android Cont.
Mobile Software Engineering Crash Course - C04 Android Cont.
 
Clean Architecture @ Taxibeat
Clean Architecture @ TaxibeatClean Architecture @ Taxibeat
Clean Architecture @ Taxibeat
 
Use Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDEUse Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDE
 
MobileCity:Core Data
MobileCity:Core DataMobileCity:Core Data
MobileCity:Core Data
 
OpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConOpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheCon
 
Home Improvement: Architecture & Kotlin
Home Improvement: Architecture & KotlinHome Improvement: Architecture & Kotlin
Home Improvement: Architecture & Kotlin
 
Modern Android app library stack
Modern Android app library stackModern Android app library stack
Modern Android app library stack
 
CQRS and Event Sourcing
CQRS and Event SourcingCQRS and Event Sourcing
CQRS and Event Sourcing
 

Más de Alina Vilk

Al around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
Al around ML 2017, Оксана Савенко, студентка НТУ имени КаразинаAl around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
Al around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
Alina Vilk
 
Кирилл Безпалый, .NET Developer, Ciklum
Кирилл Безпалый, .NET Developer, CiklumКирилл Безпалый, .NET Developer, Ciklum
Кирилл Безпалый, .NET Developer, Ciklum
Alina Vilk
 
Александр Сергиенко, Senior Android Developer, DataArt
Александр Сергиенко, Senior Android Developer, DataArtАлександр Сергиенко, Senior Android Developer, DataArt
Александр Сергиенко, Senior Android Developer, DataArt
Alina Vilk
 

Más de Alina Vilk (20)

Designer in you, Irina Shapoval, Lead Designer, DataArt
Designer in you, Irina Shapoval, Lead Designer, DataArtDesigner in you, Irina Shapoval, Lead Designer, DataArt
Designer in you, Irina Shapoval, Lead Designer, DataArt
 
.NET framework vs .net core 3.1 commons &amp; differences
 .NET framework vs .net core 3.1  commons &amp; differences .NET framework vs .net core 3.1  commons &amp; differences
.NET framework vs .net core 3.1 commons &amp; differences
 
Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)
 
"Dev to PM" D.Fedotov
"Dev to PM" D.Fedotov"Dev to PM" D.Fedotov
"Dev to PM" D.Fedotov
 
Игорь Литвиненко (Senior iOS- и Android-разработчик,DataArt)
Игорь Литвиненко (Senior iOS- и Android-разработчик,DataArt)Игорь Литвиненко (Senior iOS- и Android-разработчик,DataArt)
Игорь Литвиненко (Senior iOS- и Android-разработчик,DataArt)
 
Алексей Рыбаков (Senior Engineer,Technical Evangelist DataArt )
Алексей Рыбаков (Senior Engineer,Technical Evangelist DataArt ) Алексей Рыбаков (Senior Engineer,Technical Evangelist DataArt )
Алексей Рыбаков (Senior Engineer,Technical Evangelist DataArt )
 
Ирина Шаповал,(Lead UI/UX дизайнер, DataArt)
Ирина Шаповал,(Lead UI/UX дизайнер, DataArt)Ирина Шаповал,(Lead UI/UX дизайнер, DataArt)
Ирина Шаповал,(Lead UI/UX дизайнер, DataArt)
 
Devops, v.02, Alexander Pavlenko (DataArt)
Devops, v.02, Alexander Pavlenko (DataArt)Devops, v.02, Alexander Pavlenko (DataArt)
Devops, v.02, Alexander Pavlenko (DataArt)
 
O DevOps, Stanislav Kolenkin ( DataArt)
O DevOps, Stanislav Kolenkin ( DataArt)O DevOps, Stanislav Kolenkin ( DataArt)
O DevOps, Stanislav Kolenkin ( DataArt)
 
Interactive 3D graphics for web with three.js, Andrey Vedilin, DataArt
Interactive  3D graphics for web with three.js, Andrey Vedilin, DataArtInteractive  3D graphics for web with three.js, Andrey Vedilin, DataArt
Interactive 3D graphics for web with three.js, Andrey Vedilin, DataArt
 
Al around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
Al around ML 2017, Оксана Савенко, студентка НТУ имени КаразинаAl around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
Al around ML 2017, Оксана Савенко, студентка НТУ имени Каразина
 
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
 
Кирилл Безпалый, .NET Developer, Ciklum
Кирилл Безпалый, .NET Developer, CiklumКирилл Безпалый, .NET Developer, Ciklum
Кирилл Безпалый, .NET Developer, Ciklum
 
Игорь Леонтьев, Lead Architect on all Blockchain projects of Viseo group
Игорь Леонтьев, Lead Architect on all Blockchain projects of Viseo groupИгорь Леонтьев, Lead Architect on all Blockchain projects of Viseo group
Игорь Леонтьев, Lead Architect on all Blockchain projects of Viseo group
 
Александр Сергиенко, Senior Android Developer, DataArt
Александр Сергиенко, Senior Android Developer, DataArtАлександр Сергиенко, Senior Android Developer, DataArt
Александр Сергиенко, Senior Android Developer, DataArt
 
Евгений Дубовик, Senior Developer, DataArtDb presentation gdg
Евгений Дубовик, Senior Developer, DataArtDb presentation gdgЕвгений Дубовик, Senior Developer, DataArtDb presentation gdg
Евгений Дубовик, Senior Developer, DataArtDb presentation gdg
 
Дмитрий Козицкий,Lead UX / UI Designer, DataArt
Дмитрий Козицкий,Lead UX / UI Designer, DataArtДмитрий Козицкий,Lead UX / UI Designer, DataArt
Дмитрий Козицкий,Lead UX / UI Designer, DataArt
 
Игорь Юзовицкий,UX Expert, DataArt
Игорь Юзовицкий,UX Expert, DataArtИгорь Юзовицкий,UX Expert, DataArt
Игорь Юзовицкий,UX Expert, DataArt
 
Android Things, Alexey Rybakov, Technical Evangelist, DataArt
Android Things, Alexey Rybakov, Technical Evangelist, DataArtAndroid Things, Alexey Rybakov, Technical Evangelist, DataArt
Android Things, Alexey Rybakov, Technical Evangelist, DataArt
 
«Делегирование как идеальный способ угробить проект», Александр Ивахненко, IT...
«Делегирование как идеальный способ угробить проект», Александр Ивахненко, IT...«Делегирование как идеальный способ угробить проект», Александр Ивахненко, IT...
«Делегирование как идеальный способ угробить проект», Александр Ивахненко, IT...
 

Último

Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
KarakKing
 

Último (20)

Kodo Millet PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
Kodo Millet  PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...Kodo Millet  PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
Kodo Millet PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
 
Unit 3 Emotional Intelligence and Spiritual Intelligence.pdf
Unit 3 Emotional Intelligence and Spiritual Intelligence.pdfUnit 3 Emotional Intelligence and Spiritual Intelligence.pdf
Unit 3 Emotional Intelligence and Spiritual Intelligence.pdf
 
Sensory_Experience_and_Emotional_Resonance_in_Gabriel_Okaras_The_Piano_and_Th...
Sensory_Experience_and_Emotional_Resonance_in_Gabriel_Okaras_The_Piano_and_Th...Sensory_Experience_and_Emotional_Resonance_in_Gabriel_Okaras_The_Piano_and_Th...
Sensory_Experience_and_Emotional_Resonance_in_Gabriel_Okaras_The_Piano_and_Th...
 
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
 
Towards a code of practice for AI in AT.pptx
Towards a code of practice for AI in AT.pptxTowards a code of practice for AI in AT.pptx
Towards a code of practice for AI in AT.pptx
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and Modifications
 
Application orientated numerical on hev.ppt
Application orientated numerical on hev.pptApplication orientated numerical on hev.ppt
Application orientated numerical on hev.ppt
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
 
Graduate Outcomes Presentation Slides - English
Graduate Outcomes Presentation Slides - EnglishGraduate Outcomes Presentation Slides - English
Graduate Outcomes Presentation Slides - English
 
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfUGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
 
Fostering Friendships - Enhancing Social Bonds in the Classroom
Fostering Friendships - Enhancing Social Bonds  in the ClassroomFostering Friendships - Enhancing Social Bonds  in the Classroom
Fostering Friendships - Enhancing Social Bonds in the Classroom
 
Sociology 101 Demonstration of Learning Exhibit
Sociology 101 Demonstration of Learning ExhibitSociology 101 Demonstration of Learning Exhibit
Sociology 101 Demonstration of Learning Exhibit
 
On National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan FellowsOn National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan Fellows
 
How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
 
Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...
 
Wellbeing inclusion and digital dystopias.pptx
Wellbeing inclusion and digital dystopias.pptxWellbeing inclusion and digital dystopias.pptx
Wellbeing inclusion and digital dystopias.pptx
 
Interdisciplinary_Insights_Data_Collection_Methods.pptx
Interdisciplinary_Insights_Data_Collection_Methods.pptxInterdisciplinary_Insights_Data_Collection_Methods.pptx
Interdisciplinary_Insights_Data_Collection_Methods.pptx
 

Architecture components, Константин Марс, TeamLead, Senior Developer, DataArt