Что такое декомпозиция?

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

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

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

Но в чем же особенность декомпозиции рабочих задач?

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

1. Атомарность: Разделение на конкретные и понятные шаги, которые могут быть выполнены независимо друг от друга. Здесь под независимостью понимается то, что разные задачи могут быть выполнены в разное время. Приведем пример задачи, которая атомарна и не может далее разбиваться на более мелкие подзадачи - это управление автомобилем. Водитель не может сначала позаниматься рулежкой, а позже переключением передач. Эти процессы тесно связаны и производятся строго одновременно.

2. Зависимость: При декомпозиции задач определяются зависимости между различными шагами, что позволяет правильно установить порядок выполнения работ и избежать блокировок или задержек. Также приведем пример с автомобилем. Чтобы начать управлять автомобилем нужна определенная подготовка: получение прав на управление, техническое обслуживание и заправка авто. Только сделав эти шаги, можно будет приступить к управлению. 

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

4. Назначение ответственных: Каждая мелкая задача может быть назначена конкретному исполнителю или команде, что улучшает ясность в отношении ответственности и управления ролями. В примере с автомобилем, пожалуй, очень целесообразно доверить техническое обслуживание мастеру станции, а параллельно с этим вы сможете заняться планированием поездки. Здесь ответственный за ТО - мастер, а за маршрут - вы.

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

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

Для Agile команд добавим еще один важный принцип, который желательно соблюдать:

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

Виды декомпозиции

Виды декомпозиции могут варьироваться в зависимости от типа проекта или задачи:

1. Функциональная декомпозиция: Разбиение проекта на функциональные блоки или компоненты. Например, разработка веб-приложения может быть разделена на части, такие как пользовательский интерфейс, бэкэнд, база данных и т. д. Для выявления этого вида, как правило, можно использовать признак - над разными задачами работают специалисты из разных областей (дизайнер, архитектор, разработчик бэкенд, разработчик фронтенд, тестировщик).

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

3. Последовательная декомпозиция: Разделение задачи на последовательные шаги или этапы выполнения. Это позволяет определить порядок выполнения работы и планировать ресурсы соответственно. Пример:  1. Проектирование базы данных, 2. Создание БД, 3. Наполнение данными. Такие задачи, как правило, выполняются одним специалистом, но в строгой последовательности. Каждая следующая задача начинается после завершения предыдущей.

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

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

Декомпозируем по шагам

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

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

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

Шаг 3. Определение зависимостей: Определите зависимости между подзадачами и выявите последовательность их выполнения. Некоторые подзадачи могут зависеть от завершения других, поэтому важно учитывать это при планировании и выполнении работы.

Шаг 4. Оценка времени и ресурсов: Оцените время и ресурсы, необходимые для выполнения каждой подзадачи. Это поможет определить общее время выполнения основной задачи и предотвратить перегрузку работы.

Шаг 5. Порядок выполнения: Определите приоритетность подзадач и решите, в каком порядке они будут выполнены. Учитывайте сроки, требования к бизнесу и другие факторы при принятии решения о последовательности выполнения подзадач.

Шаг 6. Детализация и назначение ответственных: Подробно опишите каждую подзадачу и назначьте ответственных за их выполнение. Это поможет обеспечить ясность и ответственность в рамках команды.

Шаг 7. Отслеживание и обновление: Отслеживайте выполнение каждой подзадачи и регулярно обновляйте статус и прогресс. Это позволит заранее обнаружить проблемы и принять меры по их устранению.

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

Пример декомпозиции

Давайте рассмотрим пример функциональной декомпозиции задачи "Разработка добавления комментирования к постам в социальной сети":

1. Исследование и анализ требований:

- Изучить требования пользователя к функции комментирования.

- Проанализировать существующие аналоги функции комментирования в других социальных сетях.

- Определить основные функциональные и нефункциональные требования к комментированию постов.

2. Дизайн интерфейса:

- Создать макеты и прототипы интерфейса для отображения комментариев к постам.

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

3. Разработка бэкэнда:

- Создать API для добавления, получения и управления комментариями.

- Разработать базу данных для хранения комментариев и их связей с постами и пользователями.

- Написать бэкэнд-логику для обработки запросов на добавление и получение комментариев.

4. Разработка фронтенда:

- Создать компоненты пользовательского интерфейса для отображения комментариев к постам.

- Разработать механизм добавления комментариев к постам через интерфейс.

- Реализовать функциональность управления комментариями (редактирование, удаление и т. д.).

5. Тестирование:

- Написать и запустить модульные и интеграционные тесты для бэкэнда и фронтенда.

- Провести ручное тестирование функциональности комментирования на различных устройствах и браузерах.

- Выполнить тестирование безопасности для проверки наличия уязвимостей.

6. Документация:

- Написать документацию для разработанных API и интерфейсов.

- Создать инструкции пользователя по использованию функции комментирования.

- Подготовить техническую документацию для разработчиков.

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

А вот пример разбиения основной задачи на Epic, User Story и Task:

1. Epic:

- Название: Разработка функциональности комментирования постов.

- Описание: Создание возможности для пользователей оставлять комментарии к постам в социальной сети.

2. User Story:

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

- Критерии приемки:

- Пользователь может просматривать комментарии к посту.

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

- Пользователь может удалять или редактировать свой комментарий.

3. Task:

- Название: Исследование и анализ требований к функции комментирования.

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

- Ответственный: Владимир

- Оценка времени: 2 дня

- Критерии завершения:

- Сформулированы основные требования к функции комментирования.

- Проведен анализ аналогичных решений в других социальных сетях.

4. Task:

- Название: Разработка API для управления комментариями.

- Описание: Создание API для добавления, получения и удаления комментариев к постам.

- Ответственный: Андрей

- Оценка времени: 3 дня

- Критерии завершения:

- Разработаны эндпоинты для добавления, получения и удаления комментариев.

- API прошло модульное тестирование.

5. Task:

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

- Описание: Разработка компонентов интерфейса для отображения комментариев к посту и добавления новых комментариев.

- Ответственный: Елена

- Оценка времени: 4 дня

- Критерии завершения:

- Реализован компонент для отображения комментариев.

- Разработан механизм добавления новых комментариев через интерфейс.

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

 

Как правильно описывать задачи?

Epic (Эпик)

Вот некоторые шаги, которые помогут правильно описать эпик:

  1. Название эпика: Представьте краткое, но информативное название, отражающее суть работы или требования.

  2. Описание эпика: Включите краткое описание того, что предполагается достигнуть с помощью этого эпика. Это должно быть достаточно информативным, чтобы члены команды понимали цель работы.

  3. Цель эпика: Укажите, какая конечная цель или проблема будет решена этим эпиком. Это поможет членам команды понять, почему эпик важен и как он вписывается в общую стратегию проекта или продукта.

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

  5. Сроки и бюджет: Укажите ожидаемые сроки выполнения эпика и бюджетные ограничения, если таковые имеются. Это поможет команде понять, какие ограничения учитывать при планировании работы.

  6. Стейкхолдеры: Укажите стороны, которые будут заинтересованы в этом эпике и какие интересы они преследуют. Это поможет команде учитывать их потребности и ожидания при разработке и реализации эпика.

  7. Приоритет: Определите приоритет эпика относительно других задач или требований, чтобы помочь команде понять, насколько срочным является его выполнение.

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

User Strory (пользовательская история)

Описать пользовательскую историю (User Story) нужно таким образом, чтобы она четко передавала требования пользователя и цель функциональности. Вот несколько шагов, которые помогут правильно описать User Story:

  1. Название User Story: Дайте краткое и информативное название, которое отражает суть требования пользователя.

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

  3. Критерии приемки: Укажите конкретные критерии, по которым будет определено, что пользовательская история выполнена. Это может включать требования к функциональности, условия использования и ожидаемые результаты.

  4. Бизнес-значение: Определите, какую ценность предоставляет пользовательская история для бизнеса или конечного пользователя. Это поможет приоритизировать истории и понять, почему они важны для разработки.

  5. Стейкхолдеры: Укажите заинтересованных сторон, которые связаны с этой пользовательской историей, и их интересы. Это поможет команде понять, чьи потребности учитывать при разработке и внедрении функциональности.

  6. Приоритет: Определите приоритет пользовательской истории относительно других требований. Это поможет команде понять, насколько срочно необходимо выполнить эту историю.

Пример:

Название: Добавление кнопки "Лайк" к постам

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

Критерии приемки:
- Нажатие на кнопку "Лайк" увеличивает счетчик лайков у соответствующего поста.
- Пользователь может нажать кнопку "Лайк" только один раз для каждого поста.
- Счетчик лайков обновляется мгновенно после нажатия на кнопку без перезагрузки страницы.

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

Стейкхолдеры: Пользователи социальной сети, разработчики, владельцы продукта.

Приоритет: Высокий

Task (задача)

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

  1. Название задачи: Дайте краткое и информативное название, которое отражает суть работы.

  2. Описание задачи: Подробно опишите, что именно должно быть сделано в рамках задачи. Это должно включать конкретные шаги, действия или результаты, которые ожидаются от исполнителя.

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

  4. Зависимости: Укажите, если задача зависит от выполнения других задач или требует каких-либо внешних ресурсов или данных для выполнения.

  5. Сроки: Укажите сроки выполнения задачи, если они есть. Это поможет установить ожидания по времени и понять, когда задача должна быть завершена.

  6. Ответственный: Укажите члена команды, который ответственен за выполнение задачи. Это поможет обеспечить ясность в отношении ответственности и управления ролями в команде.

  7. Приоритет: Определите приоритет задачи относительно других задач. Это поможет команде понять, насколько срочной является задача и какие ресурсы ей следует выделить.

Пример:

Название задачи: Реализация функциональности кнопки "Отправить" в форме обратной связи

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

Критерии завершения:

  • Кнопка "Отправить" отображается на форме обратной связи.

  • Пользователь может нажать на кнопку и отправить сообщение.

  • Сообщение успешно доставлено администратору сайта.

Зависимости: Нет.

Сроки: До конца текущей недели.

Ответственный: Иван Петров.

Приоритет: Средний.

Заключение

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

Более полный и емкий пример декомпозиции вы сможете увидеть в демонстрационных проектах METEOR

Регистрируйтесь, изучайте и стартуйте свои проекты! Успехов вам!

Комментарии (8)


  1. g000phy
    23.04.2024 14:37

    Жжжжуть!

    Приведу только 1 пример

    Критерии приемки:- Нажатие на кнопку "Лайк" увеличивает счетчик лайков у соответствующего поста.- Пользователь может нажать кнопку "Лайк" только один раз для каждого поста.- Счетчик лайков обновляется мгновенно после нажатия на кнопку без перезагрузки страницы.

    Попытка нажать на лайк второй раз крашит приложение. Но по формальным признаками приемка пройдена.


    1. Squeez
      23.04.2024 14:37
      +2

      Спасибо, что развиваете тему! Здесь приведены очень простые примеры, которые дадут понимание как это устроено. Хотелось бы в комментариях увидеть ваши реальные описания эпиков, юзерстори и задач. Завтра утром опубликуем здесь примеры наших рабочих задач. Надеюсь это будет полезным.


    1. moaismario
      23.04.2024 14:37

      Согласно требованию, второй раз нажать не может


      1. g000phy
        23.04.2024 14:37

        А чем обеспечено требование?


  1. binary_file
    23.04.2024 14:37

    Как вам подход без использования саб тасок, то есть без подзадач, только эпики, задачи ну и баги со спайками?


    1. nergal-perm
      23.04.2024 14:37

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

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

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


  1. lambadakursk
    23.04.2024 14:37

    Вполне понятная и хорошая статья. Один минус на мой взгляд, часто встречаю при декомпозиции что все хотят исследовать существующие решения. А если их не существует?


  1. nergal-perm
    23.04.2024 14:37

    Хм, а если я декомпозирую функциональность из примера ("Разработка добавления комментирования к постам в социальной сети") вот так:

    1. Реализовать возможность просмотра комментария в виде простого текста без форматирования. То есть, на фронте это компонент отображения текста комментария, в БД - структура для хранения комментария, в API - метод получения комментария. Пока что к одному посту возможен один комментарий, для тестирования будем создавать его в БД вручную.

    2. Реализовать возможность просмотра всех комментариев (и там возможная пагинация, подгрузка еще что-то в этом роде).

    3. Реализовать возможность добавить комментарий по нажатию на кнопку в UI. На фронте - кнопка и условия ее доступности, в API - метод создания комментария, который пока что будет создавать захардкоженный текст. При проверке будем нажимать на кнопку и видеть, что список комментариев пополняется.

    4. Реализовать возможность удалить комментарий по нажатию на кнопку.

    5. Реализовать возможность ввести произвольный текст в качестве комментария.

    6. Реализовать возможность форматирования текста в комментарии.

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