Флажки функции

Как постепенно открывать свои функции с помощью функциональных флагов.

Ian Buchanan Ian Buchanan

Описание. Функциональные флаги (или переключатели функций) — это технология разработки программного обеспечения, которая позволяет включать и отключать выбранные функции во время работы системы без развертывания нового кода. С ее помощью команды могут вносить изменения, не отправляя дополнительный код в удаленный репозиторий, и проводить более контролируемые эксперименты на протяжении жизненного цикла функций.

Если вы планируете непрерывно интегрировать функции в свое приложение во время разработки, обратите внимание на функциональные флаги. В итоге вы сможете открывать и скрывать функции, включать и отключать их. Вы также сможете предоставлять пользователям различные варианты функциональных возможностей, чтобы узнать, какой из них лучше. Функциональные флаги («переключатели», «биты»), позволяют сделать это и многое другое.

Что такое функциональные флаги?

Функциональные флаги (или переключатели функций) — это технология разработки программного обеспечения, которая позволяет включать и отключать выбранные функции во время работы системы без развертывания нового кода. С ее помощью команды могут вносить изменения, не отправляя дополнительный код в удаленный репозиторий, и проводить более контролируемые эксперименты на протяжении жизненного цикла функций. Так функциональные флаги позволяют задействовать множество новых рабочих процессов, которые невероятно полезны при использовании гибкого стиля управления и сред CI/CD.

Во время разработки разработчики программного обеспечения отмечают желаемые пути кода функциональным флагом. Ниже приведен пример простого функционального флага, написанного на языке JavaScript:

  if(featureFlags[‘new-cool-feature’] == true){
renderNewCoolFeature();
}

В этом коде показано простое выражение, которое проверяет, включена ли функция «new-cool-feature». Даже при наличии современных платформ и инструментов, которые помогают управлять данными флагов или внедрением и удалением нового логического пути, функциональные флаги, по сути, остаются обычными операторами «если». Вот почему все названия флага связаны с понятием двоичного переключателя.

Когда код будет готов к поставке в рабочую среду, он будет развернут в обычном режиме. Однако он будет неактивен в рабочей среде до тех пор, пока функциональный флаг не будет активирован явным образом. Флаги можно назначать подмножеству группы пользователей и тем самым обеспечивать специализацию поведения.

Преимущества функциональных флагов

Схема, демонстрирующая разработку на основе функциональных флагов

На базовом уровне функциональные флаги позволяют выполнять коммиты и развертывать код в рабочей среде в неактивном состоянии и активировать его позже. Это помогает командам более эффективно контролировать пользовательский интерфейс конечного продукта. Команды разработчиков могут выбирать, когда и каким пользователям предоставлять новый код.

Проверка работоспособности функций
Разработчики могут использовать функциональные флаги для «мягкого развертывания» новых функций продукта. С помощью функциональных переключателей новые функции можно сразу интегрировать в ожидаемый релиз. В качестве состояния функционального флага по умолчанию можно указать «отключено», чтобы после развертывания в рабочей среде код оставался неактивным, а новая функция была отключена до тех пор, пока функциональный переключатель не будет активирован явным образом. Затем команды решают, когда перевести функциональный флаг в состояние «включено» и тем самым активировать код, чтобы можно было провести контроль качества и убедиться в правильной работе функции. Если в ходе этого процесса команда обнаружит проблему, она сможет мгновенно перевести функциональный флаг в состояние «отключено», чтобы отключить новый код и свести воздействие этой проблемы на пользователей к минимуму.

Снижение рисков
Опираясь на рассмотренную выше идею «мягких развертываний», активные команды могут использовать функциональные флаги совместно с системным мониторингом и показателями, чтобы реагировать на любые заметные периодически возникающие проблемы. Например, если в приложении произошел всплеск трафика и система мониторинга сообщает о росте количества проблем, команда может использовать функциональные флаги для отключения неэффективных функций.

Коррекция поведения системы без внесения изменений, нарушающих работу
Функциональные флаги позволяют свести к минимуму использование сложных сценариев интеграции и развертывания кода. Интегрировать новые сложные функции или деликатную работу по рефакторингу в главную рабочую ветку репозитория может быть непросто. Эта задача становится еще сложнее, если несколько разработчиков работают над перекрывающимися частями базы кода.

Функциональные флажки можно использовать для изоляции новых изменений, не затрагивая известный и стабильный код. Разработчики могут обойтись без долгосрочных функциональных веток и отправлять частые коммиты в основную ветку репозитория с этим функциональным переключателем. Когда новый код готов, команде не нужно прерывать работу и совместными усилиями выполнять слияние и развертывание. Она может просто переключить функциональный флажок и тем самым включить новую систему.

Примеры использования функциональных флагов

Деятельные команды используют функциональные флаги самым различным образом. В следующих примерах показаны некоторые популярные способы применения функциональных флагов в agile-среде.

Тестирование продукта
Функциональные флаги можно использовать для постепенного выпуска новых функций продукта. Бывает неясно заранее, понравится ли предложенная новая функция пользователям и окупятся ли эти инвестиции. Команды могут выпустить новую возможность продукта или ее часть под функциональным флагом и выполнить ее развертывание для подгруппы пользователей, чтобы собрать обратную связь. Таким подмножеством может стать инициативная группа опытных пользователей, которые будут рады участию в бета-тестировании и обзоре. Если новая идея продукта понравится, команда разработчиков сможет выполнить развертывание функционального флага для более широкой аудитории. Если же новая идея окажется неудачной, команда разработчиков сможет легко отключить функциональный флаг и впоследствии удалить его из базы кода.

Проведение экспериментов
Эксперименты, или сплит-тестирование — это основной пример использования функционального флага. В простейшей форме флаги действуют как переключатели состояния «включено» и «отключено» для функции. Улучшенные функциональные флаги одновременно используют несколько флагов, чтобы активировать различные функции для подгрупп пользователей. Например, представьте, что вы разделили свою пользовательскую базу на три части. Каждая треть получает свой уникальный флаг и пользовательский интерфейс. Затем можно сравнить эффективность этих трех флагов относительно друг друга, чтобы определить версию для окончательного коммита.

Миграции
Бывают случаи, когда приложению требуется миграция данных, причем необходимо внести изменения в зависимый код приложения. Эти сценарии представляют собой многоступенчатые задачи развертывания и требуют деликатного подхода. Поля базы данных могут меняться, удаляться или добавляться в базу данных приложения. Если код приложения не подготовлен к изменению базы данных, возникнут сбои и ошибки. В этом случае требуется координированное развертывание изменений базы данных и кода приложения.

Функциональные флаги помогают упростить этот сценарий, позволяя командам заранее подготовить изменения приложения внутри флага. Как только команда внесет изменения в базу данных, она сможет переключить функциональный флаг и тем самым согласовать код приложения. Это устраняет риск и задержку в ожидании развертывания нового кода приложения, а также возможные сбои при развертывании и рассогласование приложения с базой данных.

«Канареечный запуск»‎
Канарейка в этом контексте упомянута из-за старой практики, когда шахтеры брали с собой в угольную шахту канареек для обнаружения угарного газа. У птиц более высокая скорость обмена веществ и частое дыхание, поэтому они подвергались воздействию угарного газа раньше шахтеров.

«Канареечный запуск» в разработке программного обеспечения происходит, когда новая функция или изменение кода развертывается на небольшом подмножестве пользователей для мониторинга поведения перед тем, как выпустить это изменение для всей базы пользователей. При возникновении ошибок или сбоев выполняется автоматический откат. Функциональные флаги играют важную роль в этом процессе, поскольку они позволяют ограничить выборку пользователей и легко отключать функции.

Перерыв в работе системы
Функциональный флаг также может использоваться как инструмент для остановки работы системы. С его помощью веб-приложение может «выключить» весь веб-сайт для технического обслуживания или по иной причине. Функциональный флаг можно использовать во всей базе кода для отправки конфиденциальных транзакций и отображения контента для конечных пользователей в случае простоя. Это может быть крайне полезно при выполнении конфиденциальных развертываний или при обнаружении непредвиденной проблемы, которую необходимо срочно решить. В этом случае команды могут намеренно остановить работу системы и выполнить необходимые действия.

Непрерывное развертывание
Функциональные флаги можно использовать в качестве неотъемлемого компонента при создании действительно непрерывной системы развертывания. Непрерывное развертывание — это автоматизированный конвейер, получающий новый код от разработчиков и автоматически развертывающий его для конечных пользователей. Непрерывное развертывание зависит от уровней автоматических тестов, которые проверяют новый код на соответствие спецификации во время его прохождения по конвейеру.

Функциональные флаги обеспечивают безопасность непрерывного развертывания, изолируя изменения кода от презентации функций пользователям. Новый код может автоматически сливаться и развертываться в рабочей среде, а затем ждать своего часа под функциональным флагом. Система непрерывного развертывания может отслеживать поведение пользователей и трафик, а затем автоматически активировать флаг. Или она может отслеживать поведение нового кода под функциональным флагом и выполнить откат, если что-то пойдет не так.

Функциональные ветки и функциональные флаги

Как внедрить функциональные флаги

Существует множество способов применения функциональных флагов с различными логистическими соображениями и окупаемостью инвестиций. Выбор зависит от потребностей команды и целей организации.

Функциональные флаги имеют некоторые инфраструктурные зависимости, которые необходимы для их правильной работы. По мере того как команды масштабируют использование функциональных флагов, а переключение флагов превращается в бизнес-решение, наличие надежного хранилища данных и механизма управления флагами приобретает критически важное значение. Многие сторонние службы функциональных флагов предоставляют эту зависимость от хранилища данных.

Размещенные службы функциональных флагов от сторонних поставщиков часто являются оптимальным решением. Они справляются со сложной логистикой и предлагают удобные для интеграции библиотеки, которые ускоряют процесс установки. Это позволяет командам сосредоточиться на своей основной работе, а не на управлении инфраструктурой. Однако если сторонние решения неприемлемы по соображениям безопасности, разумно будет внедрить собственную серверную часть для работы с функциональными флагами.

Отдельно следует отметить, что инженерам необходимо реализовать новую логику кода, которая извлекает из службы состояние флага для активации содержимого, отмеченного этим флагом. Для этого код, отмеченный флагом, требуется объединить и развернуть перед его активированием. Поскольку многие функциональные флаги являются временными, не забывайте удалять ненужные флаги.

Заключение

Функциональные флаги являются мощным дополнением к арсеналу agile-разработки. Их можно использовать самыми разными способами. Они отлично совместимы с непрерывным развертыванием и контролем версий в Git. В целом функциональные флаги обеспечивают командам больший контроль над базой кода, развертыванием и интерфейсом конечных пользователей.