Talks о ФП — общие тезисы

Talks-стримы AsForJS: критическое мышление и проверка по спецификации, доминирование Node как мейнстрима, разница между функциональными React-компонентами и реальным ФП, отношение к Clean Code и Кейси Маратори.

Главный методический совет

Воспитывайте в себе критическое мышление. Даже взявши книгу заслуженного автора, читая пояснение про механизм — перепроверяйте по первоисточнику. А первоисточником у нас является спецификация.

Для JS первоисточник — ECMAScript Specification (ECMA-262).

Перепроверяй тремя способами

Прочитав что-то, спросите себя: прав ли автор? Как я могу это проверить? Попробуйте придумать два или три способа.

Способы перепроверки:

  1. Прочитать спецификацию (ECMA-262)
  2. Поставить эксперимент в своём коде
  3. Свериться с реализацией V8 / SpiderMonkey

Пример: доказать отсутствие "передачи по значению" в JS — пишешь функцию, мутируешь объект изнутри, наблюдаешь, что снаружи он изменился.

You Don't Know JS как ориентир

Из всех книжек по JS интереснее всего показалась You Don't Know JS Кайла Симпсона. Доктор Аксель Раушмайер — книги бесплатно онлайн.

YDKJS, Exploring ES6/2025 by Rauschmayer — ориентир. Но главное — практическое мышление, не книга.

В ФП нет state

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

ФП мыслит входами и трансформациями, не переменными и присваиваниями.

Функциональные компоненты ≠ ФП

Начинающие считают: React-компонент в функциональном стиле = ФП, на классах = ООП. Это с реальностью ничего общего не имеет.

Хук useState с побочными эффектами в useEffect — это ООП-объект в синтаксисе функции.

ФП-стиль превращает код в кашу

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

Чистая λ для чисел Фибоначчи — нагромождение скобок. Лучшие качества ФП — палка о двух концах.

ФП = декларативность

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

В ООП декларативность — цель. В ФП — данность.

Knapsack 32MB JS

Google Docs — это 32 мегабайта распакованного JS. Я постоянно его разбираю. Названия функций — A, B, C, D из-за Closure Compiler. И это не мешает понимать код.

Реверс-инжиниринг JS-приложений учит абстрагироваться от имён и смотреть на структуру.

Кейси Маратори не "ворвался"

Критика Clean Code существовала задолго до Кейси. Эксперты по перформансу относились к ней снисходительно. Вирусным стало именно публичное заявление.

Кейси Маратори (Casey Muratori Handmade Hero) публично разнёс Clean Code Боба Мартина. Это не новая критика — она была известна давно. Виральность ≠ новизна идеи.

SOLID — калька с ФП

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

LSP, DIP — костыли, чтобы дисциплинировать ООП-программистов. В ФП эти правила — естественная норма.

Знай цену каждой инструкции

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

class в C++ и в JS — разные вещи на уровне VM. Реализация у каждого языка своя. Не копипастьте между языками без понимания.

Три проблемы программирования

Самые большие проблемы: 1) выбрать имя идентификатора, 2) инвалидация кэша, 3) алгоритмы консенсуса в распределённых системах.

Расширение классической шутки про "две сложные задачи: invalidate cache, naming things".

Главная мысль про паттерны

В JS нет интерфейсов — это ещё не повод их не использовать. Концепции важнее синтаксической поддержки в языке.

GoF писали на Java/C++/C#. JS-версии паттернов нужно переосмыслять, не натягивая 1:1.

Связанные темы

Ресурсы