Флаги функций (их также называют переключателями функций или Feature Toggles) — это механизм в разработке программного обеспечения, который позволяет включать или отключать определённую функциональность без необходимости развёртывать новый код. По сути, это похоже на условный оператор `if`, который проверяет, должна ли часть кода быть доступна. Например, если вы хотите переработать функцию проверки кода, вы можете развернуть её в рабочей среде как можно раньше, но показывать только небольшой группе пользователей. Везде, где в пользовательском интерфейсе или бизнес-логике должна появляться новая функциональность, добавляется проверка — включён ли флаг для текущего пользователя.
Зачем нужны флаги функций
Использование флагов функций даёт команде разработки несколько ключевых преимуществ.
- Постепенное внедрение новых функций. Вы можете включить новую возможность для части пользователей, получить от них обратную связь, и только затем расширять доступ. Это также позволяет проводить A/B-тестирование и проверять, как изменения влияют на поведение пользователей.
- Сокращение времени до выхода в производство. Вы можете держать флаг выключенным для всех, кроме разработчиков и команды контроля качества. Они тестируют и дорабатывают функцию, а когда она готова, вы просто включаете её для всех — без нового развёртывания.
- Частые безопасные слияния кода. Разработчикам не нужно работать с долгоживущими ветками, которые со временем становятся сложными для слияния. Вместо этого они часто сливают код в основную ветку, оставляя новую функциональность скрытой за флагом.
Как работает процесс с флагами функций на примере команды JetBrains Space
Команда Space использует флаги функций, чтобы тестировать новые возможности с минимальным риском и влиянием на пользователей. Процесс выглядит так:
- Разработка новой функциональности начинается в отдельной ветке, куда добавляется флаг.
- Когда разработчик уверен в качестве кода и добавлены автоматические тесты, ветка сливается в основную.
- Новая функциональность сначала попадает во внутренний экземпляр Space, используемый сотрудниками JetBrains. По умолчанию флаг выключен, но разработчик может включить его для себя, а команда контроля качества и технические писатели — для своей работы.
- Затем флаг включается для всей команды Space, а позже — для всех сотрудников JetBrains.
- После успешного внутреннего тестирования функциональность развёртывается в облаке для клиентов. Здесь флаг тоже по умолчанию выключен.
- После дымового тестирования и получения обратной связи от сообщества Space Insiders функция включается для всех организаций и пользователей.
На что обратить внимание при внедрении флагов функций
Концепция флагов функций проста, но, как говорится, с большой силой приходит и большая ответственность. Вот основные моменты, которые стоит учитывать.
- Своевременное удаление флагов. Флаги не должны жить вечно. Со временем они могут начать зависеть друг от друга, создавая запутанную логику. Важно иметь процесс для их удаления, когда функциональность становится стабильной и больше не нуждается в переключении.
- Устаревание неиспользуемых функций. Флаги позволяют экспериментировать, и некоторые функции могут никогда не увидеть свет. В команде Space для их удаления обычно достаточно консенсуса, после чего исходный разработчик помечает флаг и связанный с ним код как устаревший.
- Тестирование с флагами функций. Нужно ли тестировать все возможные комбинации флагов? Как правило, достаточно тестировать исходный код и добавлять тесты для нового. Главное — делать флаги максимально изолированными и небольшими по объёму изменений.
Заключение
Флаги функций — это мощный инструмент, который позволяет ускорить процесс разработки и сделать его более безопасным. Они сокращают время до выхода функций в производство, уменьшают боль от слияния долгоживущих веток и позволяют собирать обратную связь от пользователей на ранних этапах. Если ваша команда создаёт сервис, который поставляется как услуга, внедрение флагов функций может стать отличным решением для вашего процесса разработки и выпуска.