Истории (пользовательские и не только)

А так — перевод оригинальной статьи.

Истории ведут себя как «пиджин»,
позволяя обеим сторонам
договориться в достаточной мере,
чтобы эффективно работать вместе.

Билл Уэйк, соавтор экстремального программирования

Определение: Истории — это короткие описания небольшой части требуемой функциональности, написанные с точки зрения пользователя.

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

Истории — это основной артефакт, используемый для определения поведения системы в Agile. Это короткие, простые описания функциональности, рассказанные с точки зрения пользователя и написанные на его языке. Каждая история реализует небольшой вертикальный срез поведения системы.

Истории предоставляют достаточно информации для представителей бизнеса и технических специалистов, чтобы понять общую суть изменений. Детали откладываются до того времени, когда история будет взята в реализацию. Благодаря критериям приемки и приемочным тестам истории становятся более конкретными, помогая обеспечить качество системы.

Пользовательские истории (user story) описывают функциональность, используемую непосредственно конечным пользователем. Вспомогательные истории (enabler story) позволяют вытащить на свет работы, необходимые для обеспечения исследований, построения и развития архитектуры, создания и развития инфраструктуры и соответствия регуляторным и отраслевым требованиям.

Детали

SAFe описывает четырехуровневую иерархию артефактов, описывающих функциональное поведение системы: Эпики (Epic), Возможности (Capability), Функции (Feature) и Истории (Story)1. В совокупности эти артефакты используются для описания требуемого поведения решения (solution). Непосредственная работа по реализации решения определяется через истории (stories), которые составляют Бэклог команды (Team backlog). Некоторые истории возникают из бизнес фич (business features) и вспомогательных фич (enabler features) из Бэклога ARTа (ART Backlog), в то время как другие исходят из внутреннего контекста команды.

Каждая история — это описание небольшого, независимого (в том смысле, что его реализация не должна зависеть от реализации прочих вариантов поведения системы) поведения системы, которое может быть реализовано пошагово, и которое представляет некоторую ценность для пользователя или Решения. Это вертикальный срез функциональности, гарантирующий, что каждая итерация будет приносить новую ценность. Истории должны быть небольшими и должны завершаться за одну итерацию (см. Раздел о разделении историй).

Часто истории сначала записываются на каталожных карточках или на стикерах. Физическая природа карточки создает ощутимую связь между командой, историей и пользователем: она помогает вовлечь всю команду в написание истории. Стикеры имеют и другие преимущества: они помогают визуализировать работу, их можно легко разместить на стене или на столе, менять последовательность размещения и даже передать карточку другой команде при необходимости. Истории позволяют лучше понять объем работ и прогресс:

• «Вау, посмотрите на все эти истории, на которые мы собираемся подписаться» (объем работ)
• «Посмотрите на все истории, которые мы реализовали в этой итерации» (прогресс)

Хотя написать историю может любой, согласование их добавления в Бэклог команды и добавление их в базовый план системы является обязанностью Владельца продукта (Product Owner). Понятно, что бумажные стикеры плохо приспособлены для использования в масштабах крупного предприятия, поэтому истории часто быстро переносятся в инструменты Agile Lifecycle Management (ALM).

В SAFe, как описано ниже, есть два типа историй: пользовательские истории (user stories) и вспомогательные истории (enabler stories).

Источники появления историй

Обычно истории появляются, как результат декомпозиции бизнес и вспомогательных фич (см. рис. 1).

На картинке изображено, что пользовательские и вспомогательные истории могут быть порождены из фичи.
Рисунок 1. Пример декомпозиции бизнес фичи на истории.

Пользовательские истории

Пользовательские истории являются основным средством описания необходимой функциональности. Они, по существу, заменяют традиционную спецификацию требований (requirement specification). Однако, в некоторых случаях, они служат средством для объяснения и проработки поведения системы, которое позже будет зафиксировано в спецификации, поддерживающий потребность: в удовлетворении требованиям регуляторных органов, соответствии стандартам поставщиков, в трассируемости и т. д.

Поскольку истории фокусируются на пользователе, как на выгодополучателе, а не на системе, пользовательские истории ориентированы на клиента и описывают ценность с точки зрения клиента. Поэтому рекомендуемой формой записи истории является «голос пользователя», а именно:

Как <пользователь в определенной роли>, я хочу <выполнять определенные действия>, чтобы <получить ценность>

Используя этот формат, команды ориентируются на понимание того, кто использует систему, что он с ней делает и почему он это делает. Регулярное применение формата «голоса пользователя» способствует повышению компетентности команды в предметной области, команда лучше понимает реальные бизнес-потребности своего пользователя (см. рис. 2).

Как владелец ТС, я хочу. чтобы ТС умело определять текущий лимит скорости и двигалось с соблюдением этого лимита, чтобы при движении соблюдать ПДД.
Рисунок 2. Пример пользовательской истории в формате “голоса пользователя”.

Как <пользователь>, я могу <действие> <влияние на пользователя>

В целях <цель>, как <пользователь> я могу <действие>

Как описано в Дизайн Мышлении, персонажи описывают конкретные характеристики типичных представителей групп пользователей, которые помогают командам лучше понять своего конечного пользователя. Примерами персонажей для пассажира на рисунке 2 могут быть или искательница острых ощущений «Джейн», или робкий пассажир «Боб». Затем описания историй могут ссылаться на этих персонажей («Как Джейн, я хочу…»).

Хотя формат пользовательской истории типичен, не каждая система взаимодействует с конечным пользователем. Иногда «пользователь» — это устройство (например, принтер) или система (например, сервер транзакций). В этих случаях история может принять форму, показанную на рисунке 3.

Как абонентский ящик, я могу обнаруживать вкладываемую или вынимаемую посылку с помощью RFID, чтобы отправлять уведомление об этом событии.
Рисунок 3. Пример пользовательской истории, где пользователем выступает “система”.

Вспомогательные истории

Команды также разрабатывают новую архитектуру и инфраструктуру, необходимые для реализации новых пользовательских историй. В этом случае история не может напрямую касаться какого-либо конечного пользователя. Команды используют «вспомогательные истории» для обеспечения исследований, проработки архитектуры или формирования инфраструктуры. Как показано на рисунке 4, вспомогательные истории могут быть выражены техническим, а не ориентированным на пользователя языком2.

Определить способность камеры считывать международные знаки скорости.
Рисунок 4. Пример вспомогательной истории.

Существует множество различных типов вспомогательных историй, в том числе:

  • Рефакторинг и изучение путей реализации (Spikes, традиционно определяемые в XP)
  • Создание или улучшение инфраструктуры разработки/развертывания
  • Выполнение задач, требующих участия человека (например, индексирование миллиона веб-страниц).
  • Создание необходимых конфигураций продукта или компонента для различных целей
  • Проверка качества системы (например, тестирование производительности и поиск уязвимостей)

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

Написание хороших историй

Хорошие истории требуют при создании нескольких пар глаз. В Agile-подходе все участники команды определяют единое понимание того, что им нужно создать, чтобы уменьшить количество переделок и увеличить производительность. Команды взаимодействуют, используя Разработку, управляемую поведением (BDD), чтобы определить подробные приемочные тесты, которые окончательно определяют каждую историю.

Совместное написание истории гарантирует учет всех точек зрения, общее согласие относительно сценария истории и ожидаемых результатов, которые определены в описании истории, критериях приемки и приемочных тестах. Приемочные тесты написаны в терминах предметной области с использованием BDD. Затем тесты BDD автоматизируются и выполняются непрерывно для обеспечения Встроенного Качества (Built-In Quality). Тесты BDD написаны в связке с требованиями к системе (историями) и, следовательно, могут использоваться в качестве окончательного описания поведения системы, заменяя стандартную документацию на систему.

Подход трех С: карточка, обсуждение, подтверждение

Рону Джеффрису, одному из создателей XP, приписывают создание подхода 3Cs:

  • Карточка (Card) — фиксирует заявление о намерениях в рамках пользовательской истории с помощью каталожной карточки, стикера или специальной системы. Каталожные карточки обеспечивают физическую связь между командой и историей. Размер карточки физически ограничивает длину истории и преждевременные предположения о специфике поведения системы. Карточки также помогают команде «почувствовать» предстоящий объем работ, потому что одно дело — смотреть на десять строк в электронной таблице, и другое — держать десять карточек в руке.
  • Обсуждение (Conversation) — представляет собой «обязательство диалога» об истории между командой, клиентом (или доверенным лицом клиента), PO (который может представлять клиента) и другими заинтересованными сторонами. Обсуждение необходимо для определения более подробного поведения, требуемого для реализации намерения. Обсуждение может породить дополнительную конкретику в виде критериев приемки (подтверждаемых ниже) или вложений в пользовательскую историю. Обсуждение является частью всех этапов жизненного цикла истории:
    • Проработки бэклога (Backlog refinement)
    • Планирования (Planning)
    • Реализации (Implementation)
    • Демонстрации (Demo)

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

  • Подтверждение (Confirmation). Критерии приемки предоставляют информацию, необходимую для понимания, что история реализована правильно и покрывает соответствующие функциональные и нефункциональные требования. На рисунке 5 приведен пример. Некоторые команды часто используют раздел подтверждения на карточке истории, чтобы записать то, что они будут демонстрировать.
Дано ТС, движущееся в рамках текущего ограничения скорости
Когда новое ограничение скорости ниже, чем текущая скорость
То это ограничение скорости ограничивает скорость ТС до тех пор, пока не появится новое ограничение
Рисунок 5. Пример критериев приемки, сформулированных по BDD.

Agile команды автоматизируют приемочные тесты везде, где это возможно, часто на языке предметной области, удобном для бизнеса. Автоматизация создает исполняемую спецификацию для проверки правильности реализации и верификации решения. Автоматизация также обеспечивает возможность быстрого регрессионного тестирования системы, улучшая Непрерывную Интеграцию, рефакторинг и обслуживание.

Инвестиции в хорошие истории

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

Написание кода для осознанной цели не обязательно является самой сложной частью разработки программного обеспечения.

Наоборот, понимание реального назначения кода — это сложно. Поэтому вложение в хорошие пользовательские истории, пусть даже и в последний ответственный момент4, — соответствующая трата ресурсов команды. Билл Уэйк придумал аббревиатуру INVEST (Leffingwell, 2011) для описания атрибутов хорошей пользовательской истории.

  • I (Independent) — независимая (истории не зависят друг от друга и могут реализовываться в любом порядке)
  • N (Negotiable) — обсуждаемая (история представляет гибкое заявление о намерениях, а не контракт)
  • V (Valuable) — ценная для клиентов и бизнеса (предоставляет клиенту вертикальный срез функциональности, имеющий для него ценность)
  • E (Estimable) — оцениваемая (история должна быть небольшой и возможной к обсуждению, чтобы ее можно было оценить с достаточной точностью)
  • S (Small) — маленькой (история должна умещаться в одну итерацию)
  • T (Testable) — тестируемая (история понятна в той мере, чтобы было ясно, как её проверить)

Правильное разделение историй

Более маленькие истории реализуются быстрее и с большим уровнем качества, поскольку небольшие элементы проходят сквозь любую систему быстрее, подвержены меньшим изменениям и меньшим рискам. Поэтому разбиение больших историй на более мелкие — обязательный навык для каждой Agile-команды. Это одновременно и искусство, и наука инкрементальной разработки. Agile Software Requirements описывает десять способов разделения историй. Ниже приводится краткое изложение этих методов:

  • Шаги рабочего процесса
  • Варианты бизнес-правил
  • Основное усилие
  • Простые/сложные
  • Варианты данных
  • Методы ввода данных
  • Отложенные характеристики качества системы
  • Операции (например, CRUD)
  • Сценарии использования
  • Выделение исследований

На рисунке 6 показан пример разделения по сценариям использования.

История может быть декомпозирована на несколько по сценариям использования.
Рисунок 6. Пример разделения большой истории на меньшие.

Шаги рабочего процесса

Варианты бизнес-правил

Основное усилие

Простые/сложные

Варианты данных

Методы ввода данных

Отложенные характеристики качества системы

Операции

Выделение исследований

Оценка историй

Agile-команды используют для оценки своей работы сторипоинты и метод «покер планирования». Story Point — это особое число, которое представляет собой комбинацию следующих характеристик:

  • Объем работ – сколько нам придется трудится, чтобы сделать это?
  • Сложность — насколько это будет сложно сделать?
  • Понимание – что известно о задаче, насколько мы ее понимаем?
  • Неопределенность – что нам неизвестно?

Сторипоинты представляют собой относительную единицу, не привязанную к какой-либо конкретной единице измерения. Размер (объем усилий команды, затрачиваемый командой на реализацию истории) каждой истории оценивается относительно наименьшей истории, которой присваивается размер «единица». Для оценки применяется модифицированная последовательность Фибоначчи (1, 2, 3, 5, 8, 13, 20, 40, 100), отражающая присущую неопределенность в оценке, особенно в области больших чисел (например, 20, 40, 100).

Покер планирования

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

(Обратите внимание на то, что можно использовать несколько других методов для оценки.) Правила оценки с помощью покера таковы:

  • Участвуют все члены команды
  • Каждому участнику дается колода карт, содержащая модифицированную последовательность Фибоначчи.
  • Владелец продукта (product owner) принимает участие, но не оценивает
  • Скраммастер/Team Coach принимает участие, но не оценивает, если только он не совмещает роль с ролью разработчика
  • Для каждого оцениваемого элемента бэклога PO читает описание истории
  • Команда задает вопросы и получает ответы
  • Каждый участник самостоятельно и в тайне от других выбирает карту со своей оценкой
  • Все карты переворачиваются одновременно, чтобы избежать предвзятости и сделать все оценки видимыми
  • Участник, давшие самую высокую и самую низкую оценки объясняют мотивы своего решения
  • После обсуждения каждый участник дает повторную оценку
  • Скорее всего оценки совпадут. В противном случае процесс повторяется5.

Уместно провести несколько предварительных обсуждений архитектуры. Однако трата слишком большого количества времени на обсуждение архитектуры может оказаться напрасной тратой усилий. Настоящая ценность использования покера планирования заключается в том, чтобы добиться общего понимания объема истории. Это также весело6!

Скорость команды (Velocity)

Скорость команды для итерации равна сумме сторипоинтов за все завершенные истории, соответствующие их критериям готовности (DoD). Чем дольше команда работает вместе, тем их средняя скорость (завершенные сторипоинты за итерацию) становится более надежной и предсказуемой. Более предсказуемая оценка скорости помогает в планировании и дает возможность ограничить незавершенную работу (WIP), поскольку команды не берут на себя больше историй, чем позволяет их историческая скорость. Эта метрика также позволяет оценить, сколько времени потребуется для доставки эпиков, фич, капабилити и вспомогательных элементов бэклога, которые также оценивать с использованием сторипоинтов.

Исходный базовый уровень для оценки

В обычном Scrum оценка в сторипоинтах и скорость каждой команды — это проблема самой команды. При масштабировании производства становится проблематично предсказать размер в сторипоинтах более крупных эпиков и фич, если скорость команды сильно различается. Чтобы решить эту проблему, команды SAFe изначально калибруют исходный базовый уровень сторипоинта, чтобы один сторипоинт определялся примерно одинаково для всех команд. Нет необходимости повторно калибровать оценку команды или ее скорость. Калибровка выполняется один раз при запуске новых Agile Release Trains.

Нормализация сторипоинтов, обеспечивающая достижение согласованного исходного уровня для историй и скорости, осуществляется следующим образом:

  • Дайте каждому разработчику/тестировщику в команде восемь сторипоинтов на двухнедельную итерацию (по одному сторипоинту за каждый идеальный рабочий день, вычтя два дня на общие накладные расходы).
  • Вычтите по одному сторипоинту за каждый день отпуска и выходной для каждого члена команды.
  • Найдите небольшую историю, для которой на написание кода вы потратите полдня, и на тестирование и проверку — потратите полдня. Оцените эту историю в один сторипоинт.
  • Оцените остальные истории относительно этой «единичной».

Пример: предположим, что команда состоит из шести человек, из которых трое — разработчики, двое — тестировщики и один PO, нет отпусков или праздников. Тогда предполагаемая начальная скорость = 5 × 8 сторипоинтов = 40 сторипоинтов за итерацию. (Примечание: может потребоваться небольшое снижение скорости, если один из разработчиков или тестировщиков исполняет роль Team Coach.)

Таким образом, сторипоинты в какой-то мере будут сопоставимы между командами. Менеджмент сможет лучше понять стоимость сторипоинта и более точно определить стоимость запланированной фичи или эпика.

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


Примечание. Kanban-команды SAFe обычно тратят меньше времени на оценку историй, чем Scrum-команды. В модели, основанной на потоке Канбан, рабочие элементы или истории обычно декомпозированы и доведены до такого размера, который позволяет команде поставить историю в течение нескольких дней. В контексте SAFe, где командам необходимо участвовать в планировании итераций и определять истории для будущих итераций, требуется некоторое понятие размера.

Канбан-команды SAFe могут первоначально использовать покер планирования или аналогичный механизм для определения размеров своих историй. Однако, скорее всего у них сформируется чувство разбиения работы на истории одинакового размера, поскольку это способствует потоку поставки в целом и гарантирует, что никакая крупная история не заблокирует другие истории, которым также необходимо пройти через Канбан-систему. Когда команды понимают свою скорость, они могут предположить, сколько историй они смогут реализоватьв единицу времени, что позволит им распределить истории по итерациям во время PI-планирования, и позволит брать на себя обязательства перед другими командами касательно того, когда конкретные истории будут реализованы.

Для команд, занимающихся постоянным обслуживанием и поддержкой, оценка обычных элементов их бэклогов часто имеет меньшее значение. Во многих случаях эти команды не оценивают этот тип работ. Однако у всех команд есть работы, возникшие по результатам ретро, потенциальные улучшения конвейера CD и другие важные задачи, требующие внимания, планирования и оценки.


Критерии проверки историй на корректность формулировки

Алгоритм определения типа истории

Схема определения типа истории
Рисунок 7. Схема определения типа истории.

Пользовательская история

Вспомогательная история на разработку

Вспомогательная история – задача

Список литературы

Cohn, M. (2004). User Stories Applied: For Agile Software Development. Addison-Wesley.

Leffingwell, D. (2011). Agile Software Requirements: Lean Requirements Practices for Teams, Programs, and the Enterprise. Addison-Wesley,.

Leffingwell, D. (2011). Agile Software Requirements: Lean Requirements Practices for Teams, Programs, and the Enterprise. Addison-Wesley.

Jeffries, Ronald E., Essential XP: Card, Conversation, Confirmation / Ron Jeffries Site, дата обновления: 30.08.2001 / Ссылка (дата обращения: 21.12.2024)

Specification by example / Википедия — свободная энциклопедия, дата обновления 11.08.2021 / Ссылка (дата обращения: 21.12.2024)

Story / SAFe Studio / Ссылка (дата обращения: 21.12.2024)


  1. Поскольку корректные переводы названий артефактов достаточно длинные и не прижились в профессиональном общении, в дальнейшем по тексту будем использовать английские варианты терминов. ↩︎
  2. Стоит обратить внимание, что даже в этом виде описывается ожидаемый результат, а не просто работа, которую нужно сделать. ↩︎
  3. В рамках демонстрации системы (System Demo) ↩︎
  4. Здесь имеется в виду применяемая в agile-подходах стратегия принятия решения Last Responsible Moment (LRM). Он гласит, что критичные решения надо принимать в тот момент, когда стоимость непринятия решения станет выше, чем стоимость принятия. По-другому можно сказать, что тратить усилия по формированию историй можно до самого последнего момента, после которого уже нужно делать реализацию кровь из носу. ↩︎
  5. Обратите внимание, здесь явно указано, что не берется никакое среднее значение по оценкам, а оценки всех участников команды должны совпасть. Отсюда – оценка истории всегда целое число и совпадает с модифицированным рядом Фибоначчи. ↩︎
  6. По мнению авторов SAFe. ↩︎