Несколько лет я выкатывала себя в продакшн каждый день: без сна, без команды, без логов и без плана отката. Каждое утро деплой на уставшую голову, а каждую ночь бесконечный воркер, который пережёвывает один и тот же сценарий катастрофы и жрёт всю память. И я была уверена, что так и надо: просто работа, просто период, просто характер такой, да и вообще у всех так.
Но со временем поняла, что это не так, а теперь решила написать эту статью. Она про то, что когда мы выкатываем релиз в прод, то ведём себя как взрослые ответственные инженеры. А когда выкатываем в прод самих себя, то почему-то нет.
А ещё про то, как это всё дело чинить.

Только подумайте, ведь когда мы релизимся, мы не пытаемся удержать все риски в голове. Напротив, заводим задачи, пишем чек-листы, просим команду посмотреть, прогоняем тесты, мониторим и откатываемся, если всё пошло не туда. В общем и целом, строим вокруг релиза целую инфраструктуру поддержки.
А с тревожностью делаем ровно наоборот: держим весь хаос в голове, не фиксируем мысли, ни с кем не делимся, не проверяем гипотезы и не даём себе восстановиться. Как будто наш мозг ночью превращается в прод без логов, без алертов и без ответственного дежурного.
Вообще эта статья о том, как применить к тревожности то самое инженерное мышление, которым мы пользуемся каждый день на работе.
И ещё. У меня (и, кажется, у каждого из нас) на плечах сидят двое. Токсичный менеджер, назову его демоном. Он пишет в два часа ночи с паникой в голосе, требует статус по задаче и свято верит, что страдание равно продуктивности. И уставший тимлид, пусть он будет нашим ангелом. Он видел достаточно инцидентов, чтобы не паниковать из-за каждого лога со словом «возможно». А кого из них слушать, каждый решает сам. Я довольно долго слушала не того, чуть позже расскажу, чем это всё закончилось.
Не держи всё в голове — заводи тикет
Самое тяжёлое время дня при тревоге это ночь. Мозг разгоняет один и тот же сценарий по кругу, и каждый следующий круг кажется важнее предыдущего: как будто на сорок седьмом повторе ты наконец найдёшь спасение. Спойлер: не найдёшь, просто не выспишься. А знаю я это потому, что честно проверила гипотезу много-много раз.
Тревожная мысль без записи ведёт себя как баг без тикета: все о нём помнят, никто не понимает, что конкретно сломалось, но почему-то он занимает весь спринт. Пока мысль крутится в голове, она огромная, размытая и срочная одновременно.
Но стоит её записать и она становится объектом: её можно прочитать, уточнить формулировку, отложить, проверить утром на свежую голову. Это ровно то, что делает баг-репорт: превращает «всё горит» в «вот конкретная строчка, вот шаги воспроизведения».
Вот что я хочу посоветовать попробовать сделать ночью, когда в голове оркестр тревожных мыслей. Задать себе 4 вопроса и (это важно!) записать на них ответы буквально одной строчкой:
-
Что меня тревожит? Одна строка, без подробностей и описаний.
-
Что я могу сделать? Хоть что-то, что в зоне моего контроля.
-
Что не в моей зоне контроля? Это отдельная строка, туда складываем всё, на что я не влияю.
-
Когда я вернусь к этому вопросу? Укажи время, когда вернешься к этому вопросу (три часа ночи не совсем подходящее время, поверь мне)
Покажу на себе как это работает.
Однажды я задала достаточно глупый вопрос на ревью и мне ответили ссылкой на доку. А в моей голове перешёлкнуло и я пол-года корила себя за этот тупой вопрос, боялась каждого следующего ревью, боялась вновь показаться глупой. Поэтому для меня ночной заход выглядел так: «Я завалю ревью, меня посчитают слабым разработчиком, а потом всё развалится». Но чтобы пресечь каскад тревожности на корню, я открываю заметки в телефоне (главное не уйти по скользкой дорожке в соц.сети) и начинаю писать:
-
Что тревожит: «Боюсь, что плохо проведу код-ревью завтра»
-
Что могу сделать: «За 15 минут утром перечитать гайд по ревью и накидать список того, на что смотрю»
-
Что не в моём контроле: «Как именно отреагирует автор кода»
-
Когда вернусь к вопросу: «Завтра в 10:00»
И всё, закрыть заметки и отпустить. Тикет заведён, ответственный назначен, дедлайн на утро.
Вся магия такого подхода в том, что мозгу больше не нужно держать эту проблему открытой во вкладках. Проблема описана, за неё есть ответственный, поэтому её можно выгрузить из оперативки.

Не каждый алерт это инцидент
У тревожности всегда плохо настроены пороги срабатывания. Любая мелочь поднимает алерт уровня high, дежурного будят в три ночи из-за того, что в логах мелькнуло слово «возможно».
Если бы наш мониторинг работал так же, мы бы давно его выключили: когда пейджит всё подряд, перестаёшь отличать настоящий пожар от шума. Это называется alert fatigue, и тревожный мозг живёт в нём постоянно.
Лечится это не тем, чтобы «не тревожиться» (кнопки-то нет, я искала), а тем, чтобы один раз отделить алерт от инцидента. Алерт это сигнал «Посмотри сюда», а инцидент это «Всё, прод реально лёг, иди чини». Тревога подаёт их одинаково громко, и в этом весь подвох. Большая часть тревожных мыслей — это алерты о вещах, которые либо не случатся, либо не зависят от тебя, либо случатся, но переживутся. А настоящих инцидентов мало.
Важно понять вот такую одну вещь: тревожная мысль это как запись в логе. Строчка уровня WARN со словом «возможно» говорит, что нужно обратить внимание сюда, а не то, что прод лёг. Я вижу строчку, читаю эту строчку, но я — не она. Как только перестаёшь отождествлять себя с каждой записью в логе, появляется тот самый зазор, в котором уже можно спокойно сделать триаж и не падать вместе с воображаемым сервисом.
Когда прилетает тревожная мысль, я пытаюсь научиться прогонять её через короткий триаж из четырёх вопросов:
-
Это уже случилось или я предсказываю будущее?
-
Это в моей зоне контроля?
-
Как часто этот сценарий реально срабатывал раньше?
-
Если худшее случится это переживаемо?
Например, тимлид пишет в конце дня: «Нужно завтра поговорить». Демон мгновенно поднимает алерт уровня critical: «Тебя увольняют. Ты накосячила. Все всё поняли, что ты самозванка. Начинай собирать вещи».
Прогоняю через триаж:
-
Это случилось? Нет. У меня есть ровно одна фраза без контекста. А всё остальное это мой дорисованный сценарий.
-
В моём контроле? Тема разговора нет, но моя возможная подготовка к нему да.
-
Как часто «нужно поговорить» = увольнение? За мою карьеру такого не было ни разу (тьфу тьфу тьфу)
-
Если это правда плохой разговор, переживу? Да. Конечно, это будет неприятный день, но не конец жизни
Вывод: это алерт, а не инцидент. Понижаю приоритет, записываю в наблюдения (завожу тикет как в прошлой главе) и иду спать. Утром выясняется, что тимлид хотел спросить, не возьму ли я стажёра. Чудеса, прод оказывается не падал.
Но тут смысл не в том, чтобы убедить себя, что всё всегда хорошо, а в том, чтобы понизить приоритет ложного срабатывания и не будить дежурного из-за каждого шороха. Бонусом реальные инциденты становятся виднее, так как их перестаёт глушить фоновый шум.

Не прячь страшное за фиче-флагом навсегда
Есть отдельный класс тревоги про реально страшные вещи, которые ты всё время откладываешь. Например, выступить с докладом или написать тому самому человеку. А может поднять неудобный вопрос на ретро. Или запушить наконец свою идею, которую полгода держишь в черновиках.
С такими вещами мозг предлагает гениальную стратегию: не катить вообще. Спрятать фичу за фиче-флагом и держать там вечно, в безопасности, где её никто не увидит и не покритикует. А еще мозг будет подпитывать тебя мнимым чувством спокойствия от того, что ты не сделал этот рисковый шаг.
Но на деле чем дольше фича лежит за флагом, тем страшнее её раскатывать: ветка протухает, конфликты копятся, а в голове она разрастается до проекта размером с переписывание всего легаси.
И тревога устроена так же: чем дольше избегаешь страшного, тем больше оно становится.
Но есть же нормальный инженерный способ катить страшное постепенно. Никто в здравом уме не выкатывает рискованную фичу сразу на сто процентов трафика. Ты раскатываешь по чуть-чуть: сначала на себя, потом на 1%, смотришь метрики, выдыхаешь, повышаешь долю. Канареечный релиз называется. Это способ сделать страшное нестрашным: разбить его на дозы, которые ты в состоянии пережить.
Так можно делать с чем угодно. Боишься выступать? Выступи сначала на внутреннем тех-толке на 5 человек, потом на 100. К примеру, вот с таким лицом прошло мое первое выступление для девушек в IT.

Потом был внутренний техтолк на более чем 180 человек. И дальше надеюсь будет ещё не одно выступление.
Боишься написать статью? Напиши один абзац, не диссертацию. Дай нервной системе собрать метрики «Я сделала страшное, и прод не упал», прежде чем повышать процент. Это и есть грамотный rollout. Например, я сначала перевела один интересный англоязычный материал, на фоне перевода появились другие мысли, я стала больше погружаться в ретроспективу по теме, и в итоге вышла моя первая статья «Как функциональное программирование изменило фронтенд и почему отрасль возвращается к платформе».

Не будь единственным человеком на релизе
Когда релиз большой и страшный, ты не сидишь над ним один в четыре утра. У тебя есть команда: можно попросить тестировщиков перепроверить, аналитиков переуточнить, а второго разработчика глянуть свежим взглядом на код.
А с тревогой мы почему-то решаем геройски подежурить на инциденте в одиночку. Молчим, держим лицо, делаем вид, что всё нормально, а потом взрываемся на ровном месте от перегруза. Я так делала особенно виртуозно: могла месяцами никому не говорить, что мне тяжело, и искренне считать это профессионализмом.
Но как оказалось, поделиться с близким человеком, сказать: «Мне сейчас тревожно, можешь просто побыть рядом полчаса», это значит дать себе поддержку и опору.
Конечно, хочу добавить важное уточнение, чтобы не перегнуть: близкие не терапевты, и не стоит вываливать на них тревогу как на службу поддержки, но они могут быть рядом в сложный момент, выслушать и напомнить, что ты не один на один с катастрофой.

Не деплой ночью на уставшую голову
Есть негласное правило: не катить в пятницу вечером и не катить ночью на уставшую голову. Уставший инженер хуже видит риски, медленнее реагирует и принимает решения, о которых утром жалеет.
С тревогой ровно также — ночью мозг превращает любую проблему в хоррор-франшизу с сиквелами. Конечно, утро не чинит всё магически, и выспаться это всё ещё не пилюля от всех тревог. Но у выспавшегося мозга просто больше шансов отличить реальный риск от тревожного шума. То, что в три ночи выглядело как конец карьеры, в десять утра нередко оказывается письмом, на которое надо просто ответить.
Поэтому самое здоровое решение ночью это отложить деплой до утра. Сон это как пересборка проекта с обновлёнными зависимостями: код тот же, но почему-то многое перестаёт падать.
Тело это твоя инфраструктура
Прогулки, дыхание, спорт, вода, нормальная еда, отдых — это базовая инфра, на которой крутится всё остальное. Если у тебя лежит инфра, приложение тоже ведёт себя странно: тормозит, выдаёт непонятные ошибки, падает на пустом месте. Бессмысленно дебажить логику, когда на самом деле сервер не вывозит нагрузку.
Поэтому первый вопрос при разгоне тревоги: «Я сегодня спала? Ела? Пила воду? Выходила на улицу? Двигалась?
Очень часто «экзистенциальный кризис» это просто инфраструктура, которая давно просит внимания.
Кстати, здорово иметь свой личный ранбук, эдакий список того, что конкретно тебе помогает вернуться в норму. Там должны быть записаны конкретны шаги, например:
-
пройтись 20 минут,
-
позвонить вот этому человеку,
-
принять душ,
-
поесть,
-
закрыть ноут.
Попробуйте потратить на это время и записать те вещи, которые заставляют почувствовать себя здесь и сейчас. Я собрала свой список методом проб и ошибок. К примеру, в один момент мне помогает просто разговор с мужем, а в другой — пересадка и обрезание домашних цветов.
Мой ранбук висит в заметках, потому что, когда накрывает, импровизировать невозможно, гораздо проще открыть готовую инструкцию и тупо идти по пунктам, как по чек-листу выката.
А ещё есть пара пунктов, которые я бы положила в любой ранбук как аварийные.
№1. Дыхание по квадрату: вдох на четыре счёта, задержка на четыре, выдох на четыре, задержка на четыре, и по кругу. Важная дыхательная практика, по сути ручной load shedding для нервной системы. Когда сервис перегружен, он сознательно сбрасывает часть запросов, чтобы успеть восстановиться. Дыхание делает ровно это: снимает пик, пока ты не ушёл в каскадный отказ из паники.
№2. Заземление по схеме 5-4-3-2-1: назови пять вещей, которые видишь, четыре, которые слышишь, три, которых касаешься, и дальше по убывающей. Это простейший smoke-тест реальности. Тревога утаскивает тебя в воображаемый инцидент, которого ещё нет, а проверка по органам чувств работает как liveness probe и возвращает к факту: система прямо сейчас жива, прод стоит, ничего не горит.

У тебя есть право на откат
Любой нормальный релиз-процесс предполагает план отката. Если что-то пошло не так, ты откатываешься на стабильную версию, выдыхаешь, разбираешься спокойно и катишь завтра снова.
С собой можно также — разрешить себе плохой день и откатить планы на сегодня: перенести сложный разговор, отменить встречу, лечь раньше. Штатная процедура.
Даже у AWS аптайм не 100%. У всех в SLA заложена допустимая доля сбоев, при которой система всё ещё считается здоровой. Стопроцентная безотказность не существует в природе, её не закладывают даже в самые дорогие системы на свете.
Так почему мы требуем её от себя!?
Мне особенно зашло понятие error budget (бюджета ошибок). Это не просто «сбои бывают», это заранее выделенная, заложенная в план доля сбоев, которую система имеет полное право потратить.
Плохой день это плановый расход бюджета, который ровно для этого и существует. Ты не прожигаешь себя, когда отменяешь встречу и ложишься раньше. А вот что реально прожигает бюджет в ноль так это попытки держать стопроцентный аптайм голыми руками.
Если я понимаю, что сегодня как раз такой день, то просто пытаюсь отстать от себя, не корить за невыполненные дела и просто разрешить себе плыть этот день по течению. Я знаю себя, если я что-то не сделаю сегодня, значит сделаю завтра в два раза больше, но уже восстановившаяся.
Что предлагает демон, он же токсичный менеджер
Демон обожает быстрые костыли. Я их все на себе перепробовала, так что список выстрадан лично:
-
Просто проверь ещё один пост.
-
Просто загугли ещё один симптом.
-
Просто подумай об этом ещё 5 минуточек.
-
Реши всю свою жизнь прямо сейчас, за одну ночь, до рассвета.
-
Выпей ещё кофе. Да, тебя и так трясёт, но вдруг поможет.
-
Сделай вид, что ничего не происходит. Профессионалы так и делают.
-
Поругай себя за всё, что можно. Виноватым тревожиться полезнее.
Через два часа таких костылей ты лежишь с глазами как у совы и знаешь всё о редких болезнях, экономическом кризисе и разводах незнакомых людей. А прод почему-то всё равно лежит.
Фишка демона в том, что он подменяет действие имитацией действия. Это как чинить баг, накидывая поверх него новые костыли, вместо того чтобы один раз нормально сесть и разобраться.
Blameless post-mortem
Я несколько лет жила ровно по советам демона. Тревожность копилась, как технический долг: каждый отдельный день она почти не мешала, и поэтому я каждый день откладывала разбор «на потом».
А ведь технический долг так и работает. Сначала все говорят: «Ну подумаешь, чуть-чуть неаккуратно». Потом всей командой решаем: «Да ладно, потом отрефакторим». А через 5 лет обнаруживаешь, что система стала неподдерживаемой, и прогулкой с хорошим сном это уже не чинится. Долг накопился до состояния, когда нужен не лёгкий патч, а серьёзная пересборка под наблюдением специалистов.
В итоге я оказалась в кабинете психиатра и на антидепрессантах. Что я хочу сказать: это нормальный, разумный хотфикс, который накатывают врачи, когда инцидент перерос возможности ручного восстановления.
Лечиться не стыдно. Стыдиться тут нечего, ровно так же, как не стыдно вызвать дежурную команду, когда прод лёг по-настоящему.
Обидно другое: я довела до этого инцидента сама, своими руками, игнорируя алерты 5 лет подряд. Хотя могла завести тикет раньше. Обратиться к специалисту, когда это был ещё маленький баг, а не отказ всей системы.
В инженерной культуре есть прекрасная штука blameless post-mortem: разбор инцидента без поиска виноватого. Команда не казнит конкретного человека за то, что прод упал. Мы разбираемся, что именно пошло не так и что поменять в процессе, чтобы не повторилось.
Так вот, мой post-mortem звучит так: я слишком долго относилась к своим алертам как к шуму и не настроила нормальный мониторинг себя.
Если вы узнаёте в этом себя, то пожалуйста, не геройствуйте как я 5 лет. Поговорите со специалистом, пока это ещё маленький тикет. Чинить раньше всегда дешевле, это не я придумала, это базовый принцип эксплуатации, и к людям он применим не хуже, чем к системам.
Ангел предлагает следующий шаг
Наш тимлид-ангел говорит обычные взрослые вещи: «Давай сделаем одно маленькое действие, которое не ухудшит ситуацию».
Тревожность нельзя победить одним чек-листом, как нельзя гарантировать идеальный релиз одной кнопкой Deploy. Но можно перестать выкатывать себя в продакшн без сна, без команды, без логов и без плана отката.
Можно записать мысль, а не гонять её всю ночь. Можно понизить приоритет ложного алерта вместо того, чтобы будить себя из-за каждого шороха. Можно раскатывать страшное по проценту трафика, а не прятать его за флагом навсегда. Можно попросить помощи, а не героически молчать. Можно выйти на прогулку, а не скроллить ленту до состояния внутреннего болота. Можно разрешить себе откат и неидеальный аптайм. Можно признать «мне тревожно», не превращая это в доказательство собственной слабости.
И можно (нужно!) обратиться к специалисту, пока инцидент ещё маленький.
Конечно, демон на плече будет недоволен. Ему-то нравилось, когда ты жуёшь одну и ту же мысль, как старую жвачку, всю ночь напролёт. Но вообще-то у тебя релиз. И продакшн на этот раз ты сам.
Телеграм-канал Alfa Digital, где рассказывают о работе в IT и Digital: новости, события, вакансии, полезные советы и мемы.
Читайте также:
Автор: Viktoria_Arturovna


