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



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


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

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



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

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


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

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

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

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



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


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

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

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



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


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

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

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

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


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


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

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

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

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

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

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



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


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

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

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

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



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


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

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

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



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


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

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



Инциденты


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

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

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


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

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

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

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

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

Комментарии (17)


  1. Wolonter
    10.10.2018 12:03

    В обычном рабочем режиме вся ветка прогоняется вручную по 800+ тест-кейсам. Полная команда тестировщиков делает у нас штатное регрессионное тестирование за две недели.


    А как часто?


    1. Bsydna
      11.10.2018 18:55

      Да, собственно, каждый релиз. На iOS это каждые три недели, на Android — четыре.


  1. alexhott
    10.10.2018 12:15
    -1

    У меня коллега по работе истерически хихикал
    я спросил почему?
    И он мне рассказал забавную и длинную историю его обращения в техподдержку сбербанка (примерно две недели общения по два раза в сутки) на счет ушедшей куда суммы.
    Ошибку вроде признали, но те сотрудники до которых ему удалось пробиться оказались откровенно низкой квалификации и в итоге результата так и не было, сумма была небольшоя и он на нее забил… но осадок остался.


  1. UnclShura
    10.10.2018 12:39
    +1

    Т.е. вы пару месяцев готовились к тому, чтобы за сутки багов пофиксить много? Кроме тим билдинга смысла в таком занятии не вижу. Вы подталкиваете разработчиков работать сутки суперинтенсивно (и видимо сверхурочно). Это не этично как мне кажется.

    (Отдельно доставляют фото программистов с ноутбуками)


    1. QtRoS
      10.10.2018 19:28

      (А что не так с ноутбуками/программистами?)


      1. katleta
        10.10.2018 22:25

        А что с ними не так? Вроде бы крышками вверх открыты, яблочки светятся…


    1. Bsydna
      11.10.2018 18:58

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

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

      Разумеется, мы сделали ставку на азарт коллег и надеялись, что как можно больше из них останется на ночь. Но это не было обязанностью и все, у кого были другие планы на пятничный вечер и ночь — спокойно уходили домой).

      В 19:00, через час после завершения рабочего дня, у нас оставалось более 3/4 всех участников. До 23:00 остались порядка 50%. К утру с нами осталось 20%, и еще столько же вернулись в офис к подведению итогов.

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


  1. Popadanec
    10.10.2018 12:50

    А длительное время запуска(программа в оперативке, загрузка несколько раз подряд, время одно и то же) порядка 40 секунд, это баг или «фича»? Но это на планшете с 4.2.2 wexler tab 7t.
    Просто к примеру тот же хром с десятками открытых вкладок на нем работает без тормозов.
    И для сравнения на samsung j5 prime стабильное время запуска менее 10 секунд.
    На Xiaomi 4x запуск менее 5 секунд.
    Время везде считал от распознавания отпечатка пальца/ввода последнего символа пароля.


  1. gdt
    10.10.2018 14:30

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


    1. Popadanec
      10.10.2018 16:14

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


  1. Corosan
    10.10.2018 17:45

    Мне одному кажется, что делать из каждодневных обязанностей, на которые почему-то забили, шоу… несколько странно? И предлагать это как достижение.


    1. Bsydna
      11.10.2018 19:03

      Мы предлагаем это как кейс, результатами которого довольны. Как мы писали в статье — никто не пренебрегает своими обязанностями. Есть приоритеты, и есть гибкая методология разработки. Если ваши задачи не укладываются в спринт, вы берете в него те, которые приоритетней —срок/востребованность выше. Все что не поместилось — уезжает в следующий блок времени. К началу следующего блока у вас появляются или становятся более приоритетными другие задачи, а старые с низким — так и остаются с низким, а так как у них нет срока исполнения, приоритет и не повышается. В итоге задача раз за разом перекочевывает из спринта в спринт.

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


  1. nikola_sa
    10.10.2018 23:11

    А для чего нужны резервные учетные записи для доступа к Jira?


    1. Bsydna
      11.10.2018 19:04

      Для дашборда мы сделали парсер по джире, а чтобы этот парсер получал данные, дали ему логин и пароль от одной из личных учеток. Времени до мероприятия оставалось мало, и кейсов подобных у нас не было. Уточнили у коллег есть ли ограничения на количество суточных запросов. Получили несколько мнений. Ориентировались на минимальное предположение. Мы не были уверены на счет конкретной цифры. Чтобы у нас внезапно не отрубили доступ нашему парсеру, на всякий случай решили перестраховаться)


  1. Nidhognit
    11.10.2018 11:56

    Итак, если 9 команд, по 5 iOS и 5 Android + 3 дня веремени (24 часа) и получаем 286 багов, то вы ходит что в среднем разработчик чинил 286/90/3 = 1.05 бага в рабочий день

    1 баг за 1 день разработки. Я не знаю насколько серьезные были баги, но как то слишком долго для минорных багов.

    А есть статистика сколько багов в среднем чинят в день при нормальной работе? Может это просто неефективно?


    1. Bsydna
      11.10.2018 19:05

      Не совсем так) Не все команды были по 10 человек. Всего в багатоне приняло участие 82 разработчика. Как мы писали выше, никого не принуждали присутствовать все 24 часа. После окончания рабочего дня всё, что делали ребята, было исключительно на добровольных началах. Ну и, разумеется, чем дальше от 18:00 мы продвигались — тем меньше с нами оставалось людей. Не стоит забывать об усталости. В среднестатистический день закрываются 25 багов, но это с учетом прочих задач по разработке, которые занимают большую часть времени работы. У нас получилось закрыть 286 за все мероприятие.


      1. Nidhognit
        12.10.2018 12:12

        Сколько тогда залогировали времени разработчики в сумме за весь хакатон? потмоу как данные очень разрозненные, тяжело посчитать