Любимые курсы студентов магистратуры «инструменты разработки и анализа программ»
Любимые курсы студентов магистратуры «инструменты разработки и анализа программ»
Продолжаем рассказывать о любимых предметах наших магистрантов. В сегодняшней подборке — фаззинг ПО, конструирование компиляторов и дизайн языков программирования, которые читают на корпоративной программе компании YADRO.
  • Валерий Кечин
«Фаззинг программного обеспечения», преподаватель — Даниил Сергеевич Степанов

Мне понравились все узкоспециализированные курсы на нашей программе, но отдельно я хочу выделить фаззинг.

Вся информация на лекциях воспринималась очень комфортно, потому что Даниил Сергеевич делал акцент на реальном применении фаззинга в жизни без отрыва от реальности, как это часто бывает с научными подходами. При этом он смог объяснить сложные вещи простым языком, из-за чего студентам, не знакомым с данной областью, было легко освоиться и включиться в обучение. Мне уже приходилось использовать фаззинг в различных проектах, но интерес к занятиям от этого не пострадал. Курс содержал много новых и неочевидных вещей, а также Даниил Сергеевич особое внимание уделял подводным камням и тонкостям как при разработке фаззеров, так и при их использовании.

Практическая часть курса была интересной и суперсбалансированной. Помимо того, что удалось познакомиться с инструментами по типу AFL или Daikon на практике, мы также поэтапно, понимая необходимость каждой модификации, реализовывали свой фаззер. При этом каркас фаззера был подготовлен заранее, поэтому мы могли сосредоточиться только на содержательной части.
  • Егор Бронников
«Конструирование компиляторов», преподаватель — Николай Дмитриевич Кудасов

Одним из самых запоминающихся и сложных предметов для меня стал курс «Конструирование компиляторов». Он открыл мне внутреннюю кухню языков программирования и дал глубокое понимание того, как код, написанный на высокоуровневом языке, в итоге превращается в исполняемую программу.

Особенно интересным оказался блок про сборку мусора: мы подробно разобрали и классические алгоритмы (пометок, подсчета ссылок, копирования), и более продвинутые решения вроде алгоритма Бейкера или инкрементальной сборки. Занятия по многопоточному сборщику мусора для функциональных языков вообще стали настоящим открытием и показали многие нюансы и инженерные решения, о которых я раньше даже не задумывался. Также очень ценными оказались темы, связанные с SSA-представлением и анализом потока данных — это не только про компиляторы, но и вообще про то, как делать программы эффективнее и оптимальнее.

Отдельно хочется отметить подход преподавателя, Николая Дмитриевича Кудасова. Он не просто объяснял материал, а делал акцент на современных исследованиях и часто опирался на свежие научные статьи, что позволило взглянуть на тему с исследовательской точки зрения. Это вдохновляло копаться глубже, читать дополнительные источники и задавать вопросы.

Входной порог на курс далеко не самый низкий: желательно понимать работу памяти и иметь хотя бы базовое представление о компиляторах и устройстве языков программирования, а также функциональном подходе к программированию. Однако даже если вы чего-то не знаете, преподаватель всегда объяснит, направит, порекомендует статьи и другие материалы. В целом курс отлично сочетает теорию, практику и современный взгляд на тему, что и делает его по-настоящему классным, но сложным.
  • Алексей Трифонов
«Дизайн языков программирования», преподаватель — Михаил Анатольевич Беляев

Мой любимый курс — «Дизайн языков программирования». Он читается в третьем семестре, когда базовые вещи уже пройдены, и можно глубже погружаться в то, как на практике проектируют языки, компиляторы и среды исполнения. Курс захватывает различные темы — от парсеров и синтаксиса до полиморфизма, асинхронного исполнения и многого другого.

Михаил Анатольевич рассказывает о проектировании языков не только с теоретической стороны, но и показывает сложности применения теории на практике с помощью наглядных примеров. Он знает различные детали и особенности из опыта работы над Kotlin и Cangjie.

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

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