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

Eve - это результат многолетних исследований и разработок команды дальновидных, которые ранее основали Light Table. Версия 0.2 Eve была запущена в прошлом месяце и произвела большой фурор в Hacker News, именно так я впервые услышал о ней.

В этой последней версии Eve есть несколько очень крутых живых демок, таких как Flappy Eve:

При первой прокрутке демонстрации flappy.eve можно выделить несколько поразительных особенностей:

  • IDE выглядит как редактор блога WYSIWYG. Код Eve разработан для встраивания в текст в формате Markdown; это грамотное программирование по максимуму.
  • Синтаксис незнаком, но все равно выглядит чистым и доступным - в основном он просто выглядит разреженным. Часть меня не может не думать: «Я вижу все эти части в скобках, но где собственно код?»
  • Код до смешного компактен - около 100 строк. Точно так же их todomvc.eve весит всего 63 строчки. Для сравнения: React’s TodoMVC содержит более 300 строк JavaScript.

Это было мое первое впечатление. Вот мое впечатление после того, как я часами просматривал примеры, размышлял над документами и смотрел видеоролики с техническими обсуждениями: Вау!

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

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

Проблема: слои делают одно и то же по-разному

В вашем программном стеке много уровней. Следующие три уровня обычно являются «основной системой», выполняющей тяжелую работу:

  • Уровень базы данных
  • Уровень удаленного API
  • Уровень приложения

Но есть также множество других уровней, с которыми общается основная система:

  • Слои рендеринга
  • Уровни событий ввода / вывода
  • Уровни конфигурации
  • Слои регистрации

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

Различные модели данных

У вас есть одна или несколько онлайн-систем баз данных. Их модели данных выглядят как таблицы SQL, коллекции документов, карты «ключ-значение» и / или графики.

У вас есть удаленный API, который моделирует данные как фрагменты JSON или XML или, возможно, как график GraphQL.

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

Различные операции

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

Чтобы работать на уровне API, вы можете запрашивать данные через HTTP GET и обновлять данные через HTTP POST и друзей. Если это GraphQL API, вы работаете с запросами и изменениями GQL.

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

Для каждого уровня вашего стека существуют разные модели данных и операции:

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

Решение: единый язык обработки данных

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

Единая модель данных

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

  • Данные приложения в памяти хранятся в @session базе данных
  • Дерево DOM браузера находится в @browser базе данных.
  • События пользовательского ввода-вывода находятся в @event базе данных

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

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

Универсальная модель данных связанных записей Евы напоминает технологии семантического Интернета, такие как RDF и JSON-LD. Но Ева - это больше, чем единообразная модель данных ...

Единый набор операций

Это также единый набор операций. Три операции search, commit и bind составляют всю функциональность Eve:

Удивительно, что мы можем управлять разными слоями стека, используя этот единый набор операций в единой модели данных Евы. Например, вот как мы отображаем <div> в DOM:

Поскольку дерево DOM находится в @browser базе данных, рендеринг <div> означает просто commit запись записи с tag: "div".

Теперь для каждого уровня вашего стека есть только одна модель данных и набор операций:

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

Высшие абстракции

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

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

Людям нужно время, чтобы понять, что GraphQL - это не база данных или сервер, а, скорее, язык запросов к графам (или «GraphQL», если хотите). Смысл GraphQL состоит в том, чтобы изменить взгляд клиента на API с небольшого жесткого набора конечных точек REST на унифицированную структуру связанных данных, которая принимает запросы произвольного графа.

Как и GraphQL, Eve также не является базой данных или сервером; это язык на более высоком уровне абстракции, чем мы привыкли. Рассмотрим пример кода из раздела домашней страницы Евы под названием Простая модель: мир как данные:

Когда вы запускаете этот search @slack блок, вы взаимодействуете со сторонним приложением Slack, у которого, конечно же, есть собственная внутренняя база данных. Но вы можете притвориться, что все является частью вселенной данных Eve - точно так же, как GraphQL позволяет вам притвориться, что произвольные вызовы API являются частью большой вселенной графов.

Итак, если вам нравится то, что GraphQL делает для уровня API, но вы просто хотите, чтобы кто-то сделал то же самое для всех остальных слоев одним махом… поздоровайтесь с Евой.

Следующее сообщение:
II. Когда логическое программирование встречается с CQRS

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!