Зачем нужна декомпозиция?
Из предыдущих уроков вы узнали, что планировать задачи проще, если они небольшие. Такие задачи легче оценивать, контролировать и измерять качество результата. Но что делать, если перед вами стоит крупная задача, которую сложно сразу взять в работу?
Декомпозиция — это разделение целого объекта на составные части.
Пример из жизни: постановка спектакля
Представьте, что зритель хочет посмотреть новый мюзикл в театре. Чтобы удовлетворить его запрос, труппе нужно:
- Написать сценарий.
- Назначить актёров.
- Создать декорации и костюмы.
- Подобрать звук и освещение.
- Провести репетиции.
- Устроить премьеру.
Если времени мало, можно показать только первый акт — это заинтересует зрителей и даст возможность доработать остальное позже.
Точно так же в разработке ПО большие задачи разбивают на более мелкие, чтобы команда могла:
- Быстрее получить обратную связь.
- Снизить риски.
- Упростить оценку и контроль.
Виды декомпозиции
1. Вертикальная декомпозиция
Это разделение одной большой функции (например, "изменение записи в салоне красоты") на несколько более мелких историй, каждая из которых должна соответствовать критериям INVEST (независимость, переговоры, ценность, оценка, малый размер, тестируемость).
Пример:
- Пользователь хочет перенести запись на другую дату.
- Пользователь хочет сменить мастера.
- Пользователь хочет отменить запись.
2. Горизонтальная декомпозиция
Это разбиение задачи на этапы работы: проектирование, разработка, тестирование и т. д.
Пример для "изменения записи":
- Проектирование интерфейса.
- Настройка интеграции с системой салона.
- Тестирование функционала.
SPIDR: 5 техник декомпозиции сложных задач
Когда перед командой разработки встаёт сложная, труднооцениваемая задача, её можно разбить на более мелкие и управляемые части с помощью SPIDR — набора техник декомпозиции. Рассмотрим каждую из них подробно.
1. Spikes (Спайки) — исследовательские задачи
Что это?
Спайк — это небольшое исследование, которое помогает команде понять, как именно реализовать сложную функцию, прежде чем браться за её разработку.
Когда применять?
- Когда есть неопределённость в реализации.
- Когда нужно сравнить несколько вариантов решения.
- Когда требуется изучить внешние системы (например, API салонов красоты).
Пример из статьи:
Перед тем как реализовать функцию изменения записи в салоне, команда провела спайк:
✅ Выяснила, какие салоны вообще разрешают изменять запись.
✅ Определила, какие способы изменения возможны (через администратора, через приложение и т. д.).
3 правила эффективных спайков:
- Чётко формулировать ожидаемый результат
Гипотеза должна быть проверяемой (например: "80% салонов разрешают перенос записи").
Избегать расплывчатых формулировок ("изучить возможности"). - Ограничивать время исследования
Если спайк занимает больше времени, чем сама реализация, — возможно, он не нужен. - Выполнять спайк на одну итерацию раньше основной задачи
Это даст время на анализ и корректировку плана.
2. Paths (Пути) — разбиение по сценариям
Что это?
Разделение задачи на успешные и неуспешные сценарии выполнения.
Как применять?
- Определить основные пути решения задачи.
- Разделить их на:
Happy Path (идеальный сценарий).
Альтернативные пути (частичный успех).
Ошибочные сценарии (что пойдёт не так).
Пример из статьи:
Функция изменения записи в салоне может иметь:
✅ Успешный сценарий:
- Пользователь меняет запись, новая услуга стоит столько же.
✅ Частично успешный: - Нужна доплата (например, если новая услуга дороже).
❌ Неуспешный: - Запись нельзя изменить (например, если до визита меньше суток).
Почему это полезно?
- Можно реализовывать поэтапно (сначала только happy path, потом остальное).
- Позволяет снизить риски, сразу видя "узкие места".
3. Interfaces (Интерфейсы) — разделение по экранам и платформам
Что это?
Разбиение задачи на:
- Разные экраны (клиентский интерфейс vs. админ-панель).
- Разные платформы (iOS, Android, веб).
Пример из статьи:
Функция изменения записи может быть реализована:
📱 Через приложение (если салон поддерживает интеграцию).
🖥 Через заявку в поддержку (если интеграции нет).
Как применять?
- Определить, для каких ролей нужен интерфейс (клиент, администратор).
- Выбрать приоритетную платформу (например, сначала iOS, потом Android).
Плюсы подхода:
✅ Упрощает оценку времени.
✅ Позволяет быстрее выпустить MVP (минимальную версию).
4. Data (Данные) — разделение по информации
Что это?
Разбиение задачи на группы данных: обязательные и дополнительные.
Пример из статьи:
При изменении записи в салоне передаются:
🔹 Обязательные данные (ФИО, дата, услуга).
🔸 Дополнительные (номер телефона, мастер, сумма доплаты).
Как применять?
- Сначала реализовать минимальный набор данных для работы функции.
- Потом добавить остальные поля (если они не критичны).
Плюсы:
- Можно быстрее запустить функционал.
- Упрощает тестирование (меньше переменных на старте).
5. Rules (Правила) — управление ограничениями
Что это?
Разделение задачи на этапы: сначала базовая логика, потом правила.
Пример из статьи:
Правило: "Запись нельзя изменить за сутки до визита".
- 1-я итерация: разрешить изменение без ограничений.
- 2-я итерация: добавить проверку на 24 часа.
Когда так делать?
✅ Если правило не критично для работы (например, временно можно обойтись без него).
❌ Нельзя пропускать, если правило связано с безопасностью или законом (например, отправка чека по ФЗ-54).
Плюсы:
- Ускоряет выход первой версии.
- Позволяет постепенно усложнять логику.
Вывод: как применять SPIDR на практике?
- Spikes — если не знаете, как реализовать → сначала исследуйте.
- Paths — разбейте задачу на сценарии (успешные/неуспешные).
- Interfaces — разделите по интерфейсам и платформам.
- Data — начните с минимального набора данных.
- Rules — сначала базовая логика, потом ограничения.
Итог: SPIDR помогает превращать сложные задачи в понятные, измеримые и управляемые части!