1 | #+TITLE: Алексей Пирогов про ФП
|
---|
2 | #+DATE: <2019-03-22 Пт>
|
---|
3 | #+LANGUAGE: ru
|
---|
4 |
|
---|
5 | * Алексей Пирогов про ФП
|
---|
6 |
|
---|
7 | Алексей Пирогов провел вебинар на тему «Функциональное
|
---|
8 | программирование как парадигма: цели, способы, применимость». Вебинар
|
---|
9 | был транслирован на YouTube-канале Hexlet, автоматизированной площадке
|
---|
10 | обучающей программированию.
|
---|
11 |
|
---|
12 | Алексей Пирогов — хаскеллист, в прошлом питонист. Недавно он пополнил
|
---|
13 | ряды преподавателей Hexlet и теперь готовит курс по Python на этой
|
---|
14 | площадке. Он сделал мини-курс на [[https://code-basics.ru/languages/python][Code-Basics]]. Имеет канал в [[https://t.me/brain%255Fdump%255Fetc][Telegram]] и
|
---|
15 | на [[https://www.youtube.com/channel/UCXk1kxTjZwluYLyijyKVsAA][Youtube]], а также он является соорганизатором [[http://prog.msk.ru/][«Клуба Программистов в
|
---|
16 | Москве»]]. В [[https://hexlet-ru.slack.com/][слак-канале Hexlet]] Алексея можно найти под ником @astynax.
|
---|
17 |
|
---|
18 | in:0GX4JRAGEzc
|
---|
19 |
|
---|
20 |
|
---|
21 | Этот вебинар рассматривает тему обзорно. Он будет полезен тем, кто не
|
---|
22 | знает, что такое ФП и зачем оно существует или знает о нем
|
---|
23 | недостаточно много. Далее представляю набор ключевых идей с
|
---|
24 | трансляции. Информация в том или ином виде сказана на трансляции.
|
---|
25 |
|
---|
26 | ** Что такое ФП
|
---|
27 | /Функциональное программирование/ — это отделение чистого кода от кода
|
---|
28 | с побочными эффектами.
|
---|
29 |
|
---|
30 | Чистые функции похожи на функции из математики. Они возвращают всегда
|
---|
31 | один и тот же результат при одинаковых аргументах. Это их главное
|
---|
32 | свойство. Они не затрагивают все то, что находится за их телом. Не
|
---|
33 | пишут в консоль, не трогают БД, не генерят случайные числа.
|
---|
34 |
|
---|
35 | Функция, которая оперирует с “внешним миром”, то есть вне своего тела,
|
---|
36 | производит /побочные эффекты/. Побочные эффекты, они же сайд-эффекты,
|
---|
37 | это как правило операции ввода-вывода, хождение в сеть, диск. Эти
|
---|
38 | операции возможно делать в небольших участках программы, а логику
|
---|
39 | описывать функционально.
|
---|
40 |
|
---|
41 | В языках с единственной доступной парадигмой функционального
|
---|
42 | программирования есть четкое разделение чистого кода от
|
---|
43 | нечистого. Такое разделение всячески поощряется. В большинстве языков
|
---|
44 | с элементами функционального программирования нельзя проверить
|
---|
45 | является ли функция чистой или нет.
|
---|
46 |
|
---|
47 | ** Ключевые свойства
|
---|
48 | - Функции высшего порядка
|
---|
49 | - Иммутабельные структуры данных
|
---|
50 |
|
---|
51 | /Функции высшего порядка/ — возможность возвращать и передавать функцию
|
---|
52 | в качестве аргумента.
|
---|
53 |
|
---|
54 | /Имутабельные структуры данных/ — данные, которые нельзя изменить на
|
---|
55 | уровне языка. Оперируя над такими данными, мы не можем изменить саму
|
---|
56 | структуру, а можем вернуть новую версию этой структуры. Иммутабельные
|
---|
57 | структуры данных реализованы везде по-разному. В современных
|
---|
58 | компиляторах они оптимизированы и работают быстро.
|
---|
59 |
|
---|
60 | ** Чистый код просто:
|
---|
61 |
|
---|
62 | - Анализировать :: Самое важное свойство ФП — способность
|
---|
63 | рассуждать о функциях. Человеку легче
|
---|
64 | оперировать с тем, что находится вблизи него. В
|
---|
65 | ФП легче держать весь контекст функции в
|
---|
66 | голове. Не надо думать о глобальных переменных,
|
---|
67 | которые могут быть изменены после вызова
|
---|
68 | функции. Посмотрев тело функции, можно легко
|
---|
69 | понять все, что с ней происходит.
|
---|
70 | - Тестировать :: Тут все просто. Если мы знаем, что функция всегда
|
---|
71 | возвращает одинаковое значение при одинаковых
|
---|
72 | аргументах — значит ее легче тестировать. Не
|
---|
73 | нужно учитывать внешний мир, от которого она
|
---|
74 | может зависеть.
|
---|
75 | - Переиспользовать :: Чистый код легко переиспользовать, потому
|
---|
76 | что мы можем код спокойно копировать. Он не зависит от
|
---|
77 | контекста.
|
---|
78 | - Вычислять параллельно и/или конкурентно :: Большинство проблем
|
---|
79 | при запуске параллельных функций связаны с разделением
|
---|
80 | данных, которые изменяются. Мы вынуждены делать семафоры,
|
---|
81 | локи и так далее, потому что у нас есть процессы, которые
|
---|
82 | могут менять общие данные произвольно. \\ \\
|
---|
83 | В чистых функциях, работающих с иммутабельными структурами
|
---|
84 | данных нет таких проблем. Мы можем отдать структуру десяти
|
---|
85 | разным процессам и они ее не смогут поменять.
|
---|
86 |
|
---|
87 | ** Удобно писать
|
---|
88 | - Компиляторы, парсеры, генераторы чего-либо
|
---|
89 | - Сложную логику, ложащуюся на DSL (Например Sigma)
|
---|
90 | - Высококонкурентный код (Например код на Erlang)
|
---|
91 | - GUI (Например React)
|
---|
92 |
|
---|
93 | ** Как научиться
|
---|
94 | Чтобы научиться настоящему ФП, нужно изучить Haskell.
|
---|
95 |
|
---|
96 | ** Почему Haskell?
|
---|
97 | Haskell – чистый функциональный язык, который позволяет изучить ФП как
|
---|
98 | подход и писать идиоматический для ФП код. Есть другой вариант для
|
---|
99 | изучения, например Standart ML, но этот язык мертвый. Haskell же хорош
|
---|
100 | тем, что у него есть живое сообщество. Помимо этого Haskell —
|
---|
101 | статически-типизированный язык, который заодно научит интересному
|
---|
102 | подходу к типам, отличающегося от типов в других языках.
|
---|
103 |
|
---|
104 | Функциональное программирование можно изучить в вузе под руководством
|
---|
105 | преподавателя на каком-то другом языке, хоть на Python. Но здесь
|
---|
106 | потребуется именно преподаватель.
|
---|
107 |
|
---|
108 | Фишка брать функциональный язык в том, что мы не сможем схалявничать и
|
---|
109 | использовать старые знакомые нам подходы. Уроки, которые мы получим
|
---|
110 | изучив Haskell, могут быть применены в повседневной жизни потом, вне
|
---|
111 | зависимости от языка программирования.
|
---|
112 |
|
---|
113 | ** Теория категорий
|
---|
114 | Есть такой миф, что в Haskell не стоит лезть, если не знаешь теорию
|
---|
115 | категорий. Это неправда. Я из теории категорий примерно знаю
|
---|
116 | содержание первых двух страниц типичной книги и это мне это не мешает
|
---|
117 | писать production-код на Haskell.
|
---|
118 |
|
---|
119 | Теория категорий — это приятная штука для развития мозгов в первую
|
---|
120 | очередь, она даже не про программирование. Она может помочь стать
|
---|
121 | лучше как программист, а может и не помочь.
|
---|
122 |
|
---|
123 | ** Что еще из языков
|
---|
124 | - Clojure :: Потому что современный живой лисп в функциональной
|
---|
125 | парадигме.
|
---|
126 | - Erlang :: Erlang — не язык, который создавался, чтобы быть
|
---|
127 | функциональным, а создавался для того, чтобы быть
|
---|
128 | надежным. Функциональная парадигма в нем применяется,
|
---|
129 | чтобы создавать устойчивые к отказам программы. Поэтому
|
---|
130 | в языке не очень хорошо с выразительностью. \\ \\
|
---|
131 | После Erlang можно пописать на Elixir. Он похож на Ruby
|
---|
132 | с рельсами.
|
---|
133 |
|
---|
134 | ** Про парадигмы
|
---|
135 | Существует мнение, что стоит изучать по одной новой парадигме в
|
---|
136 | год. Изучать их нужно на максимально ярких для этих парадигм
|
---|
137 | языках. Хотим изучить ФП — берем Haskell. Хотим изучить ООП — берем
|
---|
138 | SmallTalk. Хотим изучить Мета-программирование — берем лиспы. Хотим
|
---|
139 | логическое программирование — берем Prolog.
|
---|
140 |
|
---|
141 | Какая парадигма лучше всего? Никакая, все парадигмы клевые.
|
---|
142 |
|
---|
143 | Изучать новые парадигмы всегда сложно, но это интересно. Чем больше мы
|
---|
144 | сформируем отличных друг от друга навыков, тем будем ценнее вне
|
---|
145 | зависимости от того, что мы будем делать. Это происходит, потому что
|
---|
146 | разные парадигмы позволяют нам бо́льшими способами решить задачу.
|
---|
147 |
|
---|
148 | ** Для каких задач не подходит ФП
|
---|
149 | Функциональные языки общего назначения являются версиями
|
---|
150 | лямбда-исчислений. Так как мы знаем, что лямбда-исчисление может
|
---|
151 | выразить любую вычислительную задачу, на ФП языке мы можно решить
|
---|
152 | любую задачу.
|
---|
153 |
|
---|
154 | Функциональные языки хорошо себя чувствуют в тех областях, где можно
|
---|
155 | использовать много памяти. Потому ФП не подходит для встраиваемых
|
---|
156 | систем и всему тому, что должно быть близко к железу.
|
---|
157 |
|
---|
158 | ** О типизации
|
---|
159 | Лямбда-исчисление как таковое является безтиповым. Все типы — это
|
---|
160 | хитро-сделанные функции в оригинальном лямбда-исчислении.
|
---|
161 |
|
---|
162 | Очень круто пописать на типизированных функциональных языках. Если я
|
---|
163 | знаю, что в функцию будут приходить только строчки, а выходить только
|
---|
164 | числа, то это позволяется мне проще рассуждать о функции. Не нужно
|
---|
165 | думать, что придет что-то не то.
|
---|
166 |
|
---|
167 | Также круто пописать на динамически-типизированных языках. Например
|
---|
168 | Clojure.
|
---|
169 |
|
---|
170 | ** Про работу
|
---|
171 | Все люди, которых я знаю, если хотят писать на Haskell, то пишут на
|
---|
172 | Haskell за деньги. Люди, которые ищут отговорки, продолжают писать на
|
---|
173 | чем-то ином. Я в этом убежден. Работа есть.
|
---|
174 |
|
---|
175 | Если технология не мертва, значит она кому-то нужна.
|
---|
176 |
|
---|
177 | Сейчас, когда можно работать удаленно, найти работу по Haskell не
|
---|
178 | составляет сложности. Если ты вчерашний студент, можно очень круто
|
---|
179 | устроиться. Раз в полгода приходят вакансии от Tesla идти в
|
---|
180 | магистратуру в Штаты, чтобы потом писать на Haskell ПО, которое
|
---|
181 | анализирует метрики приходящие с автомобиля.
|
---|
182 |
|
---|
183 | ** Ответы на вопросы
|
---|
184 | *** Lisp — функциональный язык
|
---|
185 | Это неправда. Лисп — не функциональный язык. Код на лиспе содержит
|
---|
186 | присваивание и измененных структур данных. Это процедурный код.
|
---|
187 |
|
---|
188 | SICP — это не книжка по функциональному программированию. Она
|
---|
189 | использует некоторые моменты, свойственные ФП. Это книга про
|
---|
190 | информатику в общем. В самой книге присутствуют термин “Процедура”, а
|
---|
191 | не “Функция”.
|
---|
192 |
|
---|
193 | Clojure — это Lisp-подобный язык, но функциональный. Clojure
|
---|
194 | вдохновлялась Lisp’ом на этапе зарождения концепций, но в отличии от
|
---|
195 | него это functional-first язык. Все структуры данных
|
---|
196 | иммутабельные. Разделения на чистые и грязные функции там нет, тем не
|
---|
197 | менее в нем отсутствует практика злоупотреблять побочными эффектами.
|
---|
198 |
|
---|
199 | *** Применяются ли ФП-элементы в Python
|
---|
200 | Применяются, но в Python принято их избегать
|
---|
201 | исторически. Использование только map, filter, reduce не делает код
|
---|
202 | функциональным. Это синтаксический сахар для пайплайнов, которые их
|
---|
203 | обрабатывают.
|
---|
204 |
|
---|
205 | *** ООП vs ФП
|
---|
206 | Нельзя сказать что ООП очень сильно противоречит ФП. Они про
|
---|
207 | разное. Они не противоположны, они ортогональны. Что важнее для
|
---|
208 | создания продукта парадигма языка или библиотеки?
|
---|
209 |
|
---|
210 | Библиотеки, конечно же, важны, но приходится и самому писать
|
---|
211 | код. Лучше писать код, понимая, что ты делаешь. Порой сами библиотеки
|
---|
212 | могут быть плохо спроектированы и вам придется самому что-то
|
---|
213 | писать. Лучше иметь возможность смотреть на задачу шире.
|
---|
214 |
|
---|
215 | Если вдруг у кого-то работа связана только со склеиванием библиотек и
|
---|
216 | не приходится писать свой код, то не важно какая парадигма будет
|
---|
217 | использована. Но такое происходит редко.
|
---|
218 |
|
---|
219 | ** Материалы для изучения
|
---|
220 | - [[https://www.manning.com/books/exploring-haskell][Книга Exploring Haskell]]
|
---|
221 | - [[https://stepik.org/course/75/][Курс по Haskell на Stepic]]
|
---|
222 | - [[https://www.ohaskell.guide/][Книга О Haskell по-человечески]]
|
---|
223 |
|
---|
224 | ** Задачи
|
---|
225 | - [[https://www.codewars.com/][Codewars]]
|
---|
226 | - [[http://www.4clojure.com/][4clojure]]
|
---|
227 |
|
---|
228 | ** Другие ссылки
|
---|
229 | - [[https://www.meetup.com/Moscow-Clojure-Script-Meetup/][Clojure DOJO]]
|
---|
230 | - [[https://t.me/haskellru][Сообщество Haskell в Telegram]]
|
---|
231 |
|
---|
232 | ** Заключение
|
---|
233 |
|
---|
234 | На стриме присутствовали звуковые искажения, которые порой
|
---|
235 | останавливали повествование Алексея. Надеюсь что-нибудь с этим
|
---|
236 | сделают. Помимо этого у Натальи, представляющей докладчика ведущей, на
|
---|
237 | записи присутствовало эхо.
|
---|
238 |
|
---|
239 | Тем не менее спасибо Алексею и команде Hexlet за вебинар. Человека для
|
---|
240 | создания курса по питону наверное лучше не найти, с нетерпением жду
|
---|
241 | нового материала от него. Было бы круто дополнить раздел с книгами.
|
---|