Все, кто слышал про Scrum, скорее всего слышали про его основные мероприятия: планирование, пятиминутка (stand-up), обзор спринта и ретроспектива. Многие слышали, инструментов для проведения ретроспектив много, "обучающих" материалов ещё больше, но всё как-то не выходит. Или вроде как выходит, но почему-то команда не хочет в этом участвовать. В этой статье я представлю свой рецепт проведения ретроспектив, не только представив конкретные и детальные шаги, но и попробовав объяснить, почему шаги именно такие и в такой формулировке.

Кто присутствует

Ретроспектива это в первую очередь мероприятие, направленное внутрь команды. Его решения -- это решения для самой команды, и вырабатываться они должны внутри. Вполне допустимо на ретроспективу принести те самые две пиццы, использовать нецензурные выражения (но не друг на друга!), принести куклу большого начальника и/или заказчика. Важно, чтобы каждый член команды чувствовал, что он может высказать своё мнение, и это не то что не приведёт к какому-нибудь негативу, а ровно наоборот -- будет использовано для пользы команде.

Поэтому на ретроспективе должны быть, с одной стороны, все члены команды, с другой -- никаких больших начальников, секретарей, представителей заказчика и соседних команд. Ретроспектива -- это не отчёт! Это не презентация! Это не спектакль, который команда играет для заказчика (в отличие от обзора спринта). Это внутреннее мероприятие команды, которое, в принципе, иногда можно даже заменять тим-билдингом. И возможно от этого даже будет больше пользы, чем от ретро.

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

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

Когда

Ретроспектива должна проводиться регулярно. Вообще всё в Scrum должно делаться регулярно. И планирование, и обзор, и ретро. "Сила" методологии именно в том, чтобы превратить непредсказуемый творческий процесс разработки в предсказуемый и планируемый.

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

Что нужно для ретро?

Если ретро проводится в "реальном мире", потребуются стикеры/листочки (по 6-10 штук на человека), ручки и доска с маркером.

В "виртуальном" мире достаточно обойтись расшаренным экраном с двумя/тремя блокнотами, либо одним экраном Confluence / MS Word с тремя полями. Условно их пока можно назвать "плюсы", "минусы" и "действия".

Для целей геймификации можно использовать онлайн-инструменты типа fun retro / easy retro, но пока что ни один из этих инструментов не вписался в тот рецепт, который будет описан ниже.

Будучи хорошим начальником (или планируя им стать) -- принесите на ретро орешков, конфет, печенек (*закадровое узнаваемое дыхание*), запланируйте общий ланч с пиццей без отрыва от "производства".

Начало ретро

В начале всем участникам команды раздаётся задание. Нужно придумать и записать (пока что в тайне от других членов команды -- это важно):

(+) Не менее N таких вещей, которые им понравились в текущем спринте, и которые они не хотели бы терять в процессе предлагаемых в рамках ретро изменений.

(-) Не более N таких вещей, которые не нравятся, и хотелось бы поменять.

Не нужно пытаться "оптимизировать" процесс и просить членов команды записать эти пункты заранее в качестве домашнего задания. Всё равно им придётся на это тратить время, верно? Пусть лучше потратят его все сразу в одном месте, не мучаясь угрызениями совести за несделанную домашнюю работу и без смущающих взглядов коллег, которые были такими замечательными, что сделали заранее (читай -- за 5 минут до встречи, отвлекаясь от какой-нибудь скучной еженедельной встречи).

Сначала про "плюсы". Этот пункт важен, хотя бы для закрепления того, что команда сделала хорошо. Похвалить самих себя -- тоже важно. Наверное это подтвердит любой психолог. Граница снизу здесь нужна, чтобы каждый член команды заставил себя, во-первых, вспомнить прошедший спринт, а, во-вторых, включился таким образом в ретроспективу. "Не хотим терять" -- это важная подсказка. Например она сразу отекает такие вещи, которые не зависят от команды. Нет смысла обсуждать возможность удалённой работы, если не команда решает этот вопрос. Или есть смысл упомянуть, как нравится текущий CI и быстрое прохождение ревью, ведь именно от команды (обычно) он и зависит.

Другое важное назначение "+"-пунктов, это возможность позже, когда будут предлагаться действия по решению проблем (action point'ы), выбирать те из них, которые минимальным образом будут влиять на то, что команда не хочет потерять.

Важно, чтобы плюсы и минусы записывались на листочках независимо друг от друга. Тем самым мы избавляемся от "проблемы +1", когда люди вместо раздумывания над проблемой просто присоединяются к чужому ответу (аналогичная ситуация происходит, например, при планировании, от чёго защищает "слепое" покер-планирование).

Минусы. В идеале нужно, чтобы участники сразу записали что им не нравится. Не action point, не то, что они предлагают сделать, а то, что им непосредственно мешает в работе. Но в принципе на первые 4-6 ретроспектив достаточно, чтобы участники хоть что-нибудь записали. А далее ведущий уже вытянет из них всю правду (*дьявольский смех за кадром*).

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

Анализ

Начинаем с плюсов. Тут можно просто выписать их в первую колонку (наклеить стикеры), при возможности сгруппировав их для удобства наблюдения и красивого представления вышестоящему начальству. Просто пока помните, что эти плюсы -- это что ваша команда хочет сохранить хотя бы на следующий спринт и не потерять при выполнении action point'ов.

Минусы. Самый сложный этап. Игра в доктора "наоборот".

Берём каждый стикер (присланный нам в персональные предложения пункт) и... не записываем его. А проверяем, что данный пункт описывает симптом, а не болезнь. Почему? Потому что потом мы должны будем предложить такое решение, которое будет наиболее эффективным способом избавиться от симптома. И "лечение" самой болезни может быть одним из, но не самым эффективным (с точки зрения усилий и времени) способом. Кроме того, данный симптом может быть вызван несколькими причинами, и возможно только одну из них нужно будет убрать, и это вовсе не та, которую изначально назвал член команды.

Ещё раз. Каждый пункт надо записать в виде симптома, а не болезни (и точно не в виде action point'а). Например. Член команды записывает на стикере "у нас неоптимальный CI-скрипт". Если оставить как есть, единственным возможными способом решения данной проблемы будет, очевидно, переписать CI-скрипт. Но нужно ли?

Уточняем у члена команды, "[Олег], на что в твоей работе влияет то, что CI-скрипт не оптимален"? Внезапно оказывается, что:

  • скрипт медленно работает

    • медленная работа приводит к медленному прохождению pull request'ов

      • невозможность распарраллелить работу приводит к простою

        • это приводит к медленной работе члена команды

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

    • это приводит к необходимости ручного перезапуска CI

      • это приводит к медленной работе члена команды

На каком шаге остановиться -- сказать сложно. Но в любом случае каждый следующий шаг описывает более общую проблему. В целом все пункты так или иначе сводятся к одному конкретному -- "замедление работы команды". Поэтому тут важно остановиться где-то за 1-2 пункта до этого.

Но зато для каждого следующего более общего уровня можно предложить самые разные варианты решения проблем:

  • поставить больше CI-агентов для сборки и распараллелить его работу / сборку / разрешить параллельную работу нескольких сборок одновременно

  • поставить посильнее машину для CI

  • выкинуть часть действий из CI-скрипта, не переписывая его кардинально

  • полностью переписать CI-скрипт

  • научить пользователя переключаться между ветками в git, позволив ему распараллелить работу и не ждать CI

  • сделать простой скрипт для перезапуска failed-сценариев 2-3 раза

Но пока что возможный список даже не озвучиваем. Но мы должны (из своего опыта) как-то понять, что именно та формулировка, которая будет записана, может, хотя бы в теории, быть решена несколькими разными способами. И вот именно эту формулировку и надо записать в "минусы".

Кроме того, более обще записанная формулировка имеет больше шансов пересечься с "минусом" от другого участника. А это хорошо -- значит у нас не 30 разных проблем, а, скажем, 7-10 (сгруппированных). К этому и надо стремиться.

Очень важно при попытке вытащить из члена команды более общую проблему не задавить его авторитетом и не подложить свою проблему вместо его. Все мы люди, все мы субъективны, и можем увидеть в чужой проблеме вовсе не то, что беспокоит члена команды, а что беспокоит нас самих. Уметь оставлять свои проблемы в стороне и слушать (и слышать) другого человека, наверное, самое важное для того, кто собирается в IT работать с людьми. Но это очень и очень сложно. Ничего страшного, если Вас по началу будут поправлять и говорить, "нет, это вовсе не то, что меня беспокоит, меня беспокоит другое". Замечательно, если Вам будут это говорить. Гораздо хуже, если с Вами молча согласятся, чтобы не спорить и побыстрее закончить.

Голосование

Изначально считаем, что за каждый пункт подано столько голосов, сколько изначальных "минусов" было сгруппировано в него. Далее я предлагаю членам команды проголосовать дополнительно за 1 или 2 пункта (из сгруппированных 7-10), Но только за те, в которых нет пунктов, которые они формулировали сами (или в которые были переформулированы их "минусы").

В результате формируется отсортированный "по голосам" список проблем.

Блиц-этап

На данном этапе включаем секундомер и предлагаем по 60 секунд на решение каждой проблемы, кроме Top3 (в любом порядке). В рамках этих 60 секунд можно предложить "быстрое" решение проблемы. Не важно, насколько сильно оно решает проблему, главное, чтобы хоть как-то решало. Если никто из членов команды не против предложенного решения, оно записывается в action point'ы. Если против -- решение сразу же откидывается без обсуждения (время на обсуждение не тратится).

60 секунд это скорее ориентир. На то, что не нужно тратить много времени на блиц-проблемы, которые не являются самыми больными местами в процессе.

Перерыв на кофе

Перед перерывом на кофе окончательно формулируем top3 проблем, которые нужно обсудить, и предлагаем членам команды пойти покурить/попить/выпить/отойти проверить почту.

Обсуждение. Action Points

Итак, у нас есть top3 проблем. Самые больные, самые серьёзные, самые мешающие команде. На каждую проблему хоть час обсуждения (поэтому ретро и занимает от 3-х часов). Как придумать возможные решения -- не знаю. Однако, знаю, что делать с возможными решениями.

Во-первых, не надо отбрасывать решения, которые не решают проблему целиком. Нас вполне устроят решения, которые решают проблему хотя бы частично. Хоть на 20%, но облегчают жизнь команды. Кто знает, может именно этих 20% хватит, чтобы в следующий раз проблему не включили в top3?

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

В-третьих, формулировка. Формулировка должна быть такой, чтобы у команды был минимальный шанс не выполнить пункт.

Плохой вариант

Вариант получше

Нужно устроить встречу и обсудить розовых единорогов

[Олег] устраивает встречу во-вторник в 15 часов по обсуждению проблемы питания розовых единорогов

Ответственно подходить к ревью pull request'ов

- (или) при отклонении pull request'а оставлять комментарий
- (или) настроить бота, назначающего PR на ревью на членов команды
- (или) добавить в CI-скрипт автоматический линтер, а все проблемы в оформлении, которые им не покрываются не считать проблемами

заранее формулировать тикеты в jira до планирования

[Олег] заведёт в outlook еженедельный backlog grooming до планирования с участием владельца backlog'а, представителя аналитиков и solution-архитекторов смежных систем

Полученные шаги записываются в action point'ы.

Почему ретро может не помочь

Может так случиться, что сделали всё по рецепту, а огонёк в глазах команды всё тусклее и тусклее, а производительность команды падает. Потому что автор этого текста ни хрена не знает. Ретроспектива в этом случае позволяет найти часть этих причин, и задуматься, почему эти причины до сих пор не исправлены.

Признаками проблем являются:

  • Ретроспектива проводится за полчаса. Это не ретроспектива, это отчёт-доклад команды "как у нас всё хорошо, как здорово и дружно мы живём, дорогой дедушка Ленин". Явный признак того, что мероприятие проводится для галочки, без той пользы, которую могло бы принести полноценное ретро.

  • Повторяющиеся в две-три ретроспективы похожие описания проблем. Команда предполагает, что теоретически эти проблемы можно было бы попытаться решить какими-то действиями внутри команды. Может быть даже предлагает action point'ы.Но в какой-то момент эти проблемы просто исчезают из анализа, потому что команда уже привыкла к тому, что высказывать их бесполезно. Но сами проблемы-то никуда не делись!

  • Если таких проблем много, то в какой-то момент появляются фразы "слишком много времени тратится на ретроспективы". Это прямо-таки прямой сигнал о том, что с ретроспективой всё плохо. И да, без изменения формата ретро далее проводить бессмысленно.

  • Невыполненные action point'ы (при том, что проблема не ушла). Возможно они были очень неудачно сформулированы. А возможно тот, кто должен был их выполнить, забыл/забил/не захотел их делать.

Самой большой проблемой является понять, что у нас вас проблемы. Вы можете спокойно смотреть на красивые отчёты о ретроспективах в confluence, показывать начальству, а члены команды почему-то не хотят на них ходить. Моя рекомендация -- приглашайте на ретро раз в полгода кого-то со стороны. Не начальника, а методолога, коллегу из параллельной (или далёкой) команды. Возможно пригласить даже его сразу как фасилитатора -- попробуйте формат ретроспективы от другой команды. Пусть её проведёт тот, кто не привык к вашему формату.

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


  1. akuleshov7
    02.11.2021 10:59
    +1

    Отличная статья! Хоть сам и не сторонник расово-scrum-верных подходов, но все равно возьму на вооружение некоторые вещи.


  1. yellowmew
    02.11.2021 11:52

    Самый подходящий для меня формат ретроспективы когда обзор своей работы каждый пишет сам, при подготовке к спринту

    Да, "домашка", ничего не поделаешь, но зато никто не торопит во время митинга, ты легко вспоминаешь все самое хорошее и самое не очень и спокойно фиксируешь .. и приносишь на ревью спринта. Проводить ретро в формате "вспомнить что вы делали последние две недели за 10 минут" - для меня так себе идея. Пара месяцев в команде понадобилось добавлять отдельные задачи в спринт на подготовку, зато потом стало все гораздо легче (и задачи кстати тоже ушли, привычка - дело такое). Все приходят с уже готовыми мыслями и идеями, не взятыми с потолка во время "минутки", как вы предлагаете.

    С подготовленными селф ревью гораздо легче проводить ревью спринта.

    А ретроспективу в общем то и необязательно проводить если команда не видит проблем которые ей мешают. Но в команде должен быть тот, кто занимается анализом ревью, чтобы отсекать случаи типа "Вася уже несколько спринтов выполняет только 50% взятых задач но пишет что проблем нет" и выносить их в список проблем. Это, как и у вас , должен быть или член команды - не менеджер, или же менеджер но такой, который в работе ставит себя на одном уровне с другими в команде, дополнительно выполняя менеджерские функции. Как раз чтобы не давить авторитетом "я начальник - ты дурак"

    Про план действий:

    у любого действия должен быть "владелец". Это человек который вынесет с ретроспективы действие и обеспечит его выполнение. Если это задача внутри команды - то можно договариваться сразу кто будет выполнять.

    Каждое действие должно быть сформулировано в виде действия, приносящего конкретный результат, а не просто "благие намерения" (в вашем списке последние два - как раз благие намерения). Но, опять же, в случае "Ответственно подходить к ревью pull request'ов" у вас в правой колонке тоже написаны какие-то пожелания. Я бы предложил "сформулировать и описать на вики правила ревью пул реквестов" - договоренность, кото
    рая формируется внутри команды и которой члены команды обещают следовать, зафиксированная и живая - то есть ее можно и нужно править со временем, если она будет вызывать проблемы


    1. vlsergey Автор
      02.11.2021 12:03

      Уточнение: не все action point'ы являются конкретными действиями. Это может быть изменение в процессе -- тогда оно просто принимается всеми членами команды. Или это может быть задача на уменьшение тех. долга в следующий спринт (в резерв мощности, которая команда себе на это оставляет). В этих случаях нет "владельца".

      И не обязательно в этом случае описывать это на вики. Описывать правила проведения pull request'ов иногда это просто лишняя бюрократия. Ведь и так эти правила все помнят (пока что), а в случае сомнений можно посмотреть на список action point'ов. Разумеется, это только для маленькой команды со своими правилами.


      1. yellowmew
        02.11.2021 12:10

        "изменение в процессе" - это вполне себе конкретный экшен, "внести изменение в процесс", он же где то описан, не на словах договариваемся

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

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


        1. vlsergey Автор
          02.11.2021 12:13

          Процесс может быть и описан, а может быть и на словах. В последних двух командах он был "на словах и в скриптах". До этого было формальное описание, общее для десятка команд... на которое команды забивали и всё равно делали по своему.

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


          1. yellowmew
            02.11.2021 13:02

            то есть на несоблюдение процесса мы на ретро записываем "Коля мы же тебе уже сто раз говорили" ?

            Я не сторонник формализации всего и вся, но в определенных ситуациях от обилия информации начинаешь теряться и в голове ее не удержать, поэтому важные соглашения надо фиксировать. Хотя тут скорее культура работы в команде, конечно.

            А про техдолг, судя по всему, я вас убедил :D


            1. vlsergey Автор
              02.11.2021 13:07

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

              А вот если процесс не будет соблюдаться (когда процесс уже есть), тогда да, первый шаг -- его куда-нибудь записать. Но у нас такой проблемы пока не было.


              1. yellowmew
                02.11.2021 17:44

                У нас это вылилось не в формализацию в вики, а в написание скрипта, который часть этого процесса автоматизировал

                ух прям завидую.. некоторые вещи тоже хочется переложить на автомат и не морочиться


    1. vlsergey Автор
      02.11.2021 12:15

      А ретроспективу в общем то и необязательно проводить если команда не видит проблем которые ей мешают

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


      1. yellowmew
        02.11.2021 12:57

        Вот именно поэтому должен быть кто-то кто увидит в такой ситуации проблему, даже если команда ее не видит. Я про это упомянул.

        И, поверьте, бывают такие случаи. как-то
        6 спринтов без проблем работали, незабываемое ощущение у всей команды - это очень поднимает дух (и это заметно)


        1. MikeVentris
          02.11.2021 13:34
          +1

          Очень многие команды попадают в эту логическую ловушку:

          1) У нас есть проблемы, что нужно чтобы их решить?

          2) Ретроспективы!

          3) Ок, мы решили наши проблемы, зачем теперь нам ретроспективы?

          Именно поэтому важно акцентировать внимание на том, что ретроспектива - не способ решения проблем, а инструмент непрерывного процесса совершенствования работы команды: "Мы работали 6 спринтов без проблем, а как нам работать еще лучше/эффективнее?".

          И задача фасилитатора тут донести этот акцент до команды, чтобы она сама начала генерировать идеи, что можно улучшить.

          Тк альтернатива - это "злой начальник", который придет и создаст проблемы сам: "6 спринтов проблем не было? Ок, в ближайший спринт сделайте вдвое больше". И не потому, что злой, а потому что видит, что команда может лучше, но сама над этим не работает.


          1. yellowmew
            02.11.2021 17:34

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

            Здесь, да и у @vlsergey в общем то так и написано - главное понять что проблема есть
            . Ваш пример с развитием - это уже анализ процессов внутри команды, на них тоже кто-то должен обращать внимание.


        1. yellowmew
          02.11.2021 17:40

          исходя из своего опыта - есть несколько вариантов:

          1. решаете не ту проблему - может быть неверно сформулировали, или слишком поверхностно анализировали и не докопались до первопричины. Судя по вашим словам о похожести проблем - наиболее вероятно, с моей точки зрения (это такой gut feeling, с похожим сталкивались)

          2. решение проблемы, несмотря ни на что, - от вас не зависит.

          3. это на самом деле не проблема, но в список она попала из за молчаливого согласия что "Васе неудобно, да, наверное надо как то решить"


  1. RhelasTgav
    02.11.2021 11:55

    Есть замечательная книга по Agile от Боба Мартина, так вот он когда описывает инструменты, то отталкивается от того зачем и почему они его придумали, вместо "понадобятся листочки". Мне видится это важным


    1. MikeVentris
      02.11.2021 13:35

      Полностью согласен, без мотивационной составляющей, любые Scrum-мероприятия - это процессы, ради процессов.


  1. Amokmorg
    02.11.2021 14:07

    Потеряли самое главное - проверку "а помогло/сделали ли то, что мы решили на прошлой ретроспективе", иначе это реально тусовка ради тусовки.

    Ну и я так и не увидел, а кто по вашему должен то присутствовать? PO является частью команды, но считается, что его присутствие на ретро вредит по причине конфликта интересов.


    1. vlsergey Автор
      02.11.2021 14:18

      Валидация action point'ов как отдельный шаг не нужен. Потому что ретроспектива это не отчёт. Если у нас какой-то action point не решил проблему (и не важно -- потому что не был выполнен, или потому что не помог), мы заново вписываем проблему в список, и, если она по прежнему актуальна, ищем новые решения. Разумеется, если будет предложено то, что уже предлагалось ранее, то стоит обращать на это внимание и уточнять, а чем текущее предложение лучше несработавшего старого.

      Присутствие PO это штука спорная. Очень много зависит от того, а кого вы называете владельцем продукта, и кем он сам себя считает. Если этот человек участвует в написании кода и ревью -- его 100% надо включать. Если человек что-то делает внутри команды (закрывает таски в Jira) -- тоже надо. Если же он только таски создаёт... будет зависеть от самого человека, в том числе его адекватности. Ну и загруженности. Если человек даже Jira не видит и только раздаёт ЦУ -- ему на ретро точно делать нечего.


  1. anonymous
    00.00.0000 00:00


    1. vlsergey Автор
      02.11.2021 16:42

      Если каждый раз говорится одно и то же -- это явный признак проблем. Но вот где -- вопрос.


  1. anonymous
    00.00.0000 00:00