История разработки повторяется.

Когда Алан Кей изобрел ООП и SmallTalk, он не имел в виду то, чем станет С++, Java, etc. C++ - это совсем другое ООП. Индустрия решила скоротать путь, назвав "объектно-ориентированным программированием" подход с классами, методами, наследованием. Это был "промежуточный" вариант. Пусть не оригинальное ООП в смысле SmallTalk, но уже и не структурное в смысле Си. Но оригинальное ООП все же вернулось в виде модели акторов и Erlang, когда мэйнстримное ООП начало пасовать перед сложными конкурентными и параллельными задачами, и когда стало ясно, что "inheritance considered harmful".

Сейчас то же самое происходит с функциональным программированием. Индустрия постепенно избавляется от бельма на глазу, которое позволяло игнорировать ФП, и в разработку приходят молодые, дерзкие и гибко мыслящие программисты, которые хотят корректности, надежности, простоты и удовольствия в разработке, а не зубодробительных челенджей в попытках сделать параллельный императивно-ООПшный код работающим и без багов. Но инертная индустрия и здесь пытается скоротать путь, выдавая за ФП Scala с ее гибридным подходом и лямбды в мэйнстримнымных языках. Мол, пусть не Haskell, но уже и не Java. И это очень далеко от настоящего ФП, которое хочет и может решать сегодняшние проблемы.

История повторяется, но теперь в ущербном положении находится не оригинальное ООП, а оригинальное ФП. Под этим термином уже начинают понимать императивно-объектную Scala, что приводит к дискредитации ФП, когда объектно-ориентированный Scala-код снова натыкается на старые проблемы. Казалось бы, Scala - это и ФЯП тоже, почему же с ней могут возникнуть проблемы? А потому, что функциональное программирование - это не лямбды, не иммутабельность и даже не чистые функции. Функциональное программирование - это функциональная композиция, функциональные идиомы и строящийся на этом функционально-декларативный дизайн. Что же предлагает Scala? По умолчанию - объектно-ориентированный дизайн с элементами ФП. Увы, это совсем не то же самое.

Именно связка функциональных "композиции-идиом-дизайна" и решает сложные для императивного мира проблемы с многопроцессорностью. Лямбды, которые появились во всех мэйнстримных языках, вообще говоря, нечистые и могут иметь какой угодно побочный эффект. Композиция таких лямбд становится просто невозможной, а значит, и не решает поставленную проблему. И из этого делается неверный вывод, что ФП - это обман, который не способен на то, за что его хвалят. Но на самом деле здесь подмена понятий. ФП - это не лямбды, не функции высшего порядка, не иммутабельность. Точно также как ООП - это не классы, полиморфизм и наследование. ФП это нечто большее. И я опасаюсь, что индустрия скоро впадет в очередное заблуждение, подменяя настоящее понятие каким-то своим, и конечно же, она наступит на те же грабли.

Еще по теме: https://news.ycombinator.com/item?id=7654710
Shared publiclyView activity