Аналитик в Agile: груминг, декомпозиция, работа с командой и с неопределённостью
В водопадной картине мира работа аналитика имеет конец: требования собраны, согласованы, подписаны, переданы. В Agile этого конца нет. Требования уточняются, пока фича живёт, а разработка начинается задолго до того, как всё известно. Из этого следует не «документов не надо», а другое: аналитик перестаёт производить документ и начинает производить определённость — порциями, ровно к тому моменту, когда она нужна для следующего решения.
Это статья про механику. Не про ценности Agile (они в Agile и Scrum и ценностях Agile) и не про то, как фасилитировать встречу (это в фасилитации). Здесь — что аналитик физически делает: как выглядит подготовка к грумингу, как резать историю, чтобы каждый кусок был релизуемым, куда девать вопрос, на который ещё нет ответа, и как не стать узким местом, через которое ходит вся информация в команде.
Мы продолжим сквозной пример трека — автовозврат в интернет-магазине. В прототипировании мы превратили «сделайте автовозврат в один клик» в проверенное требование: карточные оплаты, суммы до 3000 руб., две причины, 19% потока заявок, журнал решений с окном отмены 60 минут, SLA 30 минут. Теперь это надо превратить в поток работы для команды на несколько спринтов — и именно здесь ломается большинство хороших требований.
1. Что меняется, когда требования нельзя закончить
1.1. Главная ошибка: тот же документ, только в Jira
Самый частый способ провалить роль — писать ту же большую спецификацию, но нарезать её на тикеты. Симптомы узнаваемые: истории размером в две недели, «уточним в процессе» вместо критериев, эпик, который нельзя релизить частями, и аналитик, который на груминге читает свой текст вслух.
Причина в подмене цели. Кажется, что задача — описать систему. Настоящая задача — обеспечить следующее решение. Решения бывают разного размера: «берём это в спринт или нет», «как система ведёт себя при отказе банка», «одна таблица или две». Каждое требует своего объёма знания, и он редко совпадает с «описать всё».
1.2. Единица работы — не документ, а решение, которое можно отложить
Полезная привычка: перед любой аналитической работой спросить — какое решение я сейчас обеспечиваю и когда его действительно надо принять? Это принцип последнего ответственного момента: решение принимают не как можно раньше, а как можно позже — но раньше того момента, когда отказ от него станет дорогим.
| Решение | Кто принимает | Когда нужно | Что для него нужно от аналитика |
|---|---|---|---|
| Делаем ли автовозврат вообще | владелец продукта | до планирования квартала | размер потока, экономия, риски, порядок величины затрат |
| Что войдёт в первый релиз | владелец продукта + команда | до планирования спринта | нарезка на истории, ценность каждой, зависимости |
| Как ведём себя при отказе банка | команда + поддержка | до старта истории S1 | сценарии ошибок, требования к повторам, кто отвечает клиенту |
| Одна таблица решений или две | разработчики | во время разработки | правила и их источник, ожидаемая изменчивость |
| Включаем ли фичу всем | владелец продукта | после релиза S1 | метрика успеха, план наблюдения |
Требование, написанное до того, как решение стало актуальным, обесценивается: пока оно ждёт, меняется контекст. Это прямое следствие YAGNI в применении к анализу — детальная проработка идеи, которая может не поехать, оплачена дважды: временем на написание и временем на переписывание.
1.3. Два потока: анализ идёт впереди разработки, но не слишком далеко
Работающая модель — два параллельных потока (в литературе dual-track): поток исследования и поток поставки. Аналитик живёт в первом, обслуживая второй. Ключевой параметр — дистанция между потоками. Слишком мало — команда простаивает и берёт в спринт непонятное. Слишком много — вы производите запас требований, который портится.
Обратите внимание на третью секцию. Поток анализа получает вход не только от бизнеса, но и от уже выпущенного: демо S1 меняет критерии S2, а метрика через две недели может отменить S4 целиком. Это и есть причина не прорабатывать глубоко то, что дальше одного-двух спринтов: часть будущих требований вы получите бесплатно, из фактов.
2. Горизонт проработки: определённость как расходуемый ресурс
2.1. Глубина обратно пропорциональна расстоянию
Бэклог — не список одинаково описанных элементов. Это градиент: у ближнего края — готовые к разработке истории с критериями, у дальнего — фразы из одного предложения.
Практическая ценность картинки — в правой части. «Зона перепроработки» — не абстракция: это макеты к фиче, которую отменят, критерии приёмки к идее из «когда-нибудь», подробная схема интеграции с системой, которую заменят. Каждый такой артефакт ещё и вредит дважды: он создаёт ложное чувство обязательства («мы же уже всё описали, давайте делать») и требует поддержки при изменениях.
Обратная ошибка встречается чаще и стоит дороже: ноль проработки на дистанции одного спринта. Команда садится планировать, а история звучит как «сделать автовозврат». Планирование превращается в трёхчасовой сеанс выявления требований с неподготовленными участниками и без нужных людей в комнате.
2.2. Готовность истории: не бюрократический чеклист, а один вопрос
Definition of Ready — идея спорная. Формальный чеклист легко превращается в шлагбаум: «не пущу в спринт без макета», и команда начинает имитировать готовность. Полезная версия DoR — не список полей, а один вопрос:
Может ли команда начать эту работу и не встать через день, если меня не будет?
Если ответ «нет» — назовите ровно то, что заблокирует, и закройте это. Всё остальное в чеклисте — украшение. Для истории S1 из нашего примера ответ раскладывается так:
# Карточка истории в трекере: минимальный набор, без которого работа встанет
id: S1
title: "Автоматический возврат для карточных оплат до 3000 руб."
value: >
Оператор поддержки не тратит 26 минут на заявки, которые решаются по формальным
признакам. Ожидаемый охват — 19% потока (около 1600 заявок в квартал).
# «Что» — проверяемо, «как» — на усмотрение команды
acceptance_criteria:
- "Заявка с оплатой картой, суммой <= 3000 руб., причиной «передумал» или «не подошёл
размер», в пределах 14 дней от вручения — решение принимается без оператора"
- "Хотя бы одно условие не выполнено — заявка идёт в обычную очередь, причина видна оператору"
- "Деньги отправлены в банк не позже 30 минут после решения; статус виден в заявке"
- "Повторная отправка одной и той же заявки не создаёт второй возврат"
- "Функциональность включается флагом autorefund_enabled, по умолчанию выключена"
# Вопросы, на которые ещё нет ответа, но которые не блокируют старт
open_questions:
- id: Q-41
text: "Считать 14 дней от даты вручения или от даты отметки курьера?"
owner: "Марина, руководитель поддержки"
due: 2026-03-18
default: "От даты вручения из накладной; если её нет — от даты отметки курьера"
blocking: false # решение по умолчанию позволяет писать код
- id: Q-42
text: "Кто отвечает клиенту, если банк отклонил возврат?"
owner: "Марина"
due: 2026-03-20
default: "Заявка возвращается в очередь оператора со статусом «отказ банка»"
blocking: false
# То, что снято с этой истории намеренно
out_of_scope:
- "СБП и наличные — отдельная история S4"
- "Отмена решения оператором — S3"
- "Суммы свыше 20 000 руб. — по регламенту требуют звонка, автоматизации не будет"
links:
rules: "BR-14 условия автовозврата, BR-15 грейс по срокам"
contract: "refund-api.yaml v0.3"
experiment: "H-7 — проверка по данным, 19% пригодных заявок"
Три вещи в этой карточке важнее остальных. Первое — out_of_scope: половина споров
на приёмке возникает из-за того, что кто-то считал очевидным включение СБП. Второе —
open_questions с решением по умолчанию: работа не блокируется, но неопределённость
не потеряна. Третье — ссылки на правила и контракт: сама история умрёт после релиза,
а бизнес-правило и словарь должны её пережить (об этом —
в документировании).
2.3. Сколько проработки хватает: практические ориентиры
- Текущий спринт: критерии приёмки, состояния и ошибки, контракт интеграции, названный владелец приёмки. Ноль блокирующих открытых вопросов.
- Следующий спринт: нарезано, черновые критерии, вопросы заданы владельцам с датами, зависимости выявлены, порядок величины оценён.
- +2…+3 спринта: понятны цель, границы и главные риски; есть набросок процесса или данных.
- Дальше: одна фраза про ценность. Всё.
Норма для проработки — примерно на 1,5–2 спринта вперёд по объёму. Больше — запас портится; меньше — команда планирует в тумане. Механику right-sizing и оценок разбирает оценка и планирование.
3. Груминг: встреча, после которой команда может начать
3.1. Что это формально и что это на практике
В Scrum Guide 2020 уточнение бэклога (Product Backlog refinement) — не событие, а непрерывная активность: «добавление деталей, оценок и порядка элементам бэклога». Отдельной встречи «груминг» в Scrum нет, и это важно: если вся проработка происходит на одной полуторачасовой встрече в неделю, она гарантированно превратится в чтение тикетов вслух.
Работающая практика — три разных формата, и путать их дорого:
| Формат | Кто | Сколько | Зачем |
|---|---|---|---|
| Разговор один на один | аналитик + разработчик/тестировщик | 15–20 минут, по потребности | вытащить технический вопрос до общей встречи |
| Уточнение с командой | вся команда | 40–60 минут, раз в неделю | общее понимание, поиск дыр, right-sizing |
| Сессия с бизнесом | аналитик + стейкхолдеры | 60–90 минут, по фиче | правила, приоритеты, разрешение противоречий |
Ошибка — сваливать всё в средний формат. Технические вопросы на восемь человек тратят шесть человеко-часов; спор стейкхолдеров при команде разрушает встречу (см. работу со стейкхолдерами).
3.2. Что аналитик приносит на встречу
Груминг без подготовки — это выявление требований силами восьми человек, самый дорогой способ из существующих. Минимальный комплект подготовки:
- Цель встречи в одну строку: «выйти с нарезкой автовозврата на истории, которые влезают в спринт, и списком блокеров» — а не «обсудить автовозврат».
- Схема на одном экране. Диаграмма состояний заявки или sequence обмена с банком. Черновик, от руки — цель в том, чтобы по ней спорили, а не восхищались.
- Черновик критериев приёмки — намеренно неполный, чтобы команда достраивала.
- Список открытых вопросов с пометкой, кто владелец и какой у вас default.
- Факты, а не мнения: «19% заявок подходят по данным за квартал», «средняя обработка 26 минут». Один факт снимает двадцать минут спора.
- Явно заявленное «чего здесь не будет» — самая сильная часть подготовки.
3.3. Сценарий встречи на 50 минут
| Время | Что происходит | Кто ведёт |
|---|---|---|
| 0–3 | Цель встречи и что считается результатом | аналитик |
| 3–8 | Контекст: чья боль, сколько её, почему сейчас | аналитик |
| 8–18 | Разбор схемы: команда ищет дыры, вопросы фиксируются, не решаются | все |
| 18–30 | Нарезка: где границы, что можно выкинуть из первого куска | все |
| 30–40 | Критерии и края: ноль, много, отказ, права, повтор | все |
| 40–47 | Right-sizing: влезает или резать дальше | разработчики |
| 47–50 | Кто что делает до следующей встречи, даты по вопросам | аналитик |
Два правила, которые делают эту встречу полезной. Вопросы фиксируются, а не решаются на месте: обсуждение «а как считать 14 дней» с участием восьми человек без Марины — чистая потеря, вопрос уходит в список с владельцем. И на встрече не оценивают то, что не поняли: просьба «дайте оценку» при непонятой истории производит цифру-выдумку, которая потом становится обязательством.
3.4. Пять вопросов, которые вытаскивают неявное
Эти вопросы работают почти на любой истории и стоят по минуте каждый:
- «Что происходит, когда этого ноль? А когда очень много?» Ноль заявок, 4000 заявок, строка в 300 символов, отрицательная сумма.
- «Что делаем, если внешняя система не ответила?» Не «ошибка», а: показываем что, повторяем сколько раз, кто узнаёт, что видит клиент, в каком состоянии остаётся заявка.
- «Кто ещё смотрит на эти данные?» Аналитика, бухгалтерия, поддержка, регуляторный отчёт. Здесь всплывают требования, которых не было ни в одном интервью.
- «Что должно быть в системе до того, как это станет возможно?» Вытаскивает зависимости и молчаливые предположения о существующем состоянии.
- «Как мы узнаем через месяц, что это сработало?» Нет ответа — история либо не нужна, либо у неё непроверяемая цель.
3.5. Как это звучит: фрагмент груминга
Ниже сокращённая, но реалистичная запись. Обратите внимание, что находка появляется не из документа, а из вопроса разработчика — и что аналитик не защищает свой текст.
Аналитик: Цель — выйти с нарезкой автовозврата. Вот схема состояний заявки.
По данным за квартал 19% заявок проходят по формальным признакам:
карта, до 3000 рублей, две причины, 14 дней.
Разработчик: 14 дней от чего? У нас в базе три даты: создание заказа,
отметка курьера, подтверждение получения клиентом.
Аналитик: По регламенту — от вручения. Какая из трёх дат это в базе?
Разработчик: Ни одна надёжно. Подтверждение получения заполнено у 60% заказов.
Аналитик: Тогда это открытый вопрос к Марине, до 18-го. Мой default:
берём вручение из накладной, если пусто — отметку курьера.
Считаем, что это допустимо, потому что смещение максимум на день.
Тестировщик: А если решение принято, а клиент через час пишет «отмените, я передумал
отменять»? Деньги уже ушли?
Аналитик: SLA 30 минут на отправку. То есть в течение 30 минут отмена возможна,
дальше — нет. Это ровно та история S3 про окно отмены, которую я хотел
отложить. Похоже, откладывать нельзя: без неё поддержка не включит фичу.
Разработчик: Тогда S1 надо резать иначе. Давайте так: сначала автоматическое РЕШЕНИЕ
с задержкой отправки на 30 минут, а сама отправка — как есть, руками.
Это неделя, а не три.
Аналитик: Это лучше моей нарезки. Проверяю с Мариной, что промежуточный вариант
ей полезен, и переписываю S1 к пятнице.
Три вещи, которые здесь произошли: техническая реальность (три даты в базе) убила формулировку требования; тестировщик нашёл пропущенное состояние; разработчик предложил разрез лучше авторского. Ни одно из этого невозможно получить, читая тикет вслух.
3.6. Антипаттерны груминга
| Антипаттерн | Как выглядит | Что делать |
|---|---|---|
| Чтение вслух | Аналитик 40 минут пересказывает тикет, все молчат | Прислать текст заранее, на встрече — только вопросы и дыры |
| Оценка вместо понимания | Сразу «сколько сторипойнтов?» | Сначала «что непонятно», оценка последние 7 минут |
| Проектирование на восьмерых | Полчаса спорят про структуру таблиц | Вынести в отдельный разговор двух-трёх человек |
| Груминг как согласование | Стейкхолдеры спорят при команде | Разрешать противоречия до встречи, приносить решение |
| Один говорящий разработчик | Остальные в ноутбуках | Раунд по кругу: «какой у тебя главный вопрос по этой истории» |
| Вопросы без владельца | «Надо уточнить» без имени и даты | Каждый вопрос: текст, владелец, дата, default |
| Бесконечный поток историй | 15 историй за час, ни одна не понята | Три-четыре истории максимум; глубина важнее покрытия |
Больше про поведенческую сторону встреч — в фасилитации и антипаттернах Scrum.
4. Декомпозиция: как резать, чтобы каждый кусок был ценным
4.1. Зачем вообще резать
Маленькая история — не самоцель, у неё четыре конкретных эффекта: обратная связь приходит через дни, а не через месяц; оценка попадает точнее (разброс растёт нелинейно с размером); незавершённая работа в системе меньше, поток быстрее (см. Kanban и поток); и, что важнее всего для аналитика, маленькую историю невозможно описать расплывчато — на её масштабе неопределённость видна.
4.2. Вертикально или горизонтально: главное различие
Горизонтальный разрез (по слоям: UI, API, логика, данные) выглядит естественно для того, кто думает архитектурой, и он же — источник самой обидной категории провалов. У такой истории нет пользователя: «ручки API» нельзя показать на демо, нельзя принять по критериям в терминах бизнеса, нельзя выключить, если фичу отменят. Главный риск при этом всплывает в самом конце — в нашем примере это несовместимость СБП, о которой узнают на пятой истории.
Вертикальный разрез даёт узкую, но полную функциональность: тонкая полоска через все слои. Проверка одной фразой: выключите всё остальное — этот кусок всё ещё можно отдать пользователю? Ответ «нет» означает, что перед вами задача внутри истории (и это нормально, задачи нужны — просто не путайте их с историями).
4.3. Каталог разрезов: чем именно резать
Наиболее практичный набор — SPIDR Майка Кона (пять способов разрезать историю) и расширенный список Ричарда Лоуренса (Humanizing Work Guide to Splitting User Stories). Ниже — те же паттерны на нашем примере.
| Паттерн | Как режем | Автовозврат |
|---|---|---|
| По шагам сценария | Оставить самый короткий путь end-to-end | Сначала решение и журнал, отправка денег — руками |
| По бизнес-правилу | Одно правило вместо всех | Только «передумал», без «не подошёл размер» |
| По варианту данных | Один тип входа | Только карта; СБП и наличные — потом |
| По интерфейсу | Простейший способ ввода/вывода | Решение видно в списке заявок, отдельного экрана нет |
| По ролям | Одна роль | Оператор видит; руководитель-отчёты — потом |
| По операциям CRUD | Не всё сразу | Создать решение и посмотреть; отменить — S3 |
| По обработке ошибок | Счастливый путь и главный отказ | Отказ банка — да; сетевые ретраи — отдельно |
| По нефункциональным | Сначала работает, потом быстро/масштабно | 30 минут SLA в S1, пик конца месяца — позже |
| Спайк отдельно | Вынести исследование | «Поддерживает ли банк частичный возврат по СБП» |
Два предостережения. Первое: «по нефункциональным» не значит «безопасность потом» — требования, которые нельзя доклеить (изоляция данных, аудит, персональные данные), в первый же кусок и входят, см. нефункциональные требования. Второе: «спайк отдельно» не должен превращаться в спайк вместо работы; у спайка есть таймбокс и форма ответа.
4.4. Дерево решений: как выбрать разрез
в спринт или непонятна"]) --> q1{"Есть ли в ней
несколько шагов
сценария?"} q1 -- "да" --> cut1["Резать по шагам:
оставить самый короткий
путь end-to-end"] q1 -- "нет" --> q2{"Несколько бизнес-правил
или вариантов данных?"} q2 -- "да" --> cut2["Оставить одно правило
или один тип данных,
остальное — отдельные истории"] q2 -- "нет" --> q3{"Несколько ролей
или каналов?"} q3 -- "да" --> cut3["Одна роль / один канал
в первом куске"] q3 -- "нет" --> q4{"Основной объём —
обработка ошибок
и краевые случаи?"} q4 -- "да" --> cut4["Счастливый путь + главный отказ,
остальные ветки отдельно
с явным поведением по умолчанию"] q4 -- "нет" --> q5{"Мешает неизвестность
в технологии или контракте?"} q5 -- "да" --> spike["Спайк с таймбоксом:
вопрос, срок, форма ответа.
Историю оставить целой"] q5 -- "нет" --> q6{"Требуется вся
инфраструктура сразу?"} q6 -- "да" --> skeleton["Тонкая вертикаль
walking skeleton:
один сценарий насквозь,
примитивная реализация"] q6 -- "нет" --> keep["Не резать.
Взять целиком и признать,
что это большой элемент"] cut1 --> check{"Проверка каждого куска:
выключим остальные —
это можно отдать?"} cut2 --> check cut3 --> check cut4 --> check skeleton --> check check -- "нет" --> horiz["Это горизонтальный разрез.
Переклеить: назвать пользователя
и наблюдаемый результат"] check -- "да" --> ok(["Готово к right-sizing"]) horiz --> q1
Последняя ветка — самая ценная. Большинство плохих нарезок не результат незнания паттернов, а результат отсутствия проверки: разрезали и не спросили себя, кому от каждого куска станет лучше.
4.5. Пример целиком: бэклог автовозврата
Из одной «хотелки» получается семь элементов. Порядок — не по слоям, а по убыванию снимаемого риска и приносимой ценности.
| # | Элемент | Ценность после релиза | Размер | Почему здесь |
|---|---|---|---|---|
| SP-1 | Спайк: частичный возврат по СБП в API банка | знание, идёт ли S4 вообще | 2 дня | дешевле всего, влияет на скоуп |
| S1 | Решение автомата + задержка отправки 30 минут, карта, до 3000 руб., причина «передумал» | 12% заявок закрываются без оператора | ~1 спринт | тонкая вертикаль, снимает главный риск |
| S2 | Журнал решений: правило, входные данные, время | поддержка доверяет автомату | 3–4 дня | без этого фичу не включат |
| S3 | Отмена решения оператором в окне 30 минут | снят страх «спросят с меня» | 3 дня | вышло из груминга как блокер включения |
| S4 | Причина «не подошёл размер» | +7% потока | 2 дня | второе правило, отдельно |
| S5 | СБП: запрос реквизитов, ожидание, напоминание | охват растёт до 40% | ~1 спринт | зависит от SP-1 |
| S6 | Отчёт руководителю: доля автоматических, отмены, спорные | управляемость | 3 дня | не нужен в первом релизе |
Что здесь сделано осознанно. S1 включает задержку отправки — искусственное ограничение, которое позволяет выпустить полезный кусок, не решая пока вопрос отмены; это классическая тонкая вертикаль. S2 стоит выше S4, хотя S4 приносит больше пользователей: без журнала поддержка не включит флаг, а значит ценность S1 равна нулю. Порядок в бэклоге определяется не размером ценности, а тем, что открывает поток. Про формальные методы приоритизации — приоритизация.
4.6. Проверка нарезки скриптом
Две ошибки нарезки видны автоматически: история, которая не доходит до пользователя, и зависимости, из-за которых «независимые» истории на деле образуют цепочку или цикл. Проверка — обычная топологическая сортировка (алгоритм Кана).
Псевдокод:
для каждой истории:
если ни один слой не наблюдаем пользователем или внешней системой -> горизонтальный разрез
построить граф зависимостей
пока есть узлы с нулевой входящей степенью:
снять узел, уменьшить степени соседей, записать в порядок
если остались узлы -> цикл зависимостей
самая длинная цепочка = глубина, при которой ценность появляется последней
"""Проверка разреза бэклога: наблюдаемость каждой истории и связность зависимостей."""
from collections import deque
# layers: слои, которые история затрагивает; observable: кто увидит результат
BACKLOG = {
"SP-1": {"layers": {"spike"}, "observable": "команда", "depends": []},
"S1": {"layers": {"ui", "api", "logic", "db"}, "observable": "оператор", "depends": []},
"S2": {"layers": {"ui", "logic", "db"}, "observable": "оператор", "depends": ["S1"]},
"S3": {"layers": {"ui", "api", "logic"}, "observable": "оператор", "depends": ["S1"]},
"S4": {"layers": {"logic"}, "observable": "оператор", "depends": ["S1"]},
"S5": {"layers": {"ui", "api", "logic", "db", "bank"}, "observable": "клиент", "depends": ["SP-1", "S1"]},
"S6": {"layers": {"ui", "db"}, "observable": "руководитель", "depends": ["S2"]},
}
USER_FACING = {"ui", "bank", "report"} # слои, результат которых кто-то видит снаружи
def review(backlog: dict) -> list[str]:
"""Возвращает список замечаний к нарезке. O(V + E) по времени и памяти."""
problems: list[str] = []
# 1. Горизонтальный разрез: история не выходит за пределы кода
for key, story in backlog.items():
if story["layers"] & USER_FACING or story["layers"] == {"spike"}:
continue
problems.append(
f"{key}: ни один слой не наблюдаем ({sorted(story['layers'])}) — "
f"похоже на горизонтальный разрез; кто увидит результат?"
)
# 2. Топологическая сортировка: цикл или слишком длинная цепочка
indegree = {k: 0 for k in backlog}
children: dict[str, list[str]] = {k: [] for k in backlog}
for key, story in backlog.items():
for dep in story["depends"]:
indegree[key] += 1
children[dep].append(key)
depth = {k: 1 for k in backlog}
queue = deque(k for k, d in indegree.items() if d == 0)
order: list[str] = []
while queue:
node = queue.popleft()
order.append(node)
for child in children[node]:
depth[child] = max(depth[child], depth[node] + 1)
indegree[child] -= 1
if indegree[child] == 0:
queue.append(child)
if len(order) != len(backlog):
stuck = sorted(set(backlog) - set(order))
problems.append(f"цикл зависимостей среди {stuck} — нарезка нереализуема")
longest = max(depth.values())
if longest > 3:
chain = [k for k, d in sorted(depth.items(), key=lambda kv: kv[1]) if d == longest]
problems.append(f"цепочка глубиной {longest} (хвост: {chain}) — ценность придёт поздно")
independent = [k for k, d in indegree.items() if d == 0 and not backlog[k]["depends"]]
problems.append(f"можно начать параллельно: {sorted(independent)}")
return problems
for line in review(BACKLOG):
print(line)
S4: ни один слой не наблюдаем (['logic']) — похоже на горизонтальный разрез; кто увидит результат?
можно начать параллельно: ['S1', 'SP-1']
Скрипт честно поймал S4: «причина не подошёл размер» описана как изменение в логике, а не как наблюдаемое поведение. Формулировку надо переписать: «оператор видит, что заявки с причиной “не подошёл размер” закрываются автоматически на тех же условиях». Мелочь, но именно из таких мелочей на приёмке возникает «а как это проверять?»
Сложность обеих проверок — O(V + E) по времени и памяти, где V — истории, E — зависимости;
на бэклоге любого реального размера это доли секунды. Смысл не в алгоритме, а в дисциплине:
проверка запускается перед планированием, а не после демо.
4.7. Что делать с историей, которую нельзя разрезать
Бывает: требуется вся инфраструктура, или бизнес-ценность возникает только целиком (регуляторный отчёт, миграция). Три работающих ответа:
- Тонкая вертикаль (walking skeleton). Один самый простой сценарий насквозь, с примитивной реализацией каждого слоя — идея Алистера Кокберна. Проверяет архитектурные стыки на неделе, а не на третьем месяце.
- Явное признание большого элемента. Иногда честнее сказать «это большая штука на три спринта, вот три контрольные точки», чем расклеить её на семь фальшивых историй.
- Разделение «работает» и «полностью соответствует». Первый кусок закрывает 80% случаев с явным ограничением, остальное — отдельно, с зафиксированным решением, что до тех пор делается вручную.
4.8. Антипаттерны декомпозиции
| Антипаттерн | Признак | Чем плох |
|---|---|---|
| Разрез по слоям | «История: API возврата» | Ценности нет ни у одного куска, риск в конце |
| Разрез по компонентам команды | «Фронт», «бэк», «интеграция» | Организационная структура вместо пользовательской |
| Псевдовертикаль | В названии пользователь, внутри одна таблица | Проходит проверку на словах, не на деле |
| Фальшивая независимость | Пять историй, каждая «после S1» | Это одна история, разбитая на задачи |
| Разрез по фазам | «Анализ», «разработка», «тестирование» | Мини-водопад в спринте |
| Технический долг как история | «Отрефакторить сервис возвратов» | Нет наблюдаемого результата; либо привязать к сценарию, либо признать инженерной работой |
| Дробление ради метрик | 20 историй по полдня | Накладные расходы съедают выигрыш; связь с ценностью теряется |
5. Работа с неопределённостью
5.1. Три вида «мы не знаем» — три разных лекарства
Слово «неопределённость» скрывает три разные вещи, и лечатся они по-разному. Путаница здесь приводит к тому, что доменный вопрос отдают разработчику на исследование, а техническую неизвестность обсуждают со стейкхолдером.
Дальше — практика для каждого случая. Продуктовая — в прототипировании, доменная — в выявлении требований, техническая — в анализе интеграций и нефункциональных требованиях.
Отдельная категория, которую полезно различать: сложность против запутанности. Лиз Кио в «Estimating Complexity» предлагает простую шкалу — от «делали это много раз» до «никто в мире этого не делал». Если задача в верхней части шкалы, требования вообще не пишутся заранее: сначала эксперимент, потом требование. Попытка описать неизвестное подробно даёт документ-фантазию.
5.2. Открытый вопрос — полноценный элемент работы
Главный практический приём этого раздела: вопрос без владельца и даты — это не вопрос, а надежда. Открытые вопросы живут не в голове аналитика и не в чате, а в трекере рядом с историей, с четырьмя обязательными полями: текст, владелец (человек, не отдел), дата, решение по умолчанию.
Дисциплина простая:
- Один владелец. «Уточнить у бизнеса» не работает; работает «Марина, до 18-го».
- Дата, привязанная к решению, которое вопрос блокирует, а не «когда-нибудь».
- Решение по умолчанию всегда, даже плохое: default превращает блокировку в риск.
- Блокирующий или нет — единственная метка, которая нужна команде.
- Цена ожидания названа вслух: «если ответа нет до 18-го, делаем по default, переделка — примерно день». Это превращает «мне некогда» стейкхолдера в осознанный выбор.
5.3. Жизненный цикл открытого вопроса
назван владелец и дата Сформулирован --> Отвечен : владелец дал ответ
до срока Сформулирован --> ПоУмолчанию : срок вышел,
работаем по default Сформулирован --> Исследуется : ответа нет ни у кого,
нужен спайк или проверка Исследуется --> Отвечен : эксперимент дал факт Исследуется --> ПоУмолчанию : таймбокс истёк,
решение обратимое ПоУмолчанию --> Подтверждён : владелец согласился
с default постфактум ПоУмолчанию --> Опровергнут : владелец не согласен —
появилась переделка Опровергнут --> Сформулирован : новый вопрос
с новой ценой Отвечен --> Закреплён : ответ переехал
в правило или словарь Подтверждён --> Закреплён Закреплён --> [*] note right of ПоУмолчанию Здесь живёт технический долг требований: код написан, согласия нет. Держать список коротким и видимым. end note note right of Закреплён История умрёт после релиза, а правило и определение термина должны её пережить. end note
Состояние «ПоУмолчанию» — самое важное и самое опасное. Оно позволяет команде не стоять, но накапливает долг: чем дольше решение живёт без подтверждения, тем дороже его отменять. Практика — раз в спринт просматривать список таких решений и добиваться подтверждения по тем, где цена отмены уже выросла.
5.4. Решение по умолчанию: как оно выглядит в критериях
Default — не «сделаем как-нибудь», а зафиксированное поведение, которое можно проверить и отменить. Оно попадает в критерии приёмки как обычный сценарий, с пометкой источника:
# Основание: Q-41, решение по умолчанию от 18.03 (ответа Марины к сроку не было).
# Отменяемо: правило BR-14, вынесено в конфигурацию, переделка — около дня.
Сценарий: Отсчёт 14 дней при отсутствии даты вручения
Дано заявка на возврат по заказу, дата вручения в накладной не заполнена
И отметка курьера о доставке — 2026-03-02
Когда клиент создаёт заявку 2026-03-15
Тогда заявка не проходит автоматическое решение по сроку
И оператор видит причину «срок считался от отметки курьера, дата вручения отсутствует»
Последняя строка — приём, который экономит часы разборов: система сообщает, по какому основанию приняла решение. Когда через месяц Марина скажет «мы так не договаривались», разговор пойдёт от факта, а не от воспоминаний. Как это связано с приёмкой — в приёмке, как критерии становятся тестами — в TDD и BDD.
5.5. Обратимость решения определяет цену анализа
Полезная рамка — деление решений на односторонние и двусторонние двери («type 1 / type 2» из письма акционерам Amazon за 2015 год). Дверь в две стороны: ошиблись — вернулись, цена — часы. Дверь в одну сторону: миграция данных, публичный контракт API, схема с потерей информации, обещание клиенту в договоре.
| Решение в нашем примере | Тип двери | Сколько анализа заслуживает |
|---|---|---|
| Текст сообщения оператору | двусторонняя | ноль, поправим за минуту |
| Порог 3000 руб. в конфиге | двусторонняя | немного, вынести в настройку |
| Считать срок от отметки курьера | двусторонняя, но с переделкой | default + подтверждение в срок |
| Схема журнала решений | почти односторонняя | обсудить с командой, писать не жалко |
| Публичный контракт с банком | односторонняя | полный анализ, версионирование, мок |
| Не хранить исходные данные решения | односторонняя, необратимая | максимум внимания: восстановить нельзя |
Из этой таблицы следует практический вывод, который сильно экономит время: аналитик тратит глубину не на самое заметное, а на самое необратимое. Инвентаризация «где у нас двери в одну сторону» полезнее любого чеклиста готовности. Про фиксацию таких решений — в архитектурных решениях.
5.6. Спайк: как поставить, чтобы он закончился
Спайк — исследование с обязательствами. Формула из четырёх строк:
id: SP-1
question: "Поддерживает ли API банка частичный возврат по СБП без реквизитов от клиента?"
timebox: "2 дня, до 2026-03-19"
answer_form: "Да/нет + фрагмент запроса и ответа + что меняется в S5"
decision_it_unblocks: "Идёт ли S5 в квартал или переносится"
Без question спайк превращается в «поизучать»; без answer_form — в устный рассказ,
который через неделю никто не воспроизведёт; без decision_it_unblocks он вообще не нужен.
И правило, которое стоит защищать: результат спайка — знание, а не код. Прототип
из спайка не едет в прод без переписывания, иначе вы получите постоянную «временную» реализацию
(подробнее — в прототипировании).
6. Аналитик внутри спринта: чем занят, пока команда пишет код
6.1. Три потока одновременно
| Поток | Доля времени | Что это |
|---|---|---|
| Обслуживание текущего спринта | ~30% | ответы на вопросы, уточнение краёв, участие в приёмке |
| Подготовка следующего | ~50% | выявление, моделирование, нарезка, закрытие вопросов |
| Обзор дальше горизонта | ~20% | разбор новых запросов, поддержка правил и словаря |
Перекос в первый поток — типичная ловушка: аналитик становится службой поддержки команды и перестаёт готовить следующий спринт, после чего команда планирует в тумане, вопросов становится больше, и петля затягивается. Признак, по которому это ловят: на планировании регулярно обсуждают то, что должно было быть выяснено неделю назад.
6.2. Путь вопроса, который возник в середине спринта
Ключевая обязанность аналитика в спринте — маршрутизация вопросов, а не их аккумулирование в себе. Разница между хорошим и плохим сценарием — в том, чем всё заканчивается.
Ответа у меня нет A->>D: Не блокируйся: default — вручение,
иначе отметка курьера. Флаг в конфиг A->>B: Q-41: текст, владелец Марина, срок 18.03,
default записан, blocking = false D->>D: Пишет код по default,
значение в конфигурации A->>M: Q-41 с ценой: если не ответишь до 18-го,
идём по default, переделка ~1 день M-->>A: Ответ 17.03: считаем от вручения,
если пусто — заявка идёт оператору Note over A,M: Ответ отличается от default:
оператор вместо fallback-даты A->>B: BR-14 обновлено, версия 1.2,
Q-41 переведён в «Закреплён» A->>D: Изменение на два часа: fallback → в очередь оператора A->>T: Новый сценарий приёмки:
нет даты вручения → ручная обработка T-->>A: Добавил в набор проверок,
тест-данные подготовлены Note over D,T: Итог: команда не стояла ни часа,
вопрос не потерялся, правило переиспользуемо
Разберите этот сценарий по шагам — в нём три отдельных приёма. Шаг 3: аналитик не даёт разработчику ждать, а выдаёт обратимое решение. Шаг 4: вопрос попадает в систему, а не в память. Шаг 6: владельцу сообщают цену ожидания, и именно это обычно приносит ответ за сутки. Шаг 9: ответ закрепляется в бизнес-правиле с версией, а не только в комментарии к тикету — через полгода спросят снова.
6.3. Изменение прилетело в середине спринта: протокол
Изменения — не катастрофа и не «нам же можно, мы гибкие». Гибкость означает, что изменение обрабатывается по правилам, а не проносится мимо. Рабочий протокол из пяти шагов:
- Понять, что это. Новое требование, уточнение существующего или дефект понимания? Уточнение края («а если суммы ровно 3000?») — обычная работа, дописываем критерий. Новое требование — идёт в бэклог и в приоритизацию, а не в текущую историю.
- Оценить цену сейчас против цены потом. Иногда доклеить дешевле, чем отдельной историей; иногда наоборот. Считает команда, не аналитик единолично.
- Показать обмен. «Влезет, если S4 уходит из спринта» — решение владельца продукта. Молча раздувать историю — способ провалить спринт и потерять доверие к оценкам.
- Зафиксировать письменно в истории: что изменилось, кто попросил, что взамен.
- Обновить критерии и предупредить тестировщика. Изменение без обновлённого критерия — гарантированный спор на приёмке.
Отдельный красный флаг: обходной канал. Стейкхолдер пишет разработчику напрямую, тот делает «мелочь» за час, история расходится с критериями, а на приёмке выясняется, что поведение не то, которое согласовано. Лечится не запретами, а видимостью: любая договорённость, которая меняет поведение системы, попадает в историю в тот же день.
6.4. Аналитик как узкое место
Самая распространённая системная проблема роли: вся информация ходит через одного человека. Симптомы — очередь вопросов к аналитику, разработчики без контекста, отпуск как остановка работы. Что снижает риск:
- Прямой доступ команды к экспертам. Ваша задача — не быть каналом, а сделать так, чтобы разработчик мог сам спросить Марину о мелочи и знал, что записать результат надо в тикет.
- Знание живёт в артефактах, а не в вашей голове: правила с номерами, словарь терминов, схемы рядом с кодом (см. моделирование данных).
- Парная работа над нарезкой. Резать историю вдвоём с разработчиком быстрее и точнее, чем принести готовую нарезку на встречу.
- Тестировщик как второй читатель критериев. Он найдёт непроверяемое раньше всех и бесплатно.
7. Что чаще всего ломается именно в Agile
Четыре классических поломки требований (из обзора трека) в гибком процессе принимают специфические формы. Гибкость их не устраняет — она их прячет.
7.1. Неявные требования маскируются под «уточним в процессе»
Фраза «разберёмся по ходу» легитимна, когда за ней стоит план: кто разберётся, к какому моменту, что делаем, пока не разобрались. Если плана нет, это отложенный сюрприз: работу берут в спринт, на третий день выясняется, что нет ответа, и история встаёт. Проверка: каждое «уточним» на груминге должно превратиться в открытый вопрос с владельцем и default до конца встречи. Не превратилось — вы не отложили работу, вы её потеряли.
7.2. Противоречия стейкхолдеров всплывают на демо
В водопаде противоречие ловит согласование документа — медленно, но ловит. В Agile документа нет, и два стейкхолдера с разным пониманием одинаково кивают на груминге. Расхождение проявляется на демо: «а почему автомат вернул деньги без звонка?» — и это уже готовая работа. Профилактика: пока история в подготовке, ответить на вопрос «кто ещё считает, что у этого поведения есть последствия для него», и получить от каждого не «ок», а формулировку своими словами. Разница между кивком и пересказом — примерно спринт работы. Механика разрешения — в работе со стейкхолдерами.
7.3. «Хотелки» приходят прямо в спринт, мимо бэклога
Короткий цикл создаёт иллюзию, что просьбу можно вставить в любой момент. Аналитик здесь — фильтр не по власти, а по вопросам: чья задача, что происходит сейчас без этого, сколько таких случаев, как поймём, что помогло. Половина просьб отваливается на втором вопросе. Формулировка, которая работает лучше отказа: «давай запишем как элемент бэклога с этой целью, и обсудим приоритет против S4 — что откладываем?» Приоритет — не ваше решение, но обмен показать обязаны вы.
7.4. Непроверяемые критерии проходят под флагом гибкости
«Должно быть удобно», «работать быстро», «интуитивно понятно» — в Agile такие формулировки проскакивают чаще, потому что «мы же не пишем ТЗ». Итог — спор на приёмке без арбитра. Единственная проверка: можно ли по этому критерию написать тест, не задав ни одного вопроса? Нельзя — переформулируйте в наблюдаемое поведение или число со способом измерения (см. нефункциональные требования).
7.5. Бэклог без карты: 200 историй, никто не помнит зачем
Мелкая нарезка без верхнего уровня даёт свалку: элементы есть, целостной картины нет, дыры в сценарии не видны, приоритизация вырождается в «что кричит громче». Лечится картой историй (user story mapping): сценарий пользователя по горизонтали, детализация по вертикали, релизы — горизонтальными срезами. Карта заодно отвечает на вопрос, которым мучаются на каждом планировании: что можно выкинуть и всё ещё получить работающий путь.
7.6. Псевдовертикальные разрезы и мини-водопад в спринте
Две скрытые формы. Первая: история названа от пользователя, а внутри — одна таблица («как оператор, хочу, чтобы решение сохранялось в БД»). Проверяется вопросом «что увидит оператор, если это выпустить одно?». Вторая: спринт, внутри которого последовательно идут анализ, разработка и тестирование одной большой истории — формально Agile, фактически двухнедельный водопад с тестированием в последний день. Признак: тестировщик всегда занят в конце спринта, а история регулярно не успевает.
8. Где нужен формальный документ, а где хватит доски
Гибкий процесс не отменяет письменных артефактов — он меняет их адресата: не «сдать заказчику», а «дожить до следующего человека».
| Ситуация | Хватит доски и разговора | Нужен письменный артефакт |
|---|---|---|
| Уточнение внутри истории, живёт до релиза | да, фото в тикет | нет |
| Решение обратимо за часы | да | нет |
| Бизнес-правило, влияющее на деньги | доска для поиска | обязательно, с номером и версией |
| Определение термина («вручение», «заявка») | нет | словарь данных, одно определение |
| Контракт с внешней системой | нет | схема с версией, мок, примеры ошибок |
| Требование от регулятора или аудита | нет | формально, со ссылкой на норму |
| Решение по умолчанию по открытому вопросу | нет | в критериях, с основанием и ценой отмены |
| Спор двух стейкхолдеров | доска для поиска | письменный итог с датой и участниками |
| Знание нужно новому человеку через полгода | нет | краткая запись решения и причины |
Практическое правило: рисуйте на доске, фиксируйте решение письменно, и различайте
то, что умрёт с релизом, и то, что должно его пережить. История, критерии, схема
на груминге — расходный материал. Бизнес-правило, определение термина, контракт
и обоснование необратимого решения — постоянный. Именно поэтому в карточке из раздела 2.2
есть блок links: он вытаскивает переиспользуемое знание из умирающего тикета.
Развёрнуто про уровни формальности — в документировании
и UML для аналитика; классическая формальная сторона —
в требованиях к архитектуре.
9. Как понять, что процесс анализа работает
Пять наблюдаемых признаков. Смотреть на них стоит как на симптомы для разговора, а не как на KPI: любая из этих метрик, превращённая в цель, немедленно портится.
| Признак | Норма | О чём говорит отклонение |
|---|---|---|
| Доля историй, вернувшихся из разработки за уточнением | < 15% | проработка слишком поверхностная или груминг формальный |
| Открытых блокирующих вопросов на историю в спринте | 0 | работа взята неготовой |
| Время ответа владельца на вопрос | < 3 дней | стейкхолдер не вовлечён; поднимать цену ожидания |
| Доля историй, изменённых после старта | < 20% | либо анализ слабый, либо изменения летят мимо протокола |
| Дефекты приёмки с причиной «требование» | < 30% дефектов | критерии неполны или непроверяемы |
| Историй, не влезших в спринт | < 20% | нарезка крупная, right-sizing не работает |
Отдельно полезно раз в квартал посмотреть на список решений «по умолчанию, не подтверждённых»: если он растёт, у вас накапливается долг требований, который однажды предъявят целиком. Про инженерные метрики потока — в DORA и метриках.
10. Мини-итог и чеклист
Аналитик в Agile производит не документ, а определённость к сроку. Из этого следует всё остальное: глубина проработки падает с расстоянием до разработки; готовность истории определяется одним вопросом «команда сможет начать без меня»; истории режутся вертикально, потому что горизонтальный кусок нельзя ни показать, ни принять, ни отменить; открытый вопрос живёт в трекере с владельцем, датой и решением по умолчанию; глубина анализа тратится на необратимое, а не на заметное.
Чеклист перед тем, как отдать элемент бэклога в спринт:
- Я знаю, какое решение эта проработка обеспечивает и когда его надо принять.
- Ценность истории сформулирована через наблюдаемый результат для конкретной роли.
- Если выключить все остальные куски, этот всё равно можно отдать пользователю.
- Критерии приёмки проверяемы: по каждому можно написать тест без вопросов.
- Описаны ноль, много, отказ внешней системы, отсутствие прав и повторный запрос.
- Явно записано, чего в этой истории нет (
out_of_scope). - У каждого открытого вопроса есть текст, владелец-человек, дата и default.
- Ни один блокирующий вопрос не остался открытым.
- Названы необратимые решения внутри истории — им уделено больше внимания.
- Бизнес-правила и термины вынесены из тикета туда, где переживут релиз.
- Тестировщик прочитал критерии и не нашёл непроверяемых.
- Понятно, по какой метрике через месяц узнаем, что это сработало.
Источники
- Scrum Guide 2020 — scrumguides.org (уточнение бэклога как непрерывная активность, а не событие).
- Mike Cohn. Five Simple but Powerful Ways to Split User Stories (SPIDR) — mountaingoatsoftware.com.
- Richard Lawrence, Peter Green. The Humanizing Work Guide to Splitting User Stories — humanizingwork.com (полный каталог паттернов и дерево решений).
- Bill Wake. INVEST in Good Stories, and SMART Tasks — xp123.com.
- Jeff Patton. User Story Mapping — jpattonassociates.com (карта историй, срезы релизов, «что можно выкинуть»).
- Alistair Cockburn. Walking Skeleton — alistair.cockburn.us.
- Gojko Adzic. Specification by Example — gojko.net (примеры как общий язык вместо спецификации).
- Ellen Gottesdiener, Mary Gorman. Discover to Deliver — discovertodeliver.com (структурированная проработка на нескольких горизонтах).
- IIBA. Agile Extension to the BABOK Guide — iiba.org (роль анализа в гибких подходах, горизонты планирования).
- Liz Keogh. Estimating Complexity — lizkeogh.com (шкала «делали много раз → никто в мире не делал» и что писать вместо требований).
- Cynefin framework — en.wikipedia.org (почему в сложной области сначала эксперимент, потом описание).
- Donald Reinertsen. The Principles of Product Development Flow — reinertsenassociates.com (размер партии, цена задержки, стоимость запаса требований).
- Martin Fowler. Yagni — martinfowler.com.
- Amazon. Письмо акционерам за 2015 год — aboutamazon.com (решения-двери в одну и в две стороны).
- Dan North. Introducing BDD — dannorth.net (как разговор о примерах заменяет спор о формулировках).
Что дальше
Всё, что описано выше, ведёт к одному моменту: команда говорит «готово», а бизнес смотрит и решает, то это или не то. Именно здесь предъявляют счёт за каждую неточную формулировку, непроверяемый критерий и решение по умолчанию, которое никто не подтвердил. Дальше — как устроена приёмка, которая заканчивается решением, а не спором: кто принимает, по каким основаниям, что делать с расхождениями и как заранее лишить спор почвы.
Приёмка: как проверить, что сделали именно то, и как избежать споров