Ковыраяя различные ресурсы, посвещённые языку OCaml наткнулся на ролик с выступлением Ричарда Хикки, создателя функционального языка Clojure. Это выступление, на мой взгляд, концетрированная выжимка той критики, которую любители функционального программирования обычно подвергают мейнстрим.
Слово “информировать” обозначает “передавать знания посредством фактов”. Оданко если мы рассмотрим современные информационные системы, очень часто окажется, что это не совсем так.
Чаще всего, информация представляется изменяемыми (mutable) объектами - это абстракции места в памяти. Как раз это понятие “информации” как места в памяти или на диске и смущает, потому что в ходе работы информационной системы эти места используются многократно, изменяя факты на месте. Но ведь факты в реальной жизни работают совсем не так! Если наш друг сообщил нам, что адрес его электронной почты изменился, то этот факт не изменит того, что раньше он был другим. Факты так не работают, новая информация не изменяет значения прошлой, вместо этого она добавляется “сверху”.
Ричар описывает такой подход к программированию забавным термином PLOP
– Place-Oriented Programming.
Этот стиль родился из изначального состояния компьютерных систем, когда объём памяти и дискового места был
крайне мал.
Сегодня объём памяти вырас в миллионы раз – средняя вкладка в Google Chrome использует больше памяти, чем понадобилось
компьютерам прошлого для запуска человека в космос, однако мы всё еще используем стиль программирования, ориентированный на “место”.
Множество современных проблем происходят из-за того, что мы используем “факты” как что-то изменяемое различными агентами, в итоге вся система оказывается зависимой от того, какой “факт” является истинным на текущий момент.
Этому подходу противопоставляется Value Oriented Programming
- программирование, ориентированное на значения (читай
функциональное программирование).
Вот лишь некоторые преимущества такого подхода:
- Неизменяемость - значениям не нужны методы, они семантически прозрачны, им не нужны геттеры, их легко сравнивать.
- Значениями можно свободно “делиться”, без всяких защитных копирований или механизмов блокировки.
- Результаты всегда воспроизводимы, что во много раз облегчает дебаггинг и тестирование.
- Значения не завязаны на конкретный язык, их легко воспроизводить на любых языках и системах.
- Агрегация: значения агрегируются бесшовно, сохраняя свойства отдельных значений.
Ричард сравнивает то, как такие области как логирование и системы версионирования отражают принципы ориентации на значения. В конце концов, новыё лог не пишется на место прежнего. Информация всегда доступна на всём протяжении времени, тем она и ценна.
На месте такого наблюдения и возникла индустрия BigData, целью которой является именно сбор информации во времени (и пусть даже при этом большаяя её часть будет “мусором”, это абсолютно нормально).
Естественно, все эти разговоры не могут разом изменить подхода в индустрии программирования.
Да и в целом, этот подход легко подвергнуть критике, ведь в конце концов компьютер представляет собой набор значений в памяти,
значит от состояния нам никуда полностью не деться.
На сегодняшний день всё популярные языки всё еще являются всё еще ориентируются на PLOP.
Но очень медленно ситуация всё же меняется в сторону заимствования подходов из функционального программирования (здесь, возможно, не последнюю роль
сыграл Rust
) и всё больше и больше разработчиков признают, что в индустрии есть место для таких ЯП как Elixir
или Scala
.