Сложные системы

Система становится сложной не просто из-за большого числа компонентов. Важнее нелинейные связи, память, задержки, обратные связи и самостоятельное поведение частей. Из-за них небольшое изменение входа иногда даёт непропорциональный результат.

Признаки

  • много типов элементов и связей;
  • несколько уровней организации;
  • конкурирующие цели участников;
  • задержки между причиной и наблюдаемым эффектом;
  • вероятностное поведение;
  • адаптация к среде;
  • эмерджентные свойства;
  • невозможность полностью наблюдать состояние.

Микросервисная архитектура может быть технически большой, но предсказуемой. Небольшая система с циклическими зависимостями и обратной связью может оказаться сложнее.

Системный подход

  1. Исследовать результат целого, а не только исправность деталей.
  2. Явно обозначать границы и внешнюю среду.
  3. Смотреть на потоки и связи, а не только на список компонентов.
  4. Учитывать несколько масштабов времени: запрос, релиз, рост нагрузки.
  5. Проверять побочные эффекты локальной оптимизации.

Декомпозиция и координация

Декомпозиция уменьшает объём рассуждения: выделяем подсистемы по ответственности, данным или темпу изменения.

Координация задаёт правила совместной работы: контракты, порядок событий, владение данными, обработку отказов.

flowchart LR
    A["Входной поток"] --> B["Подсистема A"]
    B --> C["Подсистема B"]
    C --> D["Результат"]
    C -- "сигнал перегрузки" --> B

На схеме нельзя оптимизировать A без проверки B: ускоренный выпуск из A способен перегрузить B и ухудшить общий результат.

Как исследовать

Самопроверка

  • По каким признакам отличить сложность от большого размера?
  • Почему локальное снижение задержки может увеличить задержку всей системы?
  • Что теряется при декомпозиции и чем это компенсировать?