Ретроспектива за 45 минут: как перестать превращать ретро в час коллективного нытья

Дисклеймер: я делаю бесплатную онлайн-доску для ретроспектив Retrospectrix и насмотрелся на ретро в разных командах. Первая половина статьи — про процесс: тайминг, форматы, правила. Вторая — про то, как устроен сам инструмент: стек, где хостится и что происходит с данными. Ссылка на проект в статье одна, выше.

Почему ретро умирают

Симптомы одни и те же в любой команде:

  • Ретро превращается в жалобную книгу. Все выговорились, всем полегчало, ничего не поменялось. Через три месяца команда решает, что ретро — пустая трата времени, и перестаёт их проводить.

  • Говорят два человека. Тимлид и самый громкий разработчик. Остальные ждут, когда можно вернуться к работе.

  • Один пункт съедает всё время. Сорок минут спорили про флаки-тесты, остальные восемь карточек «перенесли на следующий раз». И так каждый раз.

  • Экшен-айтемы никто не записал. Или записал, но в никуда — через две недели никто не помнит, о чём договорились.

Всё это лечится не мотивацией, а структурой. Ниже — тайминг и правила, которые чаще всего спасают ретро.

Тайминг на 45 минут

Этап

Время

Что происходит

Сбор карточек

10 мин

Каждый пишет молча, никаких обсуждений

Голосование

5 мин

Лайки на чужие карточки, у каждого ограниченный запас голосов

Обсуждение

25 мин

Строго по убыванию голосов, максимум 5 минут на карточку

Экшен-айтемы

5 мин

У каждого пункта — ответственный и срок

Два неочевидных момента.

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

Пять минут на карточку — жёсткий лимит. Есть старое правило: спор, который не решился за пять минут, обсуждением не решится вообще — участникам не хватает фактов. Такой спор надо не продолжать, а конвертировать в экшен-айтем: «Вася собирает статистику по флаки-тестам к четвергу».

Форматы: что писать в колонки и когда какой брать

Формат ретро — это просто набор колонок, которые задают вопросы команде. Разные вопросы вытаскивают разное. Вот четыре формата, которые я поддерживаю в инструменте, — с тем, что именно писать в каждую колонку.

Start / Stop / Continue

Три колонки, каждая требует не чувства, а решения:

  • Start (Начать) — практики, которых у нас пока нет и которые хотим попробовать в следующем спринте. «Начать писать ADR на архитектурные решения».

  • Stop (Прекратить) — то, что съедает время и ничего не возвращает. «Прекратить созвон-синк по понедельникам, он дублирует стендап».

  • Continue (Продолжить) — то, что сработало и тихо исчезнет, если этого никто не назовёт. «Продолжать парное ревью критичных PR».

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

Mad / Sad / Glad

Формат спрашивает не как прошёл спринт, а как он ощущался:

  • Mad (Злит) — что вызывало злость: блокеры, невыполненные обещания, повторяющаяся боль. «Третий спринт подряд ждём доступ к стенду».

  • Sad (Огорчает) — разочарования: то, на что надеялись и что не случилось. «Думали выкатить фичу к демо, не успели».

  • Glad (Радует) — что искренне порадовало, пусть в мелочи. «Новичок сам закрыл первый баг без помощи».

Это отвечает на вопрос «что значит “с командой нехорошо”». Метрики могут быть здоровыми — velocity растёт, релизы в срок, — а люди выгорают, тихо раздражаются друг на друга, и ваш сильный инженер обновляет резюме. Ни один график velocity этого не покажет: выгорание и обида не попадают в трекер задач. Процессные форматы к этому слепы по устройству, потому что просят назвать проблему процесса, а проблема — не в процессе. Mad/Sad/Glad даёт легальный способ сказать «меня злит, что…» без выяснения отношений. Брать после аврала, провального релиза, реорганизации — или когда ретро стали подозрительно тихими и вежливыми. Читать карточки начинайте с Glad: если открыть встречу злостью, она из этого тона уже не выйдет. И лучше, чтобы вёл не руководитель — при нём люди редактируют себя.

4L: Liked / Learned / Lacked / Longed for

Четыре колонки, и главная ценность — в разделении двух последних:

  • Liked (Понравилось) — что принесло удовлетворение и стоит сохранить.

  • Learned (Узнали) — новое знание: техническое, продуктовое или друг о друге. «Оказалось, наша GC-пауза была из-за логгера».

  • Lacked (Не хватило) — конкретные пробелы: инструменты, доступы, люди, информация, время. «Не хватило тестового стенда с прод-данными».

  • Longed for (Хотелось бы) — желания за пределами досягаемости команды. «Хотелось бы внятной продуктовой стратегии».

Отсутствующий тестовый стенд — пробел, который закрывается за месяц. Желание внятной стратегии — нет. Разнесённые по колонкам, они перестают выглядеть одинаково решаемыми. Голосуйте только по Lacked — единственная колонка, где у команды есть рычаг, а карточки из Longed for относите тому, кто может по ним действовать. Формат для закрытия длинного спринта или этапа проекта, и для команд, осваивающих новое. Минус: четыре колонки на телефоне — это одна колонка за раз.

Sailboat

Метафора: команда — лодка.

  • Wind (Ветер) — что двигает вперёд и стоит усилить.

  • Anchors (Якоря) — что тормозит прямо сейчас.

  • Rocks (Рифы) — риски впереди, на которые ещё не напоролись. «Сертификат истекает в ноябре, а владельца процесса нет».

  • Island (Остров) — цель: куда мы на самом деле плывём.

Единственный распространённый формат с колонкой для того, что ещё не сломалось, — поэтому к нему возвращаются. Остров заполняйте первым и вместе: если команда напишет три разные цели — остановите ретро, настоящая проблема уже найдена. Брать в начале квартала или большого релиза. Ловушка: спор «это якорь или риф?» — десять секунд на такое и дальше.

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

Правила, которые держат ретро живым

  1. Вегас-правило. Всё сказанное на ретро остаётся на ретро. Один пересказ менеджеру — и следующие полгода на ретро будут говорить только про погоду.

  2. Ищем причину, не виноватого. «Почему деплой упал» вместо «кто уронил деплой». Как только появляется виноватый, честность заканчивается.

  3. Максимум три экшен-айтема. Список из десяти пунктов — это ноль выполненных. Три пункта с ответственными — это три выполненных.

  4. Начинайте со статуса прошлых экшен-айтемов. Единственное, что доказывает команде, что ретро — не ритуал.

Как устроен инструмент

Для офисной команды стикеры на стене — до сих пор лучший инструмент. Для распределённой нужна общая доска. Я устал от «зарегистрируйтесь, подтвердите почту, создайте воркспейс» ради встречи на 45 минут и сделал свою. Ниже — что под капотом, потому что для многих команд вопрос «где лежат наши откровения про менеджера» важнее любых фич.

Что умеет. Доска создаётся в один клик и раздаётся ссылкой; участники заходят без регистрации и почты. При создании выбирается формат — классические три колонки («хорошо / не получилось / улучшить») или один из четырёх выше; колонки подстраиваются под формат. Карточки, лайки/дизлайки, комментарии, картинки, drag&drop между колонками — всё обновляется у всех в реальном времени. Режим обсуждения: ведущий нажимает «Обсудить», у всей команды подсвечивается одна и та же карточка, повестка отсортирована по голосам, на карточку идёт таймер 5 минут, пройденные помечаются галочкой. Пространства объединяют серию ретро одной команды и могут закрываться паролем. Итоги выгружаются в Markdown или JSON — есть read-only API по коду доски, чтобы скормить ретро AI-агенту или боту.

Стек. SvelteKit на Svelte 5 (runes) + Tailwind 4 на фронте; Node.js с Socket.IO для реального времени; PostgreSQL 16 через Drizzle ORM; картинки жмёт Sharp в WebP до 1200px. Собирается в Docker, деплой — GitHub Actions по SSH: npm test → сборка → e2e-прогон на Playwright против настоящего Postgres гейтит деплой. Метрики уходят в Netdata по StatsD. Проект открытый, исходники на GitHub (ссылка есть на сайте).

Где данные и что с ними происходит.

  • Хостинг. Один VPS в Selectel, дата-центр в Санкт-Петербурге. Никаких зарубежных облаков и CDN — шрифты и статика отдаются с того же сервера.

  • Шифрование. Тексты карточек и комментариев шифруются при хранении AES-256-GCM, ключ — в переменной окружения, в базе лежит шифротекст. Дамп базы без ключа бесполезен. Между браузером и сервером — TLS с HSTS.

  • Доступ. Доска живёт по неугадываемой ссылке — 21 символ nanoid, около 126 бит энтропии. Она нигде не публикуется, поисковикам доски и пространства закрыты заголовком noindex и robots.txt. Кто знает ссылку — тот на доске: относитесь к ней как к ключу. У создателя есть отдельная админ-ссылка для таймера, обсуждения и удаления.

  • Что не собирается. Аккаунтов нет, почты нет, рекламных и сквозных трекеров нет. Одна техническая сессионная кука для подсчёта уникальных визитов; язык, тема и имя участника живут в localStorage браузера. Аналитика — анонимные счётчики «сколько зашло, из какого класса источников».

  • Удаление. Создатель удаляет доску — вместе с ней каскадом уходят карточки, комментарии, голоса и картинки. Картинки, которые не привязались ни к одной карточке, чистятся автоматически через сутки.

  • Self-hosting. Если и этого мало — код открытый, поднимается одним docker compose up с Postgres в комплекте; переменные окружения описаны в репозитории. Можно держать ретро полностью внутри своего периметра.

  • Исходный код открыт. Вот репозиторий.

Чего пока нет и что честно стоит знать: нет экшен-айтемов как сущности (ответственный + срок) — записывать их приходится карточкой или комментарием, это следующая большая фича; нет SSO и ролей — модель доступа намеренно плоская, «ссылка = доступ»; английская версия есть, но живёт на тех же адресах.

Бесплатно, без лимитов на участников. Если пригодится — буду рад обратной связи в комментариях. А какие правила и форматы спасают ретро в ваших командах?

Автор: neckita39

Источник

Оставить комментарий