теория

Сложность — это характер взаимодействий

Ты только что видел, как Иван поставил вопрос ребром: почему правка одной строчки — лотерея? Давай спокойно разложим это по полочкам. Начнём с того, что сложность бывает двух сортов, и путать их — дорого.

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

Но что именно делает систему непредсказуемой? Тут прячется красивый и неочевидный ответ. Люди, разбиравшие катастрофы на АЭС и в авиадиспетчерских, заметили странное: дело не в размере системы и не в числе деталей, а в характере взаимодействий между ними.

Линейные взаимодействия предсказуемы: видно, кто от кого зависит, и у правки очевидные последствия. Механические часы — сотни деталей, а путь усилия от пружины к стрелке прослеживается. Потому часовщик их и не боится.

Сложные взаимодействия подкидывают сюрпризы двух сортов:

  • Незапланированный результат. Правишь одно — неожиданно ломается другое; отказ каскадом валит «несвязанные» части; тихое предположение о среде («сеть надёжна», «колонку никто не тронет») однажды перестаёт быть правдой.
  • Запланированный результат, но достигнутый непонятно как. Система работает, а как — не знает никто: носители знания ушли, код унаследован, инструменты навешаны по моде. Менять такое страшно — и страх обоснован.

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

Отсюда вывод, который стоит повесить на стену: размер — не мера сложности. Пять тысяч компонентов с линейными связями проще пяти компонентов со сложными. Непредсказуемость создаётся не количеством кода, а числом неожиданных путей, по которым в нём разбегается знание.

← назад