теория

Два этажа сложности и степени свободы

Держись, тут одна из самых красивых идей курса — и она проще, чем звучит.

Сложность живёт этажами. Любой компонент сам — система: сервис состоит из модулей, модуль из классов, класс из методов. Отсюда два уровня: глобальная сложность — это сложность взаимодействий между компонентами, локальная — сложность внутри одного компонента. Где проходит граница, зависит от того, откуда смотришь: поднимись на этаж выше — и вчерашняя глобальная сложность окажется чьей-то локальной.

И вот ловушка: чинить только один этаж — самообман.

  • Только глобальную: слить всё в один компонент. Взаимодействий между компонентами — ноль, зато внутри пухнет . Сложность не исчезла — спряталась этажом ниже.
  • Только локальную: нарезать систему на «микросервисы не длиннее ста строк». Каждый мил и прост, но их взаимодействия сплетаются в распределённый ком грязи (Big Ball of Mud — система без внятной структуры; разберём в следующем модуле) — максимум глобальной сложности.

Управлять надо обоими этажами разом. А запас непредсказуемости удобно мерить понятием из механики — : это число независимых переменных, которыми описывается состояние системы. У квадрата такая переменная одна (сторона), у прямоугольника — две. Чем больше степеней свободы, тем больше возможных состояний и тем больше комбинаций надо держать в голове, когда что-то меняешь.

Лишние степени свободы — топливо сложных взаимодействий. Продублировал бизнес-правило в двух сервисах — у правила теперь два независимых значения, и «реализации разъехались» становится законным состоянием. Реплицировал данные — добавил состояние «копия устарела».

Срезают степени свободы ограничения (constraints). Класс Triangle с тремя открытыми полями умеет изобразить невозможный треугольник; спрячь поля за методом SetEdges с проверкой — и невалидные состояния просто исчезнут из списка возможных.

И вот тут всё сходится с первой неделей: — это и есть инструмент задания ограничений. Интерфейс между компонентами решает, какое знание пересекает границу. А каждая утёкшая крупица знания дарит чужому коду ещё одну степень свободы относительно твоих внутренностей. Reports, знавший схему Orders, был волен обратиться к любой колонке — и обратился.

Только не переусердствуй: не всякое ограничение — благо. Ком грязи ограничен по максимуму — там любая правка гарантированно что-то ломает. Предсказуемость есть, а пользы нет. Хорошие ограничения разрешают нужные взаимодействия и закрывают сложные.

монолит без ограничений · знание течёт куда хочет
монолит «ярмарка»каталогзаказыценыдоставкаплатежиотчёты
явный контрактнеявное знание

Каждая пунктирная линия — чьё-то знание о чужих внутренностях, то есть лишняя степень свободы системы.

← назад