Неофициальный путеводитель по мозгу Рича Хики

в 6:19, , рубрики: clojure, functional programming, translate

Блог Flying Machine Studios
6 декабря 2012 года
перевод статьи The Unofficial Guide to Rich Hickey's Brain

Неофициальный путеводитель по мозгу Рича Хики

Частично, мое удовольствие от изучения Clojure возникло благодаря знакомству с мыслями Рича Хики о программировании. У Рича есть свой взгляд на фундаментальные концепции программирования, ясный и последовательный, и я думаю, что каждый программист смог бы выиграть, используя его. Каждый раз, когда я смотрю одно из его выступлений, у меня складывается ощущение, что кто-то взял и привел мой ум в порядок.

В этой статье (а, возможно, и в будущих) я постараюсь упорядочить и каталогизировать уникальную точку зрения мистера Хики. В конечном счете, я бы хотел получить краткое резюме его идей. Я надеюсь, что это приведет к появлению удобной для поиска справки для тех, кто пишет на Clojure, и доступного введения для тех, кто Clojure не использует.

Весь последующий текст основан на выступлении Рича Хики «Are we there yet?»

Вступление

Современные ООП-языки — Ruby, Java, Python, и т.д. — содержат фундаментальный изъян — они привносят непредвиденные сложности, основываясь на неточной модели внешнего мира и реальности. Несмотря на то, что в них существуют явные определения следующих понятий, эти определения неверны:

  • Значение (Value)
  • Состояние (State)
  • Идентичность (Identity)
  • Время (Time)
  • Поведение (Behaviour)

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

Метафизика, программирование и вы: Сравнивая ООП и ФП

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

Как учит нас Wikipedia, метафизика пытается как можно более широко ответить на два основных вопроса:

  • Что там?
  • На что это похоже?

Рич Хики поясняет разницу между метафизикой ООП и ФП на примере ответа на вопрос «Что есть река?».

Объектно Ориентированное Программирование

Согласно метафизике ООП, река это то, что на самом деле существует в реальном мире. Знаю, знаю, я даже слышу как вы спрашиваете: «Да, и что?», но, поверьте, точность этого заявления не давала спать многим философам.

Хитрость в том, что река постоянно меняется, и её воды никогда не перестают течь. В терминах ООП мы бы сказали, что у реки есть изменяющееся (mutable) состояние, и оно (состояние) постоянно колеблется.

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

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

В конце концов, в ООП объекты думают. Они действуют друг на друга. И опять, это соответствует нашим представлениям о мире, где изменения — это результат действий одних объектов на другие. Объект Человек толкает объект Дверь и перемещается в объект Дом.

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

Неофициальный путеводитель по мозгу Рича Хики

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

«Река» это не вещь сама по себе, а понятие, которое мы накладываем на последовательность связанных с ним явлений. Эта концепция очень полезна — я не буду возиться с пояснением этого, — это всего лишь концепция.

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

Эти частицы не действуют друг на друга, и они не могут быть изменены. Они не могут ничего делать. Изменение не является результатом действия одного объекта на другой, изменение является результатом процесса, применяемого к неизменяемой частице. Сказать, что что-то изменилось, это все равно что произнести: «О, это новая частица в этом потоке частиц». Это все равно что сказать, что HEAD указывает на новый коммит в Git-репозитории.

Ну ладно, хватит с метафизикой! Теперь опишем более полезные темы, начиная со Значения.

Значение (Value)

Это очевидно, что числа 3, 6 и 42 являются значениями. Числа постоянны, неизменны.

Так же должно быть очевидным и то, что ОО-языки не имеют правильного определения для значений в таком смысле. Как указывает Рич Хики, вы можете создать класс, экземпляры которого состоят из неизменяемых частей, но у вас нет высокоуровневой концепции, которая бы в целом выражала класс как неизменяемое значение.

Это одна из основных причин головных болей при использовании ООП. Сколько раз вы рвали на себе волосы, в попытках выяснить, как был изменен атрибут объекта? На самом деле, в объектно-ориентированных языках нет встроенного механизма для того, чтобы определить — устойчиво ли состояние объекта или нет.

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

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

Идентичность (Identity)

В выступлении мистер Хики говорит:

«Самая большая проблема в том, что мы путаем две вещи. Мы высказали идею о том, что нечто, что изменяется во времени и есть наш объект, вещь.»

В ФП мы оперируем простым именем, которое мы дали последовательности связанных частиц. «Река» соответствует последовательности R1, R2, R3 и т.д., произведенной процессом «течения» реки. Существует прямая аналогия с HEAD в git — это просто имя, которое указывает на фактические значения. В ООП нет такого различия.

Или, как он сам говорит:

«Соответствие это связь мнимого объекта с серией причинно-связанных значений (состояний) с течением времени. Это метки, которые мы используем для именования временных отрезков.»

Состояние (State)

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

Это становится более понятным, если вы проведете сравнение с понятием идентичности в ФП. В Хиксианской вселенной, Состояние является определенным значением в определенный момент времени. (Для меня, это определение действительно расставило все по местам.)

Время (Time)

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

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

Поведение (Behavior)

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

«Нет никакого поведения. Когда вас ударила молния, кто себя „ведет“?»

Может это то, что сподвигло Steve Yegge написать «Execution in the Kingdom of Nouns»

Конец

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

Примечания переводчика

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

Автор: helions8

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js