сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Требования

User story и критерии приёмки

User story и критерии приёмки

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

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

// Формулировки: «как разрежешь эту историю?», «чем критерий приёмки отличается от тест-кейса?», «что такое INVEST?»

Ценность важнее формы

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

Пример. Заказчик просит выгрузку заказов в таблицу. Записываем цель: «чтобы быстрее находить нужный заказ». И тут же выясняется, что фильтр по номеру прямо в интерфейсе решает ту же задачу вдвое дешевле и без ежедневной выгрузки файлов. Без «чтобы» команда сделала бы выгрузку - ровно то, что попросили, и не то, что было нужно.

Без цели история превращается в наряд на работу. Команда выполняет написанное, никто не задаёт вопросов, и способ решить задачу проще так и остаётся неизвестным.

// Аббревиатура INVEST перечисляет свойства хорошей истории: независимая, обсуждаемая, ценная, оцениваемая, небольшая, тестируемая. Самая рабочая буква первая: если истории сильно связаны между собой, почти наверняка их нарезали по слоям, а не по ценности.

Критерии приёмки и формат Given-When-Then

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

Формат Given-When-Then разводит три вещи: given - состояние до, when - произошедшее действие, then - проверяемый исход. Разделение дисциплинирует и сразу показывает, если чего-то не хватает.

Главная ошибка формата - протащить результат в given. «Дано: заказ оформлен. Когда пользователь оформляет заказ. Тогда заказ оформлен» - критерий, который проходит всегда и не проверяет ничего. Выглядит смешно в примере и абсолютно незаметно в документе на сорок страниц.

// Критерии только на счастливый путь - типичная дыра, и лечится она тем же вопросом «а если нет». Незаданное поведение при ошибке всё равно будет реализовано, просто решение примет разработчик и никому об этом не скажет.

Нарезка по вертикали

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

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

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

// Оценивать слои действительно проще, и в этом вся ловушка: удобство оценки покупается отложенной обратной связью. Причём платит за это не тот, кто оценивал.

Как отвечать: «История Личный кабинет не влезает в спринт. Как разрежешь?»

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

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

На чём валятся

  • − Пишут историю без «чтобы» и лишают команду возможности предложить решение дешевле.
  • − Режут по слоям архитектуры: обратная связь откладывается до схождения всех частей.
  • − Путают критерий приёмки с тест-кейсом и тащат в историю конкретные тестовые данные.
  • − Фиксируют в истории техническое решение, хотя ограничением оно не было.
  • − Протаскивают результат в предусловие и получают критерий, который проходит всегда.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.

  1. #ana_req_userstory1 / 5
    Что означает буква I в INVEST?
    A)Independent — реализуема отдельно от других
    B)Important — история приоритетна для бизнеса
    C)Integrated — история связана с соседними
    D)Iterative — история делается за несколько итераций
    показать ответ и разбор
    +A)Independent — реализуема отдельно от других

    // разбор: Independent означает минимальную зависимость от других историй: такую карточку можно вытащить в спринт, не таща за собой хвост. Полной независимости добиться редко удаётся, но сильная связность — сигнал, что нарезка сделана по слоям или по техническим этапам, а не по пользовательской ценности.

  2. #ana_req_userstory2 / 5
    В формате Given-When-Then что описывает Given?
    A)Ожидаемый результат проверки
    B)Исходный контекст до действия
    C)Действие пользователя или системы
    D)Роль, от лица которой написана история
    показать ответ и разбор
    +B)Исходный контекст до действия

    // разбор: Given задаёт исходное состояние («в корзине один товар, пользователь авторизован»), When — событие или действие, Then — проверяемый результат. Порядок важен: смешение контекста и действия делает сценарий неоднозначным, а перенос результата в Given превращает критерий в тавтологию, которая проходит всегда.

  3. #ana_req_userstory3 / 5
    Чем критерий приёмки отличается от тест-кейса?
    A)Критерий пишет аналитик, тест-кейс — тестировщик, содержание совпадает
    B)Критерий относится к НФТ, тест-кейс — к функциональности
    C)Критерий проверяется вручную, тест-кейс — автоматически
    D)Критерий — условие готовности, кейс — шаги проверки
    показать ответ и разбор
    +D)Критерий — условие готовности, кейс — шаги проверки

    // разбор: Критерий приёмки отвечает на вопрос «когда история считается сделанной» и живёт на уровне поведения. Тест-кейс — это способ убедиться: конкретные данные, шаги, ожидаемый результат, окружение. Из одного критерия обычно рождается несколько кейсов, включая негативные, которые в критерии не перечисляют.

  4. #ana_req_userstory4 / 5
    История «Личный кабинет» не помещается в спринт. Как её разрезать?
    A)На фронтенд, бэкенд и слой работы с базой данных
    B)На аналитику, разработку и тестирование
    C)На отдельные сценарии: профиль, пароль, заказы
    D)Пополам по объёму оценки в стори-поинтах
    показать ответ и разбор
    +C)На отдельные сценарии: профиль, пароль, заказы

    // разбор: Резать надо по вертикали — так, чтобы каждый кусок сам по себе давал пользователю работающий результат. «Просмотр профиля» можно выкатить и получить обратную связь. Нарезка по слоям или по этапам процесса даёт куски, которые поодиночке бесполезны: их нельзя ни показать, ни принять, ни отложить без потери смысла.

  5. #ana_req_userstory5 / 5
    Почему нарезка историй по слоям архитектуры считается антипаттерном?
    A)Слои сложнее оценивать в стори-поинтах
    B)Разработчикам неудобно работать параллельно
    C)Так усложняется ревью изменений
    D)Отдельный слой нельзя показать и принять
    показать ответ и разбор
    +D)Отдельный слой нельзя показать и принять

    // разбор: Готовый бэкенд без интерфейса не даёт ни демонстрации, ни проверки гипотезы: ценность появляется только когда сойдутся все слои. Риск копится до самого конца, а ошибка в понимании требований вскрывается тогда, когда переделка уже дорога. Вертикальный срез даёт обратную связь на каждом шаге.

дальше

Теорию прочитали. Навык ставится повторением

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