Курс по функциональному программированию от ИТМО

Замечательный курс по функциональному программированию  от Университета ИТМО доставляет острых ощущений: лекции интересные и сложные, как и задания для самостоятельного решения.
Курс обозревает концепции функционального программирования: рекурсию, функции высшего порядка, свёртку и отображение последовательностей, ленивые вычисления, метапрограммирование (макросы) и остальное — всё на Common Lisp, одном из популярных диалектов семейства Lisp.

Lisp

Сам лисп вызвал у меня разрыв шаблона, всё, что я знал до этого — это то, что язык в основном состоит из скобочек. Оказалось, что кроме этого, лисп древнее мамонтов (первая версия появилась в 1958-м), но при этом гибкий и мощный. У меня осталось впечатление, что я прикоснулся к чему-то хтоническому, на этом языке могли бы писать жители других измерений из миров Лавкрафта.

Скобок действительно много, в них легко запутаться. Впрочем, со временем, синтаксис лиспа начинает казаться изящным, а необходимость громоздить повсюду скобки перестаёт бесить — понимаешь, что за счёт вложенных s-форм и достигается такая гибкость.

Сдвиг парадигмы начинается с польской нотации и встроенной поддержки дробей:

Ну а дальше открывается ящик Пандоры, и всё, что ты знал про map/reduce и модную лямбда-функциональщину оказывается придуманным лет так за тридцать-сорок до сегодняшнего момента.

За бортом курса остались такие моменты языка, как тестирование, обработка исключений и ООП — но для понимания ФП это и не нужно. Код писал в Atom (так себе удовольствие, но после поиска редактора оказалось, что это тоже что-то из области героического: можно настроить vim/emacs, а можно купить коммерческий). Что получалось, можно посмотреть здесь.

Обучение

Слайды с лекции по функциональному программированию

Отрывок лекции

Лектор (Алексей Валерьевич Гирик) объясняет грамотно и доходчиво. Слайды понятные, иногда в тему встречаются даже шутки юмора. Смотреть комфортно, можно в ускоренном режиме, но это лишнее: скорее всего, придётся останавливать, и вникать в код на экране.

Решать и сдавать задачи предлагается в специальном онлайн-редакторе, который пропускал без проблем простые задания, а со сложными часто приходилось заниматься отладкой и поиском невидимых багов (редактор падает без вывода ошибки). Оказалось, что решения запускаются интерпретатором SBCL, а в самом курсе примеры приводятся на CLISP. SBCL более строгий к коду: необъявленные и неиспользованные переменные (плюс ещё некоторые нюансы) выбрасывают ошибки/замечания, а это лишний вывод, и решение, естественно, не проходит. Об этом я узнал на форуме курса довольно поздно — это бы сэкономило кучу времени.
Условие задачи, которую нужно решить для недельного зачёта, меняется каждые несколько часов, и предыдущее уже невозможно выбрать и сдать. Я узнал об этом случайно под конец программы, и это стало неприятным сюрпризом: пишешь решение четыре часа, а его уже невозможно сдать, потому что задача теперь другая, и всё по новой. Повторить n раз.
Попыток тоже ограниченное число, но их всегда хватало. К тому же, на последних неделях их количество увеличили.

Ещё редактор изредка повисал намертво — новые варианты не отправлялись, и интерфейс не оживал даже после выхода/входа (другой браузер тоже). Проходило само собой по необъяснимому принципу.

Решать задачи иногда было настоящим вызовом, под конец курса я часто тратил по полдня на их решение. На последних темах про макросы мозги уже закипали от подобной эзотерики.

Макросы на Common Lisp

Макросы на Common Lisp

Над одной задачей я бился особенно долго: на моей машине решение прекрасно проходило все тесты, а в онлайн-редакторе нет. Чтобы разобраться, я написал на форуме, мне ответил сам лектор (!) и в переписке по почте объяснил, где я неправ («в коде», нужно лучше писать тесты). Я переписывал решения по нескольку раз — и в итоге решил все варианты, но они не проходили онлайн-проверку.
Решение не продвигалась, критичный тест не придумывался, попытки тратились, и я решил отдохнуть денёк от учёбы. В итоге я всё-таки сдал эту задачу как в кино, с последней попытки, когда у меня над головой зажглась лампочка, и я понял, что надо исправить.

В общем

Мне понравилось, я закрепил новые практики написания кода (reduce/map/filter и использование лямбда-функций где возможно). Понимание типовых задач стало другим: теперь хочется красиво отобразить/свернуть список, вместо того, чтобы городить очередной скучный цикл.

Курс стоил времени и усилий. Сертификат, кстати, выдали молниеносно — через пару недель после окончания.

У курса недавно вышло продолжение — Функциональное программирование: специальный курс, с углубённым изучением темы и использованием Haskell. Дата старта ожидается.