Разрезать природу по суставам

О GUN, перспективах и разлагающихся проблемах

Чтобы решить большую проблему, сведите ее к более мелким проблемам. Это, должно быть, одна из самых известных стратегий решения проблем, которую мы применяем каждый день в огромном количестве ситуаций. Большой вопрос, конечно, в том, как разделить, прежде чем завоевывать? «[Мы] стремимся вырезать природу по стыкам», — писал Джерри Фодор («Призыв к неявным знаниям в психологических объяснениях», 1968), имея в виду так называемые «естественные виды». Википедия: «Естественный вид обозначает «реальную» структуру «естественного мира», а не «искусственный» результат человеческого мышления» (1).

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

Это повседневные вещи в вычислительной технике. Все дело в создании правильных абстракций, скрытии одних элементов данных и раскрытии других. Сделав это неправильно, вы обнаружите, что бесконечно перебрасываете информацию через границы, ведете двойной учет, создаете программы, которые трудно поддерживать.

У меня был повод задуматься над этим вопросом, изучая GUN (https://gun.eco) как возможный субстрат для распределенного стека Perspectives. GUN — фантастическая система. Он предоставляет разработчику приложений небольшой функциональный API, который позволяет ему использовать известные концепции баз данных, не развертывая их. Кратко: поместите значение под каким-то ключом, извлеките его, используя тот же ключ. Другими словами, GUN работает как гардероб. Особенность GUN заключается в том, что нет физического центрального места, куда попадают вещи, которые были спрятаны. Скорее, значение хранится на каждом компьютере, на котором запущена программа, запросившая его.

Однако для разработчика приложений фактическое хранилище находится под капотом. Концептуально для него это просто центральное место, куда он кладет вещи и откуда их достает.

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

Теперь, в контексте многопользовательских компьютерных программ, база данных также функционирует как доска объявлений. Люди будут размещать на нем информацию, и другие обратят на это внимание, используя ее, если они заинтересованы. Как правило, доска объявлений будет расположена так, что многие люди будут проходить мимо нее в ходе своей повседневной деятельности, например, в офисе. в холле здания. Он должен быть доступен. Доска объявлений решает проблему группы людей, которым необходимо общаться друг с другом. Доска объявлений, как и база данных, является центральным хабом. Теоретически для общения между n людьми требуется n*(n-1) соединений. Но концентратор сокращает это число до n соединений.

В наше время это означает клиент-серверную архитектуру Интернета.

Но доске объявлений не хватает конфиденциальности. Некоторая информация не у всех на виду! Это зависит, конечно, от приложения, а точнее, от процесса, который им поддерживается. Разработчик приложения может выбирать из различных методов доставки информации только тем, кто заинтересован и имеет право ее видеть. Некоторые из этих методов поддерживаются на уровне постоянства (например, управление списками доступа), другие зависят от логики самого приложения, чтобы скрывать информацию от одних пользователей и раскрывать ее другим.

Дело, конечно, в том, что, хотя база данных решает одну проблему — взаимодействие n с n — она вводит другую: отсутствие конфиденциальности.

Вернемся к ГУНу. Разделите всех пользователей той или иной программы на две группы по любому заданному ключу: тех, кто ею интересуется, и тех, кто не интересуется. Теперь, когда какой-то пользователь меняет значение этого ключа, как GUN гарантирует, что те, кто в нем заинтересован, получат его (когда они его запросят)?

Интерес (в ключе) определяется на уровне приложения. GUN ничего не понимает в этом; эта информация ему недоступна. Тем не менее, GUN должен учитывать, что любой компьютер в сети может в любой момент в будущем запросить этот ключ — или уже запросил его. Поэтому он должен убедиться, что, когда это произойдет, он сможет найти связанное значение. Он делает это, распространяя сообщение об обновлении (дельту) по всей сети на каждый компьютер. Кому интересно, сохранит. Кто нет, просто передайте. И наоборот, когда компьютер запрашивает ключ, этот запрос будет распространяться волной от него по сети. Компьютеры, содержащие сохраненное значение, ответят; другие передадут это.

В алгоритмы GUN было вложено много изобретательности, чтобы сделать этот процесс максимально эффективным. Позвольте мне упомянуть только один, который слишком хорош, чтобы его пропустить: компьютер, который знает ответ, все равно пересылает запрос своим партнерам (это частная версия значения может быть устаревшей!). Тем не менее, он прикрепляет свой собственный ответ на запрос. Любой компьютер, получивший это расширенное сообщение и сохранивший такое же значение, не будет ни распространять его дальше, ни отвечать. Это может сэкономить значительное количество усилий; можно представить себе кольцо «осведомленных компьютеров» вокруг запрашивающего компьютера, которое будет действовать как сдерживающее поле для распространяющейся волны.

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

Теперь обратимся к перспективам. Как и в случае с GUN, только компьютеры, «заинтересованные» в конкретной части данных, будут ее хранить. Как и в случае с GUN, здесь нет центрального сервера. Таким образом, как и GUN, Perspectives должен выяснить, как переместить дельту на соответствующие компьютеры в сети. Но, в отличие от GUN, уровень распространения Perspectives очень хорошо информирован о том, кому актуальна та или иная часть данных. Это связано с тем, что «программа» Perspectives — мы предпочитаем слово «модель» — описывает типы контекстов, роли, которые активны в этих контекстах, и действия, доступные для каждой роли (где консультационная информация также является действием). Сочетая модель с экземпляром контекста, удерживая реальных пользователей, выполняющих роли, Перспективы могут точно определить, куда отправить каждую дельту. Если ему известен IP-адрес компьютера участника контекста, он отправит дельту непосредственно на этот компьютер через https. Таким образом, мы видим, что Perspectives необходимо задействовать лишь небольшое количество узлов одноранговой сети для любой дельты.

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

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

Освященное веками разделение компьютерной программы на уровень хранения и прикладную логику просто не подходит для Perspectives. Это прекрасный пример того, как разделение проблемы на более мелкие проблемы может привести к неоптимальному решению. В этом случае, если бы мы абстрагировали уровень данных от понятия самого приложения, мы потеряли бы информацию, имеющую решающее значение для целенаправленной, эффективной доставки и хранения информации, а также потеряли бы конфиденциальность в процессе.

Является ли это дополнительным бременем для специалиста по моделированию перспектив (невозможность передать хранилище специализированной подпрограмме)? Нисколько. Скорее наоборот: хранение и распространение полностью ложатся на сам программный стек. Модельер вообще не должен думать об этом. Ему даже не нужно хранить вещи, не говоря уже о том, чтобы их куда-то отправить! Он может с уверенностью предположить, что информация волшебным образом доступна везде, где она необходима.

Таким образом, даже несмотря на то, что Perspectives стремится к тем же нефункциональным функциям, что и GUN, использование GUN в качестве основы приведет к неоптимальному программному стеку. Это не значит, что Perspectives лучше GUN. Разработчики GUN очень мало думали о типах приложений, которые будут его использовать. Перспективы просто более самоуверенны: они созданы для сотрудничества. При его реализации мы извлекаем выгоду из этой специализации. Это также гарантирует нефункциональность, которой не хватает GUN: быть приватной по замыслу.

(1). Метафора имеет глубокую традицию. Тийс Рингельберг указал мне, что Платон использовал его в Федре (строки с 265d по 266a). Его история может быть непостижимой, учитывая природу наших предков охотников-собирателей.

Это десятая колонка в серии. Предыдущий был: Homo Co-operans. Вот предисловие к сериалу.