Небольшой дисклеймер. Понимаю, в разных организациях декомпозицией задач могу заниматься отдельные люди, старшие разработчики/тимлиды и пр. Есть разные подходы, декомпозиция по usecse, по сценариями, поэтапный и по иным умным подходам. Я не претендую на "правильные" подходы. Просто поделюсь опытом.
Что такое декомпозиция?
Декомпозиция задач — это процесс разделения сложной задачи на более мелкие, управляемые части. Этот подход помогает лучше понять задачу, упрощает её выполнение и позволяет эффективно распределить работу.
На первый взгляд всё просто: берём большую задачу и делим её на более мелкие. Однако, на практике часто встречаются ошибки в этом процессе. Некоторые разработчики или менеджеры пропускают важные этапы. После декомпозиции необходимо оценить задачи, чтобы понимать объём работы. Но если пропустить некоторые этапы, сроки выполнения могут затянуться.
С другой стороны, иногда встречаются слишком детализированные, "микроменеджментные" декомпозиции. Например, задачи формулируются как "Создать класс в такой-то папке". Это тоже не всегда правильно, так как в процессе работы может выясниться, что этот класс не нужен. Технические подробности важны, но скорее в качестве референсов, чтобы указать, что что-то уже реализовано или определённый функционал работает определённым образом.
Декомпозиция важна всем:
- Разработчикам для понимания плана действий
- Менеджерам для понимания, где происходит "пробуксовка"
- Стейкхолдерам/бизнесу для понимания, что проект вообще движется
Декомпозиция очень важный навык для разработчика. Если вы сможете сделать декомпозицию и оценку в одиночку и потом предоставить менеджеру, вы очень повысите свой авторитет в компании.
Много слов и мало действий. Давайте как я люблю всё познаем на практике.
Требования к проекту
Возьмём пример проекта
Необходимо реализовать виджет конвертера валют.
Курсы валют нужно брать из API ЦБ РФ и Binance для криптовалют. Обновлять курсы валют у нас в базе раз в сутки. Конвертация курсов валют должна без перезагрузки страницы у пользователя. Верстка виджета должна быть адаптивной. Список валют должен быть получен с сервера. Виджет должен быть выполнен в виде микросервиса.
Технологии и фреймворки не важны, так сказать на откуп разработчику.
Грубые наброски
Для начала не будем сильно углубляться в технические тонкости, просто пробежимся по требованиям. Для начала выделим два больших куска:
- Frontend
- Верстка адаптивного виджета
- Получение списка валют
- Расчёт курса валюты
- Backend
- Получение курсов валют из API ЦБ РФ и Binance
- Создание метода API для получения списка валют
- Создание метода API для конвертации валюты
С первого взгляда всё просто и понятно, можно брать в работу, НО(!) это слишком крупные мазки и в этом кроется проблема.
Погружаемся в backend
Давайте начнём с backend части.
Задача 0
Раз у нас в требованиях есть два сервиса, которые мы будем интегрировать к себе, мы должны убедиться, что они отдают необходимы нам данные. Так же тут нужно убедиться, что есть все необходимые реквизиты доступа токены, логин/пароли пр.
Задача: Ревью API источников курсов валют
Критерий завершения задачи: API источников курсов валют просмотрены и мы убедились, что нам это подходит.
Задача 1
Первое за что можно зацепиться Виджет должен быть выполнен в виде микросервиса. Получается наша первая задача сделать каркас микросервиса. По сути поднять пустой проект. Это может отнять не один час, поэтому это одна полноценная задача. Поэтому первая задача в копилку
Задача: Поднять микросервис
Критерий завершения задачи: Рабочий микросервис который успешно крутиться либо на локальной хост машине, либо в Docker, тут как удобно (я конечно за Docker).
Задача 2
Идём дальше. Можем подумать над схемой хранения данных. В данном случаем мы будем использовать подход database first, т.к. для новичком он самый простой. Нам нужно спроектировать базу данных. Придумать как будут лежать данные в базе и какие будут связи. На данном этапе мы можем подумать какая база данных нам нужна. Отсюда получается вторая задача.
Задача: Проектирование базы данных
Критерий завершения задачи: Поднятая локально база данных с нужно структурой таблиц.
Задача 3
Мы идём от простого к сложному. Если взглянуть на наши грубые наброски и выделить Создание метода API для получения списка валют. Достаточно простая задача на чтение данных из базы данных. Предварительно накидав вручную нужных нам данных в базу, чтобы нам было что отдавать в API. Так же на данном этапе нам нужно подумать над структурой ответа. Не будем сейчас брать в расчёт будет ли это REST, SOAP, gRPC и пр.
Задача: Создание метода API для получения списка валют
Критерий завершения задачи: Написан метод API для получения списка валют
Задача 4
У нас есть микросервис, база данных и метод который отдаёт список валют. Теперь мы можем перейти к расчёту курса определенной валюты. На данном этапе мы должны подумать над параметрами запроса, в каком виде они будут к нам приходить и над структурой ответа.
Задача: Создание метода API для конвертации валюты
Критерий завершения задачи: Написан метод API для получения списка валют
Задача 5
Теперь пришло время к обновлению курсов валют у нас в системе. Данную задачу можно разделить на три(неожиданно) задачи. Давайте опишем одну для начала, она получится самая большая из всех. В ней мы должны написать воркер/cron скрипт который запускается в определенное время.
Так же из требований мы видим, что мы должны подключить API ЦБ РФ и Binance, что может натолкнуть на мысль, что будут и другие источники данных. Поэтому на данном этапе, нам нужно продумать архитектуру кода так, чтобы можно было относительно легко добавлять новые источники данных, так и отключать ненужные.
Так же важный критерий на данном этапе это сохранение данных из будущих источников данных. Может появиться вопрос "как это могу над этим продумать, когда я ещё ни ЦБ РФ ни Binance не подключал". Да, это может показаться сложным на первом этапе, но необходимо продумать, какие данные будут приходить из классов в которых мы будем писать код интеграции к источникам курсов валют.
Задача: Создать воркер обновления курсов валют.
Критерий завершения задачи: Воркер стартует в нужное время и каркас для будущих интеграций готов. Так же происходит сохранение данных в базу.
Задача 5
На предыдущем этапе мы продумали каркас наших будущих интеграций. Поэтому на данном этапе нам нужно просто подключить API ЦБ РФ к нам.
Задача: Интеграция API ЦБ
Критерий завершения задачи: Данные из API ЦБ РФ приходят к нам и сохраняются в базу
Задача 6
Теперь проворачиваем такой же ход с API Binance
Задача: Интеграция API Binance
Критерий завершения задачи: Данные из API ЦБ Binance приходят к нам и сохраняются в базу
Задача 7
Так как мы не используем подход TDD в нашем примере, тесты мы будем писать в конце.
Задача: Написание тестов
Критерий завершения задачи: Тесты написаны и успешно проходят
Погружаемся в frontend
Задача 1
По примеру с backend нам нужно подумать, что мы будем использовать у себя, фреймворк (Reactjs, Vuejs и т.д.) или чистый HTML+CSS+JS и набросать каркас будущего виджета. Без разного рода элементов управления, просто пустой проект.
Задача: Поднять каркас приложения
Критерий завершения задачи: Клиентское приложение запускается
Задача 2
Теперь самая объёмная задача, вёрстка. На данном этапе нам нужно взять дизайн нашего виджета и адаптивно сверстать его. Нам нужно чтобы виджет просто был адаптивный тянулся под разные разрешения, но без интеграций с backen
Задача: Адаптивная верстка виджета
Критерий завершения задачи: Виджет правильно отображается на разных устройствах
Задача 3
Когда верстка виджета у нас готова, можно в него вдохнуть жизнь. Для начала добавим получение списка курсов валют. Наш виджет должен ходить в backend, получать список курсов валют и отображать в нашей форме
Задача: Получение списка курсов валют
Критерий завершения задачи: Курсы валют подгружаются в виджет и их можно выбрать
Задача 3
Осталось самое интересное. Нам нужно сделать функционал, ради чего всё это затевалось. Делаем конвертацию курса. В данном случаем на нужно брать данные из формы, отправлять на backend, ждать ответа и отображать пользователю
Задача: Конвертация валют
Критерий завершения задачи: При нажатии на кнопку "Рассчитать" сумма конвертируется
Задача 4
И финальны аккорд это тесты.
Задача: Написание тестов
Критерий завершения задачи: Тесты написания и успешно проходят
Итог
Из небольшого текста у нас получилось 7 задач для backend и 4 задачи на frontend. Я тут намеренно упустил этапы деплоя, приёмочного тестирования и пр., т.к. я хотел показать суть декомпозиции. Нельзя просто брать текст требований и разбивать на задачи, обязательно нужно подумать над планом своих действий.
Обязательно старайтесь делать задачу так, чтобы можно было выделить критерий завершения задачи. Нужно просто задать вопрос "Какую ценность принесёт задача?". Если у задачи нет цели, то и выполняться она будет бесконечное количество времени. Если сложно получается выделить критерий завершения или наоборот их слишком много, то нужно подумать, правильно ли вы разбили задачи.
Так если в процессе видите, что задача достаточно объемная, например "верстка виджета", её можно поделить ещё на более мелкие. Обычно говорят, если задача занимает больше 1 дня, то нужно дробить на более мелкие. Я бы тут выделил не 1 день, а 3 дня. Это я исхожу из своего опыта.
Так же вы должны статься сделать оценку задач, это так же важный навык, но об этом позже.