source: content/posts/pirogov-o-fp.org@ ba742f0

Last change on this file since ba742f0 was ba742f0, checked in by Mikhail Kirillov <w96k@…>, on Jan 11, 2020 at 4:49:09 AM

Port pirogov post

  • Property mode set to 100644
File size: 18.0 KB
Line 
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
18in: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?
97Haskell – чистый функциональный язык, который позволяет изучить ФП как
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. Хотим изучить ООП — берем
138SmallTalk. Хотим изучить Мета-программирование — берем лиспы. Хотим
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Также круто пописать на динамически-типизированных языках. Например
168Clojure.
169
170** Про работу
171Все люди, которых я знаю, если хотят писать на Haskell, то пишут на
172Haskell за деньги. Люди, которые ищут отговорки, продолжают писать на
173чем-то ином. Я в этом убежден. Работа есть.
174
175Если технология не мертва, значит она кому-то нужна.
176
177Сейчас, когда можно работать удаленно, найти работу по Haskell не
178составляет сложности. Если ты вчерашний студент, можно очень круто
179устроиться. Раз в полгода приходят вакансии от Tesla идти в
180магистратуру в Штаты, чтобы потом писать на Haskell ПО, которое
181анализирует метрики приходящие с автомобиля.
182
183** Ответы на вопросы
184*** Lisp — функциональный язык
185Это неправда. Лисп — не функциональный язык. Код на лиспе содержит
186присваивание и измененных структур данных. Это процедурный код.
187
188SICP — это не книжка по функциональному программированию. Она
189использует некоторые моменты, свойственные ФП. Это книга про
190информатику в общем. В самой книге присутствуют термин “Процедура”, а
191не “Функция”.
192
193Clojure — это 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нового материала от него. Было бы круто дополнить раздел с книгами.
Note: See TracBrowser for help on using the repository browser.