Close

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

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

Фотография: Иэн Бьюкэнэн
Иэн Бьюкенен

Главный разработчик решений


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

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


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

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

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

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

См. решение

Разработка и эксплуатация программного обеспечения с помощью Open DevOps

Связанные материалы

Подробнее о магистральной разработке

Преимущества флажков возможностей


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

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

Проверка работоспособности

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

Снижение рисков

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

Коррекция поведения системы без внесения изменений, нарушающих работу

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

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

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


Feature flag diagram

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

Тестирование продукта

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

Проведение экспериментов

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

Миграции

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

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

«Канареечный запуск»

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

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

Перерыв в работе системы

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

Непрерывное развертывание

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

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

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


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

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

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

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


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

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

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

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

Заключение


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

Обязательно ознакомьтесь с нашими руководствами по флажкам возможностей в DevOps, где приводятся рекомендации по пакету инструментов Open DevOps.

Ian Buchanan
Ian Buchanan

У Иэна большой опыт разработки на Java и .NET. Но гораздо больше он известен как специалист по применению agile-методик в крупных корпорациях. Сейчас он с головой погрузился в развивающуюся культуру DevOps и инструменты, улучшающие процессы непрерывной интеграции, непрерывной поставки и анализа данных. В течение своей карьеры он с успехом управлял корпоративными инструментами разработки ПО на всех этапах ее жизненного цикла. Он руководил на корпоративном уровне модернизацией процессов, которая приводила к улучшению производительности, качества и повышению удовлетворенности потребителей. Он создал международные команды, в которых ценятся саморегуляция и самоорганизация. Когда Иэн не выступает и не пишет код, он использует свои знания для создания парсеров, использования предметно-ориентированных языков и метапрограммирования. Подписывайтесь на Иэна: @devpartisan.


Поделитесь этой статьей

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Рисунок: DevOps

Сообщество DevOps

Рисунок: DevOps

Узнать больше в блоге

Рисунок: карта

Начните работу бесплатно

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up