Сложность
Назад к Глоссарию.
Эссенциальная и акцидентальная сложность
Одно из самых полезных различий в программной инженерии — это различие между эссенциальной и акцидентальной сложностью.
Эссенциальная сложность
Эссенциальная сложность — это неустранимая сложность самой задачи.
Она следует из природы предметной области, требуемого поведения системы, числа бизнес-правил, формы данных и ограничений, которые встроены в саму задачу. Иными словами, она не создается реализацией. Она уже присутствует в проблеме, которую нужно решить.
В конкретный момент времени, при фиксированной постановке задачи, эссенциальная сложность относительно постоянна. Ее можно лучше понять, точнее смоделировать и аккуратнее выразить в коде, но нельзя просто отменить инженерными усилиями.
Акцидентальная сложность
Акцидентальная сложность — это привнесенная сложность, возникающая из выбранной реализации, архитектуры, инструментария, процессов и коммуникационных накладных расходов.
Она не следует из самой предметной области. Она появляется в ходе работы над эссенциальной сложностью и потому в значительной степени является следствием проектных, реализационных и организационных решений.
Типичные источники акцидентальной сложности:
- абстракции, масштаб которых не оправдан самой задачей
- уровни косвенности, которые не улучшают изменяемость и ясность
- слабые границы между зонами ответственности
- чрезмерно сложные процессы разработки и поставки
- непоследовательное именование и плохо читаемые локальные соглашения
- отсутствие проектирования там, где структура уже объективно нужна
Почему это различие важно
Это различие помогает отделять неизбежную сложность самой задачи от избыточной сложности реализации.
Если сложность эссенциальна, задача состоит в том, чтобы аккуратно ее смоделировать и сделать читаемой. Если сложность акцидентальна, задача состоит в том, чтобы убрать, сократить или не допустить ее. Хорошая инженерия не устраняет эссенциальную сложность. Она не позволяет акцидентальной сложности нарастать вокруг нее.
Именно поэтому архитектуру полезнее воспринимать не как выбор между тотальной простотой и избыточной структурой, а как вопрос о том, снижает ли структура акцидентальную сложность или просто создает ее новые слои.
Связанное чтение: Архитектура должна оправдывать свою сложность.