От контрактов к онтологиям
1. Проблема, которую не решают типы
Начну с боли, знакомой каждому, кто работал в крупной кодовой базе. Идеальная типизация. 90% покрытия. Зелёный CI. Code review в два глаза. И всё равно раз в квартал — инцидент: заказ отменён после отгрузки, платёж возвращён дважды, скидка применена к товару, который в акции не участвует. Ни один тест не упал. Ни один тип не возмутился. Компилятор был счастлив.
Теперь добавьте вторую картину. Разработчик просит Copilot «написать метод refund для платежа», получает аккуратный, компилирующийся, покрытый тестами код — и через месяц выясняется, что он не учитывает правило «возврат невозможен после отгрузки». Copilot не ошибся синтаксически. Он ошибся семантически — потому что семантики в его контексте не было.
Это не два разных кризиса. Это один. Мы научились формализовать форму кода, но не его смысл. Типы гарантируют, что мы не сложим строку с числом. Они не гарантируют, что мы не нарушим бизнес-инвариант. Тесты гарантируют, что код делает то, что мы проверили. Они не гарантируют, что мы проверили то, что имеет значение.
За тридцать лет мы построили мощную инфраструктуру для типов: компиляторы, IDE, линтеры, системы сборки. Для смысла мы построили комментарии, вики и надежду на дисциплину. Неудивительно, что именно смысл утекает первым. Но здесь есть ловушка. Услышав «нам нужна семантика», индустрия склонна бросаться в две крайности: либо «всё и так работает, обойдёмся тестами», либо «давайте формализуем всё в онтологию». Оба пути ведут в тупик. Первый оставляет нас с галлюцинациями LLM и ночными инцидентами. Второй — это архитектурный астронавтизм 2.0, где онтология становится сложнее кода, а команда тратит недели на описание геттеров.
Эта статья — о том, как пройти между крайностями. Не «нужна ли семантика», а где именно, в каком объёме и по какой цене. Ответ — пирамида семантической надёжности и матрица рисков, которая говорит, где остановиться.
2. Матрица рисков: не вся кодовая база одинакова
Первое, что нужно принять: разные части системы заслуживают разного уровня строгости. Попытка применить один уровень ко всему — главная причина провала семантических инициатив.
Разобьём кодовую базу на четыре зоны по двум осям: цена ошибки и частота изменения правил.
| Зона | Примеры | Цена ошибки | Частота изменения правил | |---|---|---|---| | Critical Path | Платежи, возвраты, доступ, compliance, налоги | Очень высокая (деньги, репутация, регуляторика) | Средняя (медленно, но с высокими последствиями) | | Core Domain | Заказы, корзина, каталог, ценообразование | Высокая | Высокая | | Supporting | Уведомления, отчёты, интеграции | Средняя | Средняя | | Utility | Утилиты, скрипты, миграции, DTO | Низкая | Низкая | Эта матрица — не бюрократия. Это инструмент принятия решений. Critical Path заслуживает максимальной строгости, потому что ошибка стоит дорого, а правила меняются достаточно редко, чтобы их формализация окупилась. Utility не заслуживает ничего выше типов, потому что формализация будет стоить дороже, чем ошибка.
Ключевой принцип: уровень строгости определяется ценой ошибки, а не эстетикой архитектора.
3. Пирамида семантической надёжности
Теперь — сами уровни. Их пять, от дешёвого к дорогому. Каждый следующий ловит класс ошибок, невидимый предыдущему...
#DST #DSTGlobal #ДСТ #ДСТГлобал #LLM #искусственныйинтеллект #logosk #ООП #онтология #DbC #DTO #IDE #линтеры #системысборки #Copilot #семантика #semanticdb #OpenAPI #JSON #brandedtypes #AWS #Azure #MongoDB #Utility