Применение системы автоматического тестирования программ в учебном процессе
,
В настоящее время накоплен большой опыт использования различных тестирующих систем при проведении олимпиад по программированию. Плюсы такой системы на олимпиаде очевидны: участники могут оперативно наблюдать результаты своей работы; в тестах могут быть учтены многие частные случаи, относящиеся к задаче; сами тесты могут содержать большое число входных данных; результаты олимпиады становятся известны сразу по её окончанию и т. д.
В Вятском государственном университете существует система автоматической проверки программ. Она была создана четыре года тому назад в рамках дипломного проекта. Система обладает вполне стандартным набором функций. Из некоторых особенностей можно выделить возможность получения текста задачи в электронном виде, гибкая настройка системы подсчёта баллов (не только по правилам ACM), использование нескольких компьютеров в качестве тестовых серверов. К недостаткам данной системы можно отнести отсутствие возможности отправки вопросов жюри в электронном виде. Система автоматического тестирования легко переносится с одного компьютера на другой, не использует коммерческое программное обеспечение, нетребовательна к ресурсам. Всё это позволяет быстро развернуть её и настроить для использования в отдельном дисплейном классе или локальной сети ВУЗа.
В промежутках же между олимпиадами система простаивает, хотя её вполне можно использовать и в учебном процессе, например, в лабораторном курсе «Практикум на ЭВМ» при отработке навыков реализации различных алгоритмов. Использование тестирующей системы позволит интенсифицировать учебный процесс, одновременно освобождая преподавателя от необходимости активно перемещаться по лаборатории с целью проверки правильности выполнения студентами своих заданий. Сама система возьмёт на себя функцию проверки корректности решений, а преподаватель сможет освободившееся время посвятить работе с теми студентами, которые испытывают затруднения в написании программы.
Студенческая группа весьма неоднородна по своему составу. Вместе могут собраться и весьма сильные программисты, и те, кто делает только первые шаги в написании программ. Первым неплохо бы не просто дать задание запрограммировать тот или иной алгоритм, решить какую-либо задачу, но и выставить дополнительные условия в виде жёстких ограничений на объём используемой памяти, время работы программы, да и исходные данные могут отличаться повышенной сложностью (учёт частных случаев) и объёмом. Кроме того можно задействовать даже такой соревновательный фактор, как скорость выполнения заданий.
Со студентами, имеющими меньший навык программирования, можно работать, уделяя им больше внимания преподавателя, а так же выдавая более простые задания на изучаемую тему. И опять здесь может помочь тестирующая система, которая предложит студентам облегчённую как по тестам, так и по ограничениям, задачу. При этом степень такого облегчения можно выбирать практически для каждого студента индивидуально.
Ещё одна область применения тестирующих систем – самостоятельная работа студентов. На сегодня существует множество постоянно действующих интернет-соревнований и тренингов, доступных любому желающему. Единственное требование – наличие доступа в интернет – не является сколько-нибудь серьёзным препятствием. Но у всех таких проектов есть один недостаток – они рассчитаны на сильных студентов, способных решать трудные задачи. Остальные вынуждены ограничиваться теми заданиями, которые получают от преподавателя, либо искать какие-то интересные для них задачи самостоятельно. Возможность самостоятельного решения задач с использованием тестирующей системы родного ВУЗа, да ещё и в свободное время, определяемое самим студентом, позволит заинтересовать и привлечь к более глубокому изучению алгоритмов и языков программирования большее, нежели сейчас, число учащихся.
Такой самостоятельной работой студенты могут заниматься, используя сторонние ресурсы, но в этом случае не всегда удастся подобрать задачи на интересующую тему и получить консультацию у преподавателя в случае возникновения каких-нибудь затруднений.
Есть у использования тестирующей системы и ещё одно методическое достоинство: преподавателю придётся очень тщательно подходить к формулировке задания. Задача должна быть сформулирована таким образом, чтобы не возникало никаких неясностей, неточностей и возможностей двоякой трактовки тех или иных формулировок.
Наконец, при использовании в учебном процессе тестирующей системы, в качестве почти бесплатного приложения получается регулярно пополняющийся банк задач и набор тестов.
В качестве недостатков тестирующих систем часто указывают на вызванную их использованием переориентацию студентов с творчества на механическую зубрёжку основных алгоритмов. Это вызвано тем, что при автоматизации процесса проверки задач, красота, оригинальность, технологическая проработанность кода не играют какой-либо роли. От студента требуется за короткое время опознать известный алгоритм и создать его программную реализацию [1].
Такой недостаток присутствует при тестовой проверке задач, но его значение не следует преувеличивать. Во-первых, какой-то устойчивый набор базовых знаний в области алгоритмов и языков программирования должен присутствовать у любого студента соответствующей специальности. Глупо будет смотреться математик, каждый раз мучительно выводящий заново формулу интегрирования по частям. Не менее глупо будет выглядеть программист придумывающий алгоритм сортировки пузырьком. Пусть у него в голове крепко сидит несколько сотен алгоритмов на все случаи жизни. В этом нет ничего плохого, если он умеет свести предложенную ему задачу к известному алгоритму решения.
Наибольший интерес и наибольшая трудность состоят в сведении задачи к последовательности алгоритмов, приводящих к её решению. К сожалению, многие учебные пособия, сборники задач грешат прямолинейностью формулировок, навевающих грусть и скуку. Типичное задание по работе с массивами выглядит примерно следующим образом: дан массив из N элементов, найти наибольший и наименьший элементы массива и поменять их местами. Когда упор делается на отработку каких-то конкретных навыков, такая формулировка понятна и, наверное, уместна. Когда хочется заставить студентов использовать вполне определённый алгоритм, то формулировка задачи в виде: дан массив из N элементов, расставить элементы в порядке возрастания, используя пирамидальную сортировку, тоже кажется вполне уместной. В рассмотренных выше случаях вполне найдётся место для использования системы автоматического тестирования программ. Студент пишет программу, тестирует её на подготовленных преподавателем исходных данных, получает от системы сообщение о том, что задача зачтена, а дальше уже вступает в дело преподаватель, который изучает исходный код и проверяет его на предмет соответствия заявленному алгоритму.
Кроме задач, содержащих простую и ясную формулировку, должны обязательно присутствовать и задачи, текст которых не даёт прямого указания на пути их решения. Такой подход уже давно является единственно приемлемым на олимпиадах всех уровней, но в обычном учебном процессе встречается не часто. В лучшем случае условие задачи немного адаптировано к специальности студентов, но всё равно грешит прямолинейностью. Такой подход к составлению условий задачи характерен не только для информационных курсов, но и, например, математики. В результате студенты легко решают задачи в постановке, чётко указывающей на раздел, формулы, алгоритмы, использующиеся при её решении, но пасуют перед задачей, формулировка которой не даёт явное указание на пути её решения. Беспомощность студентов перед «текстовыми» задачами сводит на нет все усилия по освоению ими конкретных методов и алгоритмов.
В нашем университете со студентами специальности «Прикладная математика и информатика» проводились лабораторные работы с использованием тестирующей системы и «текстовых» задач. Хотя в силу отдельных причин занятий было проведено не так много, как хотелось бы. Тем не менее можно уже сделать некоторые выводы, которые касаются как возможности использования тестирующей системы в учебном процессе, так и показанных студентами результатов.
Во-первых, многие студенты не умеют работать с файлами. Работа с ними изучается в курсе «Языки программирования и методы трансляции», но большинство заданий к лабораторным работам не предусматривают получение исходных данных из файла и/или запись результатов в файл.
Во-вторых, студенты не умеют решать задачи, в условиях которых нет явной ссылки на алгоритм. Эта проблема никак не связана с использованием методов автоматического тестирования программ. О ней говорят многие преподаватели самых различных дисциплин, просто на обычную лабораторную работу задания, как правило, содержать короткую и понятную, с точки зрения требуемого алгоритма, формулировку, а при внесении в банк задач системы обычно производится их литературная обработка.
В-третьих, студенты не умеют работать с данными большого объёма. С этой проблемой приходится встречаться при любом способе проведения лабораторных работ. В 32-х разрядных системах проблема переполнения не так бросается в глаза, как в старых 16-ти разрядных. Даже многие преподаватели считают, что сегодня нет необходимости заострять внимание студентов на такие мелочи, как количество байт, отводимых под данные различных типов. Многие авторы книг по языкам программирования позволяют себе утверждения типа «практически не существует ограничения на размер строки». Но оно, ограничение, всё-таки есть и при определённом желании его можно найти, и всем, в том числе и студентам, об этом хорошо бы помнить. Связь с системой автоматического тестирования здесь проста. Так как входные данные хранятся в файлах, а не вводятся студентом с клавиатуры, то их объём ничем, кроме требований задачи, возможностями программного обеспечения и фантазией автора, не регламентируется и, соответственно, может быть очень большим.
В-четвёртых, студенты не умеют тестировать программы. Они готовы рапортовать о выполнении задания, если их программа сумела справиться с одним единственным простеньким тестом, придуманным самим учащимся. При этом их не смущает даже тот факт, что программа не всегда выдаёт верный результат на тестовом примере, включённом в условие задачи. Преподавателю приходится делать несколько подходов к одному и тому же студенту, чтобы предложить ему очередной набор входных данных, которые оказываются непосильны его программе. В случае использования автоматической системы студент в состоянии сам убедиться в том, что его коду ещё далеко до работоспособного состояния. При этом ему самостоятельно придётся строить тестовые примеры, которые позволят найти и исправить алгоритмические ошибки.
О проблемах можно говорить ещё долго. Не все они будут связаны с использованием системы автоматического тестирования программ или отказом от неё. Остановимся на положительных моментах, наблюдаемых при проведении лабораторных работ.
Во-первых, использование системы автоматического тестирования программ оправданно, если определить ей вполне конкретный круг задач: не подменять преподавателя, а дополнять, давая возможность студентам самостоятельно оценивать готовность своей работы к защите.
Во-вторых, даже во время обычной лабораторной работы с использованием тестирующей системы у студентов возникает спортивный азарт. Хотя это не олимпиада, и призов сильнейшим не предусмотрено, но сам факт наличия таблицы результатов пробуждает желание занять в этой таблице достойное место. Активный интерес проявляли даже те студенты, которые обычно предпочитали пассивное ожидание окончания лабораторной работы с последующими сетованиями на невозможность справиться с заданием в аудитории и необходимостью доделать его дома.
В-третьих, появляется возможность заставить студента не только решить задачу, но и произвести некоторую оптимизацию, связанную с уменьшением времени выполнения программы и объёма требуемой для её работы оперативной памяти. Если ограничения на объём требуемой памяти легко указать в условиях задачи, то с ограничением по времени лучше разбираться с использованием автоматической системы тестирования, так как в этом случае все студенты группы будут находиться в абсолютно одинаковых условиях и не будет повода свалить все свои проблемы на конкретный экземпляр вычислительной техники. Если система позволяет не только зафиксировать тот факт, что время работы программы уложилось в заданные ограничения, но и сообщить, например, время работы на каждом тесте, то можно наглядно продемонстрировать студентам некоторые их просчёты, приводящие к потерям скорости выполнения программы.
В этой связи можно привести случай, который произошёл во время лабораторной несколько лет тому назад. Студенты писали программу, реализующую решение системы линейных алгебраических уравнений методом Гаусса. Один из учащихся быстро написал программу и попробовал её сдать. Одного беглого взгляда хватило, чтобы понять, что программа написана без оглядки на время выполнения. Студенту было предложено сравнить время работы его программы со временем работы программы, только что созданной преподавателем. Сравнение проводилось на одном и том же примере. Первоначально соотношение времени работы программ имело отношение 1:3 в пользу преподавателя. К концу лабораторной работы студенту удалось добиться почти идентичного результата (разница составила порядка 5%, правда, по-прежнему не в пользу студента). Конечно это не научный подход к оценке эффективности алгоритма или программы, но сравнение времени выполнения программ на одном и том же компьютере с одними и теми же данными имеет право на существование и может просто и наглядно указать на наличие путей повышения эффективности созданного приложения.
В-четвёртых, если система автоматического тестирования возвращает номера тестов, с которыми программа не смогла справиться, то у преподавателя появляется возможность чётко представить себе перечень ошибок, которые допустил студент при решении поставленной задачи.
В-пятых, результатом проведённых лабораторных работ стало присоединение большой группы студентов к участникам кружка по программированию.
Совсем уж маленьким локальным плюсиком стало отсутствие технических затруднений у студентов на университетской олимпиаде по программированию, так как им не пришлось тратить время на знакомство с тестирующей системой.
Вся система образования опутана тестами. Школьники не изучают историю, а зазубривают набор дат, студенты не изучают информатику, а заучивают типы печатающих устройств, манипуляторов, соответствие расширений файлов и приложений и т. д. На этом фоне применение системы автоматического тестирования программ кажется неразумным, наносящим вред нашему и без того уже далеко не высшему образованию. Тем не менее, разумное, грамотное, продуманное применение такой системы в учебном процессе способно повысить уровень проведения лабораторных работ по программированию, освободить преподавателя от части рутинной работы. Вырастить из ученика Мастера – это дело преподавателя, система автоматического тестирования программ является одним из возможных инструментов, помогающих достижению результата.
Литература
1. , , По какому предмету олимпиада? Сборник трудов II Международной научно-практической конференции «Современные информационные технологии и ИТ-образование». – М.: МАКС Пресс, 2006, с. 226-233.


