SlideShare a Scribd company logo
1 of 59
Download to read offline
Toggle your app
Евгений Кривобоков
12 млн установок
20+ Android разработчиков
70+ pull request’ов в неделю
370+ KLOC (Kotlin)
2
Проблемы большого приложения
Жизнь одной фичи
Тестирование
Разгоняем релизный цикл
3
Рост команд
4
Design Development QA
Кросс-функциональные команды
5
Design
Team Team
Development
QA
Как фичи попадают в приложение?
6
merge
Как фичи попадают в приложение?
7
Можно выпускать?
Как фичи попадают в приложение?
8
Можно выпускать Баги?
Точка
невозврата
Как фичи попадают в приложение?
9
Можно выпускать?
Feature toggles
( feature switch, feature flag, conditional feature, etc.) 

10
Feature toggles


Изменение поведения без изменения кода*
11
( feature switch, feature flag, conditional feature, etc.) 

12
Проблемы большого приложения
Жизнь одной фичи
Тестирование
Разгоняем релизный цикл
13
Time to market
14
Team
Team
Team
Team
…
release train
Публикация или доставка
15
Team
Team
Team
Team
…
release train
отключены
“While feature toggles are a valuable tool in the box,
they are a second-best option. 

The best thing to do with such features is to find a
way to gradually release them into production as you
are building them”
16
Martin Fowler
Жизнь одной фичи
17
ИзмененияДобавление
переключателя
Удаление
переключателя
Включение
…
Добавление переключателя
Технический долг: плата за гибкость
Планировать удаление
18
Простейший способ
val useNewFlow = false
if (useNewFlow) {
startNewFlow()
} else {
startLegacyFlow()
}
19
Простейший способ
val useNewFlow = false
if (useNewFlow) {
startNewFlow()
} else {
startLegacyFlow()
}
20
отключен по умолчанию
Toggle router
interface Features {
val isNewFlowEnabled: Boolean
val isNewGalleryEnabled: Boolean
val isWallpapersEnabled: Boolean
// ...
}
21
Feature
interface Feature<out T> {
val value: T
// metadata
22
Feature
interface Feature<out T> {
val value: T
val description: String
val key: String
// ...
23
Описание для
тестировщиков
Уникальный
идентификатор
Toggle router
interface Features {
val isNewFlowEnabled: Feature<Boolean>
val newAdvice: Feature<String>
val apiUri: Feature<Uri>
// ...
24
Самый простой способ
if (features.isWallpapersEnabled) {

wallpaper.visibility = VISIBLE

}
25
Изоляция решений
fun openGallery() {
val intent = if (features.isNewGalleryEnabled){
intentFactory.internalGalleryIntent()
} else {
intentFactory.systemGalleryIntent()
}
startActivity(intent)
}
26
Изоляция решений
fun openGallery() {
val intent = if (isNewGallerySupported()){
intentFactory.internalGalleryIntent()
} else {
intentFactory.systemGalleryIntent()
}
startActivity(intent)
}
27
Инверсия решений
@Provides
fun providePresenter(features: Features): Presenter {
return if (isNewFlowEnabled()) {
NewFlowPresenter()
} else {
OldFlowPresenter()
}
}
28
Branch by abstraction
29
Client
Client
Client
Supplier
Branch by abstraction
30
Client
Client
Client
Supplier
Abstraction
layer
Branch by abstraction
31
Client
Client
Client
Supplier
Abstraction
layer
Branch by abstraction
32
Client
Client
Client
Supplier
Abstraction
layer
New
Supplier
Включение
Experimental toggle
Release toggle
33
Эксперименты
A/B тесты
Ранние релизы
34
Конфликтующие изменения в API
35
iOS
Android
/1/parameters
Конфликтующие изменения в API
36
iOS
Android
/2/parameters
Конфликтующие изменения в API
37
iOS
Android
/?/parameters
Линейность версионирования API
38
1 2 3
/v/path/to/resource
…
Публикация состояния
iOS
Android
Features
39
/1/parameters
Публикация состояния
class FeaturesInterceptor(…) : Interceptor {



override fun intercept(chain: Interceptor.Chain): Response {

…

headers.add("Features", buildFeaturesHeader())

…

return chain.proceed(request)

}



}
40
Публикация состояния
interface Feature<out T> {
// ...
val apiToggleKey: String?
41
Удаление переключателя
Избавляемся от тех. долга
42
Проблемы большого приложения
Жизнь одной фичи
Тестирование
Разгоняем релизный цикл
43
Как тестировать?
44
feature N
feature 1
develop
…
Отладочный экран
MutableFeature<T>: Feature<T> {
override var value: T
val originalValue: T
}
Изменяемые значения
47
Юнит тесты
@Test

fun `get intent - routes to profile items - updated user adverts is disabled`() {

features.givenFeatureDisabled { updatedUserAdverts }



val intent = factory.createUserAdvertsIntent()



intent.assertHasComponent<ProfileItemsActivity>()

}



@Test

fun `get intent - routes to user adverts - updated user adverts is enabled`() {

features.givenFeatureEnabled { updatedUserAdverts }



val intent = factory.createUserAdvertsIntent()



intent.assertHasComponent<UserAdvertsActivity>()

}
48
Юнит тесты
@Test

fun `get intent - routes to profile items - updated user adverts is disabled`() {

features.givenFeatureDisabled { updatedUserAdverts }



val intent = factory.createUserAdvertsIntent()



intent.assertHasComponent<ProfileItemsActivity>()

}



@Test

fun `get intent - routes to user adverts - updated user adverts is enabled`() {

features.givenFeatureEnabled { updatedUserAdverts }



val intent = factory.createUserAdvertsIntent()



intent.assertHasComponent<UserAdvertsActivity>()

}
49
Юнит тесты: взаимное влияние
val features = Features()
50
Юнит тесты: взаимное влияние
val features = Features()
@Mock
lateinit var features: Features
51
Юнит тесты: взаимное влияние
fun getToggleCases() = arrayOf(...)



@Test

@Parameters(method = "getToggleCases")

fun `...`(case: ToggleCase) { … }
52
UI тесты
@Test

fun deliveryButton_isDisplayed_deliveryIsActivated() {

givenToggleEnabled { delivery }



screen.start()



deliveryButton.isVisible()

}



@Test

fun deliveryButton_isNotDisplayed_deliveryIsDeactivated() {

givenToggleDisabled { delivery }



screen.start()



deliveryButton.isNotVisible()

}
53
Проблемы большого приложения
Жизнь одной фичи
Тестирование
Разгоняем релизный цикл
54
Непрерывная доставка
Ценность для пользователя
Возможна ли в принципе?
Что мешает?
Как приближаемся?
55
Что попало в сборку?
56
Что попало в сборку?
APK
57
• Fix Version: ?
• Affects version: ?
• …
{
"key":"suggest"
"value":true
}
Что попало в сборку?
58
report Toggle Key:
Deploy
service
suggest
Итоги
Непрерывная интеграция кода
Небольшие pull request’ы
Приближаемся к непрерывной доставке
59

More Related Content

What's hot

Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)
DataArt
 
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
ISsoft
 
Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platform
chashnikov
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Nikita Lipsky
 

What's hot (6)

Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)
 
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
 
Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platform
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Team workflow
Team workflowTeam workflow
Team workflow
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 

Similar to Toggle your app 2.0 (AppsConf)

Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...
jazzteam
 
IT-шная история игрушек или feature-driven тестирование в действии
IT-шная история игрушек или feature-driven тестирование в действииIT-шная история игрушек или feature-driven тестирование в действии
IT-шная история игрушек или feature-driven тестирование в действии
Gleb Rybalko
 
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Rinat Shaikhutdinov
 

Similar to Toggle your app 2.0 (AppsConf) (20)

Toggle your app
Toggle your appToggle your app
Toggle your app
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspb
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Комфортная разработка мобильных проектов
Комфортная разработка мобильных проектовКомфортная разработка мобильных проектов
Комфортная разработка мобильных проектов
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
DEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровьDEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровь
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
Qt tool evaluation
Qt tool evaluationQt tool evaluation
Qt tool evaluation
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
IT-шная история игрушек или feature-driven тестирование в действии
IT-шная история игрушек или feature-driven тестирование в действииIT-шная история игрушек или feature-driven тестирование в действии
IT-шная история игрушек или feature-driven тестирование в действии
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia Redunova
 
Алексей Рыбак (Badoo)
Алексей Рыбак (Badoo)Алексей Рыбак (Badoo)
Алексей Рыбак (Badoo)
 
Доклад Алексея Рыбака на Whalerider 2013. Эволюция разработки в Badoo.
Доклад Алексея Рыбака на Whalerider 2013. Эволюция разработки в Badoo.Доклад Алексея Рыбака на Whalerider 2013. Эволюция разработки в Badoo.
Доклад Алексея Рыбака на Whalerider 2013. Эволюция разработки в Badoo.
 
DevOps для 1С
DevOps для 1СDevOps для 1С
DevOps для 1С
 
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
 
CI/CD with Fastlane and Telegram
CI/CD with Fastlane and TelegramCI/CD with Fastlane and Telegram
CI/CD with Fastlane and Telegram
 
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentMobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
 

Toggle your app 2.0 (AppsConf)