Добавить в корзинуПозвонить
Найти в Дзене

Почему пчела похожа на сервер

Глава 1. Почему Земля плоская
Если вы сейчас выйдете на улицу и посмотрите вокруг, то увидите довольно очевидную вещь.
Земля плоская.
Дорога прямая.
Оглавление

Глава 1. Почему Земля плоская

Если вы сейчас выйдете на улицу и посмотрите вокруг, то увидите довольно очевидную вещь.

Земля плоская.

Дорога прямая.

Горизонт ровный.

Никаких признаков огромного шара диаметром почти 13 тысяч километров вокруг не наблюдается.

Более того, если бы вам пришлось делать вывод исключительно на основании собственных наблюдений, версия с плоской Землёй выглядела бы вполне разумной.

Теперь представим муравья.

Для него Земля не просто плоская. Она практически бесконечная.

За всю свою жизнь он не увидит даже намёка на кривизну поверхности.

Поднимемся выше.

На вершину горы.

Кривизна всё ещё не видна, но горизонт заметно расширяется.

Ещё выше.

На высоту полёта пассажирского самолёта.

Теперь уже можно заметить, что линия горизонта начинает изгибаться.

Поднимемся на орбиту.

И вот перед нами уже не плоскость, а шар.

Возникает интересный вопрос.

Кто ошибался?

Муравей?

Человек на земле?

Пилот?

Космонавт?

На первый взгляд кажется, что только последний обладал правильной картиной мира.

Но это не совсем так.

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

Для строительства дома Землю можно считать плоской.

Для прокладки железной дороги — тоже.

Для навигации самолётов уже приходится учитывать кривизну.

Для расчёта орбит без неё вообще не обойтись.

Один объект.

Несколько описаний.

Все правильные.

Именно здесь начинается большинство инженерных споров.

Представьте лист бумаги.

Если посмотреть на него сверху, вы увидите плоскость.

Если посмотреть строго с ребра — линию.

Если взять микроскоп, окажется, что это вовсе не плоскость, а объёмное тело, состоящее из множества волокон.

Что из этого правда?

Всё сразу.

Объект не изменился.

Изменился способ наблюдения.

Та же история происходит и в программировании.

Недавно я наблюдал спор о микросервисах.

Один участник утверждал:

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

Другой отвечал:

Тогда почему современный автомобиль состоит из десятков независимых блоков управления, связанных общей шиной?

Они долго спорили.

Приводили аргументы.

Ссылались на определения.

Но проблема заключалась не в знаниях.

Они обсуждали систему на разных уровнях абстракции.

Первый говорил о конкретном архитектурном подходе, сложившемся в веб-разработке.

Второй говорил о гораздо более общем принципе — разделении сложной системы на независимые взаимодействующие компоненты.

Это примерно как спорить, является ли Земля плоской или круглой.

Ответ зависит от того, что именно вы рассматриваете и для какой задачи.

Человек удивительным образом привязывается к масштабу, на котором привык работать.

Программист, много лет занимающийся веб-разработкой, начинает видеть микросервисы исключительно в Kubernetes и распределённых облачных системах.

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

Биолог замечает похожие закономерности в устройстве живых организмов.

Никто из них не обязательно ошибается.

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

Есть старая инженерная шутка:

Если у вас есть молоток, все проблемы начинают напоминать гвозди.

Но существует и противоположная проблема.

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

Специализация помогает решать задачи.

Но она же незаметно ограничивает способ мышления.

Человек начинает путать знакомую реализацию с лежащим под ней принципом.

Event Loop превращается в особенность NodeJS.

Agile — в набор встреч по расписанию.

База данных — в PostgreSQL.

Микросервисы — в Kubernetes.

Хотя все эти вещи существовали в той или иной форме задолго до появления современных технологий.

Именно поэтому в инженерии так полезно иногда подниматься выше.

Достаточно высоко, чтобы детали начали исчезать.

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

Начинают проявляться общие закономерности.

  • Специализация.
  • Коммуникация.
  • Обработка событий.
  • Распределение нагрузки.
  • Самоорганизация.

Внезапно оказывается, что многие идеи человечество и природа независимо изобретали десятки раз.

А некоторые архитектурные решения намного старше компьютеров.

Чтобы увидеть это, нужно сделать всего одну вещь.

Немного подняться над привычным масштабом наблюдения.

Глава 2. Карта и территория

В 1931 году польский философ и инженер Альфред Коржибский сформулировал фразу, которая позже стала знаменитой:

Карта — не территория.

На первый взгляд звучит как очевидная банальность.

Разумеется, карта не является территорией.

Но люди постоянно забывают об этом.

Причём не только в географии.

Представьте туристическую карту города.

На ней есть дороги, станции метро, парки и достопримечательности.

Но на карте нет запаха кофе из ближайшей кофейни.

Нет шума автомобилей.

Нет луж после дождя.

Нет бездомного кота, который живёт возле подъезда.

Карта не врёт.

Она просто показывает лишь ту часть реальности, которая важна для решаемой задачи.

Теперь возьмём другую карту.

Например, схему метро.

С неё исчезнут улицы.

Исчезнут дома.

Исчезнут реки.

Зато появятся станции, пересадки и маршруты движения поездов.

И эта карта тоже будет правильной.

Хотя выглядит совершенно иначе.

Любое описание реальности является картой.

Математическая формула.

Чертёж.

Архитектурная схема.

Техническое задание.

Даже определение термина.

Всё это карты.

Полезные.

Необходимые.

Но всё-таки карты.

Проблемы начинаются в тот момент, когда карта начинает восприниматься как сама территория.

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

Возьмём базы данных.

Если спросить начинающего разработчика:

Что такое база данных?

Есть хороший шанс услышать:

PostgreSQL.

Или MySQL.

Или MongoDB.

Для него понятие базы данных и конкретный продукт почти сливаются воедино.

Но если посмотреть шире, база данных — это всего лишь способ хранения и извлечения информации.

Под это определение прекрасно попадают:

  • текстовые файлы;
  • JSON-документы;
  • электронные таблицы;
  • SQLite;
  • PostgreSQL;
  • распределённые кластеры.

PostgreSQL — не база данных.

PostgreSQL — одна из реализаций идеи базы данных.

Карта.

Не территория.

То же самое произошло с Agile.

Когда в 2001 году создавался Agile Manifesto, речь шла о нескольких довольно простых принципах:

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

Нигде не говорилось про стендапы в 9 утра.

Нигде не говорилось про Scrum-мастеров.

Нигде не говорилось про спринты на две недели.

Но со временем конкретные реализации настолько прочно ассоциировались с исходной идеей, что для многих людей Agile и Scrum стали практически синонимами.

Карта постепенно подменила территорию.

С микросервисами произошла похожая история.

Первоначально это был один из способов декомпозиции сложных программных систем.

Со временем вокруг него сформировался целый набор ассоциаций:

  • Kubernetes;
  • Docker;
  • Service Discovery;
  • API Gateway;
  • CI/CD;
  • облачная инфраструктура.

И теперь стоит кому-нибудь произнести слово «микросервис», как многие автоматически представляют именно этот набор технологий.

Хотя большая часть перечисленного относится не к самому принципу, а к конкретным инструментам его реализации.

Интересно, что подобное происходит не только в программировании.

В биологии это встречается постоянно.

Спросите человека, что такое полёт.

С высокой вероятностью он представит птицу.

Но природа реализовала полёт десятками различных способов.

Птицы.

Летучие мыши.

Насекомые.

Летучие рыбы.

Семена растений.

Даже некоторые пауки способны преодолевать огромные расстояния по воздуху.

Если смотреть слишком узко, легко решить, что полёт — это крылья.

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

Чем дольше работаешь в какой-либо области, тем сильнее возникает соблазн считать привычную карту самой территорией.

Это удобно.

Мозгу нравится классифицировать мир по знакомым шаблонам.

Но за это удобство приходится платить.

Вместе с деталями карта скрывает альтернативные способы мышления.

Человек начинает видеть не объект, а ярлык.

Не принцип, а реализацию.

Не задачу, а привычный инструмент её решения.

Именно здесь появляется одна из самых интересных особенностей человеческого мышления.

Мы гораздо лучше замечаем различия между объектами, чем сходство между механизмами.

Легко увидеть разницу между:

  • пчелой и сервером;
  • нейроном и программным агентом;
  • автомобильным блоком управления и микросервисом.

Гораздо сложнее заметить, что все они решают похожие задачи:

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

Но именно такие наблюдения часто приводят к самым интересным открытиям.

Чтобы увидеть их, приходится временно отказаться от привычной карты и посмотреть на территорию немного шире.

Именно этим мы и займёмся дальше.

Глава 3. Узоры, которые повторяются

Представьте, что вам показали три фотографии.

На первой — муравейник.

На второй — современный датацентр.

На третьей — человеческий мозг.

Большинство людей не найдут между ними ничего общего.

И это неудивительно.

Слишком разный масштаб.

Слишком разный материал.

Слишком разное происхождение.

Один объект появился в результате эволюции насекомых.

Другой спроектирован инженерами.

Третий формировался миллионы лет естественного отбора.

На уровне деталей они действительно почти не похожи.

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

Ни один муравей не знает устройство всего муравейника.

Ни один сервер не знает состояние всего датацентра.

Ни один нейрон не понимает, о чём сейчас думает человек.

Каждый элемент обладает лишь небольшим объёмом локальной информации.

И тем не менее вся система каким-то образом работает.

Более того, решает задачи, которые значительно превосходят возможности отдельных компонентов.

Это очень странное свойство сложных систем.

С ростом сложности центральное управление начинает исчезать.

Точнее, становится слишком дорогим.

Представьте себе мозг, в котором существует отдельный нейрон-директор.

Каждую секунду он должен был бы принимать миллиарды решений и распределять команды по всей нервной системе.

Очевидно, такая схема не заработает.

То же самое относится к датацентру.

Если каждое действие каждого сервера должен одобрять один центральный процесс, производительность быстро упадёт до нуля.

Поэтому природа и инженеры снова и снова приходят к одной и той же идее.

Решения принимаются локально.

Глобальное поведение возникает из взаимодействия множества простых участников.

Если посмотреть на историю технологий, становится заметно нечто любопытное.

Мы постоянно переизобретаем одни и те же архитектурные решения.

Иногда даже не подозревая об этом.

Возьмём специализацию.

Самые простые живые организмы состоят буквально из одной клетки.

Она выполняет все функции сразу:

  • питание;
  • движение;
  • защиту;
  • размножение.

Но по мере усложнения организмов возникает разделение обязанностей.

Появляются специализированные клетки.

Затем ткани.

Затем органы.

Сердце занимается одним.

Лёгкие другим.

Печень третьим.

Нервная система четвёртым.

Именно специализация позволяет организму стать сложнее.

Тот же путь проходит практически любая инженерная система.

Первый программный проект обычно представляет собой один файл.

Потом появляется несколько файлов.

Затем модули.

Затем подсистемы.

Затем сервисы.

Затем распределённые узлы.

Не потому, что разработчики любят усложнять себе жизнь.

А потому что с ростом сложности специализация становится дешевле универсальности.

Или возьмём коммуникацию.

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

Органы организма связаны нервной системой и кровеносной сетью.

Блоки управления автомобиля связаны CAN-шиной.

Сервисы связаны API и очередями сообщений.

Муравьи используют химические сигналы.

Пчёлы используют танец.

Люди используют язык.

Способы передачи информации различаются радикально.

Но задача остаётся одной и той же.

Передать информацию между независимыми участниками системы.

Именно поэтому опытные архитекторы часто говорят:

Самая сложная часть системы — не компоненты, а связи между ними.

Создать десять модулей обычно проще, чем заставить их надёжно взаимодействовать.

Написать микросервис проще, чем спроектировать его контракт.

Создать орган проще, чем встроить его в организм.

Построить сервер проще, чем интегрировать его в датацентр.

Любопытно, что люди обычно замечают сами компоненты.

Мы обсуждаем сервисы.

Говорим про органы.

Изучаем нейроны.

Разбираем контроллеры.

Но настоящая магия происходит между ними.

  • В проводах.
  • В шинах.
  • В синапсах.
  • В сетевых пакетах.
  • В химических сигналах.

Именно там рождается поведение системы.

Есть ещё одна закономерность, которая повторяется удивительно часто.

Когда система становится слишком сложной для полного понимания отдельным участником, она начинает опираться на правила.

Муравей не знает устройство колонии.

Но знает набор простых реакций.

Нейрон не знает устройство мозга.

Но знает, когда передавать сигнал.

Сервер не знает всей архитектуры датацентра.

Но знает протокол взаимодействия.

Программист не знает весь интернет.

Но знает TCP/IP.

Чем сложнее система, тем меньше её элементы понимают целое и тем сильнее зависят от протоколов.

И здесь возникает интересный вопрос.

Почему всё это происходит?

Почему природа, инженеры, программисты и даже социальные системы снова и снова приходят к похожим решениям?

Неужели это совпадение?

Или существуют некоторые фундаментальные ограничения, которые делают одни архитектуры естественными, а другие — нежизнеспособными?

Чтобы ответить на этот вопрос, придётся познакомиться с одной из самых старых архитектурных идей на Земле.

С обработкой событий.

С тем, что программисты называют Event Loop.

Глава 4. Event Loop старше компьютеров

Спросите современного разработчика, что такое Event Loop.

С высокой вероятностью вы услышите рассказ про JavaScript, NodeJS или браузер.

Для многих программистов именно эти технологии стали первым знакомством с событийной моделью.

Поэтому неудивительно, что Event Loop часто воспринимается как особенность определённых языков и платформ.

Но, как это уже не раз происходило в нашей статье, реализацию легко перепутать с принципом.

Существует удивительно точное объяснение разницы между двумя подходами к взаимодействию систем.

И его случайно показали создатели мультфильма «Шрек».

На протяжении всего путешествия Осёл регулярно спрашивает:

— Уже приехали?

— Нет.

Через некоторое время:

— А сейчас?

— Нет.

Ещё через некоторое время:

— А теперь?

— Нет.

С точки зрения информатики Осёл занимается polling.

Он постоянно опрашивает систему на предмет изменения состояния.

Шрек при этом выполняет роль сервера, который вынужден снова и снова отвечать на один и тот же запрос.

Такой подход вполне работоспособен.

Именно поэтому он до сих пор используется в огромном количестве систем.

Но у него есть неприятная особенность.

Большая часть запросов оказывается бесполезной.

Потому что состояние ещё не изменилось.

Теперь представим другой вариант.

Шрек говорит:

— Когда приедем, я сам тебе скажу.

После чего Осёл перестаёт задавать вопросы.

До самого момента прибытия.

Это уже событийная модель.

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

На первый взгляд разница кажется незначительной. Но с ростом сложности системы последствия становятся огромными.

Представьте пожарную службу.

Можно каждые пять минут объезжать весь город в поисках пожара.

А можно ждать сигнала тревоги.

Очевидно, второй вариант дешевле.

Или представьте почтовый ящик.

Человек не стоит возле двери круглосуточно.

Сообщение помещается в ящик.

Получатель забирает его позже.

Между отправителем и получателем появляется событие и очередь.

По мере роста системы событийная модель начинает возникать снова и снова.

Не потому, что инженеры любят события.

А потому, что постоянный опрос плохо масштабируется.

Интересно, что похожие идеи встречаются далеко за пределами вычислительной техники.

Муравей не обходит каждую секунду весь муравейник в поисках изменений.

Пчела не спрашивает каждую другую пчелу, появились ли новые цветы.

Живые системы постоянно используют сигналы, триггеры и локальные реакции на события.

На этом месте важно сделать оговорку.

Было бы ошибкой заявить, что нервная система — это Event Loop.

Или что человеческий мозг работает как NodeJS.

Это именно тот случай, когда аналогия начинает трещать при слишком буквальном использовании.

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

Но это не отменяет главного наблюдения.

Когда системе приходится взаимодействовать с большим количеством участников, постоянная проверка состояния становится слишком дорогой.

И тогда появляются события.

  • Сигналы.
  • Очереди.
  • Уведомления.
  • Подписки.

В этот момент становится понятно, почему Event Loop старше компьютеров.

Потому что компьютеры не изобрели этот принцип.

Они просто стали ещё одной областью, в которой он оказался полезен.

Точно так же, как самолёт не изобрёл полёт.

И точно так же, как микросервисы не изобрели декомпозицию сложных систем.

Это одна из самых интересных особенностей инженерии.

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

Мы лишь даём им новые названия.

А затем удивляемся, обнаруживая их в самых неожиданных местах.

Глава 5. Пчела, сервер и нейрон

Если бы вам поручили спроектировать разумную систему, с чего бы вы начали?

Большинство людей ответит примерно одинаково.

Нужен центр управления.

Кто-то должен принимать решения.

Кто-то должен обладать полной картиной происходящего.

Кто-то должен координировать остальных.

Такое представление кажется настолько естественным, что мы редко ставим его под сомнение.

Однако самые успешные сложные системы на нашей планете устроены совершенно иначе.

Представьте себе пчелиный улей.

В солнечный летний день тысячи пчёл одновременно покидают его в поисках нектара.

Через несколько часов большая часть вернётся.

Причём не просто вернётся.

Улей будет знать:

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

Возникает закономерный вопрос.

Кто принимает эти решения?

Человеку хочется найти главную пчелу.

Начальника.

Диспетчера.

Менеджера среднего звена.

Кого угодно.

Но такого существа в улье нет.

Матка не управляет ульем.

Она занимается совсем другой задачей.

Каждая рабочая пчела обладает лишь крошечным фрагментом информации.

Она знает только то, что увидела сама.

Тем не менее улей в целом демонстрирует удивительно разумное поведение.

Ещё интереснее становится, когда рою нужно выбрать новый дом.

Разведчики исследуют различные варианты.

Возвращаются.

Передают информацию через знаменитый танец.

Другие разведчики проверяют предложенные места.

Сравнивают.

Возвращаются.

Передают свою оценку.

Постепенно вокруг лучших вариантов начинает формироваться всё больше сторонников.

В какой-то момент рой принимает решение.

Причём никто не голосует.

Никто не проводит совещание.

Никто не публикует протокол заседания.

Коллективное решение возникает само.

Из взаимодействия множества простых участников.

Теперь посмотрим на человеческий мозг.

С ним ситуация ещё удивительнее.

Мы привыкли воспринимать себя как единое разумное существо.

Но если попытаться найти внутри мозга место, где находится этот разум, возникнут проблемы.

Нейроны ничего не знают о личности.

Не знают о ваших планах.

Не знают о ваших мечтах.

Не знают даже о существовании других областей мозга.

Каждый нейрон получает сигналы от соседей.

Выполняет относительно простые операции.

Передаёт результат дальше.

На этом его обязанности заканчиваются.

Представьте себе нейрон, который внезапно обрёл сознание.

Что бы он увидел?

Несколько тысяч соседей.

Поток электрических импульсов.

Набор простых правил.

И ничего более.

Он никогда не догадался бы, что участвует в написании книги, решении математической задачи или чтении этой статьи.

Но из миллиардов таких нейронов возникает нечто большее.

Память.

Эмоции.

Творчество.

Личность.

Сознание.

Ни один элемент системы не обладает этими свойствами.

Свойства возникают у системы в целом.

В информатике для подобных явлений существует красивый термин — эмерджентность.

Появление новых свойств, которых нет у отдельных компонентов.

Но для нашей статьи важнее другое.

Природа снова показывает нам знакомый паттерн.

Сложность рождается не внутри элементов.

Она рождается между ними.

Теперь заглянем в датацентр.

На первый взгляд кажется, что здесь всё иначе.

Ведь серверы созданы людьми.

Они выполняют программы.

Работают по строгим алгоритмам.

Однако при ближайшем рассмотрении картина оказывается подозрительно знакомой.

Представим поисковую систему.

Каждую секунду в неё поступают миллионы запросов.

Ни один сервер не хранит весь интернет.

Ни один сервер не знает полную картину происходящего.

Ни один сервер не способен самостоятельно обслужить весь мир.

Каждый занимается своей частью работы.

Одни хранят данные.

Другие индексируют документы.

Третьи обрабатывают запросы.

Четвёртые следят за доступностью системы.

Пятые распределяют нагрузку.

Для пользователя всё это выглядит как единый организм.

Он открывает страницу.

Вводит запрос.

Получает результат.

Система ведёт себя так, словно перед ним находится один гигантский компьютер.

Хотя на самом деле за кулисами взаимодействуют тысячи независимых узлов.

И вот здесь начинают проявляться странные совпадения.

Пчела знает только свою задачу.

Нейрон знает только своих соседей.

Сервер знает только свою часть работы.

Пчела общается через танец.

Нейрон через электрический импульс.

Сервер через сетевой пакет.

Пчела может погибнуть, а улей продолжит существовать.

Нейроны постоянно умирают и заменяются новыми.

Серверы выходят из строя каждый день.

Но система в целом остаётся работоспособной.

Пчелиный рой может увеличиваться.

Мозг может наращивать связи.

Датацентр может добавлять новые узлы.

Архитектура при этом остаётся прежней.

Меняется только масштаб.

На этом месте многие начинают видеть аналогию.

Но обычно делают неправильный вывод.

Они говорят:

Датацентр похож на улей.

Или:

Мозг похож на распределённую систему.

На самом деле всё наоборот.

Ни датацентр не похож на улей.

Ни улей не похож на датацентр.

И улей, и датацентр являются реализациями более общего принципа.

Примерно так же, как самолёт и птица являются реализациями идеи полёта.

Или как корабль и рыба являются реализациями идеи передвижения в водной среде.

Мы снова сталкиваемся с тем, о чём говорили в начале статьи.

Люди любят сравнивать объекты.

Но гораздо интереснее сравнивать механизмы.

Когда инженер смотрит на пчелиный рой, он видит распределённую систему.

Когда биолог смотрит на датацентр, он может увидеть коллективное поведение.

Когда специалист по искусственному интеллекту смотрит на мозг, он видит сеть взаимодействующих агентов.

Никто из них не обязательно ошибается.

Они просто рассматривают один и тот же принцип через разные фильтры.

И чем внимательнее начинаешь смотреть на мир, тем чаще замечаешь подобные повторения.

Словно природа и инженеры независимо решают один и тот же набор задач.

  • Передача информации.
  • Распределение ответственности.
  • Обработка событий.
  • Коллективное принятие решений.
  • Масштабирование.
  • Отказоустойчивость.
  • Самоорганизация.

Снова и снова.

  • В разных материалах.
  • В разных эпохах.
  • В разных масштабах.

И это подводит нас к ещё более интересному вопросу.

Если природа постоянно приходит к похожим решениям, возможно, она знает что-то, чего пока не знаем мы.

Возможно, миллиарды лет эволюции — это не просто история живых организмов.

Возможно, это крупнейший архитектурный эксперимент в истории нашей планеты.

Глава 7. Когда аналогии помогают, а когда обманывают

После нескольких глав этой статьи с читателем начинает происходить опасная вещь.

Я знаю это состояние очень хорошо, потому что сам через него проходил.

Сначала ты замечаешь одну интересную закономерность.

Потом вторую.

Потом третью.

А затем внезапно начинаешь видеть знакомые паттерны буквально везде.

  • Пчелиный улей напоминает распределённую систему.
  • Мозг напоминает сеть агентов.
  • Эволюция напоминает разработку программного обеспечения.
  • Нервная система напоминает Event Loop.

И в какой-то момент возникает ощущение, что ты начал понимать устройство мира.

Именно в этот момент начинаются проблемы.

Если достаточно долго искать закономерности, однажды наступает день, когда начинаешь находить их даже там, где их нет.

  • Люди начинают объяснять экономику квантовой механикой.
  • Находят золотое сечение в каждом втором объекте.
  • Видят заговоры в случайных совпадениях.
  • Строят грандиозные теории на основании поверхностного сходства.

История науки полна таких примеров.

История псевдонауки ещё больше.

Парадокс заключается в том, что большинство плохих аналогий начинаются точно так же, как хорошие.

  • С наблюдения.
  • С неожиданного сходства.
  • С интересного совпадения.

Разница появляется позже.

Хорошая аналогия помогает понять механизм.

Плохая аналогия подменяет механизм сходством слов.

Когда мы говорим, что пчелиный рой напоминает распределённую систему, мы имеем в виду вполне конкретные вещи:

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

Мы сравниваем механизмы.

Поэтому аналогия оказывается полезной.

Когда кто-то говорит:

Мозг — это просто компьютер.

обычно происходит другое.

Вместо сравнения механизмов начинается отождествление объектов.

А это уже значительно более опасный шаг.

Самолёт и птица похожи.

Но не потому, что у них есть крылья.

Если бы дело было только в крыльях, страус летал бы не хуже орла.

Самолёт и птица похожи потому, что обе системы используют аэродинамические принципы для преодоления силы тяжести.

Именно механизм делает аналогию полезной.

Не форма.

Есть простой тест для любой аналогии.

Попробуйте сделать предсказание.

Если аналогия позволяет предсказать поведение системы, она чего-то стоит.

Если она только красиво звучит — перед вами литературное украшение.

Представьте, что вам никогда не показывали датацентр, но вы хорошо понимаете устройство пчелиного роя.

Увидев распределённую серверную систему, вы можете предположить:

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

И удивительным образом многие предположения окажутся верными.

Значит аналогия несёт полезную информацию.

Теперь представьте другое утверждение:

Квантовая физика объясняет работу человеческих отношений.

Звучит красиво.

Но какие конкретно предсказания из этого следуют?

Обычно никакие.

Это тревожный сигнал.

Хороший инженер отличается от плохого не тем, что чаще использует аналогии.

А тем, что умеет вовремя остановиться.

Он постоянно задаёт себе вопрос:

Я обнаружил общий принцип или просто натягиваю сову на глобус?

Это особенно важно для темы нашей статьи.

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

Но одновременно растёт риск начать видеть одинаковыми вещи, которые на самом деле различаются.

Мир действительно полон повторяющихся закономерностей.

Но мир также полон случайных совпадений.

Настоящее мастерство заключается в том, чтобы отличать одно от другого.

Именно поэтому хорошие аналогии делают человека умнее.

А плохие — лишь создают иллюзию понимания.

Глава 8. Искусственный интеллект как место встречи дисциплин

Несколько лет назад мысль о том, что для улучшения программного агента мне придётся читать материалы по психологии и психиатрии, показалась бы абсурдной.

  • Зачем программисту психиатрия?
  • Зачем инженеру когнитивные искажения?
  • Зачем разработчику программ изучать механизмы человеческого мышления?

На первый взгляд эти области находятся бесконечно далеко друг от друга.

Потом появились агенты.

И начали совершать удивительно знакомые ошибки.

  • Они зацикливались на одних и тех же действиях.
  • Игнорировали часть доступной информации.
  • Делали поспешные выводы.
  • Уверенно двигались в неправильном направлении.
  • Строили правдоподобные объяснения собственных ошибок.

Иногда даже после появления новых фактов продолжали придерживаться первоначальной гипотезы.

Разумеется, модель не человек.

  • У неё нет личности.
  • Нет эмоций.
  • Нет сознания.
  • Нет психики в привычном понимании этого слова.

Поэтому было бы ошибкой пытаться напрямую переносить знания из психологии в искусственный интеллект.

Но неожиданно оказалось, что некоторые проблемы когнитивных систем возникают независимо от их природы.

Человек способен делать выводы на основании недостаточных данных.

Агент способен делать выводы на основании недостаточного контекста.

Человек может зацикливаться на неудачной стратегии.

Агент может бесконечно повторять одну и ту же последовательность действий.

Человек может игнорировать информацию, противоречащую его картине мира.

Агент может игнорировать информацию, противоречащую построенной гипотезе.

Сходство заключается не в устройстве.

Сходство заключается в ограничениях.

Именно это делает некоторые идеи удивительно переносимыми между дисциплинами.

На протяжении большей части истории науки знания двигались в сторону специализации.

Появлялись новые области.

Новые кафедры.

Новые журналы.

Новые термины.

Каждая дисциплина уходила всё глубже в собственную территорию.

Искусственный интеллект неожиданно запустил обратный процесс.

Вместо разделения началось объединение.

Внезапно оказалось, что для создания хороших интеллектуальных систем приходится одновременно думать о вещах из совершенно разных областей.

  • О памяти.
  • О языке.
  • О принятии решений.
  • О коммуникации.
  • Об обучении.
  • О внимании.
  • Об ошибках мышления.
  • О коллективном поведении.

Инженер начинает читать работы по когнитивной психологии.

Лингвист изучает архитектуры нейронных сетей.

Специалист по распределённым системам интересуется коллективным интеллектом.

Биолог читает статьи про обучение моделей.

На первый взгляд всё это выглядит странно.

Но только до тех пор, пока мы не вспомним предыдущие главы.

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

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

Мы уже видели, что специализация возникает и в организмах, и в инженерных системах.

Искусственный интеллект оказался местом, где все эти линии неожиданно пересеклись.

Когда исследователи создавали первые искусственные нейронные сети, они вдохновлялись биологическими нейронами.

Позже выяснилось, что реальные нейроны работают гораздо сложнее.

Но идея уже успела породить целое направление.

Когда появились механизмы внимания в современных моделях, они получили название, пришедшее из психологии.

Разумеется, внимание трансформера и внимание человека — не одно и то же.

Но обе системы решают похожую задачу.

Как выделить важную информацию среди огромного количества доступных данных.

Когда инженеры создают многоагентные системы, они неизбежно сталкиваются с вопросами координации.

Теми же вопросами, которые природа решает миллионы лет в колониях насекомых.

Теми же вопросами, которые возникают в человеческих организациях.

Теми же вопросами, которые решают распределённые вычислительные системы.

Всё чаще оказывается, что знания начинают путешествовать между областями.

Иногда напрямую.

Иногда через аналогии.

Иногда через общие математические модели.

Именно поэтому современный искусственный интеллект так интересно наблюдать.

Он является не только технологией.

Он является своеобразной точкой встречи дисциплин.

Местом, где биология встречается с математикой.

Лингвистика встречается с теорией информации.

Психология встречается с инженерией.

А распределённые системы неожиданно обнаруживают родственников в муравейниках и ульях.

Но если задуматься, ничего удивительного в этом нет.

Природа никогда не делила себя на факультеты.

Законы физики не знают, где заканчивается биология и начинается информатика.

Эволюция не подозревает о существовании кафедр.

Информация одинаково передаётся через нервный импульс, сетевой пакет или танец пчелы.

Чем дольше человек изучает мир, тем чаще сталкивается с неожиданным парадоксом.

В начале пути знания выглядят как множество отдельных дисциплин.

Позже они начинают напоминать соседние страны.

А ещё позже возникает ощущение, что большинство из них изучает разные проявления одних и тех же фундаментальных закономерностей.

Именно поэтому самые интересные идеи часто рождаются на границе областей знаний.

Там, где одна дисциплина перестаёт видеть очевидное.

И где другая внезапно узнаёт в незнакомой задаче старый, хорошо знакомый принцип.

Глава 9. Уровни мышления

В начале статьи мы говорили о споре вокруг микросервисов.

На первый взгляд это был обычный технический спор.

Такие споры происходят каждый день.

  • О базах данных.
  • О языках программирования.
  • Об архитектуре.
  • Об искусственном интеллекте.

О правильных и неправильных подходах.

Но чем больше наблюдаешь подобные дискуссии, тем чаще замечаешь странную закономерность.

Очень часто люди спорят не потому, что кто-то из них неправ.

Они просто находятся на разных уровнях абстракции.

В своё время в нашем городе было два вуза, готовивших IT-специалистов.

Про выпускников первого обычно говорили:

Всё знают, ничего не умеют.

Про выпускников второго:

Ничего не знают, всё умеют.

Жёсткая шутка.

Но, как и большинство хороших шуток, она была основана на наблюдениях.

На собеседованиях выпускники первого вуза выглядели впечатляюще.

Они знали термины.

Помнили определения.

Уверенно рассказывали про архитектуры, алгоритмы и паттерны.

Создавалось ощущение глубокого понимания предмета.

Выпускники второго часто выглядели скромнее.

Могли забыть правильное название.

Путались в терминологии.

Иногда объясняли вещи своими словами.

Но когда дело доходило до реальной работы, работодатели нередко предпочитали именно их.

Потому что они умели решать задачи.

Тогда я ещё не понимал причины.

Сейчас мне кажется, что разница была намного глубже, чем качество образования.

Одни изучали карты.

Другие чаще сталкивались с территорией.

Первые могли подробно объяснить, что такое архитектурный паттерн.

Вторые могли построить систему, используя этот паттерн, даже не зная его официального названия.

Первые знали определение декомпозиции.

Вторые интуитивно декомпозировали сложные задачи.

Первые знали термин Event Loop.

Вторые строили событийные системы управления оборудованием.

Первые знали ответы.

Вторые знали, как искать решения.

На этом месте важно не впасть в другую крайность.

Термины важны.

Теория важна.

Карта нужна.

Без неё невозможно передавать знания между людьми.

Невозможно обсуждать сложные идеи.

Невозможно накапливать опыт поколений.

Но карта имеет неприятственное свойство.

Её можно выучить, так ни разу и не побывав на территории.

Именно поэтому многие технические споры оказываются такими странными.

Один человек защищает карту.

Другой описывает территорию.

Один говорит:

Настоящие микросервисы выглядят именно так.

Другой отвечает:

Но я решаю другие задачи теми же способами.

И оба оказываются по-своему правы.

С опытом происходит интересная трансформация.

Сначала человек запоминает названия.

Потом понимает механизмы.

А затем начинает замечать закономерности.

Новичок видит технологии.

Специалист видит инструменты.

Архитектор видит принципы.

Исследователь начинает видеть ограничения, которые заставляют совершенно разные системы приходить к похожим решениям.

Именно на этом уровне начинают происходить самые интересные открытия.

Человек внезапно замечает, что Event Loop не принадлежит NodeJS.

Микросервисы не принадлежат Kubernetes.

Коллективное поведение не принадлежит биологии.

Память не принадлежит мозгу.

Оказывается, большинство наших терминов описывает не сами идеи, а лишь наиболее известные реализации этих идей.

Именно поэтому инженер, который знает только карту, часто оказывается беспомощен на новой территории.

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

Настоящее понимание появляется значительно позже.

Когда человек начинает свободно перемещаться между картой и территорией.

Когда может подняться на уровень принципов, а затем снова вернуться к конкретной реализации.

Когда понимает не только что работает, но и почему работает.

История науки показывает удивительную закономерность.

Крупнейшие открытия редко происходят внутри строго очерченных границ.

Чаще они появляются на стыке областей.

Когда биолог начинает мыслить как инженер.

Когда программист интересуется эволюцией.

Когда математик приходит в физику.

Когда специалист по искусственному интеллекту внезапно обнаруживает полезные идеи в психологии.

Потому что новое знание часто рождается не из открытия нового факта.

А из узнавания старого принципа в неожиданном месте.

И, возможно, именно это отличает человека, который знает предмет, от человека, который понимает предмет.

Первый знает ответы.

Второй начинает замечать вопросы, которые объединяют совершенно разные области знания.

Заключение. Так кто был прав?

В начале статьи мы наблюдали спор о микросервисах.

Один человек утверждал, что микросервисы существуют только в больших веб-системах.

Другой видел их в автомобилях, промышленной автоматике и других областях.

На первый взгляд казалось, что кто-то из них обязательно ошибается.

Теперь ответ выглядит немного иначе.

Они говорили о разных вещах.

Первый описывал конкретную реализацию.

Второй — общий принцип.

На протяжении всей статьи мы снова и снова сталкивались с похожей ситуацией.

Event Loop оказался старше NodeJS.

Коллективное принятие решений оказалось старше датацентров.

Декомпозиция оказалась старше микросервисов.

Некоторые идеи вообще появились задолго до компьютеров.

Но одновременно мы увидели и другую сторону медали.

Не каждое сходство является закономерностью.

Не каждая аналогия полезна.

Не каждая повторяющаяся форма указывает на общий принцип.

Иногда мы наблюдаем фундаментальные ограничения системы.

Иногда — последствия исторической случайности.

А иногда просто выдаём желаемое за действительное.

Наверное, именно поэтому самые интересные вопросы начинаются не со слов:

Что это такое?

А со слов:

Почему это работает именно так?

Этот вопрос заставляет смотреть глубже.

Он заставляет искать не названия, а механизмы.

Не реализации, а ограничения.

Не различия между объектами, а причины появления сходства.

Постепенно становится понятно, что мир устроен немного странно.

Он состоит из бесконечного разнообразия реализаций.

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

  • Передача информации.
  • Обратная связь.
  • Специализация.
  • Кооперация.
  • Память.
  • Обучение.
  • Обработка событий.
  • Самоорганизация.

Природа использует их для создания живых организмов.

Инженеры используют их для создания технологий.

Общество использует их для организации людей.

  • Меняются материалы.
  • Меняются масштабы.
  • Меняются названия.
  • Принципы остаются.

Именно поэтому пчела может оказаться немного похожей на сервер.

Не потому, что сервер — это насекомое.

И не потому, что улей работает на Linux.

А потому, что обе системы существуют в одной и той же Вселенной и пытаются решать похожие задачи.

Возможно, самое полезное умение инженера заключается не в знании технологий.

И даже не в знании принципов.

А в способности понимать, на каком уровне абстракции сейчас находится разговор.

Потому что очень многие споры заканчиваются в тот момент, когда собеседники наконец начинают обсуждать одно и то же.