Раздел описывает принципы организации программного обеспечения: от структуры отдельных функций и модулей до архитектуры приложений и взаимодействия между системами.
Материалы раздела рассматривают способы управления сложностью, разделения ответственности, определения границ компонентов и принятия технических решений, позволяющих системе оставаться понятной, изменяемой, тестируемой и устойчивой к развитию требований.
Основные направления
- Качество кода и управление сложностью — понятность, именование, локальность изменений, размер компонентов, побочные эффекты, инварианты и снижение случайной сложности.
- Модульность и зависимости — связность, зацепление, инкапсуляция, абстракции, контракты, композиция, внедрение и направление зависимостей.
- Принципы проектирования — SOLID, DRY, KISS, YAGNI, Law of Demeter, command-query separation и другие ориентиры для изменяемого дизайна.
- Объектное и предметное моделирование — сущности, объекты-значения, агрегаты, доменные сервисы, события, ограниченные контексты и единый язык.
- Шаблоны проектирования — порождающие, структурные и поведенческие шаблоны, enterprise patterns и анализ условий их применимости.
- Архитектурные стили и структуры — монолит, модульный монолит, слоистая, компонентная, клиент-серверная, событийная и сервисная архитектуры.
- Архитектурные границы и интеграции — порты и адаптеры, API, сообщения, anti-corruption layer, разделение систем и управление изменениями контрактов.
- Архитектурные решения и эволюция системы — требования к качеству, компромиссы, ADR, технический долг, рефакторинг, миграции и постепенное изменение архитектуры.
Основные вопросы раздела
Материалы раздела должны помогать отвечать на следующие вопросы:
- Как разделить систему на понятные и независимо изменяемые части?
- Где провести границы модулей, компонентов и предметных контекстов?
- Как уменьшить связность и сохранить высокую смысловую цельность компонентов?
- Какие зависимости должны быть направлены к стабильным абстракциям?
- Когда композиция предпочтительнее наследования?
- Какие инварианты и контракты должна защищать модель?
- Когда применение шаблона упрощает решение, а когда добавляет лишнюю сложность?
- Как выбрать архитектурный стиль с учётом требований и ограничений?
- Как отделить бизнес-правила от транспорта, хранения и инфраструктуры?
- Как управлять совместимостью интерфейсов и интеграций?
- Как фиксировать архитектурные решения и их компромиссы?
- Как развивать существующую систему без опасной полной переработки?
Границы раздела
Раздел посвящён структуре программного обеспечения, моделированию предметной области и архитектурным решениям.
Синтаксис, системы типов и механизмы выполнения конкретных языков рассматриваются в разделе программирования и сред выполнения. Пользовательские и бизнес-требования относятся к разделу пользователя и бизнеса. Процессы постановки задач, рецензирования и документирования решений рассматриваются в разделе инженерного процесса. Масштабирование и согласованность между узлами относятся к разделу распределённых систем и надёжности.