У меня уже давно пылилось на полке несколько книг о функциональном программировании, по этому я решил взяться за эту тему. И конечно же, решил чт начинать проще всего с серии “Грокаем…” и в общем-то с этой книгой не прогадал, она оказалась хороша. Для меня материал оказался полезным, как минимум упорядочил знания и показал некоторые концепции с неожиданной стороны.

КДПВ

Начиналась книга забавно. Как только начал читать, как десять раз прочитал о трех категориях кода: действии, вычислении и данных. Ну, и о чистых функциях и побочных эффектах, конечно же. В целом, мысль из первых глав сводилась к двум китам, классификация кода на эти самые действия, вычисления и данные и использование абстракций более высокого порядка. В последствии оказалось, что автор под вычислениями имел ввиду “чистые функции”, а под “действиями” -> “побочные эффекты”. Прикольно то, что использование TDD приводит примерно к тому же, что и чистые функции в ФП, чаще стараешься писать такие функции, которые легко тестировать: - подал данные на вход, сверил с ожиданиями вывод.

Следующий материал в основном посвящен работе с неизменяемыми данными. В том числе и том, как адаптировать работу с изменяемыми данными к ФП, а именно - через копирование данных, преобразование копии и её возврат и называется “поверхностное копирование”. Всё это приводит к увеличению кода-вычисления и уменьшению общего количества кода-действия. В книге так же объясняется, что все эти манипуляции нужны в языках, которые не поддерживаю неизменяемые данные by design. При этом есть языки, в которых такие данные уже предусмотрены, вроде Clojure или Haskell.

Встретил новый термин, “защитное копирование”. В отличии от “поверхностного копирования”, оно создает глубокую копию, что необходимо для работы с внешними зависимостями, которые мы никак не контролируем (или не безопасным кодом, который не адаптирован). Прикольно то, что среди плюсов описывается такой кейс: - что если функция, в которую мы передавали объект, хранит ссылку для последующего изменения, это точно “побочный эффект” и защитное копирование должно избавить нас от него и избавляет. Но, если дальше случится событие, которое должно изменить корзину, и на это рассчитан код, но так как мы сделали копию, ссылка потеряется и изменения не произойдут, это приведет к ошибке. Странно. На этом первая часть книги, которая являлась вводной, оканчивалась и дальше начиналась практическая часть, проектирование.

Вторая часть начинается с рассмотрение проектирование приложений, для чего предлагается использовать четыре паттерна многоуровневого проектирования: - прямолинейная реализация, абстрактный барьер, минимальный интерфейс и удобные уровни. Автор знакомит нас с первоклассными значениями, первоклассными функциями, анонимными функциями и функциями высшего порядка, вводится такой термин, как обратный вызов и встроенная функция, а дальше рассматривается работа с такими сущностями на примере метода рефакторинга, под названием “замена тела функции обратным вызовом”. И вот тут уже начинается интересное…

Помимо советов под рефакторингу кода на примерах, упоминаются готовые инструменты. Например, для JavaScript библиотека Lodash, для PHP -> Laravel и для Haskell -> Haskell Prelude. Упоминается официальная документация для Clojure -> ClojureDoc. Объясняется то, что в JavaScript реализации map, filter и reduce уже встроены в язык и являются методами массивов, по этому писать собственную реализацию не обязательно. Объясняется то, что в Java существуют средства, упрощающие функциональное программирование, например - лямбда-выражения, по сути замыкания. Знакомят с тем, что такое “функциональный интерфейс” и Stream API, например.

На это раз в книге разбиралось такое понятие, как “временная диаграмма”, на примере ошибки в асинхронном коде. Причем, много внимания было уделено реализации асинхронных вызовов в JavaScript. Прикольно то, что дальше автор добрался до очередей и предложил свою реализацию. И где-то тут я понял, что вообще плохо понимаю, что это за приложение такое мы разрабатываем. Откровенно говоря, я до этого момента не понимал, что приложение запущено внутри браузера, считая что речь о серверном коде на Node.js и не понимал, что проблемы с глобальными переменными, откуда они вообще взялись и зачем :)

Вообще, “очередь” была предложена очень простой: массив, который является шиной и простой обработчик, которые дергается внутри коллбэка, после завершения отложенной функции (например, похода в API). Все эти последние главы всё больше и больше начинают походить на учебник асинхронного программирования какого-то, чем на функциональное. Да, функциональные принципы помогают писать более предсказуемый асинхронный код, у них есть общие концепции, но все таки, это разные парадигмы.

В следующей главе рассматривались две архитектуры: реактивная архитектура и многослойная архитектура. При изучении первой у меня возникли две мысли, что асинхронный код заразен и вторая, что постепенно превращается в какой-то запутанный клубок. Наверняка, сейчас существуют какие-то более удобные способы организации кода, например те же самые Promise, но все равно без подготовки я бы в это не погружался. А вот вторая архитектура сразу до боли напомнила мне

Забавно то, что многослойной архитектуре уделено значительно меньше внимания, чем реактивной. Хотя даже у меня есть как минимум три книги, которые посвящены ей, включая “Предметно-ориентированное проектирование. Структуризация сложных программных систем” и “Реализация методов предметно-ориентированного проектирования”. Хотя, может быть я не прав? Надо освежить в памяти, о чем эти книги. Но, вот “Чистая архитектура. Искусство разработки программного обеспечения” точно рассматривает такой подход.

Обратил внимание на то, что в конце книге идет список рекомендуемой литературы и в этом списке прямо сейчас у меня есть две книги: - это “Структура и интерпретация компьютерных программ” и “Грокаем функциональное программирование”. Наверное, прочитаю их следующими. Получается, что уже есть готовый план чтения на пару месяцев вперед!

Все бы ничего, книга понравилась всем, кроме оформления. Оформление у книги совершенно дурацкое. И дело даже не в иллюстрациях, они как раз нормальные, а в каком-то диком количестве всяких вставок, сносок и прочей ерунды. Обратил внимание на то, что для названия части функций используется CamelCase, а для части snake_case. Эдакий запашок кода :) Какая-то куча повторов материала, при том что в описании сказано, что книга рассчитана на средний-высокий уровень, что совершенно не так. Я считаю, что у меня средний уровень и мне явно не требовалось так подробно описывать материал. Так, сильным разработчикам тут точно делать нечего. Если вы понимаете, что такое рекурсия и вас не пугает слово “callback”, то книга точно вам подойдет.

Обычно я редко встречаю какие-то опечатки, но тут заметил несколько. Они не сбивают с толку, мелочи… А что касается самого издания, то оно в точности повторяет всю серию “Грокаем…”: - мягкая обложка, хорошая полиграфия, бумага и прочее. В целом, нормальное.


Автор(ы):

  • Eric Normand

Год издания: 2025
Количество страниц: 608
Оценка: 5/5

Издатель: Питер
Ссылка на страницу книги на сайте издательства: www.piter.com/collection/all/product/grokaem-funktsionalnoe-myshlenie

Оригинальное название: Grokking Simplicity: Taming complex software with functional thinking
Год издания оригинала: 2021