Сошников Д.В.1, Кириленко Я.А.2, Полозов В.С.3
1 НИУ ВШЭ/МАИ, доцент, Майкрософт Россия, эксперт по разработке ПО,
dmitri @soshnikov. com 2 СПбГУ ст.преп., j ake @ math. spbu.ru 3 СПбГУ ст.преп., [email protected]
Опыт использования языка F# в преподавании в российских университетах
КЛЮЧЕВЫЕ СЛОВА:
F#, функциональное программирование, МАИ, НИУ ВШЭ, СПбГУ, Visual Studio, Haskell.
АННОТАЦИЯ:
В статье рассказывается про молодой мультипарадигмальный язык программирования F# и про опыт его использования в преподавании курсов программирования (в особенности функционального программирования) в нескольких российских вузах.
F# - сравнительно молодой мультипарадигмальный язык программирования, который менее, чем за 10 лет своего существования приобрел существенную популярность. Статья описывает опыт использования F# при преподавании различных дисциплин на кафедрах системного программирования СПбГУ управления разработкой программного обеспечение НИУ ВШЭ и вычислительной математики и программирования МАИ.
О языке F#
Язык F# первоначально был создан в Microsoft Research как попытка реализации функционального языка программирования на платформе Microsoft .NET. Примерно в то же время существовали реализации SML.NET и даже Haskell, но вскоре стало очевидным, что для полноценной интероперабельности с .NET необходимо создание энергичного функционально-императивного языка на основе объектно-ориентированной модели .NET - и появился язык F#. За основу F# был взять популярный функциональный язык OCaml.
В 2010 г. язык сменил статус с исследовательского на промышленный и был включен в состав Visual Studio 2010. В настоящее время разработкой языка занимаются исследовательская группа в Microsoft Research Cambridge (во главе с создателем языка Доном Саймом) и продуктовая группа в штаб-квартире Майкрософт в Редмонде. Включение языка в промышленную среду разработки ПО Visual Studio положила начало существенному росту популярности языка - на данный момент в индексе популярности языков программирования TIOBE index он занимает 24 место, опережая Common
Lisp (33 место), Scheme (35 место), Scala (36 место), Prolog (38 место), Erlang (43 место) и Haskell (46 место).
Особенности использования F# в преподавании
Будучи мультипарадигмальным языком, F# тем не менее позиционируется как преимущественно функциональный язык, имеющий восходящий к семейству языков ML синтаксис, апеллирующий к профессиональному сообществу функциональных программистов. Поэтому имеет смысл рассматривать F# в преподавании языков программирования в вузе в двух контекстах:
1. Как базовый язык или один из языков (наряду с Haskell или LISP) в преподавании курсов функционального программирования (соответствующий опыт есть в НИУ ВШЭ, МАИ и ряде других вузов)
2. Как базовый язык для преподавания всего цикла дисциплин программирования (такой опыт есть в СПбГУ, он больше всего походит на использование Scheme или Python в качестве базового языка в MIT, см., например, [2])
В первом случае имеет смысл концентрироваться на функциональных аспектах языка, не излагая студентам императивные конструкции языка и даже запрещая их использование, во втором - мультипарадигмальность языка как раз позволяет изложить на основе одного синтаксиса весь спектр используемых понятий, в то же время приучая студентов к хорошему преимущественно-функциональному стилю программирования. Мультипрадигмальность языка
Язык F# позволяет обучать различным парадигмам программирования. Императивная, функциональная, объектно-ориентированная, событийно-ориентированная — все они легко демонстрируются на простых кратких примерах. Конечно, если давать F# как второй язык после традиционных императивных языков (C, C#), есть опасность "скатывания" в императивную парадигму. Как решение данной проблемы, предлагается следить за качеством кода, что обязательно происходит, когда язык используется на практикуме по программированию - тогда можно своевременно пресекать пагубную практику и помогать студентам решать задачи в более естественном для F# стиле. Кроме того, правильно выстроенная программа от простых задач, ориентированных на знакомство с подходом и базовыми конструкциями, сильно помогают студентам отстраниться от императивного стиля.
При использовании F# как первого языка, рекомендуется начинать с функциональной парадигмы. Чем раньше познакомить студентов с ФП -тем меньшим шоком для них потом будет, что программы можно писать кратко, ёмко и красиво.
Наличие инструментов разработки
Для F# существует множество инструментов разработки. На платформе Windows естественным выбором становится Visual Studio 20102013, которая доступна студентам по программе DreamSpark [3]. Для UNIX-
подобных систем (включая MacOS X) хорошим выбором будет среда MonoDevelop, включающая в себя F# в базовой поставке. Также возможно использовать свободно-распространяемые среды разработки в интеграции, например, с текстовым редактором emacs. Наконец, возможно использовать подавляющее большинство возможностей языка и среды непосредственно через бразуер в проекте http : //tryfsharp . org.
Наличие учебных материалов
В настоящее время по языку F# имеются две русскоязычные книги [4] и [5], а также множество хороших англоязычных книг [6-10]. Кроме того, имеется курс видео-лекций одного из авторов в интернет-университете информационных технологий ИНТУИТ [11], построенных по мотивам преподавания курса функционального программирования на факультете Инноваций и высоких технологий (ФИВТ) МФТИ.
Книга одного из авторов статьи [4] представляет собой краткое изложение идей функционального программирования на основе языка F#, а также содержит много рецептов практического использования языка для решения различных задач - от анализа и графического представления данных до создания веб-приложений и приложений для Windows Phone. Книга [5] является переводной, представляет собой полное и исчерпывающее изложения синтаксиса и возможностей F# и рекомендуется как дополнительное справочное пособие. Кроме того, можно воспользоваться имеющимся в электронном виде пособии по языку OCaml [12].
Ни одна из описанных книг не является учебником по функциональному программированию в академическом смысле этого слова, поэтому для изложения теории необходимо будет воспользоваться другими материалами, например, классическим сборником [13] (на основе которого были разработаны курсы функционального программирования в МФТИ и НИУ ВШЭ).
Опыт использования F# в СПбГУ
Педагогические традиции и подход кафедры системного программирования СПбГУ диктуют особые требования к методике изучения языка программирования и накладывают ограничение на его выбор. Необходимо готовить практикующих программистов, способных решать поставленные задачи, оптимально выбирая соответствующие средства. В случае ограничения в выборе языка, библиотек, платформы, выпускники должны уметь быстро включиться в разработку проекта, максимально используя возможности доступного инструментария.
Поэтому в преподавании особое место отводится изучению фундаментальных основ языков программирования и выработке навыков их использования. В том числе, студенты учатся различным парадигмам программирования, изучают основные алгоритмы и структуры данных с разных точек зрения. Разнообразие преподаваемых парадигм и языков используется для развития навыков сравнительного анализа.
Примерно с 1998 г и до сих пор на кафедре системного программирования в исследовательских проектах используется язык программирования Objective Caml. Поэтому появление F# в первых курсовых работах в начале 2007, когда .NET 2.0 доказал себя успешной промышленной платформой разработки, было вполне естественным.
Первый курс по выбору появился на кафедре в 2008/2009 учебном году и быстро завоевал интерес студентов, просуществовав 5 лет до реорганизации учебных планов и гармоничного внедрения F# в основные дисциплины. Курс сыграл важную роль в популяризации языка программирования среди студентов, увеличилось количество студентов, выбирающих язык F# как средство курсовой работы.
В период 2006-2011 раздел "Функциональное программирование" в рамках дисциплины "Основы программирования" преподавался на Haskell, но с появлением отдельного курса по функциональному программированию в учебном плане нового направления 231000 "Программная инженерия" на практике у младших курсов освободились часы, которые успешно занял мультипарадигмальный F#.
На сегодняшний день на кафедре системного программирования СПбГУ F# используется как второй (после языка С) язык программирования на направлении 231000 "Программная инженерия", где с его помощью преподаются объектно-ориентированная парадигма и первые примеры использования функциональной парадигмы. На других направлениях подготовки F# занял место первого или второго языка программирования и служит, зачастую, единым инструментом для преподавания различных аспектов. Примечательно, что язык программирования является одной из причин выбора исследовательского проекта, когда студенты ищут, где применить себя, где делать курсовую работу. Количество курсовых работ и проектов, написанных на F# ежегодно растёт.
На данный момент два проекта кафедры системного программирования используют F# как основной язык:
• YaccConstructor — исследовательская и промышленная платформа для построения генераторов синтаксических анализаторов, парсеров и работы с грамматиками. В рамках проекта было выполнено много различных курсовых и квалификационных работ, одна магистерская, запланированы две кандидатские.
• Brahma.FSharp — встраиваемый в F# язык для работы с OpenCL (для выполнения вычислений на видеокартах). Ориентирован на промышленное применение, но может стать удобным инструментом преподавания метапрограммирования, генеративного программирования и практики прикладного использования массово-параллельных архитектур.
Благодаря YaccConstructor, в рамках коммерческого проекта по миграции кредитной системы ведущего отечественного банка был успешно
разработан на F# транслятор Microsoft T-SQL в Oracle PL/SQL. Автор проекта Brahma.FSharp стал лауреатом конкурса УМ.Н.И.К, в течение года ожидается внедрение данной технологии в коммерческой компании. Кроме того, оба эти проекта являются свободным программным обеспечением, представлены международному сообществу F# программистов и заслужили положительные отзывы.
Как видно, заслуженную популярность у студентов F# получил не только за ауру академичности, а за практичность. Именно поэтому, когда весной 2013 на кафедре системного программирования начался образовательный эксперимент с использованием робототехнических моделей для обучения системному программированию и цифровой обработке сигналов, одним из первых языков прикладного программирования, которые были запущены на новом кибернетическом контроллере ТРИК по собственной инициативе студентов, стал именно F#.
Использование F# в курсах функционального программирования МФТИ и НИУ ВШЭ
Внедрение языка F# в учебный процесс ФИВТ МФТИ началось в 2008 г., когда на факультете впервые был прочитан курс «функциональное программирование», основанный именно на этом языке. За основу курса был взят классический сборник [13], при этом все примеры проиллюстрированы на F#. При выборе языка основным мотивом использования F# являлась есть практическая направленность и возможность использования его в реальных проектах совместно с другими языками платформы .NET, а также большая естественность энергичного языка для студентов, изначально знакомых с императивной парадигмой. В курсе также было предусмотрено обязательное знакомство студентов с языками Haskell и LISP.
В дальнейшем курс функционального программирования читался на факультете бизнес-информатики НИУ ВШЭ (направление программной инженерии), элементы курса были использованы на факультете Прикладной математики МАИ в курсе «Логическое и функциональное программирование».
За время существования курсов студенты выполняли ряд учебных и научно-исследовательских проектов на основе F#:
1. Совместный проект МФТИ-МАИ по созданию управляемого квадрокоптера использовал F# и технологию метапрограммирования для построения предметно-ориентированного языка (DSL) управления квадрокоптером на основе распознанного изображения. Проект был представлен на конкурсе Imagine Cup.
2. Выпускной проект НИУ ВШЭ по созданию среды параллельных вычислений задач класса parametric sweep на облачном кластере Windows Azure. В рамках проекта была создана платформа для распараллеливания и удаленного выполнения в облаке фрагментов метапрограммы на F#, сам проект был также реализован на F#,
включая облачную и графическую подсистемы.
3. Исследовательская работа лаборатории MAILabs и Российского государственного университета физической культуры, спорта, молодёжи и туризма (ГЦОЛИФК) по использованию Kinect в контроле показателей физического развития школьников.
4. Курсовой проект НИУ ВШЭ по построению графа зависимостей персонажей по тексту литературного произведения.
Плюсы и минусы использования F#
Хотелось бы отметить следующие положительные моменты использования F# в учебном процессе вуза:
1. Индустриальный язык программирования. Студенты понимают, что смогут начать использовать его на практике, при этом при грамотном изложении удается добиться компромисса между практичностью и академизмом курса.
2. Использование полноценной платформы Microsoft .NET - доступны BCL, FCL, и всё, что нужно для написания приложений "профессионального" уровня. Промышленная платформа для профессиональной разработки, которую всё равно стоит изучать.
3. F# приучает форматировать код - плохо отформатированный код не работает
4. Очень удобно преподавать основы асинхронного/параллельного программирования - хорошие выкоуровневые концепции, но без низкоуровневых трудностей. Легко показывать параллелизм по данным, но можно и concurrent tasks, и различные примитивы синхронизации. Тоже самое касается и реактивного программирования.
5. F# поддерживает интерпретативный режим работы (REPL), что позволяет намного проще демонстрировать примеры и создавать проекты в итеративном стиле. При этом существуют удобные средства немедленной визуализации данных (FSharp.Charting), что позволяет решать задачи обработки и визуализации данных прямо из Visual Studio практически с простотой сред типа MatLab, но при этом находясь в профессиональной эффективной среде разработки
6. На базе F# можно демонстрировать инновационные концепции дизайна языков программирования, такие, как провайдеры типов. В целом, F# рассматривается Майкрософт как передовой язык для введения всех инноваций
7. F# удобен как первый язык программирования, поскольку студентам при поступлении в вуз надо "сломать мозг" чем-то необычным, чтобы они не думали, что все знают сами
8. При использовании F# также следует обратить внимание на следующие моменты:
9. По умолчанию язык покрывает не все концепции, например, выпадают динамическая типизация, ручное управление памятью,
низкоуровневое программирование. Но это можно обойти: показать управление ресурсами на синтетических примерах с use/IDisposable, работа с кэшем данных видна на примерах прохода по большому массиву с шагом разной длины, недостатки и преимущества динамической типизации можно показать на объектах с использованием оператора вызова по имени (myObject? DynamicallyResolvedProperty)
10.Высокий уровень декларативности, зачастую скрывающий от программиста детали реализации - для новичка неочевидно, как выполняется код, что эффективно, а что нет. Но методически полезно научить студентов с первых дней пользоваться декомпилятором ILSpy, чтобы смотреть, во что реально превращаются функциональные вызовы.
11.Часто F# воспринимается как проприетарный язык программирования только для Windows и платформы .NET -необходимо вести образовательную работу среди студентов, рассказывая про открытость языка и наличие независимого сообщества http:// fsharp . org.
12.Документация MSDN касательно F# пока отстает от более классических языков (C#/VB), однако вокруг F# существует сильное сообществ, поэтому ресурсы типа stackoverflow приходят на помощь
13.F# не воспринимается как мэйнстрим, хотя в TIOBE Index обходит многие популярные языки, включая Erlang, Scheme, Scala и Haskell. У студентов регулярно возникают вопросы и мифы, которые надо развеивать. И на лекциях, и на практике уделяется отдельное время на их развенчание, включая такие популярные как "F# функциональный, значит академический и бесполезный". Заключение
Ни один язык программирования не может быть объективно назван единственно удачным инструментом. Если бы так было, не было бы такого разнообразия в промышленном программировании. Точно так же нет идеального языка для преподавания, но F# — это однозначно удобный инструмент, который мы с готовностью рекомендуем. Сложно сказать, что именно покажется полезным и удобным в данном языке, а что будет мешать при преподавании конкретных дисциплин, однако он стоит того, чтобы обязательно попробовать.
Литература
1. http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - TIOBE Programming Community Index, October 2013
2. Sussman G., Abelson H., Sussman J. Structure and interpretation of computer programs //The Massachusetts Institute of Technology. - 1985. - Т. 10.
3. http: //dreamspark. ru
4. Сошников Д.В. Функциональное программирования на языке F#. - М.: ДМК Пресс, 2011.
5. К. Смит. Программирование на F# / Пер. с англ. А. Киселев. - М.: Символ-Плюс, 2011.
6. D.Syme, A.Granicz, A.Cisternio. Expert F# 2.0. Apress, 2010.
7. TNeward, A.Erickson, T.Crowell, R.Minerich. Professional F# 2.0. Wiley Publishing, 2011.
8. TPetricek, J.Skeet. Real World Functional Programming: With Examples in F# and C#. Manning Publications, 2010.
9. R.Pickering, Beginning F#, Apress, 2009.
10. J.Harrop, F# for Scientists, Wiley Publishing, 2008.
11. Сошников Д.В. Видео-курс «Функциональное программирование». Интернет-университет информационных технологий ИНТУИТ.РУ http://bit.ly/funcprovideo
12. E. Chailloux, P. Manoury, B.Pagano. Développement d'applications avec Objective Caml. O'Reilly, 2000. Русский перевод: http://shamil.free.fr/comp/ocaml/
13. Филд А., Харрисон П. Функциональное программирование. - М.: Мир, 1993.