Оптимизируйте систему, а не её компоненты
Первое правило системной инженерии Хэмминга
Основной принцип Хэмминга из гл. 28: Если вы оптимизируете компоненты, вы, вероятно, ухудшите производительность системы.
Он проиллюстрировал это на примере дифференциального анализатора. Два блока должны были быть соединены. Разработчики улучшили усилители во втором блоке. В день приёмки Хэмминг провёл стандартный тест — решить y'' + y = 0, построить график y от y', ожидалась окружность. Тест провалился. Причина: улучшенные усилители потребляли больше тока через цепь заземления. Заземление было рассчитано на исходную конструкцию. Оно не было рассчитано на новый уровень тока. Интерфейс вышел из строя, а не компонент.
Его обобщение: большинство отказов систем происходит на стыках, а не в компонентах. Компоненты проектируются, тестируются, сертифицируются. Интерфейсы проектируются как запоздалые мысли, тестируются редко и никогда не сертифицируются независимо. Когда компонент меняется, меняется и его поведение на интерфейсе. Ничто ниже по потоку не было спроектировано под этот новый интерфейс.
Ключевая асимметрия: 10-кратное улучшение компонента может привести к 10-кратному ухудшению системы, если компонент питает ограниченный интерфейс. Улучшение не складывается — оно вычитается.
Система образования как провал системной инженерии
Пример Хэмминга: образование
Хэмминг применил этот принцип к образованию. Оптимизация оценок по отдельным предметам — натаскивание студентов на максимальную сдачу тестов по каждой дисциплине — даёт студентов, которые хорошо справляются с отдельными тестами, но не могут интегрировать знания между предметами.
Каждый компонент (оценка по предмету) улучшается. Система (образование, определяемое как интегрированное понимание) деградирует. Интерфейс между предметами — способность студента применять знания в разных областях — никогда не оптимизировался. Он атрофировался.
Это не случайность реализации. Это структурно. Когда вы измеряете и вознаграждаете производительность компонента, вы получаете оптимизацию компонента. Интерфейсы невидимы для метрик компонента.
Его рекомендация: найти узкое место в системе, затем спросить, что произойдёт дальше, когда вы его устраните. Устранение узкого места затопляет следующую очередь. Неограниченная оптимизация становится новым ограничением.
Отслеживание деградации интерфейса
Хэмминг показал, что улучшение компонента изменяет поведение его интерфейса — и остальная часть системы была спроектирована под старый интерфейс.
Узлы, очереди, показатели всплесков
Модель завода MOAD
Любой граф зависимостей программного обеспечения образует завод. Каждый узел — это рабочая станция. Каждое ребро — это очередь. Работа поступает в очередь узла, обрабатывается и передаётся в очереди ниже по потоку.
Каждый узел характеризуется двумя показателями:
Surge score = speedup × in-degree
Насколько сильно возрастает нагрузка ниже по потоку, когда устраняется этот узкий участок. Узел с in-degree 5 (5 зависимостей выше по потоку, все направлены на него) и ускорением 100× создаёт surge в 500× ниже по потоку.
Betweenness = in-degree + out-degree
Насколько центральна эта рабочая станция для общего потока. Высокая betweenness означает, что через этот узел проходит множество путей.
Две архетипа:
Узел-трудоголик: высокая betweenness, высокий surge score. Это узкое место. Каждая очередь выше по потоку накапливается из-за него. Уберите это узкое место без создания резервной мощности ниже по потоку, и всё, что находится ниже по потоку, рухнет одновременно.
Узел-обжора: высокая out-degree, низкий surge score. Поглощает всё, что ему подают. Не чувствует боли, потому что его узкое место внутреннее, а не пропускная способность. Машина, которая забывает остановиться — работа входит, ничего не выходит, и узел вечно сообщает «занят».
MOAD-0001 & MOAD-0005: Пример связанности
Кейс GHC
До исправления MOAD-0001 в резолвере зависимостей GHC: N=50 000 зависимостей собирались за 17 минут. После: 10 секунд. Ускорение: 100×.
Что происходит дальше? Каждый кэш сборок, хранилище артефактов и CI-раннер, настроенные на поступление сборок раз в 17 минут, теперь получают в 100 раз больше завершённых сборок в час. Кэши, рассчитанные на 60 артефактов в час, теперь получают 6 000.
Это MOAD-0005: дефект «штампа кэша». Каждый ключ кэша промахивается одновременно, потому что ни один кэш не был прогрет под новую скорость поступления. Исправление MOAD-0001 порождает MOAD-0005.
Связь не случайна. Она структурная. Любое ускорение O(N²) → O(N) при in-degree > 1 даёт surge score выше 1. Surge score выше 100 — кандидат на MOAD-0005.
Подготовка перед раскрытием
Система сборки обрабатывает 1 000 графов зависимостей пакетов в час. Вы исправляете MOAD-0001 в её обходе графа, сокращая время сборки с 60 минут до 30 секунд — ускорение в 120×. Теперь система обрабатывает 120 000 графов в час.
Когда остановиться: Условие остановки
Условие остановки
Патч удовлетворяет условию остановки — то есть: не раскрывать — когда все четыре условия выполняются одновременно:
1. Патч находится в живой системе (объединён, развёрнут)
2. Нет ответственных, назначенных для контроля последствий
3. Нисходящий дефект (MOAD-0005) не устранён
4. Ускорение >= 100×
Все четверо вместе = ребёнок плачет. Назначайте команду до слияния, а не после.
Узел без смотрителя работает как рабочая станция без сотрудника. Работа накапливается. Кто-то ломается. Принцип пермакомпьютера: вы не исправляете алгоритм диспетчеризации, не подготовив водителей. Три водителя, три миллиона человек: разблокировка алгоритма создаёт не ускоренную доставку, а лавину необслуженных запросов.
WALL-E: Обжоры и трудоголики
Модель WALL-E
В Pixar WALL-E наглядно показана модель заводского сбоя. Обжоры на летающих креслах, которых кормят без трения. Трудоголики — WALL-E, EVE — умирают на своих постах, чтобы поток не останавливался.
Узел-обжора (люди на летающих креслах) имеет максимальную исходящую степень: он потребляет всё, что ему подают, и ничего не производит. Его показатель всплеска равен нулю — это сток. Он не чувствует боли, потому что ничего не накапливается на его выходе. Он просто потребляет.
Узел трудоголика (WALL-E) обладает максимальной посреднической центральностью: через него проходит всё. Он поглощает весь вход. Он производит единственный выход. Его показатель всплеска, если его когда-либо заменят более быстрой моделью, одновременно затопит все нисходящие очереди.
Дефект в системе WALL-E не в обжорах. Он в отсутствующем смотрителе: никто не назначен балансировать рабочие станции. Никто не подготовил ёмкость перед запуском алгоритма.
Случай pip: чек-лист перед раскрытием
Вы обнаруживаете MOAD-0001 в разрешителе зависимостей pip для Python. Измеренное ускорение: 200×. pip выполняется примерно на 400 миллионах установок в день. PyPI обслуживает пакеты.