Замечательный курс по функциональному программированию от Университета ИТМО доставляет острых ощущений: лекции интересные и сложные, как и задания для самостоятельного решения.
Курс обозревает концепции функционального программирования: рекурсию, функции высшего порядка, свёртку и отображение последовательностей, ленивые вычисления, метапрограммирование (макросы) и остальное — всё на Common Lisp
, одном из популярных диалектов семейства Lisp
.
Lisp
Сам лисп вызвал у меня разрыв шаблона, всё, что я знал до этого — это то, что язык в основном состоит из скобочек. Оказалось, что кроме этого, лисп древнее мамонтов (первая версия появилась в 1958-м), но при этом гибкий и мощный. У меня осталось впечатление, что я прикоснулся к чему-то хтоническому, на этом языке могли бы писать жители других измерений из миров Лавкрафта.
Скобок действительно много, в них легко запутаться. Впрочем, со временем, синтаксис лиспа начинает казаться изящным, а необходимость громоздить повсюду скобки перестаёт бесить — понимаешь, что за счёт вложенных s-форм и достигается такая гибкость.
Сдвиг парадигмы начинается с польской нотации и встроенной поддержки дробей:
1 2 3 4 5 6 7 | ; Польская (префиксная) нотация (- 8 3) ;; == 8 - 3 (* 4 26) ;; == 4 * 26 ; Дроби (print (+ 3/4 7/9)) ;; 3/4 + 7/9 55/36 |
Ну а дальше открывается ящик Пандоры, и всё, что ты знал про map/reduce и модную лямбда-функциональщину оказывается придуманным лет так за тридцать-сорок до сегодняшнего момента.
За бортом курса остались такие моменты языка, как тестирование, обработка исключений и ООП — но для понимания ФП это и не нужно. Код писал в Atom (так себе удовольствие, но после поиска редактора оказалось, что это тоже что-то из области героического: можно настроить vim/emacs, а можно купить коммерческий). Что получалось, можно посмотреть здесь.
Обучение
Лектор (Алексей Валерьевич Гирик) объясняет грамотно и доходчиво. Слайды понятные, иногда в тему встречаются даже шутки юмора. Смотреть комфортно, можно в ускоренном режиме, но это лишнее: скорее всего, придётся останавливать, и вникать в код на экране.
Решать и сдавать задачи предлагается в специальном онлайн-редакторе, который пропускал без проблем простые задания, а со сложными часто приходилось заниматься отладкой и поиском невидимых багов (редактор падает без вывода ошибки). Оказалось, что решения запускаются интерпретатором SBCL
, а в самом курсе примеры приводятся на CLISP
. SBCL
более строгий к коду: необъявленные и неиспользованные переменные (плюс ещё некоторые нюансы) выбрасывают ошибки/замечания, а это лишний вывод, и решение, естественно, не проходит. Об этом я узнал на форуме курса довольно поздно — это бы сэкономило кучу времени.
Условие задачи, которую нужно решить для недельного зачёта, меняется каждые несколько часов, и предыдущее уже невозможно выбрать и сдать. Я узнал об этом случайно под конец программы, и это стало неприятным сюрпризом: пишешь решение четыре часа, а его уже невозможно сдать, потому что задача теперь другая, и всё по новой. Повторить n раз.
Попыток тоже ограниченное число, но их всегда хватало. К тому же, на последних неделях их количество увеличили.
Ещё редактор изредка повисал намертво — новые варианты не отправлялись, и интерфейс не оживал даже после выхода/входа (другой браузер тоже). Проходило само собой по необъяснимому принципу.
Решать задачи иногда было настоящим вызовом, под конец курса я часто тратил по полдня на их решение. На последних темах про макросы мозги уже закипали от подобной эзотерики.
Над одной задачей я бился особенно долго: на моей машине решение прекрасно проходило все тесты, а в онлайн-редакторе нет. Чтобы разобраться, я написал на форуме, мне ответил сам лектор (!) и в переписке по почте объяснил, где я неправ («в коде», нужно лучше писать тесты). Я переписывал решения по нескольку раз — и в итоге решил все варианты, но они не проходили онлайн-проверку.
Решение не продвигалась, критичный тест не придумывался, попытки тратились, и я решил отдохнуть денёк от учёбы. В итоге я всё-таки сдал эту задачу как в кино, с последней попытки, когда у меня над головой зажглась лампочка, и я понял, что надо исправить.
В общем
Мне понравилось, я закрепил новые практики написания кода (reduce/map/filter и использование лямбда-функций где возможно). Понимание типовых задач стало другим: теперь хочется красиво отобразить/свернуть список, вместо того, чтобы городить очередной скучный цикл.
Курс стоил времени и усилий. Сертификат, кстати, выдали молниеносно — через пару недель после окончания.
У курса недавно вышло продолжение — Функциональное программирование: специальный курс, с углубённым изучением темы и использованием Haskell
. Дата старта ожидается.
- Посмотреть на сертификат
- Почитать про другой курс на openedu.ru — БД от СПбГУ