Пользовательские истории Майка Кона

Алексей Начаров
7 min readFeb 20, 2017

--

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

Проблемы

Однако на практике, как это часто бывает, возникает целый ряд сложностей. Вот их неполный список:

  • Большая неопределенность оценки. Сложно оценивать задачу по краткому описанию.
  • Стоимость реализации новых историй возрастает по мере увеличения кодовой базы и закрепления архитектуры приложения. В отсутствии полного списка хотя бы основных требований сложно избежать ситуации, когда заложенная архитектура оказывается неадекватна одному или нескольким таким требованиям. Чем больше архитектурных решений принимается, тем чаще в бэклоге начинают появляться истории, требующие изменения архитектуры.
  • Неясность с описанием нефункциональных требований. Пользовательские истории сфокусированы только на функциональности, но полностью игнорируют атрибуты качества.
  • Сложности с трассировкой требований. Пользовательские истории по природе своей подвижны, они переформируются, разбиваются на более компактные и под конец проекта не всегда ясно как первоначальные требования связаны с тестами, которое приложение проходит при поставке.
  • Сложность отслеживания связей между историями. Истории оказываются взаимозависимыми, по мере нарастания числа связей приоретизация бэклога становится все более и более трудоемкой.
  • Непонятно как интегрировать пользовательские истории с полноценным процессом проектирования.
  • Теряются важные детали. Приходится доделывать и переделывать.
  • Сложности со сдачей проекта в ситуации неполного взаимопонимания. Пользовательские истории не составляют документа с зафиксированными требованиями, поэтому формально не к чему аппелировать при закрытии проекта

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

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

По запросу “how to write user stories” в поисковике выпадает множество статей и заметок, предлагающих несколько шаблонов пользовательских историй. Вот один их них:

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

И действительно краткое описание фичи — важная часть пользовательской истории. Но не единственная.

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

Третий, не очевидный, но едва ли не важнейший компонент — это общение. Общение между заказчиком и командой, между разными членами команды. Собственно ради общения пользовательские истории и создаются.

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

Пользовательские истории — представление, но не документирование требований. Это только темы для начала разговора.

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

Зачем нужны

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

Пользовательские истории же напротив:

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

Свойства хороших историй

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

  • Независимость. В гибких процессах важна возможность переодически менять приоритеты и сам состав бэклога, менять порядок реализации, убирать и добавлять новые фичи. Для этого пользовательские истории не должны быть как можно более изолированы друг от друга.
  • Обсуждаемость.
  • Ценность для пользователей и заказчиков.
  • Оцениваемость.
  • Компактность.
  • Тестируемость.

Нетрудно заметить, что одни свойства из этого списка входят в противоречение с другими. Нельзя развить их все одновременно и в полной мере. Так, наращивая тестируемость, нам понадобится перебрать все возможные варианты работы с определенной частью продукта, что лишит историю компактности и вплотную приблизит собственно к вариантам использования (use cases).

Свойства хороших пользовательских историй противоречат друг другу.

Аналогично компактность расходится с оцениваемостью: чем меньше деталей нам известно, тем сложнее нам оценить.

Независимость тяжело реализировать и саму по себе и особенно в сочетании с компактностью. Заказчик часто мыслит довольно большими блоками функциональности, большими историями, которые приходится разбивать на меньшие для того, чтобы иметь возможность оценить их, определить тесты, конвертировать в конечные задачи. И связи между историями после такого разбиения все равно остаются. Особенно в ситуации сложного проекта c большой степенью связности разных компонентов. Можно для историй применить те же методы, которые мы применяем для изоляции программных компонентов и модулей в архитектуре ПО. Но тогда борьба против связности историй оборачивается уменьшением понятности истории для заказчика и соотвественно её оцениваемости, обсуждаемости.

Ответы и вопросы

Возвращаясь к списку проблем, с которого начался этот пост, нужно отметить, что о многих пунктах сам Кон упоминает.

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

В книге пользовательские истории преподносятся, как вполне достаточный метод и для работы с требования, и для проектирования, и для оценки, и для планирования, и для постановки задач. Дополнить пользовательские истории предлагается только сторипоинтами (story points) и покером планирования(planning poker game). Но ничего сверх этого. На практике же такая сборка скорее всего будет порождать значительные сложности.

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

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

О самой книге

Что хорошо

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

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

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

Пятая часть рассказывает о практиках экстремального программирования, в контексте которого впервые и возникли пользовательские истории в далеком 1998 году. Правда тогда они определялись по аналогии с вариантами использования. Сейчас же, напротив, принято подчеркивать различия между пользовательскими историями и вариантами использования.

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

Что плохо

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

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

Для чего стоит прочесть

“Пользовательские истории” Майка Кона стоит, конечно, прочесть. Она небольшая и быстро читается. Книга будет полезна прежде всего как первое знакомство с пользовательскими историями, яснее будут идеи, которые лежат за этим методам и соответственно и область применения — с поправкой, конечно, на критическое восприятие примеров Кона. Возможно, имеет смысл прочитать книгу и специалистам, уже имеющим опыт работы с пользовательскими историями. Она позволяет несколько упорядочить свои знания и найти ответы на часть вопросов, которые возникают на практике.

--

--