Баг завели. Баг забыли. Баг вернулся на прод

Страницы:  1

Ответить
 

Professor Seleznov


Всем привет, это команда продукта SimpleOne SDLC. Поговорим о вещи, которую в командах обычно не обсуждают вслух — о бэклоге дефектов, который никто не разгребает.
И даже не потому, что лень, а потому, что нет выстроенного процесса.
pic
Разговор, который случается в каждой второй команде. Понедельник, утро перед демо:
— Сколько у нас открытых дефектов?
— Около пятисот.
— Из них критичных?
— Сейчас посмотрю… Тут написано P1, но это, кажется, вообще из прошлого квартала. Репродьюсить уже не получается.
— А вот эти триста P3 — они вообще актуальны?
— Не знаю. Их Вася заводил, а Вася уволился в феврале…
Вася — это отдельная история. Мы уже писали о том, что происходит, когда ключевой человек уходит и уносит с собой контекст. Бэклог дефектов — один из самых болезненных примеров: баги без автора, без контекста, без понимания, воспроизводится ли это вообще сейчас.
Но сегодня не про Васю. Сегодня про то, что делать с этими пятьюстами тикетами — независимо от того, кто их заводил.
Эта статья для руководителей, которые смотрят на этот список и не понимают, с чего начать. Расскажем, как навести порядок — и главное, как не дать ему снова превратиться в свалку.
Отдельную благодарность за помощь в написании статьи выражаем Панфиловой Яне.
Severity ≠ Priority: фундамент, без которого все сломается
Начнем с самого частого источника хаоса — смешения severity (критичности) и priority (приоритета). Это не синонимы, как вам могло показаться, и именно их путаница порождает ситуацию, когда P2-баг с опечаткой в интерфейсе соседствует с P2-багом, из-за которого данные записываются с ошибкой. 
  • Severity — технический масштаб проблемы: насколько сильно баг ломает функциональность. Оценивает QA или разработчик.
  • Priority — бизнес-решение о срочности исправления. Принимает Product Owner с учетом контекста: сколько пользователей затронуто, есть ли обходной путь, каков риск.
Пример, который не бьется с интуицией: баг с неправильным порядком сортировки в отчете для CFO — Severity: Low (технически косметика), Priority: Critical (CFO ждет отчет завтра утром). И наоборот: падение редко используемого внутреннего инструмента — Severity: Critical, Priority: Low.
Если в команде нет явного соглашения, кто что оценивает и по каким критериям, приоритизация всегда будет субъективной. Вот практическая матрица, которую можно взять за основу:
Severity: Critical Severity: High Severity: Medium Severity: Low
Бизнес-риск: High P0 — fix now P1 — текущий спринт P2 — следующий спринт P2 — следующий спринт
Бизнес-риск: Medium P1 — текущий спринт P2 P3 Won't Fix / Backlog
Бизнес-риск: Low P2 P3 Won't Fix Won't Fix

SLA для дефектов: «возьмем в следующем спринте» — это не ответ
Для P0 и P1 спринтовая логика не работает: нужны явные временные обязательства с цепочкой эскалации — иначе «критический баг» будет висеть неделями просто потому, что никто не обозначил дедлайн.
Приоритет Time to Acknowledge Time to Resolve Эскалация
P0 15 минут 4 часа Немедленно → Engineering Manager + PO
P1 2 часа 24 часа Тимлид + PO
P2 1 рабочий день Текущий или следующий спринт Тимлид
P3 Следующий груминг По усмотрению команды

Важный момент про P0: это не просто «очень важный баг». P0 — это инцидент, который обрабатывается по процессу incident management, а не через обычный бэклог. Если команда не разделяет эти два потока — это первое, что нужно исправить. В enterprise-контексте P0 на проде еще и проходит через Change Advisory Board: отдельный трек с формальным согласованием.
Кто решает «чинить или нет»: цепочка ответственности
Типичная ошибка — отдавать приоритизацию полностью разработчикам. Разработчик честно ставит P1: любой баг кажется серьезным, когда ты сам его нашел или тебе за него прилетело. 
Правильная цепочка выглядит так:
  • QA фиксирует факт и технический контекст — шаги воспроизведения (без них тикет не принимается), severity-оценку, затронутый сценарий, частоту проявления, версию и среду.
  • Разработчик/Тимлид оценивает техническую сторону — трудозатраты, риск регрессии, наличие workaround, связь с техдолгом.
  • Product Owner принимает бизнес-решение — сколько пользователей затронуто (реальная цифра, не интуиция), какова стоимость задержки, есть ли обходной путь, который можно коммуницировать.
  • Архитектор или Security-инженер подключается при любом баге, затрагивающем данные, авторизацию или архитектурные контракты между сервисами.
Что обязательно должно быть в тикете
Баг без контекста — это не баг. Открываете тикет «Кнопка не работает. При нажатии ничего не происходит. P2. Автор: Миша (уволился). Создан: 14 месяцев назад» — и закрываете обратно. Какая кнопка? В каком модуле? Воспроизводится ли сейчас? Непонятно.
Минимальный стандарт тикета, который можно взять в работу:
Заголовок: [Модуль] Краткое описание проблемы
           Не «кнопка не работает», а «Кнопка Submit на странице
           оформления заказа не реагирует при quantity > 99»
Severity:       [Critical / High / Medium / Low]
Модуль:         [обязательное поле]
Версия/среда:   [конкретная версия + staging/prod/dev]
Частота:        [всегда / иногда / при условии X]
Шаги воспроизведения:
1. ...
2. ...
3. ...
Ожидаемый результат: ...
Фактический результат: ...
Затронутые пользователи: [метрика или оценка, если известна]
Обходной путь:           [есть / нет / описание]
Связанный инцидент:      [ссылка, если баг пришел с прода] 
Сравните: «Кнопка не работает. P2» и «Кнопка Submit на странице оформления заказа не реагирует при quantity > 99. Staging v3.2.1, Chrome 120. Workaround: ввести значение через консоль». Первый тикет вернётся к автору. Второй — в работу через час.
pic
SimpleOne SDLC: карточка дефекта, в которой есть всё: шаги, статус, приоритет, трудозатраты.
Груминг бэклога: как проводить, а не просто планировать
Груминг дефектов — это отдельная встреча. Не часть груминга фич, не «обсудим в конце планирования». Когда их смешивают, дефекты всегда проигрывают фичам в борьбе за время. 
Состав: QA-лид, тимлид, PO. Архитектор по необходимости, не постоянно.
Частота: раз в спринт, 45–60 минут. При бэклоге > 200 тикетов первые 3–4 сессии лучше сделать по 2 часа — для «расчистки».
Повестка:
  • новые дефекты за спринт: severity/priority review — 15 мин;
  • дефекты без движения > 2 спринтов: решение по каждому — 20 мин;
  • Reopen-баги: разбор причин, почему DoD не сработал — 10 мин;
  • метрики бэклога: тренды за последние 3 спринта — 5–10 мин.
pic
Типичный бэклог дефектов до расчистки: задача на 254 часа соседствует с пятью "(Не задано)", а Васи, который мог бы объяснить почему, уже нет в команде
Выходной артефакт: не «обсудили», а конкретные решения по каждому пересмотренному тикету: «закрыли как won't fix», «перенесли в P3», «взяли в следующий спринт». Если после груминга статусы не поменялись — встреча не состоялась.
При 500+ тикетах пересматривать все каждую неделю физически невозможно. Сегментируйте:
Приоритет Частота пересмотра
P0/P1 Каждую неделю
P2 Каждые 2 спринта
P3 Раз в квартал / при квартальном планировании
Без приоритета / In Triage Каждые 2 недели, пока не расставлены

Won't Fix: как закрывать без конфликтов и с памятью
Won't Fix — это не провал и не «не хотим делать». Это честное признание: баг реальный, но исправлять его нецелесообразно. Разница между этими двумя формулировками огромная — и именно поэтому каждый Won't Fix требует явного обоснования.
Когда Won't Fix оправдан:
  • Сценарий затрагивает < N% активных пользователей (порог должна определить команда явно, не «мало»).
  • Исправление требует рефакторинга модуля, который запланирован к переписыванию.
  • Стоимость исправления несопоставима с бизнес-риском.
  • Существует задокументированный workaround, который покрывает потребность.
Шаблон закрытия, который снимет все вопросы через полгода:
Статус: Won't Fix
Причина: [одна из категорий выше + 2–3 предложения обоснования]
Кто принял решение: [имя PO + имя тимлида]
Затронутые пользователи: [цифра или оценка]
Workaround: [описание или N/A]
Дата пересмотра: [конкретная дата или триггер — «после релиза v4.0»] 

Поле «Дата пересмотра» — не формальность. Без него Won't Fix превращается в мусорную корзину, куда удобно выбрасывать то, что не хочется делать. Метрика для самопроверки: если Won't Fix > 30% всех закрытых дефектов — это симптом либо слишком низкого quality bar при заведении, либо технического долга, который не признается таковым.
Баг из прода — это не просто еще один тикет
Дефект, который обнаружил пользователь или мониторинг в проде, несет контекст, которого нет в обычном баге: сколько людей пострадало, было ли нарушение SLA, дошло ли до бизнеса. Без этого контекста разработчик видит технический дефект. С ним — видит бизнес-последствие. Это кардинально меняет приоритизацию.
Минимальная цепочка, которая не должна разрываться:
pic
Последний пункт — самый важный и самый редкий. Без постмортема для P0/P1 команда бесконечно исправляет симптомы. RCA должен отвечать на вопрос: какое системное условие позволило этому багу добраться до прода? Не «разработчик ошибся», а «у нас нет интеграционного теста для этого сценария» или «мониторинг не покрывает этот путь». Первый ответ закрывает один баг. Второй — предотвращает класс багов.
Как эта цепочка выглядит на практике — в демонстрации плагина кросс-продуктовой интеграции SDLC и ITSM:
Метрики: что измерять и как не врать самим себе
Интуиция говорит: «у нас много багов, это плохо». Метрики говорят точнее — где именно сломан процесс.
Метрика Формула На что смотреть Сигнал тревоги
Escape Rate Баги из прода / Все баги × 100% Динамика от релиза к релизу Растущий тренд
Defect Density Баги / Размер модуля (KLOC, endpoints) Сравнение по модулям Один модуль генерирует > 30% всех дефектов
MTTR по приоритетам Считать отдельно для P0/P1/P2/P3 Рост MTTR у P2 при стабильном P1 Команда тушит пожары, не работает над качеством
Reopen Rate Переоткрытые / Все закрытые × 100% Кто закрывает с высоким reopen > 10–15% — слабый DoD

Важная оговорка: доля дефектов, дошедших до прода 20% для внутреннего инструмента с 50 пользователями и 20% для платежного сервиса — принципиально разные ситуации. Метрики имеют смысл только в динамике и только в контексте. Смотрите тренд, а не абсолют.
Дефекты как симптом — не как болезнь
Если один модуль стабильно генерирует > 30% всех дефектов — это не проблема QA. Это сигнал технического долга: высокая цикломатическая сложность, низкое тестовое покрытие или размытая ответственность за код. Возможные причины: модуль менялся много раз без рефакторинга, тестовое покрытие < 40%, размытая ответственность («все вносят правки, никто не владеет»).
Когда вам нужно пойти к бизнесу с аргументом про рефакторинг, забудьте про «код выглядит плохо» — это не то, что бизнес воспримет как реальный аргумент.
С бизнесом нужно говорить иначе: «За последний квартал мы закрыли 34 дефекта в модуле оплаты. Это 180 часов работы команды — только на исправления, без новых фич. Рефакторинг модуля займет 3 спринта, после чего этот поток дефектов сократится в разы. По нашей оценке, вложение окупится уже через два квартала».
Бизнес понимает деньги и время, а не красоту кода.
Anti-patterns, которые убивают процесс
Мы видели эти паттерны достаточно часто, чтобы дать им имена. 
  • «Все P1» — команда выставляет высокий приоритет всему, чтобы не расстраивать стейкхолдеров. В итоге P1 теряет смысл. Лечится явной матрицей с критериями.
  • Груминг без решений — встреча прошла, тикеты обсудили, но статусы не поменялись.Правило простое: каждый тикет на груминге завершается явным решением. 
  • «Вася разберется» — баг назначен человеку, а не модулю. Вася ушел — баг завис. Назначайте на модуль или команду, не на человека.
  • Бесконечный triage — новые баги неделями висят без severity-оценки. Правило: тикет старше 3 рабочих дней без оценки автоматически попадает в повестку следующего груминга. В SimpleOne SDLC, Jira, YouTrack это настраивается за 15 минут.
  • Won't Fix как корзина — используется для всего, что не хочется делать. Требуйте обоснования с цифрами. Без цифр — не принимается.
Если бэклог уже в хаосе: план на 4 недели
Не пытайтесь навести порядок за один груминг. Реалистичный план:
Недели 1–2: аудит
Пройдитесь по бэклогу и разбейте тикеты на категории: воспроизводится / не воспроизводится / дубль / нет контекста. Все невоспроизводимое и без контекста — закрыть с комментарием:
«Closed: cannot reproduce / insufficient info. Reopen with reproduction steps if still relevant.»
Недели 3–4: расстановка приоритетов
Оставшиеся актуальные баги прогнать через severity/priority матрицу. Все без четкого бизнес-обоснования для P1/P2 — перевести в P3 или Won't Fix.
С 5-й недели: регулярный процесс
Груминг раз в спринт. SLA для P0/P1 зафиксированы. Метрики в дашборде. В Jira, YouTrack и Linear настройте автоматические уведомления: тикет без движения 3 спринта — автотег для груминга.
По нашей практике после такой расчистки активный бэклог сжимается в 3–5 раз. Оставшееся — реально актуальные задачи с понятными приоритетами. Это не магия — это просто наведенный порядок, который не случился раньше, потому что не было времени и процесса.
***
А сколько тикетов в вашем бэклоге заведены людьми, которых уже нет в компании?-Источник
 
Loading...
Error