Skip to content

Latest commit

 

History

History
48 lines (27 loc) · 10.6 KB

preface.md

File metadata and controls

48 lines (27 loc) · 10.6 KB

Функционально-легкий JavaScript

Предисловие

Монада - просто моноид в категории эндофункторов.

Вы только что растерялись, верно? Не переживайте, я был таким же растерянным, когда увидел это впервые! Все эти термины имеют какое-то значение только для тех, кто уже знаком с Функциональным Программированием™ (ФП), и являются просто набором звуков для всех остальных.

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

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

К сожалению, я не являюсь членом закрытого клуба экспертов в ФП. Я никогда не занимался формальным изучением функционального программирования. И хотя я имею образование в области Computer Science и довольно неплохо разбираюсь в математике, математические выражения - это не то, как мой мозг понимает программирование. Я до сих пор не написал ни строчки кода на Scheme, Clojure, или Haskell. И конечно, я не олдскульный Лиспер.

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

Однако, мало-помалу кусочки пазла в моей голове начнали собираться в единую картину важных базовых концепций, которые выглядят такими естественными для любого настоящего функциональщика. Я познавал их медленно, через призму практики и экспериментов, а не формально и с использованием подобающей терминологии. Случалось ли вам столкнуться с тем, что то, чем вы давно и успешно пользуетесь оказывается имеет своё собственное название, о котором вы никогда не знали!?

Если да, то, возможно, в этом вы похожи на меня; Я слышал слова вроде "map-reduce" в различных контекстах, особенно в отношении "больших данных" на протяжении лет, не имея ни малейшего представления о том, что они действительно означают. Со временем я узнал, что делает функция map(..) -- до того момента я и представить себе не мог, что операции над массивами являются краеугольным камнем на пути функциональщика, и это делает их невероятно важными. Фактически, я знал, что делает map задолго до того, как узнал о его правильном названии.

Со временем, я начал собирать все эти фрагменты знаний в то, что позже назвал "Функционально-легким программированием" (ФЛП).

Миссия

Почему же знания о функциональном программировании так важны для среднего программиста, даже в подобной легкой форме?

В последние годы, я пришел к убеждению, в которое поверил очень глубоко. Настолько глубоко, что оно стало для меня сродни религии. Я убежден, что программирование - это в отражение человека в целом, а не про набор знаков и символов, которые мы привыкли называть кодом. Код - в первую очередь форма коммуникации, а программа, и её работа внутри компьютера - лишь сайдэффект (саркастический смешок).

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

Проклятье монады в том... что однажда поняв... ты теряешь способность объяснить кому-либо ещё.

Дуглас Крокфорд 2012 "Монады и Гонады"

https://www.youtube.com/watch?v=dkZFtimgAcM

Я надеюсь, что эта книга, "Возможно" разобьет это проклятье, несмотря на то что мы не будем упоминать о монадах почти до самого конца книги.

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

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

Конечно, чем лучше качество написания кода и его конститентность, тем проще его будет прочитать. Но проблема в том, что я - не идеальный автор. И некоторые части удаются мне лучше, чем другие. Но те части, которые требуют улучшения вовсе не обесценивают пользу от всей книги.

То же справедливо и для кода. Чем больше и чаще вы будете применять данные принципе, тем лучше будет ваш код. Даже используя их только 25% времени вы получите ощутимую выгоду. Используйте их 80% времени, вы увидите что выгода выросла в разы.

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

Добро пожаловать в это путешествие в самые полезные и практические основы ФП. Нам обоим есть чему поучиться!