МенеджментSenior

Планування релізу

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

Ключова ідея
Деплой ≠ реліз
Вимірюється
П’ять метрик DORA
Release-прапорець живе
Тиждень-два

План релізу на одному екрані — готовий

Більшість тих, хто шукає планування релізу, хоче побачити план, який працює. Ось один — для інтернет-магазину, що проходить крізь сторінки розділу «Декомпозиція»: реліз, що відкриває клієнтам «Повторне замовлення з історії», фічу 1 епіка про повторні замовлення. Код для неї вже кілька тижнів потрапляє в production вимкненим. Тож план не про дату деплою. Він про те, хто бачить фічу, в якому порядку, що її зупинить і як її знову вимкнути. Наступні розділи посилаються на рядки за номерами.

  1. 1.Що виходить, а що — ні

    1. Повторне замовлення з історії — історії 1.1–1.4 епіка про повторні замовлення, за release-прапорцем reorder-from-history
    2. Власник прапорця — продакт-менеджер команди, а строк його життя спливає 18 грудня
    3. Не в цьому релізі: збережені кошики, фіча 2, — перенесено на січень, а не втиснуто перед заморозкою
    4. Один рядок на кожну історію, написаний до етапу 3.3, — для клієнтів і для підтримки
  2. 2.Схема й дані

    1. Expand: nullable-колонка reorder_source у таблиці замовлень, задеплоєна 20 жовтня — за два тижні до того, як фічу хтось побачить
    2. Без дозаповнення: минулі замовлення читаються із сервісу історії замовлень, 4 на сторінці про епіки
    3. У цьому релізі нічого не видаляють і не перейменовують; будь-який крок contract чекає кінця заморозки
  3. 3.Етапи — кожен відкривається, лише якщо попередній пройшов усі пороги з групи 5

    1. Dark launch з понеділка 26 жовтня: кожен перегляд історії замовлень викликає «Повторити» у фоні й відкидає результат; помилок менше 0,1%, менше 300 мс
    2. Акаунти працівників, близько 200, у понеділок 2 листопада
    3. 1% постійних клієнтів у середу 4 листопада, після go/no-go, — до понеділка, щоб у вибірку потрапили вихідні
    4. 10% у понеділок 9 листопада
    5. 50% у середу 11 листопада — знову з вихідними
    6. 100% у понеділок 16 листопада; якщо до середи 18 листопада цього не досягнуто, прапорець лишається там, де є, до 2 грудня
  4. 4.Шлях назад

    1. Вимкнути прапорець: черговий інженер або продакт-менеджер, з консолі прапорців, діє менш ніж за хвилину; відрепетирувано на 30 жовтня
    2. Дефект у коді: виправлення вперед через звичайний пайплайн, 25 хвилин; попередня збірка лишається придатною до деплою, бо 2.1 лише додала колонку
    3. Що не скасувати: замовлення, оформлені й оплачені через «Повторити», лишаються оформленими; у підтримки є шаблон повернення коштів для замовлення, якого клієнт не хотів
  5. 5.Сигнали — і хто за ними стежить

    1. Частка успішних оплат щонайменше 97,5% у групі з прапорцем — committed key result зі сторінки про ; алерт, а не дашборд
    2. Натискання «Повторити», що закінчуються помилкою: менше 0,5%
    3. Конверсія оформлення в групі з прапорцем проти групи без нього — продакт-менеджер читає щоранку
    4. Звернення в підтримку з тегом «reorder» — керівник підтримки рахує щоранку
  6. 6.Люди й дати

    1. Власник релізу — продакт-менеджер, який відкриває кожен етап і може закрити будь-який із них
    2. Етапи відкривають з понеділка по четвер, до 14:00, з черговим інженером до 20:00
    3. Підтримку інструктують 30 жовтня: FAQ на одну сторінку, шаблон повернення, рядки changelog
    4. Go/no-go у вівторок 3 листопада, п’ятнадцять хвилин, перед етапом 3.3 — його п’ять питань є в розділі про шлях назад
    5. Передсезонна заморозка змін з 19 листопада до 1 грудня (Black Friday — 27 листопада): жоден етап не рухається вперед, але вимкнути прапорець дозволено завжди
  7. 7.Готово, коли

    1. Прапорець чотирнадцять днів на 100% і жодного разу не вимикався
    2. Прапорець і старий шлях коду видалено до 18 грудня, після заморозки
    3. Випереджальні показники передано на рев’ю епіка, яке вирішує долю фічі 3

Деплой — це не реліз

Деплой — технічна подія: новий код працює на production-інфраструктурі. Реліз — продуктова подія: користувачі тепер можуть робити те, чого не могли раніше. Більшість організацій вважає це одним моментом, і саме тому «день релізу» такий страшний: усі технічні й усі продуктові ризики приходять разом, опівночі, у п’ятницю, яку хтось обрав місяці тому.

Код деплоїться в production постійно й потрапляє туди вимкненим за прапорцем фічі. Реліз — окреме, пізніше й зворотне рішення: увімкнути прапорець для малої частки користувачів, подивитися на цифри, а тоді ввімкнути для всіх — або вимкнути за секунди без відкату.

Розділення змінює саму суть плану релізу. Код потрапляє в production постійно — прихований і неактивний за прапорцем. Реліз стає окремим зворотним рішенням: увімкнути для 1% користувачів, подивитися на цифри, увімкнути для всіх — або вимкнути за секунди, без відкату, хотфіксу й авральної наради.

ДеплойРеліз
Що відбуваєтьсяНовий код працює на production-серверахКористувачі можуть зробити те, чого не могли раніше
Хто вирішуєІнженери — через пайплайнТой, хто відповідає за результат, — у плані це продакт-менеджер (6.1)
Як частоКілька разів на деньКілька разів на місяць, щоразу поетапно
СкасовуєтьсяДеплоєм попередньої збірки або наступноїВимиканням прапорця
Який ризик несеТехнічний: код падає, гальмує або псує даніПродуктовий: користувачам це не потрібно, вони це хибно розуміють або користуються так, як ніхто не тестував

Це розділення має коротку історію. Джез Гамбл і Девід Фарлі зробили його центром книжки «Continuous Delivery» (2010): кожна зміна, що пройшла пайплайн, придатна до релізу, а випустити її — бізнесове рішення. Facebook показав крайній випадок ще у травні 2008 року. Чат будували, щоб увімкнути для всіх приблизно 70 мільйонів користувачів одразу, тож кілька тижнів перед тим живі сторінки тихо генерували чат-трафік без жодного видимого інтерфейсу. Сервери зустріли справжнє навантаження раніше за будь-якого користувача. Ця техніка зветься dark launch, і рядок 3.1 плану — саме вона.

Фіксована дата чи фіксований обсяг — ритм, у якому живе реліз

Ще до будь-якого викочування план релізу відповідає на питання, яке часто пропускають: що фіксоване — дата чи вміст? Зафіксувати обидва — класичний спосіб провалити обидва. Єдиною змінною лишається якість, а її ніхто не записує як рішення. Робочих відповідей три.

МодельФіксованеРухаєтьсяПрикладПасує
Release trainДата: потяг вирушає кожні N тижнівОбсяг: що не готове, чекає наступного потягаChrome — кожні чотири тижні від Chrome 94 (21 вересня 2021), до того кожні шість; Ubuntu — щоквітня й щожовтняБагато команд і фіч; користувачі, які планують під дати
Реліз за вмістомВмістДата, спрогнозована діапазономМажорна версія встановлюваного продукту; регульований запускОдна велика зміна, яка наполовину не має сенсу
Безперервний релізНічого на рівні релізуКожна зміна виходить, щойно проходить перевірки; доступ відкривають прапорцями поетапноGitHub, що вже 2015 року деплоїв кількасот разів на тиждень; магазин із цієї сторінкиОнлайн-сервіси з однією живою версією
У release train дата фіксована, а обсяг рухається. Потяги вирушають кожні чотири тижні, хоч би що було готове. Фіча, яка не встигла, чекає наступного в main, вимкненою, тож нікому не треба просити ще два дні, — а велика фіча може проїхати кількома потягами вимкненою, перш ніж її ввімкнуть.

Release train працює, бо прибирає найдорожчу розмову в розробці: «можна почекати ще два дні на мою фічу?» Відповідь завжди «ні», а наступний потяг ніколи не далеко, тож сперечатися немає потреби. Фіча, не готова на момент відгалуження, лишається вимкненою, і потяг вирушає без неї. Ціна в тому, що велику фічу треба будувати так, щоб вона могла проїхати кількома потягами вимкненою, — а це знову розділення деплою й релізу. масштабує ту саму ідею на цілий підрозділ: планує разом на кожен Planning Interval, зазвичай від восьми до дванадцяти тижнів, — а його власна формула «develop on cadence, release on demand» тримає план і реліз окремо.

Прогноз релізу з фіксованим обсягом

Коли вміст фіксований, дату доводиться прогнозувати, і чесний прогноз — це діапазон. Арифметика, яку Майк Кон виклав у книжці «Agile Estimating and Planning» (2005), досі працює. Поділіть залишок обсягу на найнижчу й на найвищу швидкість, яку команда справді мала. 120 пунктів залишку при 18–26 пунктах за спринт — це від п’яти до семи спринтів, а не 5,6. Називайте діапазон і кажіть, що його звузить.

Колись планування релізу було частиною самого Scrum. Scrum Guide 2010 року описував зустріч із планування релізу та release burndown. Редакція липня 2011 року прибрала обидва, і жодна наступна їх не повернула: кожен спринт має давати придатний до релізу інкремент, тож як групувати релізи, вирішує команда. це зберіг. Його planning game у книжці Кента Бека «Extreme Programming Explained» (1999) має план релізу з історій над планом кожної ітерації.

Стратегії викочування — від усіх одразу до одного відсотка

Стратегія викочування вирішує, хто першим зустріне нову версію. Стратегії відрізняються тим, що рухається — сервери, трафік чи користувачі, — і тим, як працює шлях назад. Вони поєднуються, а не конкурують: магазин деплоїть через rolling update, а фічу відкриває прапорцем.

СтратегіяЩо рухаєтьсяХто зустрічає першимШлях назадЦіна
Big bangУсе одразуУсіПередеплоїти стару версію, якщо дозволяють даніТестова група — усі користувачі
Rolling updateСервери, по кілька за разКористувачі, яких спрямовано на нові сервериЗупинити й прокотити стару версію назад тим самим шляхомДві версії одночасно обслуговують трафік; код має це витримувати
Blue-greenУвесь трафік — між двома однаковими середовищамиУсі — у момент перемиканняПеремкнути назад — секундиПодвійна інфраструктура; база даних однаково спільна
CanaryМала частка трафіку — на нову версіюВипадкові 1–5% запитівПовернути цю частку назадМає сенс лише з автоматичним порівнянням
Кільця (rings)Групи користувачів у фіксованому порядкуКоманда, потім компанія, потім ранні користувачіЗупинитися на поточному кільціКожне кільце має бути досить великим, щоб проблема проявилася
Викочування прапорцемДоступ — для кожного користувача чи акаунтаТой, на кого націлено прапорецьВимкнути прапорець — секундиБорг прапорців; кожен прапорець — розгалуження в коді
Поетапний реліз у сторіВерсія застосунку — користувачам з автооновленням1% у перший деньПауза; ті, хто вже отримав версію, лишаються на нійВерсію на телефоні не відкликати

Назву blue-green близько 2005 року дали Деніел Терхорст-Норт і Джез Гамбл, а Мартін Фаулер описав техніку в березні 2010-го. Canary-реліз позичає образ шахтарської канарки: мала група першою зустрічає небезпеку. Кільця застосовують ту саму ідею до людей, а не до трафіку, і так Microsoft випускає Azure DevOps: спершу кільце власних інженерів, решта світу — останньою. Дві суміжні техніки розв’язують те, чого не розв’язують інші. Dark launch проганяє новий шлях на реальному трафіку, не показуючи результату, — як рядок 3.1. Rolling update — те, що за замовчуванням робить більшість оркестраторів: дешевше за blue-green, але обидві версії обслуговують трафік одночасно.

Застосунки в сторах неможливо викочувати через canary у звичному сенсі, бо версію на телефоні не повернеш назад. Поетапний реліз Apple () розподіляє оновлення серед користувачів з автооновленням за сім днів — 1, 2, 5, 10, 20, 50 і 100 відсотків — і його можна поставити на паузу сумарно до 30 днів. Вручну завантажити версію може будь-хто. Staged rollout у Google Play можна зупинити, але ті, хто вже отримав версію, лишаються на ній. У мобільному плані релізу вимкнути ще можна лише прапорець усередині застосунку.

Canary потребує порівняння, а не дашборда

Canary захищає лише тоді, коли щось автоматично порівнює його з тим, що він замінює, — до наступного кроку. У квітні 2018 року Netflix і Google відкрили код Kayenta — «суддю» canary, яким Netflix користувався всередині компанії. Його дизайн містить деталь, яку більшість команд пропускає: canary порівнюють не з production. Свіжу базову групу (baseline) зі старою версією запускають у той самий момент і того самого розміру. Сервери, що працюють давно, відрізняються від нових прогрітим кешем, пам’яттю й з’єднаннями, і ця різниця заглушила б ту, яку ви шукаєте.

«Суддя» оцінює canary від 0 до 100 відносно baseline за обраними метриками. Успіх просуває його далі, проміжна оцінка звертається до людини, а провал відкочує. План магазину застосовує ту саму логіку через прапорець. Група з прапорцем і група без нього — це canary і baseline, тому рядок 5.3 порівнює їх, а не читає одне число окремо.

Етапи плану на його календарі. Доступ зростає лише через пороги — кожен крок чекає, доки попередній етап пройде всі перевірки, — і будь-якої миті може впасти до нуля, якщо вимкнути прапорець. Вертикальна шкала — це етапи плану, а не лінійні відсотки. Передсезонна заморозка зупиняє подальші кроки, але не вимикач.

Чотири види прапорців, чотири терміни життя

Команди вскакують у халепу з feature flags тому, що вважають їх чимось одним. Причина існування прапорця визначає, скільки він має жити і хто ним володіє, а змішування видів і дає кодову базу з двома сотнями перемикачів, які ніхто не наважується видалити. Класифікація, якою нині користується більшість команд, належить Піту Годжсону, жовтень 2017 року. Вона розкладає прапорці за двома питаннями: скільки вони живуть і як часто змінюється рішення, поки вони живі.

ВидІснує, щобЖивеРішення змінюється
Release toggleХовати незавершену роботу, щоб її можна було безпечно злити й задеплоїтиДні-тижні — за Годжсоном, не набагато довше за тиждень-дваРідко: вимкнено, потім поетапно ввімкнено
Experiment toggleДілити користувачів між варіантами, щоб виміряти, який кращийТривалість експериментуНа кожен запит — кожен користувач має лишатися в одному варіанті
Ops toggleДати операторам скинути навантаження чи вимкнути дорогий шляхДні для нової фічі; роки для аварійного вимикача — це орган керування, а не боргПід час інциденту, за секунди
Permission toggleДавати фічу тарифу, акаунту чи групі користувачівРоки — це частина продуктуНа кожен запит — залежно від того, хто користувач

Перші два тимчасові, другі два — ні. Плутанина в будь-який бік шкодить. Залишений release toggle стає нетестованим шляхом коду, який тихо гниє. Permission toggle, записаний у «борг прапорців», видалить хтось під час прибирання — разом із платним тарифом. Рядок 1.1 плану — release toggle, тож рядки 1.2 і 7.2 дають йому власника й дату смерті.

Годжсон перелічує способи, якими команди тримають тимчасові прапорці тимчасовими. Задача на видалення потрапляє в беклог того ж дня, коли прапорець створено. Прапорець отримує дату згасання. Тест-«бомба уповільненої дії» валить збірку, щойно прапорець переживе цю дату. Або система має ліміт на те, скільки прапорців може нести одночасно. Рядок 7.2 — другий із цих способів. Третій — той, що працює й тоді, коли всі зайняті.

Шлях назад — і коли його немає

Плани релізу звично вписують «відкотити» як пом’якшення будь-якого ризику, і для stateless-коду це чесно. Щойно реліз торкається постійних даних, це зазвичай перестає бути правдою — і план тепер описує страхувальну сітку, якої немає. Чотири шляхи назад скасовують різне.

Шлях назадСкасовуєШвидкістьНе скасовує
Вимкнути прапорецьДоступ: хто бачить фічуВід секунд до хвилиниТе, що користувачі зробили, поки він був увімкнений, — замовлення, листи, записані дані
Відкотити деплойКодХвилиниДані, записані в новій формі, спожиті повідомлення, уже зроблені виклики інших систем
Виправити впередДефект — новою зміноюОдин прогін пайплайна — 25 хвилин у магазиніНічого, доки її не задеплоять
Відновити бекапДаніГодиниУсе, що користувачі зробили після бекапу, — воно втрачається

Причина, чому відкат не спрацьовує, проста. Якщо версія 2 видалила колонку, записала дані в новій формі чи спожила повідомлення з черги, то повернення до версії 1 не відновлює світ. Версія 1 тепер зустрічає дані, під які її ніколи не писали. Тому досвідчені команди планують рух уперед — виправити й задеплоїти знову за хвилини — і лишають відкат для релізів, які справді його витримують.

Техніка, що тримає шлях назад відкритим, — expand and contract; Данило Сато описав її як parallel change у травні 2014 року. Замість однієї міграції, що змінює форму даних, — три кроки, кожен окремим релізом. Expand: додати нову структуру, поки стара працює, і писати в обидві. Migrate: дозаповнити дані й переводити читачів по одному. Contract: прибрати стару структуру, коли з неї ніхто не читає. Кожен крок, крім останнього, можна скасувати, а останній відбувається тижнями пізніше, коли новий шлях уже себе довів.

Expand and contract перетворює одну ризиковану міграцію на три релізи. Expand додає нову колонку й пише в обидві; migrate дозаповнює дані й переводить читачів; contract видаляє стару колонку. Кожен крок, крім останнього, можна скасувати деплоєм попередньої збірки, а останній виходить через тижні, коли новий шлях уже себе довів.

План магазину використовує лише перший крок. Рядок 2.1 додає колонку, якої не читає жоден старий код, тож попередню збірку досі можна задеплоїти (4.2). Рядок 2.3 відсуває все руйнівне за межі заморозки. Класична пастка тут — перейменування. Воно виглядає як одна нешкідлива міграція, а насправді це кроки expand і contract, зроблені одночасно, без релізу між ними.

Що насправді має перевіряти go/no-go

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

  • Чи визначено шлях назад для кожного виду збою — вимкнути прапорець, виправити вперед, відпрацьований шлях для даних — і чи хтось його реально проходив? Рядок 4.1 відрепетирували 30 жовтня.
  • Який сигнал за десять хвилин скаже, що стало гірше, — і це алерт чи дашборд, який хтось має не забути відкрити? Рядок 5.1.
  • Хто поза інженерією має дізнатися раніше за клієнтів — підтримка, продажі, ті, хто відповідає на дзвінки? Рядок 6.3.
  • Чи стається в цьому релізі щось необоротне і чи можна перенести це в наступний? Рядки 2.3 і 4.3.
  • Якщо піде не так у найгірший правдоподібний момент — хто доступний і як до нього достукатися? Рядок 6.2.

Чотири релізи, що пішли не так, і рядок, якого бракувало кожному

Кожен кейс нижче задокументовано регулятором або самою компанією, і кожен відповідає рядкам плану нагорі. Жоден не стався лише через брак тестування. Кожен був релізом, що дістався всіх одразу, або не мав шляху назад, або і те, і те.

КейсЩо сталосяЯкого контролю бракувалоРядки плану
Knight Capital, 1 серпня 2012Код вручну скопіювали на сім із восьми серверів; повторно використаний прапорець розбудив мертвий код на восьмому; $460 млн втрат за 45 хвилинСписаний прапорець лишається списаним; перевірка кожного сервера; спосіб вимкнути1.2, 7.2, 4.1, 5.1
TSB, 22 квітня 2018Клієнтів банку перевели на нову платформу за один вікенд, без шляху назад на старуЕтапи; go/no-go на доказах, а не на обіцянкахГрупа 3, 6.4
CrowdStrike, 19 липня 2024Оновлення конфігурації одразу дісталося кожного сенсора онлайн; 8,5 млн пристроїв на Windows упалиCanary і кільця для конфігурації так само, як для кодуГрупа 3
Google Cloud, 12 червня 2025Новий код без прапорця; зміна даних, що за секунди розійшлася світом, на нього наткнулася; близько трьох годин помилокПрапорець, вимкнений за замовчуванням; поетапне викочування й для даних1.1, 3.1

Knight Capital, 2012 — прапорець із минулим

Knight Capital була одним із найбільших трейдерів акцій у США. У липні 2012 року компанія готувала свій маршрутизатор ордерів SMARS до нової програми Нью-Йоркської фондової біржі для роздрібних ордерів. Новий код повторно використав прапорець, що колись вмикав «Power Peg» — функцію, якою не користувалися з 2003 року, але так і не видалили, і зламану з 2005-го, коли код, на який вона спиралася, перенесли, а її саму не перетестували. З 27 липня технік вручну копіював новий код на вісім серверів. Один пропустили, і ніхто другий цього не перевірив.

1 серпня ринок відкрився, надійшли ордери з увімкненим прапорцем, і восьмий сервер запустив Power Peg. До відкриття пішло дев’яносто сім автоматичних листів «Power Peg disabled»; їх не проєктували як алерти, і ніхто на них не відреагував. Приблизно за 45 хвилин система здійснила 4 мільйони угод зі 154 акціями — понад 397 мільйонів акцій, — і Knight втратила понад 460 мільйонів доларів. Одна зі спроб виправити ситуацію її погіршила. Команда видалила новий код із семи правильних серверів, і Power Peg опинився за прапорцем на всіх восьми. Постановою SEC від 16 жовтня 2013 року фірму оштрафували на 12 мільйонів доларів.

TSB, 2018 — вікенд без шляху назад

TSB, британський банк із приблизно 5,2 мільйона клієнтів, переходив із платформи, яку орендував у Lloyds Banking Group, на Proteo4UK — її збудував ІТ-підрозділ нової материнської компанії, Sabadell. Метод Sabadell — одна міграція за вікенд, і TSB застосував його до більшості даних: так дешевше, а міграція за продуктами зламала б клієнтам єдиний погляд на їхні рахунки. Міграція відбулася 20–22 квітня 2018 року, і дані перенеслися правильно. Потім платформа відмовила в онлайн- і мобільному банкінгу, телефонному банкінгу й відділеннях, і до звичної роботи TSB повернувся лише 10 грудня.

Остаточне повідомлення регуляторів від 20 грудня 2022 року називає дві речі, заради яких існує план релізу. Шляху назад не було: після міграції відкат був «по суті неможливим». А докази для рішення «go» включали лист постачальника, чиї підтвердження були «спрямованими в майбутнє заявами про добрі наміри чи очікування, а не констатацією фактів», здебільшого із застереженнями про ще не проведені тести. Далі за рік — 225 492 скарги, £32,7 млн компенсацій і штрафи FCA та PRA на £48,65 млн.

CrowdStrike, 2024 — конфігурація теж є релізом

Рано-вранці 19 липня 2024 року CrowdStrike надіслала оновлення контенту — Channel File 291 — своєму сенсору Falcon на Windows. Це була конфігурація, а не код, і конфігурація йшла на кожен сенсор онлайн одразу. Новий шаблон визначав 21 поле вводу, а сенсор подавав 20, і читання 21-го валило Windows. Файл замінили через 78 хвилин. За оцінкою Microsoft, постраждали 8,5 мільйона пристроїв на Windows, і багато з них довелося лагодити вручну, машину за машиною.

Аналіз першопричин від 6 серпня 2024 року відповідає планом релізу. Кожен новий екземпляр шаблону тепер проходить поетапне розгортання: спершу canary, далі кільце за кільцем, і після кожного — час витримки, поки читають телеметрію. Клієнти також можуть обирати, куди й коли приходять оновлення контенту. Це група 3 плану, застосована до даних. Файл, що змінює поведінку, — це реліз, хоч як його називає інструмент деплою.

Google Cloud, 2025 — прапорець, якого не було

29 травня 2025 року Google додав перевірку квотної політики до Service Control — сервісу, що перевіряє авторизацію, політики й квоти для запитів до сервісів Google Cloud. Новий шлях коду не мав обробки порожніх полів і не мав feature flag, і два тижні його ніщо не викликало. 12 червня зміну політики з ненавмисно порожніми полями записали в глобальне сховище, і вона, за словами Google, «реплікувалася глобально за секунди». Кожен регіон одночасно наткнувся на нульовий вказівник, і запити падали з 10:49 до 13:49 за тихоокеанським часом.

Звіт Google каже це прямо: «Якби це було захищено прапорцем, проблему спіймали б на staging». Його зобов’язання — план релізу у двох рядках. Кожна зміна критичного бінарника має бути захищена прапорцем і вимкнена за замовчуванням. І кожну систему, що споживає глобально репліковані дані, мають перевірити. Друге зобов’язання — знову урок CrowdStrike: поетапне викочування коду нічого не дає, якщо дані, що його запускають, приходять усюди одразу.

Вимірювання процесу — і де він вироджується

DORA — дослідницька програма, яку тепер веде Google Cloud, — щороку з 2014-го публікує звіт про поставку програмного забезпечення. Її чотири ключові метрики 2024 року стали п’ятьма. Час від коміту до production, частота деплоїв і час відновлення після невдалого деплою описують пропускну здатність. Частка невдалих змін і нова частка переробок (rework rate) описують нестабільність. Rework rate — це частка деплоїв, яких не планували і які зробили, щоб виправити баг, видимий користувачам.

МетрикаЩо вимірюєКластер elite, 2024Фактор
Час від коміту до productionВід коміту до роботи в productionМенше дняПропускна здатність
Частота деплоївЯк часто зміни потрапляють у productionНа вимогу, кілька на деньПропускна здатність
Відновлення після невдалого деплоюВід невдалого деплою до відновленняМенше годиниПропускна здатність
Частка невдалих змінДеплої, що потребують негайного втручання5%Нестабільність
Частка переробокНезаплановані деплої для виправлення бага, видимого користувачамНе входить у кластериНестабільність

Два застереження дають самі звіти. Кластери 2024 року — не драбина: середній кластер повідомив нижчу частку невдалих змін (10%), ніж високий (20%), тож деякі команди міняють швидкість на стабільність, а рівні — це знімки відповідей одного року, а не цілі. А 2025 року DORA взагалі відмовилася від чотирьох рівнів і замінила їх сімома архетипами команд, які враховують ще й вигорання, тертя та результати продукту. Висновок, що тримався весь цей час, — той, на якому стоїть планування релізу. Швидкість і стабільність ідуть разом, бо малі зміни легше зрозуміти й скасувати.

Один висновок варто процитувати кожному, хто проєктує комітет із релізів. У книжці «Accelerate» (2018) Ніколь Форсгрен, Джез Гамбл і Джин Кім пишуть, що зовнішні затвердження — менеджером чи комітетом зі змін (change advisory board) — негативно корелювали з часом поставки, частотою деплоїв і часом відновлення та ніяк не корелювали з часткою невдалих змін. Затвердження ззовні команди сповільнювало поставку й не робило її безпечнішою. Тому go/no-go з рядка 6.4 відбувається всередині команди, триває п’ятнадцять хвилин і стосується того, чого не знає пайплайн.

Застереження, яке варто тримати в голові: ці метрики — діагностика, а не табло. Частоту деплоїв легко накрутити, поділивши одну зміну на п’ять, а команда, яку оцінюють за часткою невдалих змін, просто перестане називати щось невдачею. Читайте їх разом і у власній динаміці, а не проти чужого бенчмарку.

Де воно вироджується

  • Комітет, що затверджує деплої, — дослідження кажуть, що він додає затримку й не додає безпеки.
  • Пакування місяця змін в один реліз — кожен збій стає складно віднести до причини.
  • «Відкотити» як пом’якшення для релізу, що виконує необоротну міграцію.
  • Прапорці без власника й дати згасання тихо стають постійними розгалуженнями в коді.
  • Canary без автоматичного порівняння — це повільніший big bang із гарнішою назвою.
  • Поетапне викочування коду, поки конфігурація й дані й далі доходять до всіх одразу.
  • Заморозка, яка забороняє ще й вимикати.
  • Частота деплоїв як ціль дає більше деплоїв, а не більше цінності.

Коли це застосовувати

Застосовуйте, коли

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

Уникайте, коли

  • Відвантажене залізо чи встановлений софт без способу оновлення — реліз справді односторонній.
  • Регульований реліз, що потребує формального затвердження фіксованого версійованого артефакту, — тоді поетапним робіть саме затвердження.
  • Команда ще не вміє надійно прибирати прапорці — борг обійдеться дорожче за виграну гнучкість.
  • Немає моніторингу — тоді canary-реліз є просто повільнішим big bang.

Джерела й метод

На чому стоїть ця стаття

  • 25 джерел
  • 4 задокументовані збої
  • Перевірено 12 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.