User story и критерии приёмки
Продуктовые команды спрашивают об этом почти всегда: как режешь объём, как формулируешь критерии, что делаешь с историей, которая не влезает в спринт. Проверяют практику, а не знание шаблона - шаблон гуглится за секунду.
Стержень: история фиксирует потребность и ценность, критерии приёмки задают условие готовности, а нарезка идёт по пользовательской ценности, а не по слоям архитектуры.
// Формулировки: «как разрежешь эту историю?», «чем критерий приёмки отличается от тест-кейса?», «что такое INVEST?»
Ценность важнее формы
Шаблон «как роль, я хочу действие, чтобы результат» ценен третьей частью, и только ею. Первые две - просто вежливый способ записать задачу, а вот «чтобы» открывает пространство для разговора.
Пример. Заказчик просит выгрузку заказов в таблицу. Записываем цель: «чтобы быстрее находить нужный заказ». И тут же выясняется, что фильтр по номеру прямо в интерфейсе решает ту же задачу вдвое дешевле и без ежедневной выгрузки файлов. Без «чтобы» команда сделала бы выгрузку - ровно то, что попросили, и не то, что было нужно.
Без цели история превращается в наряд на работу. Команда выполняет написанное, никто не задаёт вопросов, и способ решить задачу проще так и остаётся неизвестным.
// Аббревиатура INVEST перечисляет свойства хорошей истории: независимая, обсуждаемая, ценная, оцениваемая, небольшая, тестируемая. Самая рабочая буква первая: если истории сильно связаны между собой, почти наверняка их нарезали по слоям, а не по ценности.
Критерии приёмки и формат Given-When-Then
Критерий приёмки отвечает на вопрос, когда историю можно считать сделанной, и живёт на уровне поведения. Тест-кейс - способ в этом убедиться: конкретные данные, шаги, окружение. Из одного критерия обычно рождается несколько тест-кейсов, и это нормальное соотношение.
Формат Given-When-Then разводит три вещи: given - состояние до, when - произошедшее действие, then - проверяемый исход. Разделение дисциплинирует и сразу показывает, если чего-то не хватает.
Главная ошибка формата - протащить результат в given. «Дано: заказ оформлен. Когда пользователь оформляет заказ. Тогда заказ оформлен» - критерий, который проходит всегда и не проверяет ничего. Выглядит смешно в примере и абсолютно незаметно в документе на сорок страниц.
// Критерии только на счастливый путь - типичная дыра, и лечится она тем же вопросом «а если нет». Незаданное поведение при ошибке всё равно будет реализовано, просто решение примет разработчик и никому об этом не скажет.
Нарезка по вертикали
Большую историю режут так, чтобы каждый кусок сам по себе давал работающий результат: отдельно просмотр профиля, отдельно смена пароля, отдельно история заказов. Каждый можно выкатить, показать людям и получить обратную связь, не дожидаясь остальных.
Нарезка по слоям - отдельно фронтенд, отдельно бэкенд, отдельно база - выглядит удобнее и остаётся антипаттерном. Ни один слой в отдельности нельзя показать и принять: пользователь не видит бэкенд. Ценность появляется только когда всё сойдётся, а до этого момента риск копится молча.
Разница в том, когда ты узнаёшь об ошибке в требованиях. При вертикальной нарезке - после первого же выката, через неделю. При слоёной - в конце, когда переделывать дорого во всех трёх слоях сразу.
// Оценивать слои действительно проще, и в этом вся ловушка: удобство оценки покупается отложенной обратной связью. Причём платит за это не тот, кто оценивал.
Как отвечать: «История Личный кабинет не влезает в спринт. Как разрежешь?»
Резал бы по вертикали, на самостоятельные пользовательские сценарии: отдельно просмотр профиля, отдельно смена пароля, отдельно история заказов. Каждый кусок можно выкатить и получить обратную связь, даже если остальные ещё не готовы. Первым взял бы то, ради чего кабинет вообще заводят - скорее всего историю заказов, потому что она снимает самый частый вопрос с поддержки, и это можно проверить по их статистике обращений. Резать на фронтенд, бэкенд и базу не стал бы: по отдельности эти куски нельзя ни показать, ни принять, и об ошибке в требованиях мы узнаем только тогда, когда всё сойдётся, - то есть в самый дорогой момент.
Кандидат показывает принцип нарезки, обосновывает порядок бизнес-ценностью со ссылкой на проверяемые данные и явно отказывается от популярного антипаттерна, объясняя почему.
На чём валятся
- −− Пишут историю без «чтобы» и лишают команду возможности предложить решение дешевле.
- −− Режут по слоям архитектуры: обратная связь откладывается до схождения всех частей.
- −− Путают критерий приёмки с тест-кейсом и тащат в историю конкретные тестовые данные.
- −− Фиксируют в истории техническое решение, хотя ограничением оно не было.
- −− Протаскивают результат в предусловие и получают критерий, который проходит всегда.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Что означает буква I в INVEST?A)Independent — реализуема отдельно от другихB)Important — история приоритетна для бизнесаC)Integrated — история связана с соседнимиD)Iterative — история делается за несколько итераций
показать ответ и разбор
+A)Independent — реализуема отдельно от других// разбор: Independent означает минимальную зависимость от других историй: такую карточку можно вытащить в спринт, не таща за собой хвост. Полной независимости добиться редко удаётся, но сильная связность — сигнал, что нарезка сделана по слоям или по техническим этапам, а не по пользовательской ценности.
- В формате Given-When-Then что описывает Given?A)Ожидаемый результат проверкиB)Исходный контекст до действияC)Действие пользователя или системыD)Роль, от лица которой написана история
показать ответ и разбор
+B)Исходный контекст до действия// разбор: Given задаёт исходное состояние («в корзине один товар, пользователь авторизован»), When — событие или действие, Then — проверяемый результат. Порядок важен: смешение контекста и действия делает сценарий неоднозначным, а перенос результата в Given превращает критерий в тавтологию, которая проходит всегда.
- Чем критерий приёмки отличается от тест-кейса?A)Критерий пишет аналитик, тест-кейс — тестировщик, содержание совпадаетB)Критерий относится к НФТ, тест-кейс — к функциональностиC)Критерий проверяется вручную, тест-кейс — автоматическиD)Критерий — условие готовности, кейс — шаги проверки
показать ответ и разбор
+D)Критерий — условие готовности, кейс — шаги проверки// разбор: Критерий приёмки отвечает на вопрос «когда история считается сделанной» и живёт на уровне поведения. Тест-кейс — это способ убедиться: конкретные данные, шаги, ожидаемый результат, окружение. Из одного критерия обычно рождается несколько кейсов, включая негативные, которые в критерии не перечисляют.
- История «Личный кабинет» не помещается в спринт. Как её разрезать?A)На фронтенд, бэкенд и слой работы с базой данныхB)На аналитику, разработку и тестированиеC)На отдельные сценарии: профиль, пароль, заказыD)Пополам по объёму оценки в стори-поинтах
показать ответ и разбор
+C)На отдельные сценарии: профиль, пароль, заказы// разбор: Резать надо по вертикали — так, чтобы каждый кусок сам по себе давал пользователю работающий результат. «Просмотр профиля» можно выкатить и получить обратную связь. Нарезка по слоям или по этапам процесса даёт куски, которые поодиночке бесполезны: их нельзя ни показать, ни принять, ни отложить без потери смысла.
- Почему нарезка историй по слоям архитектуры считается антипаттерном?A)Слои сложнее оценивать в стори-поинтахB)Разработчикам неудобно работать параллельноC)Так усложняется ревью измененийD)Отдельный слой нельзя показать и принять
показать ответ и разбор
+D)Отдельный слой нельзя показать и принять// разбор: Готовый бэкенд без интерфейса не даёт ни демонстрации, ни проверки гипотезы: ценность появляется только когда сойдутся все слои. Риск копится до самого конца, а ошибка в понимании требований вскрывается тогда, когда переделка уже дорога. Вертикальный срез даёт обратную связь на каждом шаге.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.