Полный стэк на одном языке или изоморфизм Рича Хикки

Посмотрел доклад Николая Рыжикова на FPConf 2017. Заметки больше по философской его части. Практическая часть, где автор показывал, как вообще всё в проекте делать на Clojure, была не так интересна.

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

Информация

— Что такое информация?
— Информация — данные, которые позволяют принимать решения.
— Так данные же и есть информация.
— Значит, информация — послание, имеющее смысл.
— Или, информация — то, что уменьшает неопределенность.

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

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

JSON сейчас — кровь информации.

Закрытые и открытые системы

Open-world assumption — то, что нам неизвестно, считается неопределенным.

Дано:
— Вася любит кошек!
— Вера любит собак!
— Вера любит кошек!

Запрос:
— А Вася любит собак?

Ответ открытой системы:
— Хз, он не сказал.

Closed-world assumption — то, что нам неизвестно, считается заведомо ложным, некорректным.

Дано: — Вася любит кошек! — Вера любит собак! — Вера любит кошек!

Запрос:
— А Вася любит собак?

Ответ закрытой системы:
— Ошибка!

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

Система типов — closed-world assumption. Это математическая модель, которая едва ли может смоделировать тот информационный хаос, в котором она работает.

Функциональное программирование и вывод типов

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

Автор призывает не смешивать ФП и программирование с помощью типов. ФП — простой инструмент, которые многие могут быстро освоить и применять. А к программированию на типах всегда можно вернуться, когда это понадобиться или когда будет интересно.

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

Бережливое производство — каждый шаг должен добавлять ценность.

Написали Фейсбук на старом PHP и он работает. Корректность — не основное свойство: написали, как написали. Главное, что эта штука несет ценность (создателю, миру). А раз так, то зачем преждевременно уделять так много внимания доказательству корректности?

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

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

Clojure

В Clojure принято: Prefer function over macros, prefer data over function.

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

Рич Хикки (создатель Clojure) прочитал Purely Functional Data Structures, потом узнал про Hash Array Mapped Tree, что-то там совместил и получил эффективные структуры данных. Этого минимума хватает и таким макаром можно писать в любом языке.

Автор шутит: «ООП изобрели, потому что не было хэш-мапов».

Итого

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

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

Дополнения

Доклад Николая здорово дополняет доклад самого Рича Хикки «Effective Programs – 10 Years of Clojure»:

Рич Хикки много лет программировал реал-тайм системы на C++ для радио. Потом начал делать это на Common Lisp и перегонять его в C++. А потом ушел на 2 года в отпуск и написал Clojure.