February 14, 2019

Декомпозиция требований? Самая техническая сторона проджекта

Всем привет. Сегодня предлагаю поговорить про декомпозицию требований и как это делается в Agile.

Начнем с самих основ. В статье затрону вопросы, что такое декомпозиция, при чем тут Agile и зачем и как это делать.

И начнем мы… с конца. С ответа на вопрос зачем нам это делать?

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

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

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

Что такое слайсинг?

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

Вот как выглядит любая декомпозиция:

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

Процес декомпозиции и его результат имеет ряд преимуществ, среди которых:

  1. Возможность быстро получать фидбек (аминь!). Разбив стори на логически завершенные кусочки функционала, мы можем смело бежать к клиенту и показывать, чего накодили для наискорейшего приема правок. Так дешевле.
  2. Быстрое тестирование и багфикс. Имея маленький функционал, который станет частью большого функционала, у нас есть возможность быстрее найти баги и пофиксить их. Пример: разработка формы заказа еды, отдельно от разработки витрины онлайн магазина. Если мы потестим форму заказа быстренько, то успеем допилить и валидацию правильную и верные ответы сервера на запрос. А возможно, после ревю юристов, нам потребуется еще допилить GDPR позиции (мало ли).
  3. Определение важной и менее важной работы. Когда мы декомпозируем большую задачу, мы сразу же видим, что будет важнее всего и пойдет в работу в первую очередь, а что будет менее важно и будет реализовано позже или не реализовано вовсе.
  4. Лучшая прогнозируемость результатов спринта. Если например, у нас есть скорость работы команды17 сторипоинтов, а она работает над сторями 8, 13 сторипоинтов, то есть вероятность, что мы что-то не успеем. Но что? Гораздо легче ответить на этот вопрос, когда работаем над сторями по 3 сторипоинта.
  5. Больше доверия и веры в себя. Выплывает из предыдущего — когда мы можем спрогнозировать конец спринта, к команде повышается доверие со стороны бизнеса. То же касается и веры в себя. Конечно, приятнее закрыть 10 сторис, чем 3, просто чисто на психологическом уровне. Последнее утверждение достаточно спорное, потому что важно остлеживать осознание того, что 10 сторис были частью великого — не всем доставляет удовольствие пофиксить 15 своих же багов и гордиться собой:)
  6. Экономия времени на оценку. Гораздо легче оценивать мелкие сторисы, описанные с разных сторон разработки, чем продумывать логику взаимодействия в большой задаче.
  7. Смягчение рисков. Декомпозируя задачи, нам легче выделить риски, влияющие на ту или иную реализацию. Например, подумали, что форму нужно сделать на какой-то новой технологии. Уже вырисовался риск того, что продажи в интернет-магазине можем не успеть запустить вовремя потому что технология для нас новая или не успеем покрыть юнит-тестами или еще что-то. В общем, мы можем прогнозировать раньше, чем наступит капец.
  8. Лучшее распределение работы в рамках спринта.Декомпозиция на мелкие задачи позволит многие вещи запаралелить и избежать оверзагруженности в конце спринта + лучше прозрачность отслеживания своего вклада в разработку фичи.

Когда делать декомпозицию?

Итак, как же понять, на каком этапе нам в работе нужна декомпозиция?

Разработка приложений и веб-продуктов достаточно непредсказуемый процес, в котором сложно оценивать большие куски работ и понять, в каком месте пойдет медленнее. Если в рамках спринта мы работаем над недекомпозированными задачами, то невыполнение 1–2 стори = 50% результата невыполнения спринта (образно). Декомпозицию лучше делать без привязки к конкретному спринту, и не делать ее непосредственно на планировании спринта. Самый оптимальный вариант — приходить на планирование спринта с уже декомпозированными задачами для получения более точной точечной оценки.

Как декомпозровать?

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

Горизонтальная декомпозиция задач подразумевает декомпозицию задач по типу проводимых работ, по компонентам, задействованным в работе, по специалистам. Например, возможны разбивки: База данных — Сервер — Клиентское приложение; бекенд разработчики делают свою часть работ, фронтенд свою, тестиврощики свою. В итоге, при завершении работ по каждому компоненту или каждый специалистом, мы не можем оценить конечный результат, поскольку его еще нужно “собрать” в кучу, интегрировать. Горизонтальную декомпозицию лучше всего проводить на начальном этапе проекта, когда необходимо выделить логически завершенные большие куски проекта (фичи), которые в дальнейшем будут разрабатываться.

Вертикальная декомпозиция — это больше про декомпозицию вглубь. При вертикальном слайсинге, задачи группируются таким образом, чтобы каждый из кусочков сам-по-себе уже был логически завершенным работающим функционалом без дополнительных интеграций и ресурсов, то есть таким, к которому мы можем определить definition of done. Такие кусочки легче показывать заказчику, получать фидбек и легче спланировать, поскольку в разработке каждого слайса будут принимать участие разные специалисты и будет легче выявить узкие места со всех сторон разработки.

Нагляднее о горизонтальном и вертикальном слайсинге можно посмотреть на картинке:

Если переводить на язык практического проектного менеджмента, то, в моей практике, горизонтальный слайсинг — это выделение эпиков, над которыми мы будем работать (например, “Мобильный API”), а вертикальный — создание юзер сторис (например, “Передавать 5 последних опубликованных новостей в мобильное приложение”). У вас может быть по-другому. Например, горизонтальный слайсинг это — “Создание редактируемой странички блога”, а вертикальный уже: “верстка страницы поста, создание админ-панели для редактирования страницы поста, тестирование работоспособности, нагрузочное тестирование и т.д.”

Какие техники использовать для декомпозиции?

Существует 4 основные техники декомпозиции задач: Vague Terms, Conjunctions, Acceptance Criteria, and Workflow Steps. Рассмотрим их ближе.

Vague Terms — используется в условиях сильной неопределенности. Часто, при описании фичи, мы используем неопределенности. Например:

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

В данном случае, словосочетание “несколькими способами” несет в себя некую неопределенность — что такое “несколькими”, “какими именно способами”, “сколько их должно быть”. Точно такая же история и со словосочетанием “на протяжении нескольких дней” — сколько дней? Что такое “день” и т.д. Использовав слайсинг, мы приходим к уточнению вышеописанной стори таким образом:

  1. Создать страницу оплаты, где отобразить корзину с выбранными товарами, форму для заполнения персональной информации, выбор способов оплаты.
  2. Добавить функционал оплаты через: банковский терминал, LiqPay, PayPal, расчетный счет, наличными при получении.
  3. Добавить сохранение введенной информации на протяжении 48 часов с момента клика на кнопку “Сохранить”.

Таким образом, мы видим, что уже +/- ориентируемся в том, какой объем работ нам нужно сделать и какие требования к этим работам выдвигаются.

Conjunctions — (с англ. — “союз) — если говорить простыми словами, то это те юзер стори, где мы выражаем мысли с помощью союзов “и, при условии, или, когда” и т.д.

Например:

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

В данном случае применяем декомпозицию и получаем:

  1. Сделать регистрацию на сайте.
  2. Создать страницу — личный кабинет пользователя.
  3. Создать вкладку для редактирования персональных данных пользователя.
  4. Создать форму для ввода данный банковской карты с такими полями: Имя-фамилия владельца, номер карты, срок действия, защитный код.
  5. Сделать постоянное хранение этих данных.
  6. Подставлять сохраненные персональные данные пользователя при оформлении следующей покупки.

Acceptance Criteria — декомпозиция задач на основании возможности применить к ним критериев приемки.

Например:

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

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

Разбиваем:

  1. Создать UI элементы на странице, где будем спрашивать пользователя разрешение определять его геолокацию.
  2. Создать UI элементы на странице, где пользователь сможет разрешить / запретить определение своей геолокации.
  3. Определять геолокацию пользователя — страну и город.
  4. Автоматически подставлять страну и город проживания пользователя в поля “Страна”, “Город” на странице оформления заказа.
  5. Дать возможность изменить геолокацию на странице оформления покупки вручную пользователем предоставив ему список стран и городов в них.

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

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

Например:

Как пользователь я хочу иметь возможность создать wish-лист с товарами магазина и иметь возможность совершить покупку из него.

Разбиваем по воркфлоу, получаем:

  1. Пользователь просматривает все товары, доступные для добавления в wish-лист.
  2. Пользователь формируем свой wish-лист из доступных товаров путем добавления выбранных товаров в wish-корзину.
  3. Пользователь сохраняет wish-лист в своем профиле.
  4. Пользователь переходит в свой wish-лист из личного кабинета.
  5. Пользователь имеет возможность купить все товары из wish-листа вместе для чего добавлен чекбокс “Купить все товары”.
  6. Пользователь имеет возможность купить каждый товар из wish-листа отдельно, путем клика на соответствующий товар.
  7. Пользователь переходит на страницу оформления заказа и заполняет персональные данные или использовать ранее сохраненные персональные данные путем клика на соответствующий чекбокс.
  8. Пользователь выбирает способ оплаты.
  9. Пользователь вводит платежные данные.
  10. Пользователь оплачивает выбранную покупку.
  11. Пользователь получает квитанцию об оплате в персональный кабинет и на email, указанный при регистрации.
  12. Пользователь получает информацию о том, когда и где он может забрать свой товар.

Как видим, после того, как мы разбили пользовательский воркфлоу, у нас нарисовались и неопределенности (например п.8 — какие способы оплаты доступны и т.д.) и критерии приемки.

Вместо выводов.

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

Всем пазл!