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

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

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

В этой статье в качестве примера используется GrowthBook, платформа флагов функций с открытым исходным кодом, но описанные здесь методы в равной степени применимы к коммерческим инструментам, таким как Launch Darkly, и другим платформам с открытым исходным кодом, таким как Unleash.

Теперь, без дальнейших промедлений, вот 6 причин, по которым вы должны использовать флаги функций.

1. Развернуть сейчас, выпустить позже

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

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

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

if (growthbook.feature("my-feature").on) { ... }

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

2. Выключатель для производства

У каждого инженера есть история журналов ошибок, которые заполняются во время производства, пока все пытаются понять, что не так. Нет ничего лучше, чем пытаться отлаживать и критически мыслить, когда весь ваш сайт не работает. Затем, как только нарушительный код будет обнаружен и исправление будет отправлено, сборка и развертывание на всех ваших серверах может занять мучительные 10+ минут.

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

3. Функция стробирования

Есть много ситуаций, когда вы хотите сделать опыт доступным для одних пользователей, а не для других. Например, премиум-функции для ваших платных пользователей. Или специальная распродажа 4 июля, доступная только посетителям из США. Или в приведенном выше примере «Kill Switch» оставьте функцию включенной для вашей команды разработчиков, исследующей ошибку, но отключите ее для всех остальных.

Традиционно это делается с помощью ветвей if/else и жесткого кодирования всех условий таргетинга. Это приводит к постоянному отставанию запросов от продакт-менеджеров и маркетинговых команд, и в итоге вы получаете такой код:

if (date < '2022-02-15' && url.query.utm_source != 'email' && ...)

Флаги функций значительно упрощают этот процесс. Разработчики просто используют общее условие в своем коде:

if (growthbook.feature("my-feature").on) { ... }

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

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

4. Удаленная настройка

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

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

moduleVersion = growthbook.feature("my-module").value

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

5. Канарские развертывания

Делать релиз сразу для 100% пользователей — это страшно. Неважно, сколько QA вы делаете, если есть способ сломать его, пользователи найдут его. При канареечном развертывании вы сначала делаете функцию доступной для небольшого числа пользователей, следя за журналами ошибок и метриками. Если все выглядит хорошо, вы постепенно выкатываете его на 100%.

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

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

6. А/Б-тестирование

A/B-тестирование на практике очень похоже на канареечное развертывание, но цели немного отличаются. При канареечных развертываниях главная задача — убедиться, что вы ничего не сломаете. С помощью A/B-тестов цель состоит в том, чтобы действительно улучшить ситуацию. Чтобы доказать, что что-то лучше, требуется гораздо больше статистической строгости и дисциплины:

  • Равномерно разделите трафик (например, 50/50) между вариантами и поддерживайте его на протяжении всего эксперимента.
  • Убедитесь, что один и тот же пользователь всегда видит один и тот же вариант
  • Отслеживайте, какой вариант видел каждый пользователь в вашей системе аналитики
  • Отслеживайте цели и конверсии во всем приложении
  • Используйте статистику, чтобы определить победителя

К счастью, как и в случае с канареечным развертыванием, A/B-тестирование проводится бесплатно с пометкой функций. Так же, как и канареечное развертывание, A/B-тестирование контролируется с помощью правил переопределения в GrowthBook:

Как только вы начнете собирать данные, вы сможете использовать расширенный механизм статистики GrowthBook для просмотра результатов вашего эксперимента:

Заключение

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

Ресурсы

Открытый исходный код:

Коммерческий: