Признания страстного программиста

Введение

После почти 40-летнего плодотворного сотрудничества с ремеслом программирования я до сих пор не нашел разумного объяснения тому, почему программные проекты — в частности, объектно-ориентированный подход — периодически испытывают трудности с обработкой сложности. Часто проекты борются со сложностями, которые они сами создали в более раннем воплощении.
Как же так?

В частности, если вспомнить те дни, когда «смена парадигмы» на объектно-ориентированную архитектуру рекламировалась как решение всех проблем. Точно так же, как в наши дни [вставьте модное технологическое слово здесь] спасет мир. Я все чаще задаюсь вопросом, не пришло ли время для другого взгляда на тему того, как моделировать и внедрять информационные системы.

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

Имейте в виду разрыв

Один из ответов на начальный вопрос может быть таким: объектно-ориентированная разработка программного обеспечения — в отличие от других ремесел — воплощает сложные ментальные конструкции, такие как абстракция, обобщение и атрибуция, в концепцию реальности, восходящую к философии и науке Древней Греции. . Сложные вопросы дают сложные ответы.

Я думаю о таких вещах, как платоновский мир идей, Панта Рей, ранняя идея о том, что все состоит из четырех элементов, и целая куча подобных вещей, в основном написанных заглавными буквами. На самом деле, существует довольно много исторических причин, по которым академические круги приняли объектно-ориентированные языки программирования так, как они это делали, когда они это делали, в конце шестидесятых, и уже больше поколения к настоящему времени. Но это другая история.

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

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

Материальная составляющая действительно имела значение, потому что в то время в истории большинство стран Европы были вовлечены в своего рода технологическое безумие постоянного совершенствования по созданию собственной артиллерии для достижения все более высоких характеристик, и искра измеримой науки Галилеи, безусловно, имела значение. большое влияние на эти достижения. Все дело было в том, что материя движется в пространстве, имея импульс. переосмыслить дела. А вскоре после этого пришли Гюйгенс, позже Френель, затем Максвелл и де Бройль, все они разработали физические законы и доказали с помощью математики и измерений, что свет лучше всего описывается волнами. Затем введите Эйнштейн. Но это совершенно другая история.

Снова на ходу

В этой серии я попытаюсь описать «метод и устройство» под названием нетропия, которые помогут упростить проектирование распределенных информационных систем.

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

Информация

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

Информация определяется в очень широком смысле как «что-то узнаваемое» — просто невозможно иметь какое-либо общение с другой стороной, которая не распознает сообщение как сообщение. Это касается любой системы, будь то технической, социальной или биологической: на принимающей стороне сообщения должно быть что-то, что в какой-то степени напоминает сообщение. Будь то симметричный или комплементарный по форме.

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

Начиная с нуля

Используя нетропию, мы начинаем описывать систему как некое абстрактное пространство, куда мы можем поместить информацию:

<?xml version="1.0" encoding="UTF-8"?>
<Somewhere>
  <!-- TODO: Put information here -->
</Somewhere>

Поскольку у меня никогда не было амбиций разработать еще один язык программирования, выбор представления быстро пал на использование XML в кодировке UTF-8. Это оказалось хорошим выбором по нескольким причинам, а именно потому, что этот универсальный, расширяемый язык разметки

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

Последний пункт легко ввести в заблуждение. XML часто называют способом описания «древовидной структуры». Но если приглядеться, то деревьев нет. Приведенный выше код представляет собой просто последовательность байтов в кодировке UTF-8, когда он отправляется по сети как часть потока TCP в сети. Также любую область памяти современного компьютера можно рассматривать как одномерный массив байтов, последовательность ячеек памяти, в которых может храниться информация.

Может быть полезно читать эти теги XML как указатели географических названий, которые выглядели бы так в Германии, когда вы въезжаете в город:

И когда вы выйдете, вы увидите это:

Пространств, следов и мест

Нетропия активно использует метафоры местоположения. В отличие от описания XML DOM, мы не столько фокусируемся на узлах или «объектах», сколько на тех диапазонах в тексте, которые окружены тегами.

Эти диапазоны мы называем местоположениями, и, кроме того, мы различаем местоположение как пробел, след или место. эм>. Вместе они образуют своеобразную карту системы.

пространство может иметь вложенные местоположения, что позволяет перемещаться «внутри» его.

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

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

Услуги

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

Для иллюстрации этих концепций мы представляем приложение нетропии «hello world» (преамбула и объявления пространств имен для краткости опущены):

<netropy:space>
  <hello>
    <world>
      <netropy:copy type="text/plain">Hello world!</netropy:copy>
    </world>
    <dolly>
      <netropy:stash/>
    </dolly>
  </hello>
</netropy:space>

Здесь мы определяем пространство, где вы можете пройти по следам hello и world, чтобы получить копию текста «Hello world!» — или вы можете пойти к dolly, положить что-нибудь и снова вытащить.

Служба хранения обрабатывает неструктурированную информацию. Это может быть текст, javascript, JSON, XML или даже двоичные данные. Контент не анализируется, а тип типа контента просто сохраняется. Вы даже можете поместить двоичные данные в тайник.

Созданный таким образом XML-документ называется схемой для приложения. Он документирует структуру информационной системы и может использоваться в качестве карты для ее общего обзора. Документ также может быть интерпретирован процессором netropy, небольшой программой, которая использует спецификацию для построения работающей системы.

Навигация

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

В приведенном выше примере путь /hello/world (начало вверху пробела) идет по некоторым трассам к месту, где есть служба копирования.

Другое представление пути может быть сделано только с помощью трасс:

<hello>
  <world>
    <!-- HERE -->
  </world>
</hello>

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

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

Транспорт

Транспортировка информации в нетропное пространство может происходить двумя способами:

  1. Либо разработчик проекта поместит его туда с самого начала, либо
  2. есть некий портал, через который передается информация.

Порталы — это просто сервисы, которые соединяют пространство, в котором они находятся, с его окружением. В большинстве случаев это аппаратные устройства, из которых состоит наша система; дисковое хранилище, сетевая карта, дисплей и т. д. Но также доступ к программным устройствам, будь то база данных SQL или (необязательно) хост-операционная система, будет иметь смысл как услуга.

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

Привет мир!

Итак, чтобы получить доступ к нашему примерному приложению через веб-браузер, мы должны расширить его с помощью службы HTTP:

<netropy:space>
  <hello>
    <world>
      <netropy:copy type="text/html">Hello world!</netropy:copy>
    </world>
    <dolly>
      <netropy:stash/>
    </dolly>
  </hello>
  <netropy:http port="8901"/>
</netropy:space>

Сделанный. Передайте план нетропному процессору, такому как XENOmat, и выполните запрос GET для http://localhost:8901/hello/world.

Затем вы должны получить желаемый текст, и вы можете хранить, извлекать и удалять что-либо в тайнике с помощью запросов PUT (или POST), GET или DELETE для ресурса тайника, расположенного по адресу «http://localhost:8901/hello /Долли".

И копировальный сервис, и тайник носят характер места: Дальше можно не заходить, поэтому просьба вида

GET http://localhost:8901/hello/dolly/parton

приведет к известному ответу службы 404 Not Found. Только точное совпадение трассировок сможет запросить услугу.

Поздравляем! Вы только что завершили и протестировали свое первое приложение.

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

P.S. Если вам интересно, как выглядит HTTP-запрос в нетропии, то это примерно так:

<http:get Accept="*/*" Host="localhost:8901">
  <hello>
    <dolly>
      <parton/>
    </dolly>
  </hello>
</http:get>

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

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