Feature flags и A/B-тесты

↑ 8.4 Frontend System Design · ← Предыдущая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Безопасные релизы и эксперименты — зона ответственности senior.

Feature flags

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

const flags = useFlags()   // загружаются при старте, обновляются в фоне
<NewCheckout v-if="flags.newCheckout" />
<LegacyCheckout v-else />

Типы флагов

ТипСрок жизниПример
Releaseкороткийскрыть недоделанную фичу
Experimentна время тестаA/B-эксперимент
Ops (kill switch)долгийбыстрое отключение тяжёлой функции
Permissionпостоянныйдоступ по плану или роли

Возможности

  • постепенный выпуск (rollout: 1%, 10%, 50%, 100%);
  • таргетинг (пользователь, роль, регион, версия);
  • мгновенный откат отключением флага;
  • canary-релизы;
  • разделение деплоя и релиза.

Сервисы и инструменты: LaunchDarkly, Unleash, Flagsmith, GrowthBook, собственная реализация.

Реализация на клиенте

  • получение флагов при старте (SSR — на сервере, чтобы не мигало);
  • стабильное распределение: хэш от userId и ключа флага, чтобы пользователь всегда видел один вариант;
  • значения по умолчанию, если сервис недоступен;
  • не хранить секреты во флагах (они публичны);
  • типизация ключей.
const bucket = (userId: string, key: string) => hash(`${key}:${userId}`) % 100
const enabled = bucket(user.id, 'new-checkout') < rolloutPercent

A/B-тесты

  1. Гипотеза и метрика успеха (конверсия, время задачи).
  2. Случайное разделение на группы (control, variant), размер выборки и длительность (статистическая значимость).
  3. Единая привязка пользователя к варианту.
  4. Сбор событий (экспозиция и целевые действия).
  5. Анализ: доверительные интервалы, побочные метрики (guardrails).
  6. Решение, удаление проигравшего варианта и флага.

Ловушки: подглядывание (остановка при первом «значимом» результате), взаимовлияние экспериментов, разный кэш CDN, мигание вариантов (flicker), смещённая выборка.

Технический долг

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

Вопросы с ответами