Feature flags: як безпечно вимикати незавершений код у продакшені

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

Розробник переглядає панель керування прапорцями функцій

Прапорець розділяє мерж коду і його активацію

Без feature flag команда змушена або тримати недороблену функцію в окремій довгоживучій гілці, яку дедалі важче поєднати з основною, або відкладати мерж до повної готовності, сповільнюючи інтеграцію. Прапорець дозволяє змержити код одразу, залишивши його вимкненим для користувачів, і активувати пізніше — окремо від процесу розгортання. Це знижує ризик кожного окремого мержу, бо зміни менші й частіші, але вимагає дисципліни: код за вимкненим прапорцем усе одно виконується в продакшені частково, наприклад під час ініціалізації, і має проходити той самий рівень перевірки, що й активний.

Комбінації прапорців створюють непередбачені стани

Одна нова функція за одним прапорцем — прогнозована ситуація. Дюжина активних прапорців одночасно, частина з яких залежить одна від одної, а частина — взаємовиключна, створює комбінаторну кількість станів, які ніхто не тестував явно. Команді потрібен реєстр прапорців із зазначеними залежностями і термінами дії, а не список, що зростає безконтрольно. Періодичний аудит — які прапорці активні для всіх, які можна прибрати разом із застарілим кодом за вимкненою гілкою — запобігає ситуації, коли система стає зрозумілою лише одній людині, яка пам’ятає історію кожного перемикача. Дисципліна прапорців тісно пов’язана з стабільними архітектурними межами і підходом до модульних монолітів, де контрольовані зміни так само важливі.

Прапорець має власний життєвий цикл

Тимчасовий прапорець для поступового розгортання відрізняється від довгострокового прапорця для преміум-функції чи A/B-тесту, і поводитися з ними однаково — помилка. Розгортальний прапорець після повної активації для всіх користувачів має бути прибраний із коду разом зі старою гілкою протягом розумного терміну, інакше кодова база накопичує мертві розгалуження, які ускладнюють читання й підвищують ризик випадково залишити стару поведінку доступною. Корисно позначати тип прапорця вже під час створення й автоматично нагадувати про прибирання тих, що виконали свою тимчасову роль.

Відкат через прапорець швидший за відкат релізу

Головна практична перевага прапорців — можливість вимкнути проблемну функцію миттєво, не чекаючи нового розгортання і не відкочуючи весь реліз, який міг містити й інші, цілком робочі зміни. Це працює лише тоді, коли вимкнення прапорця дійсно повертає систему в безпечний стан, а не залишає частково застосовані зміни в даних чи зовнішніх викликах. Перед активацією ризикованої функції варто явно перевірити сценарій аварійного вимкнення так само ретельно, як і сценарій успішної роботи — інакше прапорець дає лише ілюзію контролю.

Коментарі