Вопрос проверяет умение разбивать “большую неопределённую задачу” на управляемые части: требования, контракт, данные, реализация, инфраструктура, качество.
Декомпозиция начинается с целей и сценариев, затем выделяются контракты: входы/выходы, ошибки, SLA. После этого проектируют данные и потоки: что хранить, что считать, какие интеграции нужны. Реализацию раскладывают на вертикальные срезы (MVP end-to-end), а не на “сначала база, потом всё остальное”. Отдельными задачами всегда идут наблюдаемость, безопасность, тестирование и деплой.
Лучше всего работает разбиение на “вертикальные срезы”, где каждый этап даёт работающий кусок ценности, а не на абстрактные слои.
Сначала формулируется 1-3 основных сценария:
“создать/обновить/получить” (в терминах домена)
критичные ошибки и пограничные случаи
требования по времени ответа и надёжности
Результат шага:
список сценариев
критерии готовности (что значит “работает”)
Дальше фиксируете интерфейс сервиса:
API (эндпоинты/методы), схемы запросов/ответов
коды ошибок и их смысл
правила версионирования
Отдельная подзадача:
идемпотентность для операций записи
корреляция запросов (request id) для диагностики
Потом определяете, как сервис будет хранить состояние:
список сущностей и их поля (минимальный)
ограничения и инварианты (что “нельзя”)
стратегия миграций схемы
Определение: Invariant — правило, которое всегда должно быть истинным (например, “статус не может перескочить назад”).
Если сервис зависит от других систем, декомпозиция включает:
адаптеры к внешним API
таймауты/ретраи/ограничения параллелизма
сценарии деградации (что отдаём, если зависимость упала)
Пример базового таймаута на внешний вызов:
ctx, cancel := context.WithTimeout(parent, 100*time.Millisecond)
defer cancel()
// client.Do(ctx, ...)
Не начинайте с “идеальной платформы”. Сделайте рабочий путь, потом укрепляйте.
Пример очереди задач (как набор задач, не таблица):
Каркас сервиса: ручка health-check + базовый роутинг
Минимальная операция “прочитать данные” (пусть даже из заглушки)
Подключение хранилища и одна сущность end-to-end
Интеграция 1 внешней зависимости (самая критичная)
Наблюдаемость: метрики/логи/трейсинг для основных путей
Нагрузочное тестирование и оптимизация горячих мест
Расширение функционала и “полировка” надёжности
Их нельзя откладывать “на потом”, иначе потом будет больно:
деплой и конфигурация (CI/CD, секреты, параметры)
мониторинг и алерты
лимиты и защита от перегрузки
тесты: unit + интеграционные + нагрузочные (хотя бы базовые)
Декомпозиция нового сервиса — это перевод идеи в набор конкретных задач: сценарии → контракты → данные → интеграции → вертикальные срезы реализации + обязательные нефункциональные требования (деплой, наблюдаемость, тестирование, защита от перегрузки).