Feature toggles
в «Сбербанк Онлайн»
Алексей Ульенков,
«Сбербанк Технологии»
Владелец продукта «Платформа
Сбербанк Онлайн на iOS» и lead developer
Facebook: https://www.facebook.com/
alexey.ulenkov.3
Telegram: @alexulenkov
Feature Toggle
Что это?
Что это?
•Некий объект
Что это?
•Некий объект
•Отвечает за изменение поведения
приложения
Что это?
•Некий объект
•Отвечает за изменение поведения
приложения
•Может быть как локальным, так и
полученным с бэкенда
Зачем?
Зачем?
•Персонализация приложения для
клиента
Зачем?
•Персонализация приложения для
клиента
•Раскатка фичи на бэке и фронте
Зачем?
•Персонализация приложения для
клиента
•Раскатка фичи на бэке и фронте
•Изоляция неготового кода
Зачем?
•Персонализация приложения для
клиента
•Раскатка фичи на бэке и фронте
•Изоляция неготового кода
•AB тесты
Gatekeeping
Gatekeeping
Gatekeeping
•Feature toggles управляемы с бэка
Gatekeeping
•Feature toggles управляемы с бэка
•Персонализация приложения
Gatekeeping
•Feature toggles управляемы с бэка
•Персонализация приложения
•Фазовая «раскатка»
Что такое релизный
поезд и почему это
важно?
Релизный поезд
Релизный поезд
•Непрерывная поставка продукта
Релизный поезд
•Непрерывная поставка продукта
•Релизы следуют друг за другом
Релизный поезд
•Непрерывная поставка продукта
•Релизы следуют друг за другом
•Интервалы раз в 6 недель
Релизный поезд
•Непрерывная поставка продукта
•Релизы следуют друг за другом
•Интервалы раз в 6 недель
•Хотим перейти на релизы раз 2
неделе
Рельсы для поезда
Рельсы для поезда
•Фича не доделана
Рельсы для поезда
•Фича не доделана
•Она не попадет в релиз
Рельсы для поезда
•Фича не доделана
•Она не попадет в релиз
•Но как это сделать, если часть кода
уже написана?
Варианты?
Варианты?
•Версионирование модулей
Варианты?
•Версионирование модулей
•Dev toggles
Developers toggles
Dev toggles
Dev toggles
•Локальный объект
Dev toggles
•Локальный объект
•Не управляется с сервера
Dev toggles
•Локальный объект
•Не управляется с сервера
•Хранится в конфигурации
приложения
Dev toggles
•Локальный объект
•Не управляется с сервера
•Хранится в конфигурации
приложения
•Управляет переключением поведения
приложения
Изменение процесса
• Каждая новая фича закрывается переключателем
• Переключатель не снимается до выпуска фича в Пром
• После успешного запуска создается таск на Dead Code
• Переключатель удаляется из конфигурации, удаляется
неиспользуемый код
Плюсы
Плюсы
•Можно доставлять неготовый код в
ПРОМ
Плюсы
•Можно доставлять неготовый код в
ПРОМ
•Переключать поведение можно в
рантайме
Плюсы
•Можно доставлять неготовый код в
ПРОМ
•Переключать поведение можно в
рантайме
•Доступно для тестировщиков
Плюсы
•Можно доставлять неготовый код в
ПРОМ
•Переключать поведение можно в
рантайме
•Доступно для тестировщиков
•Прозрачный процесс включения в
сборку новых фич
Минусы
Минусы
•Изменение процесса разработки
Минусы
•Изменение процесса разработки
•Дублирование кода
Минусы
•Изменение процесса разработки
•Дублирование кода
•Постоянная работа с техдолгом
Немного кода
Особенности
Особенности
• Все наши модули - это фреймворки
Особенности
• Все наши модули - это фреймворки
• Умеют общаться с приложением по определенному
протоколу
Особенности
• Все наши модули - это фреймворки
• Умеют общаться с приложением по определенному
протоколу
• Мы заводим plist с переключателями в каждом
фреймворке
Особенности
• Все наши модули - это фреймворки
• Умеют общаться с приложением по определенному
протоколу
• Мы заводим plist с переключателями в каждом
фреймворке
• Собираем эти параметры в рантайме при загрузке
приложения
Реализация
• В модуле отдельная группа Toggles
• Файл FeedFeatureToggle.plist
• Параметры
• key - имя задачи из Jira
• description - читаемое описание фичи для debug меню
• taskURL - ссылка на задачу
• enabled - флаг включения/выключения по умолчанию
• debugAvailable - появление в списке дебаг меню
SBFFeatureToggleProtocol
#import <Foundation/Foundation.h>
@class SBFFeatureToggleItem;
/**
Протокол, реализуемый каждым переключателем бизнес фич в каждом модуле
*/
@protocol SBFFeatureToggleProtocol <NSObject>
@property (nonatomic, readonly) NSArray<SBFFeatureToggleItem*> *toggleList; /**< список переключателей бизнес
функционала */
/**
Вернет список доступных тоглов хронящиеся в plist
@discussion перегружается в наследниках в каждом модуле
@return список тоглов распарсенный из plist
*/
- (NSArray *)plistToggleList;
/**
Проверить на доступность по ключу бизнес фукционал
@param key ключ бизес функционала из jira
@return признак доступности
*/
- (BOOL)featureEnabledForKey:(NSString *)key;
@end
SBFFeatureToggleItem
/**
Объект, реализующий представление бизнес функционала в plist
*/
@interface SBFFeatureToggleItem : NSObject
@property (nonatomic, readonly) NSString *key; /**< Ключ бизнес
функционала из jira (DBIOSP-100) */
@property (nonatomic, readonly) NSString *itemDescription; /**<
Описание бизнес функционала для отображения в меню */
@property (nonatomic, readonly) NSURL *taskURL; /**< URL путь к бизнес
функционалу в jira */
@property (nonatomic, assign, getter=isEnabled) BOOL enabled; /**<
Признак доступности бизнес функционала */
@property (nonatomic, assign, readonly, getter=isDebugAvailable) BOOL
debugAvailable; /**< Признак доступности бизнес функционала для
отображения в debug меню */
@end
Использование
• if-else для нового кода
if ([[SBFApp shared].moduleFeed.featureToggle featureEnabledForKey:@"FeatureName"])
{
// New code
}
• фабрики для классов с новым поведением
if ([[SBFApp shared].moduleFeed.featureToggle
featureEnabledForKey:@"FeatureName"])
{
// New code
}
Debug menu
AB тесты
AB
AB
• Dev toggle легко адаптировать для AB тестов
AB
• Dev toggle легко адаптировать для AB тестов
• Инициализируем не только из конфигурационного
файла
AB
• Dev toggle легко адаптировать для AB тестов
• Инициализируем не только из конфигурационного
файла
• Можно взять Firebase Remote Config
AB
• Dev toggle легко адаптировать для AB тестов
• Инициализируем не только из конфигурационного
файла
• Можно взять Firebase Remote Config
• Через configValueForKey: получем значение toggleItem
из Firebase
?

Feature toggles в процессе подбора, Алексей Ульенков СберТех