Теорія
Релізи без страху: відкат і перемикачі функцій
Кейс модуля: нічний реліз іде не так, і звички, що обмежують шкоду: малі релізи, швидкий відкат релізу, перемикач для всього нового і спокійне вибачення.
~8 хв читання · 10 вправ · 250 балів
Перед початком
17 квітня, 23:40
GarageDesk працює вже шість тижнів. Пізно ввечері в четвер Nina випустила нові шаблони нагадувань, і щось пішло не так: власники авто одного сервісу отримали друге нагадування перед самою північчю, і за кілька хвилин власник сервісу вже дзвонив Oscar. Nina швидко відкотила зміни, але ніч на цьому не скінчилася.
Цей кейс завершує модуль. Ти розберешся, що обмежило шкоду, а що її збільшило, і які звички роблять релізи спокійними: невеликі зміни, швидкий відкат, перемикачі для всього нового і чесні вибачення.
Шлях назад на відстані однієї команди
Будь-який реліз може піти не так. Розмір шкоди визначає те, як швидко його можна скасувати. 17 квітня новий реліз змусив GarageDesk удруге надіслати нагадування того дня: 140 власників авто з автосервісу Greg отримали дубль перед самою північчю. За шість хвилин після дзвінка Greg Nina повернула попередню версію, і розсилка зупинилася.
Це спрацювало лише тому, що відкат був готовий: попередню версію можна було повернути однією командою, відпрацьованою і буденною. Без цього Nina опівночі шукала б помилку, поки повідомлення й далі йшли б.
Звідси правило: ніколи не випускай те, що не можна скасувати. Перед релізом точно знай, як повернеш попередню версію, а зміни в базі даних роби такими, щоб їх можна було відкотити.
Після відкату — друга половина: сказати клієнтам. Зроби це швидко, чесно й конкретно: що зламалося, що це виправлено і що змінюється, щоб не повторилося. Без виправдань і без перекладання провини на провайдера. Добре залагоджена помилка може збудувати більше довіри, ніж тихий місяць; Greg лишився.
- ТакПеред кожним релізом: «Якщо щось піде не так, я однією командою повертаю версію 41».
- Не так«Якщо зламається, придумаю виправлення на місці».
Пошук помилки опівночі, поки шкода росте.
Малі релізи, одна зміна за раз
Реліз Nina 17 квітня ніс три тижні роботи: нові шаблони, швидшу форму внесення авто і зміну в тому, як складається денний список розсилки. Коли з'явилися дублі, причиною могла бути будь-яка з трьох.
У цьому прихована ціна великих релізів. Вони накопичують зміни, які ніхто не може перевірити разом, і коли щось ламається, усе починається з вгадування. А клієнти раптом бачать, що змінилося все й одразу.
Альтернатива — випускати малі зміни часто, в ідеалі одну зміну на реліз:
- кожен реліз несе мало ризику;
- якщо щось зламалося, причина очевидна: це та одна річ, що змінилася;
- відкат скасовує одну зміну, а не три тижні роботи.

Здається, що це навпаки: більше релізів — більше шансів щось зламати. Але загальний обсяг змін той самий. Якщо випускати його малими частинами, ризику не додається; він ділиться на частини, які можна побачити, перевірити й скасувати по одній.
- ТакПонеділок: шаблони за перемикачем. Середа: швидша форма. Наступного тижня: зміна списку розсилки.
- Не такОдин реліз із шаблонами, формою і списком розсилки через три тижні.
Коли зламається — троє підозрюваних і жодної швидкої відповіді.
Вимкнути без релізу
Сенс перемикача функції видно в день, коли щось виглядає не так. Якщо власники авто з автосервісу Dennis почнуть відповідати на нові шаблони «що це за номер?», Nina не потрібен новий реліз, відкат чи нічне виправлення. Вона вимикає перемикач для автосервісу Dennis, і старі шаблони повертаються за секунди.
Це відрізняється від відкату двома речами:
- зачіпає одну функцію, а не весь реліз, тож швидша форма внесення авто чи будь-яка інша зміна лишається;
- зачіпає один автосервіс, а не всіх клієнтів, бо перемикач окремий для кожного автосервісу.
Далі — спокійна частина: з'ясувати, що збентежило людей, виправити й знову ввімкнути для Dennis, перш ніж для когось іще.
Часто трапляються дві хибні реакції. Лишити функцію ввімкненою, «щоб зібрати більше відгуків», — і малий сюрприз стає більшим. Увімкнути її для всіх, «щоб перевірити, чи це лише в Dennis», — і проблема поширюється на кожен автосервіс. Перемикач існує саме для того, щоб не обирати між цим.

- ТакВласники авто збентежені → вимкнути шаблони для Dennis → виправити → знову ввімкнути для Dennis.
- Не такУвімкнути шаблони для всіх автосервісів, щоб перевірити, чи це лише власники авто Dennis.
Поширює проблему замість того, щоб її стримати.
Запуск за перемикачем функції
Перемикач функції (feature toggle) — це вимикач «увімк./вимк.» для нової функції, тут окремо для кожного автосервісу. Він розділяє два моменти, які зазвичай злиті: випуск коду і увімкнення функції.
Безпечний запуск нових шаблонів нагадувань виглядає так:
- випустити код із шаблонами, вимкненими для всіх автосервісів, щоб сам реліз нічого видимого не змінив;
- увімкнути їх для одного автосервісу (Dennis любить бути першим);
- спостерігати повний день розсилки й відповідей власників авто;
- увімкнути їх для решти автосервісів;
- коли все стабільно, прибрати перемикач і старі шаблони, щоб мертві гілки не накопичувалися в коді.

Крок з одним автосервісом обмежує будь-який сюрприз власниками авто одного автосервісу. День спостереження дає сюрпризу час проявитися: нагадування йдуть у різні години, а відповіді приходять пізніше. І прибрати перемикач наприкінці теж важливо: кожен забутий перемикач — це друга версія продукту, яку хтось муситиме розуміти.
- ТакКод виходить вимкненим → увімкнено для Dennis → день спостереження → увімкнено для всіх → перемикач прибрано.
- Не такВипустити шаблони одразу ввімкненими для всіх 14 автосервісів і перевірити відповіді завтра.
Сюрприз одразу дістається власникам авто всіх автосервісів.
Релізь тоді, коли можеш спостерігати
Пізня ніч здається найбезпечнішим часом для релізу: застосунком ніхто не користується, тож ніхто не помітить збою. Для продукту, який діє сам, ця логіка не працює. GarageDesk надсилає повідомлення реальним людям у будь-яку годину, і 17 квітня дублі прийшли перед самою північчю на телефони власників авто, які вже лягали спати.
Час релізу обирай за двома запитаннями:
- Чи можеш ти спостерігати? Релізь тоді, коли досить свіжа голова, щоб стежити за першими надсиланнями, читати відповіді й спокійно відкотити. Втомлений засновник о 23:40 повільніший у всіх трьох справах.
- Кого і коли зачепить помилка? Релізь тоді, коли помилка нікого не розбудить і коли працівники клієнтів на місці, щоб помітити й сказати тобі.
Для GarageDesk із цього виходить просте правило: релізи в будні зранку, ніколи в п'ятницю ввечері. Реліз у п'ятницю ввечері дає проблемі цілі вихідні, щоб розростися, поки автосервіси зачинені, а засновники відпочивають.
- ТакВівторок, 10:00: реліз, потім стежити за першими надсиланнями й відповідями.
- Не такП'ятниця, 19:00: реліз і перевірка в понеділок.
Цілі вихідні, щоб проблема непомітно розросталася.
Відбійники: обмежують шкоду, а не помилки
Більшість звичок намагаються запобігти помилкам: тести, рев'ю, обережні релізи. Вони варті того, але жодна не ловить усього. Відбійник (guard rail) працює інакше: йому байдуже, чи є помилка. Він задає жорстку межу тому, скільки шкоди може завдати будь-яка помилка.

Приклад GarageDesk: жодних нагадувань з 21:00 до 9:00, хоч би що казав код. Якщо майбутній реліз щось неправильно порахує, зациклиться чи надішле повторно, повідомлення однаково не потраплять нікому на телефон опівночі. Помилка може статися, але її найгірший варіант — ні.
Інші відбійники мають ту саму будову:
- денна межа повідомлень на одного власника авто, щоб цикл не надіслав десять поспіль;
- межа нагадувань, які один автосервіс може надіслати за годину;
- сповіщення для Nina, коли сьогоднішня розсилка набагато більша за вчорашню.
Добрі відбійники прості, стоять близько до шкоди (тут — у точці надсилання) і не залежать від того, чи правильний код, від якого вони захищають.
- Так«Хоч би що казав код, з 21:00 до 9:00 нічого не надсилається».
- Не так«Ми ретельно тестуємо кожен реліз, тож вікно розсилки нам не потрібне».
Тести зменшують кількість помилок, але не обмежують шкоду від тієї, яку пропустили.
Три способи обмежити шкоду
Жодна звичка не запобігає всім помилкам. Добрі звички обмежують шкоду, яку може завдати помилка, і кожна обмежує її в іншому вимірі:
- Одна зміна на реліз обмежує час на пошук причини: якщо щось зламалося, це та одна річ, що змінилася.
- Перемикач для кожного автосервісу обмежує коло постраждалих: сюрприз дістається власникам авто одного автосервісу, а не всіх чотирнадцяти, і його можна вимкнути без релізу.
- Вікно розсилки (жодних нагадувань з 21:00 до 9:00) обмежує, коли може статися шкода: хоч би що зробив код, ніхто не отримає повідомлення опівночі.
Дві звички роблять навпаки, хоч і здаються безпечними:
- релізити пізно вночі, бо «ніхто не користується застосунком»: у застосунку тихо, але повідомлення йдуть реальним людям, а той, хто лагодитиме, втомлений;
- накопичувати зміни для одного великого щомісячного релізу: релізів менше, але кожен — купа змін, які ніхто не може перевірити разом.
Користуйся всіма трьома добрими звичками разом: вони закривають прогалини одна одної.
- ТакОдна зміна, за перемикачем, у межах вікна розсилки 9:00–21:00.
- Не такЩомісячний пакет змін, випущений о 23:40 одразу для всіх автосервісів.
Усі способи обмежити шкоду вимкнено одночасно.
Як вибачитися після інциденту
Помилка, що дісталася клієнтів, не закінчується, коли код виправлено. Люди помітили, а дехто вже питає. У продовження дві аудиторії.
Автосервіс (Greg і Martha) дізнається першим, рано наступного ранку, до відкриття: що сталося, конкретно (дубль нагадування близько 140 власникам авто перед північчю), що це виправлено, що змінюється, щоб не повторилося (вікно розсилки, перемикачі, спершу один автосервіс, менші релізи), і що GarageDesk зробить для них зараз.
Клієнти автосервісу (власники авто) — це стосунки автосервісу, а не GarageDesk. Тож повідомлення їм іде лише зі згоди власника автосервісу, від імені автосервісу, і воно коротке: перепрошуємо за подвійне повідомлення, вам нічого робити не треба. Це не нагромадження: половина з них уже спитала «чому двічі?», а друга половина спитала б Martha біля стійки.
Вибачення працює однаково в обох випадках, коли воно швидке, чесне й конкретне. «Перепрошуємо за незручності» без подробиць, виправдання чи перекладання провини на провайдера роблять навпаки.
- ТакЗі згоди Greg, від імені його автосервісу: «Перепрошуємо, учора ввечері ви двічі отримали нагадування про ТО. Вам нічого робити не треба».
- Не так«Перепрошуємо за незручності, спричинені нашим SMS-провайдером».
Розмито, і провину за реліз GarageDesk перекладено на іншого.
Готові потренуватися?
Виконайте вправи уроку й отримайте 250 балів, коли пройдете його вперше.
Розпочати вправи