«Breaking Bugs» в Сбербанке: как исправить семидневную норму багов за сутки

Багфиксинг — нудная, но обязательная часть любой разработки, и заниматься ей хотят далеко не все. Как превратить багфиксинг в нечто увлекательное? Устроить соревнование! В этом посте мы подробно расскажем о нашем 24-часовом «багфикс-марафоне» — от предварительной подготовки до разгребания последних коммитов после награждения победителей.


Заражаем идеей


Масштаб разработки нашего приложения Сбербанк Онлайн за последний год заметно увеличился. Вместе с этим начали копиться мелкие баги, которые на ключевых метриках никак не отражались. Но мы понимали, что это бомба замедленного действия и с ней надо что-то делать.

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

5b56c39d9317f652772bb7266bd4ae19.jpg

Нужно было устроить все так, чтобы ребята сами захотели поучаствовать в багатоне и доказать свою крутость без директив сверху. Для этого у соревнования должна быть классная атмосфера. Решили придумать особенную стилистику, что-нибудь узнаваемое и про баги. Баги — это жуки. Кто в обычной жизни уничтожает жуков? Дезинсекторы — парни в желтых костюмах химзащиты. Где они засветились в последние годы? В одном популярном сериале об учителе химии. Основа есть, допиливаем активностями. Организовали турнир по видеоиграм, викторину с призами, прикольные индивидуальные номинации… и конечно, много вкусной еды. Но главное, как ни крути, соревнование по ликвидации багов. Об этом напоминал дэшборд с веб-интерфейсом, показывающий прогресс команд, их текущие позиции, количество баллов и т.п. Обсудили все с тимлидами — они наши планы одобрили.

Android vs iOS — так нечестно


Сначала мы хотели столкнуть Android-разработчиков Сбербанк Онлайн с их iOS-коллегами, сыграть на соперничестве платформ. Но в процессе организации поняли, что это не лучшее решение, потому что технически платформы работают в неравных условиях. Так сложилось, что на iOS у нас быстрее собираются билды и прогоняются автотесты.

Тогда мы изменили формат и сделали смешанные команды: по пять Android- и iOS-разработчиков в каждой. Предварительно из числа проактивных разработчиков выбрали капитанов, чтобы они помогали формировать команды. Получилось девять команд. И несмотря на то, что мы разобрались с вопросом железа с точки зрения fair play, нужно было еще убедиться, что на пути нашей армии багфиксеров не встанут другие ограничения.

Следующим квестом стал выбор даты багатона. Даты релизов у каждой из платформ разные — подбирали так, чтобы всем было удобно. Старались, чтобы дата была максимально близка к дате, когда отводят релиз-кандидата.

Кроме того, багатон сильно нагружает инфраструктуры платформ. Когда идет соревнование, кто быстрее пофиксит баги, количество пулл-реквестов взлетает. Еще за полтора месяца до багатона был риск, что наше оборудование не справится с прогнозируемыми пиками. Но в тот момент мы ожидали новое железо, и оно подъехало как раз вовремя. Мы успели все подключить, настроить и усилить пропускную способность инфраструктуры обеих платформ в несколько раз.

6ed6a1a4d6c80cc58404762f5bda2d09.jpg

Пайплайн — как не спустить все в трубу


Здесь сделали все следующим образом: непосредственно перед началом багатона от нашего develop«а мы отвели ветку, в которой командам предстояло работать. В нее во время багатона заливалась куча пулл-реквестов с исправленными багами. На каждом из них прогонялись автотесты, разработчики ревьюили пулл-реквесты, а тестировщики проверяли новые сборки на исправление бага. И так все 24 часа соревнования.

Также нужно было распределить нагрузку тестировщиков. Мы составили почасовой график прогнозируемого количества пулл-реквестов в 24-часовом интервале багатона — в зависимости от количества участников, нагрузки на сервера, сторонних активностей и т.д. Сопоставили со средней производительностью тестировщиков и количеством эффективных часов работы каждого сопровождающего багатон. Распределили «дежурства» так, чтобы к утру субботы очереди были как можно меньше. В общем, заморочились.

При этом учли, что после багатона нужно было сразу начинать регрессионное тестирование, чтобы как можно быстрее оценить качество ветки и принять решение о ее вливании в dev-ветку. Это дополнительная нагрузка на тестировщиков.

a415357a6c7f1b40d4f67a436baa52bb.jpg

Особенности ревью


Для нас очень важно было не просто пофиксить баги, а сделать это качественно. Три процедуры обеспечивают проверку кода, отправляемого разработчиками в пулл-реквестах. Чтобы код заапрувили, они должны пройти успешно:

  • три опытных разработчика просмотрели и одобрили код;
  • код нормально сбилдился и не провалил автотесты;
  • после билда и вливания баг в сборке на описанных условиях не возобновляется.


Мы опасались, что в соревновательном режиме никто не будет ревьюить друг друга. А внутри команды оставлять ревью нельзя. Поэтому решили ничего не изобретать и действовать по стандартному флоу, как в рабочем режиме: произвольное кросс-ревью — кто свободен, тот и берет процесс на себя.

Еще нужно было отслеживать, чтобы ревью не собирались в очередь. Чтобы перестраховаться, мы привлекали к ревью синьоров (даже тех, кто не участвовал в самом багатоне) и активно напоминали участникам об ориентации на качество. Один синьор-разработчик iOS параллельно с фиксом багов для своей команды за день проревьювил 80 пулл-реквестов — вчитывался, разбирался. Это реально много!

a9676f36579300e2bec0b5e9390db4a6.jpg

Отбираем и оцениваем баги


Мы взяли баги с низким приоритетом, по лейблам и датам отсеяли очевидный мусор. Всего получилось 490 багов — в основном маленькие и средние, до которых не доходили руки из-за более важных задач. Это все вменяемые тривиалы и миноры:

  • баги, которые многократно переезжали из версии в версию
  • баги, заведенные по обращениям пользователей
  • свежайшие крэши
  • баги регресса
  • баги, которые влияют на UX


Все баги распределили на три волны по приоритетности закрытия:

  • Первая волна — около 230 багов
  • Вторая волна — около 150 багов
  • Третья волна (запасная) — около 110 багов


Дефекты оценивались не по сложности, а по критичности для бизнеса. Самые критичные мы «искусственно» и временно перевели в приоритет «блокер» и «критикал». Чем выше приоритет бага, тем больше за него начислялось баллов. Сложность при этом не учитывалась — бывало, что баг-блокер закрывался за 20 минут, а тривиал — за 4 часа. За один баг можно было заработать от 1 до 7 баллов.

Счет каждой команды мы вели по закрытым багам согласно их стоимости в правилах багатона. Если у команд оставалось время, они брали в работу следующий дефект. Мотивация через стоимость позволила закрыть в первую очередь более критичные баги.

35368520cbfb2124fbadb00bf134a144.jpg

Как закрывали баги


Первую волну багов мы поделили на 11 групп (с запасом), равных по количеству баллов и по соотношению Android и iOS. Первая волна — это «дорогие» баги, приоритетные, с повышенной стоимостью. Для удобного поиска в Jira мы назначили им соответствующие лейблы. Вышло примерно по 20 багов в каждой группе.

В начале багатона мы собрали капитанов команд и разыграли лейблы. Дальше капитаны у себя в фильтре обозначали нужный лейбл и распределяли соответствующие баги внутри команды. Так удалось исключить хаотичный багфиксинг, где ребята бы попросту брали что для них понятнее.

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

К 19:00 все незакрытые баги перешли в третью волну — в дополнение к тем багам, что уже были там запланированы. В итоге на вечер у нас остались «быстрые» баги, которые закрылись бы в обычном флоу: крэши и текущие, выгруженные буквально за день до багатона, а также баги с самым низким приоритетом. В работу пошли все три волны. В итоге за багатон закрыли 286 из 493 выделенных багов.

b8b05b054526ffe489b12fa48106d40b.jpg

Багатон объединяет


Штаб багатона разместился в нашем конференц-зале, там же проходили викторины и турнир по видеоиграм. Команды не были ограничены, разбегались куда им удобно. В итоге о багатоне узнал весь банк. Один продакт-оунер с четвертого этажа рассказывал: «Иду я на встречу по 14-му этажу, ищу нужную переговорку. Вдруг понимаю, что только что видел знакомые лица, возвращаюсь — мои разрабы сидят фигачат вовсю, а на меня ноль внимания. Ха — думаю — от своего продукт-оунера и за 10 этажей не спрячутся, ладно, сидите уж, багфикс — дело правое».

Была команда, в которой на багатон пришел только один Android- и при этом шесть сильных iOS-разрабов. Мы в исключительном порядке выбили этой команде другой пакет с iOS-багами.

Кроме того, на багатон приехали семь разработчиков из регионов. Некоторые первый раз встретились со своими командами, с которыми раньше виделись только по видеоконференцсвязи. Было очень круто наблюдать, как эти ребята активно влились в процесс.

678c20e7076b0060b880de303b6fab26.jpg

Как оценивали результаты


На почти сотню разработчиков у нас было всего 15 тестировщиков. А ночью и вовсе четверо. На все их не хватало, поэтому тестирование продолжили на следующий день. Именно тестировщики начисляли баллы командам, так что мы вывели их из состава команд, чтобы исключить предвзятость. В обычном рабочем процессе тестировщик может позвонить разработчику и узнать: «Слушай, чувак, тут такая проблема…». На багатоне было строго: тестировщики должны заворачивать все, что четко не проходит.

Так мы смогли увидеть, что некоторые разработчики работают не в принятом флоу. Хакатон стал своеобразным катализатором всех отклонений. Те, кто работает четко по флоу, успели пройти тестирование в первой волне и получить баллы. Все, кто не очень соответствовал, попали в очередь, которую уже разгребали после багатона. В ней набралось 60 багов.

97260c53e33bf174dfa680c945710af2.jpg

Инциденты


В целом все прошло в штатном режиме, инциденты были типовые и устранялись в рабочем порядке. Когда что-то ломалось, некоторые синьоры сразу переключались с багфикса на устранение инцидента.

Был один забавный случай. Когда готовили дэшборд, мы расписали возможные риски: доступы в Jira, раскатка обновлений и т.д. Уведомили всех администраторов, что на время багатона нужно приостановить все профилактические работы, обновления Jira и серверов. Создали резервные учетные записи для доступа к Jira. И вдруг около 18:00 понимаем, что дэшборд перестал собирать данные. Предположения были разные. Может не учли какой-то протокол безопасности? Причина оказалась неожиданной. Организация у нас очень большая, получить полную информацию обо всех запланированных процессах удается не всегда. Наш дэшборд был развернут на виртуалке на одном из второстепенных серверов. Оказалось, что именно в этот день, вечер пятницы, именно этот сервер по неизвестному нам плану был физически отключен от розетки, погружен в машину и отправлен на ПМЖ в наш новый дата-центр. В итоге к утру субботы нам пришлось собирать все данные и рассчитывать баллы в ручном режиме.

Мердж веток и другие итоги


В обычном рабочем режиме вся ветка прогоняется вручную по 800+ тест-кейсам. Полная команда тестировщиков делает у нас штатное регрессионное тестирование за две недели. Мы не могли позволить себе так долго держать develop без изменений. Чтобы сократить время тестирования, выбрали основные тест-кейсы работоспособности приложения — порядка 107. До конца понедельника прогнали 80% iOS, 50% Android и ни одного критичного бага не выявили. Решили, что ветки можно сливать.

Из 286 багов, закрытых на багатоне, 182 бага были исправлены. Остальные — это реджекты, не актуальные по разным причинам баги (где-то уже успел измениться дизайн или функционал). Эти баги не критичны, но зато на них теперь не нужно будет отвлекаться и можно спокойно фокусироваться на важных задачах.

Также у многих по итогам багатона возник вопрос:, а сколько багов мы внесли? Всего восемь багов на iOS и семь багов на Android.

Для нас важно, чтобы разработчики чувствовали ответственность за код продукта наравне с другими членами команды. Это важно в любой разработке, но в разработке распределенной это становится необходимым условием для успешной работы. И на наш взгляд, нам удалось повысить уровень той самой сопричастности и командный дух. В результате получилась история с кучей профита: в сжатые сроки мы пофиксили кучу багов, разгрузили бэклоги, прокачали командные навыки и получили массу фана.

Материал подготовлен командой Digital Business Platform Сбербанка

© Habrahabr.ru