Toggle your app
Евгений Кривобоков
О чем поговорим?
11 млн установок
20+ Android разработчиков
70+ pull request’ов в неделю
370+ KLOC (Kotlin + Java)
2
Как мы добавляем код?
Зачем и что отключать?
Как тестируем?
Как разогнать релизный цикл?
3
А что важно?
Стабильность решений
Code review
Удобство при разработке
4
А что важно?
Стабильность решений
Code review
Удобство при разработке
5
А что важно?
Стабильность решений
Code review
Удобство при разработке
6
А что важно?
Стабильность решений
Code review
Удобство при разработке
7
Как мы добавляем код?
8
feature
develop
Как мы добавляем код?
9
feature N
feature 1
develop
…
Как мы добавляем код?
10
feature N
feature 1
develop
…
Feature toggles
( feature switch, feature flag, conditional
feature, etc.) 

11
Feature toggles
( feature switch, feature flag, conditional
feature, etc.) 



Изменение поведения без изменения кода
12
С чего начать?
val useNewFlow = false
if (useNewFlow) {
startNewFlow()
} else {
startLegacyFlow()
}
13
Toggle router
interface Features {
val isNewFlowEnabled: Boolean
val isNewGalleryEnabled: Boolean
val isWallpapersEnabled: Boolean
// ...
}
14
Самый простой способ
if (features.isWallpapersEnabled) {

wallpaper.visibility = VISIBLE

}
15
Изоляция решений
fun openGallery() {
val intent = if (features.isNewGalleryEnabled){
intentFactory.internalGalleryIntent()
} else {
intentFactory.systemGalleryIntent()
}
startActivity(intent)
}
16
Изоляция решений
fun openGallery() {
val intent = if (isNewGallerySupported()){
intentFactory.internalGalleryIntent()
} else {
intentFactory.systemGalleryIntent()
}
startActivity(intent)
}
17
@Provides
fun providePresenter(features: Features): Presenter {
return if (features.isNewFlowEnabled) {
NewFlowPresenter()
} else {
OldFlowPresenter()
}
}
18
Инверсия решений
Feature
interface Feature<out T> {
val description: String
val value: T
val key: String
}
19
Toggle router
interface Features {
val isNewFlowEnabled: Feature<Boolean>
val newAdvice: Feature<String>
val apiUri: Feature<Uri>
// ...
20
Как мы добавляем код?
Зачем и что отключать?
Как тестируем?
Как разогнать релизный цикл?
21
Нестабильные решения
22
merge
Нестабильные решения
23
Можно релизить Баги?
Нестабильные решения
24
2. Изменения
1. Добавление
4. Удаление
Можно релизить
3. Включение
Эксперименты
A/B тесты
Ранние релизы
25
Конфликтующие изменения в API
26
iOS
Android
/1/parameters
Конфликтующие изменения в API
27
iOS
Android
/2/parameters
Конфликтующие изменения в API
28
iOS
Android
/?/parameters
Конфликтующие изменения в API
iOS
Android
X-Features
29
/?/parameters
Как мы добавляем код?
Зачем и что отключать?
Как тестируем?
Как разогнать релизный цикл?
30
Как тестируем?
31
feature
develop
Как тестируем?
32
feature N
feature 1
develop
…
MutableFeature<T>: Feature<T> {
override var value: T
val originalValue: T
Отладочный экран
Какие состояния проверяем?
Независимость переключателей
Значение по умолчанию
Резервное копирование
34
Какие состояния проверяем?
Независимость переключателей
Значение по умолчанию
Резервное копирование
35
Какие состояния проверяем?
Независимость переключателей
Значение по умолчанию
Резервное копирование
36
Какие состояния проверяем?
Независимость переключателей
Значение по умолчанию
Резервное копирование
37
Как мы добавляем код?
Зачем что-то отключать?
Как мы тестируем?
Как разогнать релизный цикл?
38
Непрерывная доставка
Ценность для пользователя
Возможна ли в принципе?
Что мешает?
Как приближаемся?
39
Публикация или доставка?
40
master
Стабилизация
Что попало в сборку?
41
Что попало в сборку?
APK
42
Fix Version/s: ?
Что попало в сборку?
{
"key":"suggest"
"value":true
}
43
APK
report
Toggle Key:
suggest
Итоги
Обмен кодом, небольшие pull request’ы
Упрощаем тестирование
Можем отключать фичи
Приближаемся к непрерывной доставке
44
Переключи свой подход!
ekrivobokov@avito.ru- Feature Toggles - Martin Fowler
Что почитать?

Toggle your app