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/")) "слак-канале
|
---|
27 | Hexlet") " Алексея можно найти под ником @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 | дополнить раздел с книгами.")))
|
---|