Если вы придерживаетесь правила никогда не деплоить по пятницам, вы транслируете неправильный месседж о качестве вашей команде и компании.
Представьте — утро пятницы в офисе. Вы с командой усердно трудились над завершением последнего спринта, и все почти готово к работе. Команда QA провела проверки. Последняя проверка выявила, что в приложении нет ошибок, сдерживающих работу команды. Продуктовая команда долго ждала выпуска новых фич и исправления раздражающих багов, и они не могут дождаться момента, когда смогут увидеть конечный результат. Осталось только запустить процесс развертывания, и можно начинать праздновать.
Однако никто не хочет этот процесс начинать. Кажется, что никто даже не решается поднять эту тему, в надежде, что следующие несколько часов пролетят быстро, и наконец начнутся выходные. Но вот новый член команды задает вопрос, который никто не хотел слышать:
«... так... мы будем деплоить в продакшн?»
В большинстве компаний, если вы зададите этот вопрос в пятницу, некоторые из членов команды ответят раздраженным взглядом, а другие усомнятся в вашем здравомыслии. Если вы работали в сфере разработки программного обеспечения, скорее всего, вы не раз слышали фразу «Мы никогда не деплоим в пятницу». Ее повторяют так часто, что она уже стала мемом:
Я полностью понимаю эти настроения. Никто не хочет рисковать и жертвовать своим свободным временем в выходные дни, если придется срываться на работу и исправлять неудачный деплой. За исключением по-настоящему срочных багфиксов любой деплой может подождать несколько дней, чтобы команда пришла отдохнувшей после выходных и имела больше времени для решения любых потенциальных проблем.
Однако я твердо убежден, что такое отношение большинства команд разработчиков и тестировщиков к развертыванию в пятницу — это не то отношение, которое нужно развивать в компании, если вы хотите создать высококачественное приложение.
Почему избегание пятничного деплоя является вредной привычкой для качества
Когда команда избегает пятничного деплоя как чумы, это обычно сводится к недостатку уверенности в своем приложении, процессах или и том, и другом. Нежелание обычно проистекает из того, что компании необходимо знать или верить, что их приложения готовы к использованию клиентами. Каждый раз, когда кто-то говорит: «Мы не будем развертывать приложение в пятницу», на самом деле он имеет в виду: «Мы не настолько доверяем нашему приложению или процессам, чтобы деплоить в пятницу».
В долгосрочной перспективе такое мышление не приводит к созданию высококачественных систем. Команды не часто используют это чувство неуверенности как сигнал о том, что им нужно сосредоточиться на улучшении. Независимо от того, является ли неуверенность реальной проблемой или мнимой, большинство команд выбирают легкий путь, игнорируя проблемы и предпочитая маскировать их. Вместо того, чтобы тратить время на поиск улучшений, они придумывают правила вроде «пятницы без деплоя».
Вместо того, чтобы избегать деплоя в конце недели, как насчет того, чтобы решить проблемы и усовершенствовать существующие процессы, чтобы дать командам свободу деплоя в любое удобное для них время? Наверняка разработчикам или тестировщикам понравиться не беспокоиться о том, что их выходные под угрозой их-за пятничного деплоя?
Любая организация, серьезно настроенная на обеспечение качества продукта в своих командах, должна развивать такую уверенность. Хотя для того, чтобы почувствовать полную уверенность в своих системах, требуется время, хорошая новость заключается в том, что это под силу каждому, независимо от того, насколько далекими от идеала являются приложения и процессы в его компании. Следующий трехэтапный план поможет вам добиться этого быстрее, чем вы думаете.
Шаг 1: Внедрите стабильный набор автоматизированных тестов
Наличие набора автоматизированных тестов — обязательное условие для любой команды разработчиков, которая хочет быстро создавать и внедрять приложения без постоянного беспокойства о них. Без него вы сильно подрываете способность команды уверенно работать и деплоить. Если вы еще не предоставили себе или своей команде пространство для работы над расширением покрытия автотестами, вы намеренно ставите себя в невыгодное положение.
Чтобы повысить уровень качества, первым делом необходимо сфокусироваться на обеспечении достаточного тестового покрытия критических путей приложения, поэтому, если вы начинаете с нуля, сосредоточьтесь на этом шаге. Однако еще более важным, чем покрытие, является стабильность. Даже при полном покрытии автоматизация тестирования не принесет пользы, если она постоянно сбоит. Если у вас нестабильные тесты, вы не сможете чувствовать себя комфортно при развертывании в любое время, а тем более по пятницам. Работая над тестовым покрытием, сосредоточьтесь на создании надежного и поддерживаемого тест-сьюта, чтобы сохранить уверенность команды надолго.
Еще одна область, на которой следует сосредоточиться, — это тип тестирования. В зависимости от потребностей приложения, вам понадобится сочетание различных автоматизированных тестов. Некоторые команды пишут несколько юнит-тестов и на этом все заканчивается, но у современных приложений множество изменяющихся частей, которые необходимо проверять. End-to-end тесты, проверка производительности, обеспечение безопасности и доступности — это лишь верхушка айсберга. Заранее спланируйте, какие типы автотестов могут принести пользу.
Помните, какие виды тестов вам нужны и какие области вы хотите охватить. Наличие стабильного набора автоматизированных тестов с правильным сочетанием тестов укрепит уверенность вашей команды в приложении и деплоях.
Шаг 2: Не забывайте о ручном исследовательском тестировании
Когда команды приобретают привычку создавать стабильные автоматизированные тесты для своих приложений, может появиться риск стать излишне самоуверенными в способности тест-сьюта отлавливать ошибки до развертывания. Часто ложное чувство уверенности приводит к тому, что команда начинает думать, будто им не нужно проводить дополнительное тестирование с помощью методов автоматизации тестирования. Это ложная мысль. Независимо от того, насколько хороши ваши навыки автоматизации тестирования или насколько большое покрытие обеспечивают написанные тесты, нельзя игнорировать важность ручного исследовательского тестирования.
Автоматизированные тесты могут делать только то, что им сказано делать, и хорошо подходят для выявления регрессий во время быстрых циклов разработки. Ручное и исследовательское тестирование позволяет заглянуть в «слепые зоны» автоматизированных тестов и обнаружить проблемы в тех областях, на которые никто и не думал обращать внимание — так называемые «неизвестные неизвестные». Пренебрежение этой важной частью тестирования, когда вы полагаетесь на автоматизацию, неизбежно приводит к низкому качеству продукта.
Ручное тестирование требует времени и усилий для качественного выполнения. Некоторые команды, особенно небольшие, не имеющие выделенной команды QA, склонны проводить такие тесты в последний момент. Большинство стартапов, с которыми я работаю, проводят исследовательское тестирование только за несколько дней или даже часов до значительного развертывания. Иногда это срабатывает, но они рискуют поторопиться и упустить баги.
В идеале ручное исследовательское тестирование должно проводиться последовательно в течение всего цикла разработки, когда новые сборки выкладываются в промежуточную среду. Дайте своей команде время для проведения такого тестирования, и вы обнаружите, что мысль о том, что развертывание можно провести в любое время, стала беспокоить вас меньше.
Шаг 3: Внедрение автоматизированного процесса сборки и развертывания
Процесс сборки и развертывания — это те части цикла разработки, о которой часто забывают в компаниях, создающих программное обеспечение. В некоторых компаниях, в которых я работал, сборка и развертывание кажется почти мистическим процессом, который могут выполнить только несколько избранных. Развертывание у них обычно представляет собой длинный процесс из шагов, выполняемых в точном порядке и в идеальном тайминге. Если человек, выполняющий это ритуальное действие, поскользнется на этом пути, хрупкость процесса может в одно мгновение обрушить все приложение.
Возможно, я описываю этот процесс несколько преувеличено, но это очень близко к истине. Многие компании, с которыми я работал, имеют неоправданно сложные процедуры развертывания. Когда их спрашивают, почему, некоторые команды пытаются объяснить, почему все должно быть именно так, как есть, но подтекст считывается следующий «Мы всегда делали это так, поэтому никогда не меняли». Причина просто заключается в том, что кто-то давным-давно создал этот сложный процесс. И поскольку он работает — независимо от того, насколько хрупким или запутанным он стал — они никогда не думали о том, чтобы улучшить статус-кво.
Если вашей команде приходится выполнять множество шагов для сборки и развертывания новой версии приложения, вы оказываете медвежью услугу своей организации. Независимо от того, сколько меняющихся частей содержит вся система, автоматизировать можно практически любой процесс релиза — даже свести его к одной команде. Сегодня есть масса отличных инструментов, позволяющих автоматизировать процесс сборки и развертывания: Jenkins, AWS CodePipeline, CircleCI и многие другие. У вашей компании нет оправданий, чтобы не автоматизировать развертывание.
Не менее важной и забытой частью процесса развертывания является откат неудачного развертывания. Несмотря на хорошо протестированный автоматизированный процесс, он все равно может потерпеть неудачу по разным причинам, от плохого кода до сбоев в инфраструктуре приложения. Большинство команд обнаруживают, что у них нет никаких стратегий отката, когда развертывание не удается и приложение не работает. Прежде чем это произойдет, разработайте стратегию отката, подходящую для вашей ситуации, и часто тестируйте ее, чтобы закон Мерфи не застал вас врасплох.
Заключение
Просить разработчика или тестировщика сделать деплой в пятницу обычно считается смертным грехом. Большинство команд отказываются развертывать что-либо в пятницу, опасаясь, что что-то сломается и придется работать в выходные. Хотя это вполне разумно, такое отношение обычно вызвано отсутствием уверенности в процессах развертывания в компании. В большинстве случаев страх того, что новый релиз сломает систему, относится не только к пятничным деплоям, но и к деплоям, которые проходят в любое время. Такие настроения не способствуют повышению качества продукта в организации.
Если ваша команда относится к развертыванию как к хрупкой процедуре, которая может все разрушить, вы можете предпринять несколько шагов, чтобы укрепить доверие к этому процессу:
Иметь стабильный набор автоматизированных тестов, который обеспечивает правильное сочетание тестирования и покрытия для выявления проблем до выхода в продакшн.
Выработать привычку проводить ручное исследовательское тестирование, чтобы обнаружить баги, которые не могут обнаружить автотесты.
Наконец, автоматизировать этапы развертывания и убедиться, что вы можете откатить любой релиз. Ни один процесс не совершенен, и, скорее всего, будут случаи, когда вам придется откатить деплой.
Благодаря этим шагам ваша команда будет готова быстро решить проблему в тех редких случаях, когда что-то пойдет не так. Как только вы внедрите некоторые или все из этих предложений, вы заметите, что качество приложений повысится. Что еще более важно, это повысит уверенность команды в своих силах.
Цель этой статьи состоит не в том, чтобы убедить вас, что можно деплоить в пятницу, а в том, чтобы дать команде возможность делать это при необходимости без каких-либо опасений. Возможность деплоя без опасений избавляет каждого разработчика и тестировщика от одной из головных болей во время проектного цикла. И если нам повезет, возможно, количество мемов в ленте в LinkedIn уменьшится.
А в завершение приглашаем всех тестировщиков на открытый урок, посвященный основам Java. На этом занятии узнаем первые операторы и создадим первую программу. Записаться на урок можно на странице курса QA Automation Engineer.
Комментарии (26)
yurikmellon
21.06.2023 11:41+15выкатывать релиз в продакшн в пятницу, будь он даже 100500 раз затестен, не стоит ещё и потому, что у пользователей неизбежно появятся вопросы по новому функционалу, хотя есть инструкции и на обучении всё это говорили. А отвечать на этот вал вопросов будет вынужден дежурный спец поддержки. Основная команда в выходные предпочитает отдыхать.
lea
21.06.2023 11:41+3Вторник, конец рабочего дня. Прибегает шеф и требует задеплоить новую фичу в прод именно сегодня. Совершенно непонятная срочность, так как от отсутствия этой фичи в течение ещё пары недель никто не умрёт.
Я: Только закончил реализацию, ещё не тестил. Давай завтра спокойно всё доделаю?
(Ш)еф: Сколько времени надо чтобы прогнать тесты и задеплоить?
Я: Ну, часа четыре, если исправлять ничего не придется.
Ш: Задержись, надо задеплоить сегодня.
Я: У меня планы на вечер, я уже собирался домой.
Ш: Я тебе такси до дома вызову.
Я: Если настаиваешь - давай задеплоим без тестов. Может сломаться, так что под твою ответственность.
Ш: Делай. (убегает)
Конечно же, утром пришлось всё срочно чинить, был разбор причин инцидента. Зато с деплоями с тех пор больше никто не подгонял :)
IsUnavailable
21.06.2023 11:41+6Аргументы из статьи бьются одной фразой - shit happens.
К сожалению, но вот оно происходит. Даже когда все процессы казалось бы доведены до идеала (а такого не бывает) оно происходит. Реже, да, но происходит. И люди просто выбирают между маленьким шансом огрести проблем и между 100% шансом их не огрести.
Общий посыл статьи то верный, делайте хорошо, а плохо не делайте, но подводка к нему неудачная. С другой стороны я вот тут и строчку коммент, так что может на то и был расчёт).
Ну и да. Разговор с копипастой - это традиции!
azgnetov
21.06.2023 11:41+3Ваши 3 шага не устраняют 100% багов. А в пятницу не деплоят вовсе не из-за чьих-то фобий, а потому что суббота выходной. Точно так же избегают предпраздничных дат и отпусков критичного персонала. Не нужно подменять риск-менеджмент на психологию.
koreychenko
21.06.2023 11:41Ну, если в выходные есть кому подхватить если что, то можно и в пятницу деплоить.
Бывают же компании, в которых нет выходных, а есть смены или индивидуальный график.
CryInt
21.06.2023 11:41+5Ну допустим мы написали отличный, полностью оттестированный код, всё проверили на 10 раз и за полчаса до окончания рабочего дня отправили в деплой, но что то пошло не так и деплой пошел не по плану, что нибудь случилось и что? Половина SoC и программистов не пошла домой и сидит думает что делать, откатывать релиз в срочном порядке или можно быстро починить, а починить быстро это не факт что качественно. У всех были планы но теперь они должны что? Забить на работу и пойти заниматься своими делами? Или забить на свой отдых и работать дальше? И всё это ради чего? Поэтому и нет деплоя в пятницу, это не от того что ты не уверен в своем коде или проекте, а потому что всегда должен быть запас времени на shit happens...
ilriv
21.06.2023 11:41+2Выберите правильный язык программирования. Вам не нужны языки, для которых деплой является проблемой. Выберите Delphi - благодаря предкомпилированным юнитам собирайте большие проекты в десятки раз быстрее чем на C++ и перестаньте бояться возможных проблем при сборке.
Shklo
21.06.2023 11:41+3Это правило написанное кровью.
команда может быть сколь угодно талантливой и ответственной, но человечески фактор на любом этапе никто не отменял - забыл, не учел, даже не подумал....
Мы не деплоим в пятницу
lexore
21.06.2023 11:41+2Похоже, автор текста никогда не работал с крупными нагруженными проектами.
Вот сходу статья про пятничный деплой. Как додо пицца прилегла на 4 часа в пятницу вечером.
miga
21.06.2023 11:41-1Всегда это твердил всем вокруг, вот какой-то добрый человек написал нормальную статью.
Если вы боитесь деплоить по пятницам и перед праздниками, то стоит ли вам деплоить вообще, без уверенности что вы (или, лучше, автоматика) вовремя обнаружите и быстро откатите любую проблему?
Ksoo
21.06.2023 11:41+2Не деплоим не из-за не уверенности, а из понимания что если что сломается, должно сломаться когда на рабочем месте есть нужные сотрудники и когда финансовые потери для бизнеса будут минимальные.
miga
21.06.2023 11:41-1Так у вас система может в любой момент сломаться и без деплоев, для этого и есть онколл, не так ли?
А если факт деплоя заметно повышает вероятность сбоя, то, видимо, что-то не так с качеством и/или процессами. В таком случае инженерам будет хороший стимул исправить проблему, чтобы их онколл был спокойнее :)
BugM
21.06.2023 11:41+1Деплой по определению увеличивает неопределенность на проде. Зачем самим себе создавать проблемы? Пусть онколл останется для внезапных продакшен проблем, а не для разгребания «А что там в новой версии могло пойти не так?»
miga
21.06.2023 11:41Вот этот майндсет «деплой - это проблема» и отравляет мне жизнь уже почти десять лет, не говоря уже обо всей индустрии. Не должен он быть ей, а если есть, то надо это чинить.
BugM
21.06.2023 11:41+4Деплой сам по себе это не проблема. Проблема это разбираться что пошло не так и точно ли это неожиданное поведение в пятницу вечером или на выходных.
Последний тест для любого кода это продакшен. Всегда что-то может пойти не так. Люди не идеальны и делают неидеальные вещи. Для защиты от такого поведения используют специальные методики. Как вам постепенная выкатка новой версии в течении двух недель?
Куда эта спешка? Не успели в четверг? Ну и ладно. Поедет в прод в понедельник. От этого никто не умрет. И даже денег потеряно особо не будет. Зато команда нормально отдохнет и будет более счастлива.
Хотфиксов это конечно не касается. Они едут в прод по готовности и по степени важности. Горящий прод до понедельника не оставляем. Я именно про типовой новый релиз.
miga
21.06.2023 11:41+1Дело не в спешке, а в рутинизации. Чем более у вас рутинизирован и безопасен процесс деплоя, тем меньше вероятность того, что когда нужен будет срочный хотфикс, вы все не разломаете до состояния "хуже чем было".
lexore
21.06.2023 11:41+1Есть много вещей, которые можно воспроизвести только на проде. Дело же не только в написанном коде. Код запускается в инфраструктуре под нагрузкой. Вот эти инфраструктуру и нагрузку вы сможете гарантированно протестировать, только если поднимете рядом второй прод и будете дублировать туда запросы. Но так почти никто не делает. Поэтому при деплое на прод у вас всегда есть фактор неизвестности. Правило "не деплоить в пятницу" - это попытка управления этим фактором.
miga
21.06.2023 11:41Для тестирования под нагрузкой есть нагрузочное тестирование.
Для тестирования взаимодействия с инфраструктурой и соседними сервисами есть стейджинг, который, в идеале, и должен быть вторым продакшеном по архитектуре и вообще всему, кроме размера.
Деплоить каждый раз как в неизвестность - мне, например, здоровья уже не хватит :)
lexore
21.06.2023 11:41+1стейджинг, который, в идеале, и должен быть вторым продакшеном по архитектуре и вообще всему, кроме размера.
В прошлом году была интересная статья от "додо пицца", как они прилегли в пятницу вечером на 4 часа: тыц. Там сложились факторы деплой+нагрузка+рекламные пуши. Ну еще пара косяков в конфигах. В теории, такое можно было бы отловить на стейджинге, если бы:
стейджинг был бы размером, как прод;
на него бы лилась нагрузка, как на прод;
на него бы лились пуши, как на прод;
Деплоить каждый раз как в неизвестность - мне, например, здоровья уже не хватит :)
По большому счету, чем больше изменений, тем больше неизвестность :) Есть же такие вещи, как ошибки, стреляющие через несколько часов. Бывает лавинообразный выход из строя при достижении некоторого порога производительности. А еще бывают плавающие баги, когда проблема возникает не только на проде, но и раз в N времени.
Поэтому на прод и деплоят мягенько, аккуратненько, поглядывая на графики. Подстилают соломки в виде blue/green и канареечных деплоев. А заодно страхуют себя от проблем, воздерживаясь от деплоев по пятницам.
Lordbander
21.06.2023 11:41+3Как говорится: Спасибо, но НЕТ.
В пятницу, даже обновы и патчи не ставлю
iBljad
21.06.2023 11:41+1Забыли еще, как минимум, несколько шагов:
Внедрение метрик для выявления проблем при/после деплоя
Автоматизация отката релизов (наличие автоматизации деплоя также подразумевается)
Автоматический откат релизов
f000
21.06.2023 11:41+3Я так понимаю, 100% отписавшихся в комментах не поддерживают продвигаемую концепцию "понты сильной команды"? Да потому что практика реально показывает, ибо ну его нафиг на выходных и праздниках устранять последствия принятых имиджевых решений эффективных менеджеров.
ZakharovAV
21.06.2023 11:41Ни в чём нельзя быть уверенным на все 100%. Предположим, что при каждом обновлении есть шанс в N%, что появятся ошибки. Это нормально. Теперь следует посмотреть на пользовательскую активность по дням недели. Как правило, к выходным количество активных клиентов возрастает, а к понедельнику снижается. Это связанно не только с выходными разработчиков, но и, по случайному стечению обстоятельств, с выходными большой массы населения. Если простой в будни обернётся достаточно серьёзными потерями (как финансовыми, так и репутационными), то такой же инцидент в выходные становится просто катастрофой.
Дело не в том, что разработчики должны отдохнуть, хотя и это тоже. Дело в том, что риск того, что все сотрудники будут вне кондиции к моменту аврала очень неиллюзорный ибо пятница традиционно ассоциируется с алкоголем (но не у всех).
Умножаем гипотетические потери в час на шанс найти ответственного специалиста, готового оперативно и на трезвую голову починить всё. Выходит, лучше в пятницу с определённого времени (например, со второй половины дня) воздержаться от обновлений. Даже для тех, у кого смена.
yoshka
Надо делать как надо, а как не надо делать - не надо!
Можно еще посоветовать писать код без багов, тогда и вовсе фиксить не придется.
У нас есть тесты, CI/CD, QA и команда дежурных инженеров. Но пятницу, пожалуйста, оставьте без выкатки больших фич. Большая фича - координация десятка человек, оповещие всех соседних команд, запуск рекламы и тому подобное. А люди имеют свойство ошибаться: пропускать баги, покрывать false-positive тестами, забывать про индексы, ревьюер может иметь замыленный глаз, ПМ забыть про важную штучку, которая на глаза попалась именно после релиза.
А откатывать всю эту красоту будет дежурный инженер. Вот оно ему надо?