Научная статья на тему 'Автоматизированная проверка задач в курсе «Функциональное программирование»'

Автоматизированная проверка задач в курсе «Функциональное программирование» Текст научной статьи по специальности «Математика»

CC BY
792
59
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ТЕСТИРОВАНИЕ / АВТОМАТИЗИРОВАННАЯ ПРОВЕРКА ПРОГРАММ / ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ

Аннотация научной статьи по математике, автор научной работы — Симуни Михаил Лазаревич, Соловьев Алексей Юрьевич, Шайтан Василий Ильич

В статье рассматривается система тестирования и проверки задач для курса «Функциональное программирование», читаемого на математико-механическом факультете СПбГУ. Обсуждаются основные возможности системы тестирования, средства автоматизированной проверки задач и основные возможности проектируемой версии системы.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Симуни Михаил Лазаревич, Соловьев Алексей Юрьевич, Шайтан Василий Ильич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Автоматизированная проверка задач в курсе «Функциональное программирование»»

УДК 004.588

Симуни М.Л.1-3, Соловьев А.Ю.2, Шайтан В.И.2

1 Санкт-Петербургскии государственный университет, г. Санкт-Петербург, Россия 2 JobToday SA, г. Санкт-Петербург, Россия 3 Санкт-Петербургскии политехнический университет Петра Великого, г. Санкт-Петербург, Россия

АВТОМАТИЗИРОВАННАЯ ПРОВЕРКА ЗАДАЧ В КУРСЕ «ФУНКЦИОНАЛЬНОЕ

ПРОГРАММИРОВАНИЕ»

АННОТАЦИЯ

В статье рассматривается система тестирования и проверки задач для курса «Функциональное программирование», читаемого на математико-механическом факультете СПбГУ. Обсуждаются основные возможности системы тестирования, средства автоматизированной проверки задач и основные возможности проектируемой версии системы.

КЛЮЧЕВЫЕ СЛОВА

Тестирование; автоматизированная проверка программ; функциональное программирование.

Simuni M.L.13, Soloviov А.У.2, Shaitan V.I.2

1 St.Petersburg State University, St.Petersburg, Russia 2 JobToday, St.Petersburg, Russia 3 Peter the Great St.Petersburg Polytechnic University, St.Petersburg, Russia

AUTOMATED PROBLEM CHECKING FOR FUNCTIONAL PROGRAMMING COURSE

ABSTRACT

In the article the system for problem testing and checking is considered. The most important features of testing system, tools for automated problem checking and the features for the next system version are considered.

KEYWORDS

Testing; problem checking; functional programming.

В работе рассматриваются возможности автоматизации проверки задач для курса «Функциональное программирование» [1], читающемся на математико-механическом факультете СПбГУ Последние четыре года при проведении курса используется система тестирования и учета решения задач [2]. В результате внедрения этои системы заметно увеличилась активность студентов при решении задач, и, в то же время, заметно упростилась работа преподавателя. В 2016 году система была дополнена средствами автоматизированнои проверки задач. Это позволило преподавателю избавиться от части рутиннои работы и сосредоточиться на содержательнои работе со студентами. В то же время, первые результаты работы с новои версиеи системы показали необходимость ее усовершенствования. В настоящее время разрабатывается проект новои версии системы, позволяющеи сделать работу преподавателя более комфортнои.

Перечислим кратко особенности рассматриваемого курса. Курс «Функциональное программирование» проводится на математико-механическом факультете СПбГУ для студентов 4 или 3 курс, в зависимости от специальности. Курс читается на основе языка Haskell [3]. Для участников не предполагаются какие-либо знания в области функционального программирования, но предполагается достаточно хорошие навыки программирования вообще и общая математическая культура. Рассматриваются темы от основ функционального программирования (функции высшего порядка, алгебраические типы данных и т.д.) до достаточно сложных тем, таких, как продолжения (continuations), монады, «бесплатные теоремы» (theorems for free) и т.д.

Курс слушают примерно 70-80 человек. Подготовка и заинтересованность студентов варьируется, но большинство студентов, около 60%, достаточно хорошо подготовлены и активно участвуют в работе, решая большое количество задач. Остальные примерно пополам делятся на очень хорошо подготовленных студентов, для которых приходится придумывать задачи

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

Методическои основои курса является большое количество задач. Каждую неделю дается примерно 8-10 задач. Их можно разбить на следующие группы:

Задачи для закрепления материала. После каждого занятия на дом даются 4-5 задач, обычно достаточно простых. Эти задачи используются, для того, чтобы и преподаватель, и сами студенты могли проверить, как они освоили текущии материал. Иногда они используются, чтобы подготовить студентов к восприятию очередного занятия. Эти задачи почти всегда разбираются на следующем занятии

Дополнительные задачи. Каждую неделю дается 2-3 задачи посложнее, они предназначены для хорошо подготовленных студентов. Их решение - это достаточно большая и сложная программа и они, как правило, на занятиях не разбираются.

Дополнительные задачи 'на обычном языке'. Каждую неделю дается дополнительная задача 'на обычном языке'. В неи студентам предлагается реализовать рассмотренные на занятии темы на каком-нибудь распространенном языке (C#, C++, Java, Python и т.д.)

Таким образом, на преподавателя ложится довольно большая нагрузка. Каждую неделю приходится проверять около 150 задач. Хотя большинство из них простые, нагрузка, тем не менее, очень значительная, и справиться с неи без инструментальных средств было бы невозможно. В дальнеишем мы будем говорить о средствах, которые позволяют упросить проверку задач первых двух типов. Задачи на обычном языке настоящее время проверяются вручную. Система тестирования задач

Для проверки задач используется тестирование. Оно было реализовано в системе в первои версии, в 2011 г., в дипломнои работе, выполненнои А.Ю.Соловьевым. К задачам прилагаются тесты, и решение, не прошедшее эти тесты, не считается засчитанным.

Проверка задач с помощью тестов используется в большинстве массовых онлаин курсов (например, в курсе Stepic, подготовленным Д.Н.Москвиным [4]). В отличие от таких курсов, в рассматриваемои системе автоматическое засчитывание задач, у которых прошли все тесты, не предусмотрено, они в любом случае просматриваются и засчитываются вручную. В следующеи версии предполагается реализовать автоматическое засчитывание задач с проиденными тестами, но не для всех, а только для задач, повышеннои сложности. Для такого автоматического засчитывания будет необходимо также обеспечить контроль списывания, он обсуждается ниже.

По сравнению с распространенными системами тестирования, реализованная подсистема тестирования обладает рядом особенностеи:

1. Студенту сообщается тестовый пример вызова, на котором его решение дало неправильные результаты. В большинстве систем тестирования [4,5] сообщается только номер теста. Однако практика показала, что для большинства студентов такой подход оказывается слишком сложным. Им сложно самостоятельно придумать пример, для которого программа могла бы не работать, и, в результате, отсутствие информации о тестах привело бы к тому, что эти тесты появились бы у студентов в сети и т.д.

2. Существует, однако, возможность не показывать некоторые тесты. В этом случае преподаватель может задать подсказку для студента. Такой подход применяется, когда показ тестового примера делает задачу слишком простой. Например, если студент забыл обработать случай, когда входное значение меньше 0, то интереснее будет ему на это намекнуть (выведя сообщение «Числа бывают отрицательными)»), а не просто показать пример вызова.

3. Еще одна особенность - это то, что система является достаточно гибкой, чтобы задавать тесты в тех случаях, когда условие предусматривает не единственное решение. Например, одна из решаемых на курсе задач такая: «Создать бесконечный список из всех пар положительных целых чисел». В этой задаче предлагается придумать порядок обхода всех пар самостоятельно, и он может быть различным. Однако система тестирования оказывается достаточно гибкой для того, чтобы в качестве тестов можно было задавать такие условия, как, например, «проверить, что первые 1000 элементов последовательности содержат пару (3,5) ровно один раз» и т.д. (рис 1). Такие условия, конечно, не являются достаточными, однако, на практике, успешно отсеивают неправильные решения.

liffiEESk-j L-.L=i ¡—й—|

|П Редактаронание геста ■ >:

(г С © bolvetask.ru/fpO/feacher/e-d itTestp h р -£г □ \

К тестам На главную

Страница редактирования теста

Номер задачи: 6 1»

Выражение:

length S filter (==(3,5)) $ take cantor 1000

Ожидаемое значение:

i I

Номер теста: 2

Хитрый:

□ -

Рис.1. Пример теста со сложным условием

Автоматизация проверки задач

Для большинства задач засчитывание их только по тестам представляется, на наш взгляд, недостаточным. Особенно это относится к простым задачам. Для таких задач имеет значение, не только то, что задача прошла тесты, но и как она написана. Студент может выбрать неоптимальньш алгоритм, или использовать не лучшее представление данных, или даже просто использовать неудачное имя переменнои, и на такие ошибки очень желательно ему указать. На наш взгляд, именно замечания, которые студент получает от преподавателя, являются наиболее важным элементом процесса обучения (и это подтверждают многие отзывы студентов, окончивших курс).

Приведем некоторые другие причины, по которым засчитывание задач на основе тестов является нежелательным:

• Многие задачи включают в себя дополнительные условия. Например, «Решение не должно использовать рекурсию» или «Решение должно использовать функцию foldr» или «Решение должно использовать стиль передачи продолжении (continuation-passing style)». Для проверки таких условии тестов, естественно, недостаточно.

• Преподавателю важно получить представление о том, какие варианты решения и какие ошибки наиболее типичны для данных студентов, что у них вызывает трудности. Именно разбор типичных ошибок является, по нашему опыту, однои из наиболее интересных и полезных для студента частью занятия.

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

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

В то же время и при таком подходе есть возможность облегчить работу преподавателя. В.И.Шаитан в 2016 году при подготовке бакалаврскои ВКР разработал систему автоматического зачитывания задач на основе типичных решении и автоматизированного проставления замечании. Рассмотрим ее основные возможности.

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

Например, для закрепления темы «бесконечные списки» дается задача «Описать бесконечный список [7,77,777,7777,7777...]». Для этои задачи есть не так мало решении, которые приходят в голову студентам. Но есть примерно 3-4 наиболее типичных правильных решения, которые, в совокупности, присылают примерно 50% студентов. Из оставшихся студентов примерно 40% присылает тоже 4-5 типичных вариантов решения, но эти варианты не совсем правильные, для них требуется написать замечания.

Важнои особенностью, характерной видимо, именно для функционального программирования, является то, что эти типичные решения часто совпадают (с точностью до имен переменных). Это связано с тем, что что в языке Haskell студенту не надо реализовывать ввод и вывод данных, подключать библиотеки и писать другои вспомогательныи код, которыи каждыи студент напишет немного по-другому. Решение простои задачи состоит, во многих случаях, из 1-10 строк кода.

Система автоматического засчитывания задач на основе правильных решении позволяет преподавателю хранить такие правильные решения в базе и засчитывать их автоматически (рис.2). Таким образом, у преподавателя освобождается время для работы с 10-20% студентов, приславших нестандартные решения - или решения с ошибками, или, наоборот, решения, использующие нестандартные подходы._

ГП Правильные решения х

С О solvetask.ru/fp4/teacher/correctSolution.php

На главную

6-2 ▼ фильтровать

Номер задания Номер задачи Правильный код

6 2 sumprod (x:xs) = sum (map (\(а,Ь)->а*Ь) (zip (x:xs

6 2 sumprod xs = let pairs = zip xs (tail xs) in sum (

6 2 sumprod xs = sumprod' (zip (xs)(tail xs)) sumprod' xs = sum(map (\(x,y)->x*y) xs)

Рис.2. Пример типичных правильных решений

Отметим некоторые особенности засчитывания задач:

1. Даже если решение студента совпадает с правильным, ему не сообщается об этом сразу. Преподаватель должен нажать кнопку «Засчитать одобренные решения», и это делается, как правило, раз или два в день. Смысл в том, чтобы студент не знал, что некоторые из его решении засчитываются автоматически. Как нам кажется, если студент будет знать, что при некоторых обстоятельствах его решения зачтется сразу, у него может возникнуть ощущение, что такое решения является более правильным, он может попытаться подобрать его и т.д.

2. Перед сравнением присланного решения с правильными образцами оно, в любом случае, проверяется тестами. Это значительно упрощает сравнение задач. Например, мы можем, заменять переменные на их порядковые номера (чтобы сравнить программы с точностью до имен переменных) и не беспокоиться о том, что можем про неправильную программу решить, что она в точности равна правильнои и засчитать. Сравниваемые программы точно по краинеи мере дают правильные результаты, иначе они не прошли бы тесты. Каталог типичных замечаний. Замечания, которые преподаватель пишет студентам, тоже

часто повторяются. Как правило, для каждои задачи есть 3-5 типичных замечании, которые охватывают 30-80% всех случаев. В текущеи версии системы реализован простои набор средств, позволяющии облегчить процесс проставления замечании. Для каждои задачи можно ввести и запомнить несколько типичных замечании. При проверке задачи этот список показывается рядом с проверяемым решением, и преподаватель может одним нажатием вставить его в нужное место (рис. 3).

ГП Проверка решения х В - □ X

С © solvetask.ru/fp4/teacher/checkSolution.php Q. # ® :

Пример вызова: take 7 fives Ответ должен быть равен [5,55,555,5555,55555,555555,5555555] Типичные замечания:

Текст оешения*: * комментарии, помеченные " {-- * --} будут выделяться цветом в системе студента {-- 0К, но мне кажется так не очень эффективно. Так у вас пол

five n = expr:five(n +1) where ехрг = foldr (\i res -> res + 5 * 10Ai) 0 [0..n] fives = five 0

Автоматически вставить замечания

Рис.3. Пример типичных замечаний

Автоматизированное проставление замечаний. Еще одна возможность, реализованная в системе, но оказавшаяся не очень востребованной, - это автоматизированное проставление замечании. Замечания могут снабжаться условием, при котором они возникают. В настоящее время условие - это просто фрагмент текста. Например, (" - это условие для того, чтобы добавить типичное замечание «После if скобки можно не писать».

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

Недостатки текущеи версии системы и планируемые дополнения

В настоящее время проектируется следующая версия системы. Опишем ее основные возможности:

1. Нормализация типичных решений

Даже в самых простых задачах все-таки образуется много типичных решении из-за того, что студенты используют разные варианты записи конструкции. Приведем простои пример. Допустим, в задаче требуется записать выражение х*х+1. Даже те студенты, которые прислали в остальном одинаковое решение, напишут это по-разному - хЛ2+1, 1+х*х, (х*х)+1, (х*х+1) и различные сочетания этих вариантов. Таким образом, приходится хранить в базе очень много похожих вариантов решения.

Для решения этои проблемы предполагается задавать набор преобразовании, которые, если есть такая возможность, следует применить к решению, чтобы привести его к единому нормализованному виду. Например, в рассмотренном выше примере, таким преобразованиями могли бы быть правила «Заменить х*х на хЛ2" и т.д. Применение таких преобразовании позволит значительно уменьшить набор правильных решении, хранящихся в системе. Схожая технология для автоматическои генерации замечании описана в [6].

2. Автоматическая обработка типичных неправильных или не совсем правильных решений.

Хотелось бы иметь возможность автоматически засчитывать (или не засчитывать)

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

3. Генерация статистки по типичным решениям

Хотелось бы иметь представление о том, как распределились решения студентов - сколько

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

4. Контроль списывания

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

Следует отметить, однако, что анонимныи опрос, проведенныи среди участников курсов прошлых лет [7] показал, что большинство участников, если и писали задачи не самостоятельно, то делали это 1-2 раза за курс. Возможно это связано с подбором задач, они, именно с целью минимизировать списывание даются или достаточно простыми, чтобы даже слабо подготовленным студентам было интересно попробовать решить из самим, или достаточно сложными, чтобы студенты не рисковали копировать чужое решения, понимая, что это легко может быть обнаружено.

Тем не менее, предполагается включить в состав системы базовые возможности по контролю за списыванием:

Проверка задач на точное совпадение, с учетом имен переменных, пробелов и переносов. Ведение статистики по неточному совпадению и поиск пар участников, у которых большое количество задач совпадают без учета имен переменных, пробелов и других простых преобразовании.

Более далекие планы развития системы

Перечислим кратко направления, в которых предполагается развивать систему в дальнеишем:

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

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

Литература

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

1. Функциональное программирование (мат-мех СПбГУ) URL: http://msimuni.wikidot.com/fp4

2. Функциональное программирование. Страница пользователя URL: http://solvetask.ru/fp4

3. Haskell Language URL: https://www.haskell.org/.

4. Функциональное программрование на языке Haskell - Stepic.org URL: https://stepik.org/course/Функцйональное-программирование-на-языке-HaskeП-75.

5. Sphere Online Judge (SPOJ) URL: http://www.spoj.com/.

6. Singh, Rishabh and Gulwani, Automated Feedback Generation for Introductory Programming Assignments. SIGPLAN Not. 48 (6), 2013, pp.15—26

7. Анкета про списывание и совместную работу над решениями в курсе ФП URL: http://webanketa.com/forms/64r38c1r6rqkjdhpcgtk0rk1/ru/statistic/

8. Gulwani, Sumit, Ivan Radicek, and Florian Zuleger. 'Automated Clustering and Program Repair for Introductory Programming Assignments." arXiv preprint arXiv:1603.03165 (2016).

References

1. Functional Programming (mat-meh SPbGU) URL: http://msimuni.wikidot.com/fp4

2. Functional Programming. User home page URL: http://solvetask.ru/fp4

3. Haskell Language URL: https://www.haskell.org/.

4. Functional Programming in Haskell - Stepic.org URL: https://stepik.org/course/Функциональное-программирование-на-языке-Haskell-75.

5. Sphere Online Judge (SPOJ) URL: http://www.spoj.com/.

6. Singh, Rishabh and Gulwani, Automated Feedback Generation for Introductory Programming Assignments. SIGPLAN Not. 48 (6), 2013, pp.15—26

7. Poll on cheating in functional programming course. URL: http://webanketa.com/forms/64r38c1r6rqkjdhpcgtk0rk1/ru/statistic/

8. Gulwani, Sumit, Ivan Radicek, and Florian Zuleger. 'Automated Clustering and Program Repair for Introductory Programming Assignments." arXiv preprint arXiv:1603.03165 (2016).

Поступила 14.10.2016

Об авторах:

Симуни Михаил Лазаревич, старший преподаватель кафедры информатики математико-механического факультета Санкт-Петербургского государственного университета, simuni@mail.ru;

Соловьев Алексей Юрьевич, ведущии программист, JobToday SA;

Шайтан Василий Ильич, студент Санкт-Петербургского политехнического университета Петра Великого, институт компьютерных наук и технологии.

i Надоели баннеры? Вы всегда можете отключить рекламу.