Архитектура и онтология
Почему деление системы на модули — это всегда выбор о том, как устроен мир.
Архитектура программной системы кажется чисто технической материей: где провести границы модулей, что от чего отделить, какие сущности завести. Но за каждым таким решением прячется утверждение о мире — о том, какие вещи отдельны друг от друга, а какие связаны. Архитектура — это прикладная онтология.
01Граница модуля — это утверждение
Когда вы решаете, что «пользователь» и «аккаунт» — две разные сущности или одна, вы не просто структурируете код. Вы утверждаете нечто о том, как устроена реальность, которую моделируете. Можно ли иметь несколько аккаунтов? Перестает ли пользователь существовать, когда удален аккаунт? Эти вопросы выглядят техническими, но они онтологические: о том, что считается отдельной вещью, а что — ее свойством.
Решая, где провести границу модуля, вы решаете, какие вещи в мире отдельны друг от друга.
02Модель становится реальностью
Самое важное происходит потом. Однажды зафиксированная в коде модель перестает быть одним из возможных описаний и становится реальностью, в которой живут пользователи. Если система не предусмотрела, что у человека может быть два гражданства, два имени, нелинейная биография, — этих возможностей просто не будет. Не потому что они невозможны в жизни, а потому что их нет в схеме. Архитектура тихо определяет, что вообще может произойти.
Категории базы данных становятся категориями опыта. То, что не влезло в модель, выпадает не только из системы, но и из доступного людям мира.
03Нет нейтральной декомпозиции
Инженеров учат, что хорошая декомпозиция «естественна»: правильные границы будто бы заложены в самой предметной области, надо лишь их разглядеть. Это полезная иллюзия, но иллюзия. Одну и ту же область можно разрезать многими способами, и каждый разрез что-то высвечивает, а что-то делает невидимым. Выбор границ — это выбор того, что важно, а значит, ценностное решение, замаскированное под техническое.
04Зачем инженеру эта оптика
Затем, чтобы проектировать честнее. Инженер, который видит в архитектуре только технику, считает свои решения нейтральными и потому не несет за них ответственности. Инженер, который понимает архитектуру как онтологию, спрашивает: чью реальность я кодирую? Какие случаи я делаю невозможными? Кто не помещается в мою схему — и что с ним будет?
Это и есть точка, где моя инженерия и мое исследование сходятся плотнее всего. Делить систему на модули — значит делать выбор о мире. Хорошо бы делать его с открытыми глазами.