source: content/posts/pirogov-o-fp.sxml@ 632f9bc

Last change on this file since 632f9bc was 632f9bc, checked in by Mikhail Kirillov <w96k@…>, on Jan 2, 2020 at 6:12:07 AM

Recreate blog in org-mode

  • Property mode set to 100644
File size: 19.0 KB
Line 
1;;; -*- scheme -*-
2
3(use-modules (haunt utils))
4
5`((title . "Алексей Пирогов про ФП")
6 (date . ,(string->date* "2019-03-22 12:00"))
7 (tags "Выдержка" "Hexlet" "ФП")
8 (summary . "Алексей Пирогов провел вебинар на тему «Функциональное
9программирование как парадигма: цели, способы, применимость».")
10
11 (content
12
13 (p "Алексей Пирогов провел вебинар на тему «Функциональное
14программирование как парадигма: цели, способы, применимость». Вебинар
15был транслирован на YouTube-канале Hexlet, автоматизированной площадке
16обучающей программированию.")
17
18 (p "Алексей Пирогов — хаскеллист, в прошлом питонист. Недавно он
19пополнил ряды преподавателей Hexlet и теперь готовит курс по Python на
20этой площадке. Он сделал мини-курс
21на " (a (@ (href "https://code-basics.ru/languages/python")) "Code-Basics")
22". Имеет канал
23в " (a (@ (href "https://t.me/brain%5Fdump%5Fetc")) "Telegram") " и на "
24(a (@ (href "https://www.youtube.com/channel/UCXk1kxTjZwluYLyijyKVsAA")) "Youtube") ",
25а также он является соорганизатором " (a (@ (href "http://prog.msk.ru/")) "«Клуба Программистов в Москве»")
26". В " (a (@ (href "https://hexlet-ru.slack.com/")) "слак-канале
27Hexlet") " Алексея можно найти под ником @astynax.")
28
29;;; Webinar
30 (p (@ (class "video"))
31 (iframe
32 (@ (src "https://youtube.com/embed/0GX4JRAGEzc"))))
33
34 (p "Этот вебинар рассматривает тему обзорно. Он будет полезен тем,
35 кто не знает, что такое ФП и зачем оно существует или знает о нем
36 недостаточно много. Далее представляю набор ключевых идей с
37 трансляции. Информация в том или ином виде сказана на трансляции.")
38
39
40 (h3 "Что такое ФП")
41
42 (p (i "Функциональное программирование") " — это отделение чистого кода от
43 кода с побочными эффектами.")
44
45(p "Чистые функции похожи на функции из математики. Они возвращают
46 всегда один и тот же результат при одинаковых аргументах. Это их
47 главное свойство. Они не затрагивают все то, что находится за их
48 телом. Не пишут в консоль, не трогают БД, не генерят случайные
49 числа.")
50
51(p "Функция, которая оперирует с “внешним миром”, то есть вне
52 своего тела, производит " (i "побочные эффекты") ". Побочные эффекты,
53 они же сайд-эффекты, это как правило операции ввода-вывода, хождение в
54 сеть, диск. Эти операции возможно делать в небольших участках
55 программы, а логику описывать функционально.")
56
57(p "В языках с единственной доступной парадигмой функционального
58 программирования есть четкое разделение чистого кода от
59 нечистого. Такое разделение всячески поощряется. В большинстве языков
60 с элементами функционального программирования нельзя проверить
61 является ли функция чистой или нет.")
62
63(h3 "Ключевые свойства")
64
65(ul
66 (li "Функции высшего порядка")
67 (li "Иммутабельные структуры данных"))
68
69(p (i "Функции высшего порядка") " — возможность возвращать и передавать
70 функцию в качестве аргумента.")
71
72(p (i "Имутабельные структуры данных") " — данные, которые нельзя изменить
73 на уровне языка. Оперируя над такими данными, мы не можем изменить
74 саму структуру, а можем вернуть новую версию этой
75 структуры. Иммутабельные структуры данных реализованы везде
76 по-разному. В современных компиляторах они оптимизированы и работают
77 быстро.")
78
79(h3 "Чистый код просто:")
80
81(ul
82 (li "Анализировать")
83
84 (p "Самое важное свойство ФП — способность рассуждать о
85 функциях. Человеку легче оперировать с тем, что находится вблизи
86 него. В ФП легче держать весь контекст функции в голове. Не надо
87 думать о глобальных переменных, которые могут быть изменены после
88 вызова функции. Посмотрев тело функции, можно легко понять все, что с
89 ней происходит.")
90
91 (li "Тестировать")
92
93 (p "Тут все просто. Если мы знаем, что функция всегда возвращает
94 одинаковое значение при одинаковых аргументах — значит ее легче
95 тестировать. Не нужно учитывать внешний мир, от которого она может
96 зависеть.")
97
98 (li "Переиспользовать")
99
100 (p "Чистый код легко переиспользовать, потому что мы можем код
101 спокойно копировать. Он не зависит от контекста.")
102
103 (li "Вычислять параллельно и/или конкурентно")
104
105 (p "Большинство проблем при запуске параллельных функций связаны с
106 разделением данных, которые изменяются. Мы вынуждены делать семафоры,
107 локи и так далее, потому что у нас есть процессы, которые могут менять
108 общие данные произвольно.")
109
110 (p "В чистых функциях, работающих с иммутабельными структурами
111 данных нет таких проблем. Мы можем отдать структуру десяти разным
112 процессам и они ее не смогут поменять."))
113
114(h3 "Удобно писать")
115
116(ul
117
118 (li "Компиляторы, парсеры, генераторы чего-либо")
119
120 (li "Сложную логику, ложащуюся на DSL (Например Sigma)")
121
122 (li "Высококонкурентный код (Например код на Erlang)")
123
124 (li "GUI (Например React)"))
125
126(h3 "Как научиться")
127
128(p "Чтобы научиться настоящему ФП, нужно изучить Haskell.")
129
130(h3 "Почему Haskell?")
131
132(p "Haskell – чистый функциональный язык, который позволяет изучить
133 ФП как подход и писать идиоматический для ФП код. Есть другой вариант
134 для изучения, например Standart ML, но этот язык мертвый. Haskell же
135 хорош тем, что у него есть живое сообщество. Помимо этого Haskell —
136 статически-типизированный язык, который заодно научит интересному
137 подходу к типам, отличающегося от типов в других языках.")
138
139(p "Функциональное программирование можно изучить в вузе под
140 руководством преподавателя на каком-то другом языке, хоть на
141 Python. Но здесь потребуется именно преподаватель.")
142
143(p "Фишка брать функциональный язык в том, что мы не сможем
144 схалявничать и использовать старые знакомые нам подходы. Уроки,
145 которые мы получим изучив Haskell, могут быть применены в повседневной
146 жизни потом, вне зависимости от языка программирования.")
147
148(h3 "Теория категорий")
149
150(p "Есть такой миф, что в Haskell не стоит лезть, если не знаешь
151 теорию категорий. Это неправда. Я из теории категорий примерно знаю
152 содержание первых двух страниц типичной книги и это мне это не мешает
153 писать production-код на Haskell.")
154
155(p "Теория категорий — это приятная штука для развития мозгов в
156 первую очередь, она даже не про программирование. Она может помочь
157 стать лучше как программист, а может и не помочь.")
158
159
160(h3 "Что еще из языков")
161
162(ul
163 (li "Изучите Clojure (ибо LISP и макросы)")
164
165 (p "Потому что современный живой лисп в функциональной парадигме.")
166
167 (li "Изучите Erlang (ибо акторы)")
168
169 (p "Erlang — не язык, который создавался, чтобы быть функциональным, а создавался для того, чтобы быть надежным. Функциональная парадигма в нем применяется, чтобы создавать устойчивые к отказам программы. Поэтому в языке не очень хорошо с выразительностью.")
170
171 (p "После Erlang можно пописать на Elixir. Он похож на Ruby с рельсами."))
172
173(h3 "Про парадигмы")
174
175(p "Существует мнение, что стоит изучать по одной новой парадигме в
176 год. Изучать их нужно на максимально ярких для этих парадигм
177 языках. Хотим изучить ФП — берем Haskell. Хотим изучить ООП — берем
178 SmallTalk. Хотим изучить Мета-программирование — берем лиспы. Хотим
179 логическое программирование — берем Prolog.")
180
181(p "Какая парадигма лучше всего? Никакая, все парадигмы клевые.")
182
183(p "Изучать новые парадигмы всегда сложно, но это интересно. Чем
184 больше мы сформируем отличных друг от друга навыков, тем будем ценнее
185 вне зависимости от того, что мы будем делать. Это происходит, потому
186 что разные парадигмы позволяют нам бо́льшими способами решить задачу.")
187
188(h3 "Для каких задач не подходит ФП")
189
190(p "Функциональные языки общего назначения являются версиями
191 лямбда-исчислений. Так как мы знаем, что лямбда-исчисление может
192 выразить любую вычислительную задачу, на ФП языке мы можно решить
193 любую задачу.")
194
195(p "Функциональные языки хорошо себя чувствуют в тех областях, где
196 можно использовать много памяти. Потому ФП не подходит для
197 встраиваемых систем и всему тому, что должно быть близко к железу.")
198(h3 "О типизации")
199
200("Лямбда-исчисление как таковое является безтиповым. Все типы — это
201 хитро-сделанные функции в оригинальном лямбда-исчислении.")
202
203(p "Очень круто пописать на типизированных функциональных
204 языках. Если я знаю, что в функцию будут приходить только строчки, а
205 выходить только числа, то это позволяется мне проще рассуждать о
206 функции. Не нужно думать, что придет что-то не то.")
207
208(p "Также круто пописать на динамически-типизированных
209 языках. Например Clojure.")
210
211(h3 "Про работу")
212
213(p "Все люди, которых я знаю, если хотят писать на Haskell, то
214 пишут на Haskell за деньги. Люди, которые ищут отговорки, продолжают
215 писать на чем-то ином. Я в этом убежден. Работа есть.")
216
217(p "Если технология не мертва, значит она кому-то нужна.")
218
219(p " Сейчас, когда можно работать удаленно, найти работу по Haskell
220 не составляет сложности. Если ты вчерашний студент, можно очень круто
221 устроиться. Раз в полгода приходят вакансии от Tesla идти в
222 магистратуру в Штаты, чтобы потом писать на Haskell ПО, которое
223 анализирует метрики приходящие с автомобиля.")
224
225(h3 "Ответы на вопросы")
226
227(h4 "Lisp — функциональный язык")
228
229(p "Это неправда. Лисп — не функциональный язык. Код на лиспе
230 содержит присваивание и измененных структур данных. Это процедурный
231 код.")
232
233(p "SICP — это не книжка по функциональному программированию. Она
234 использует некоторые моменты, свойственные ФП. Это книга про
235 информатику в общем. В самой книге присутствуют термин “Процедура”, а
236 не “Функция”.")
237
238(p "Clojure — это Lisp-подобный язык, но функциональный. Clojure вдохновлялась Lisp’ом на этапе зарождения концепций, но в отличии от него это functional-first язык. Все структуры данных иммутабельные. Разделения на чистые и грязные функции там нет, тем не менее в нем отсутствует практика злоупотреблять побочными эффектами.")
239
240(h4 "Применяются ли ФП-элементы в Python")
241
242(p "Применяются, но в Python принято их избегать
243 исторически. Использование только map, filter, reduce не делает код
244 функциональным. Это синтаксический сахар для пайплайнов, которые их
245 обрабатывают.")
246
247(h4 "ООП vs ФП")
248
249(p "Нельзя сказать что ООП очень сильно противоречит ФП. Они про
250 разное. Они не противоположны, они ортогональны. Что важнее для
251 создания продукта парадигма языка или библиотеки?")
252
253(p "Библиотеки, конечно же, важны, но приходится и самому писать
254 код. Лучше писать код, понимая, что ты делаешь. Порой сами библиотеки
255 могут быть плохо спроектированы и вам придется самому что-то
256 писать. Лучше иметь возможность смотреть на задачу шире.")
257
258(p "Если вдруг у кого-то работа связана только со склеиванием
259 библиотек и не приходится писать свой код, то не важно какая парадигма
260 будет использована. Но такое происходит редко.")
261
262(h3 "Материалы для изучения")
263(ul
264 (li (a (@ (href "https://www.manning.com/books/exploring-haskell"))
265 "Книга Exploring Haskell"))
266 (li (a (@ (href "https://stepik.org/course/75/"))
267 "Курс по Haskell на Stepic"))
268 (li (a (@ (href "https://www.ohaskell.guide/"))
269 "Книга О Haskell по-человечески")))
270
271(h3 "Задачи")
272(ul
273 (li (a (@ (href "https://www.codewars.com/"))
274 "Codewars"))
275 (li (a (@ (href "http://www.4clojure.com/"))
276 "4clojure")))
277
278(h3 "Другие ссылки")
279
280(ul
281 (li (a (@ (href "https://www.meetup.com/Moscow-Clojure-Script-Meetup/"))
282 "Clojure DOJO"))
283 (li (a (@ (href "https://t.me/haskellru"))
284 "Сообщество Haskell в Telegram")))
285
286(h3 "Заключение")
287
288(p "На стриме присутствовали звуковые искажения, которые порой
289 останавливали повествование Алексея. Надеюсь что-нибудь с этим
290 сделают. Помимо этого у Натальи, представляющей докладчика ведущей, на
291 записи присутствовало эхо.")
292
293(p "Тем не менее спасибо Алексею и команде Hexlet за
294 вебинар. Человека для создания курса по питону наверное лучше не
295 найти, с нетерпением жду нового материала от него. Было бы круто
296 дополнить раздел с книгами.")))
Note: See TracBrowser for help on using the repository browser.