Подбельский В.В.,
НИУ ВШЭ, профессор [email protected]
Максименкова О.В.
НИУ ВШЭ, старший преподаватель [email protected]
Особенности формулировок тестовых заданий по
программированию
Аннотация
В работе рассматривается применение общих рекомендаций по работе над формулировками тестовых заданий в контексте дисциплины «Программирование». Приводятся примеры некорректных заданий и варианты их исправления. Формулируются дополнительные рекомендации для тестовых заданий, связанных с программированием.
Введение
Применение тестов для контроля знаний по различным предметным областям требует от преподавателя работы не только по созданию новых, но и по изменению уже существующих тестовых заданий. Необходимость модификации формулировок готовых тестовых заданий возникает в случаях, когда, например, задание обладает низкими показателями качества. Для оценки качества тестовых заданий вычисляют такие числовые характеристики как индекс (коэффициент) дискриминативности и коэффициент трудности (решаемости) тестового задания.
При дихотомической оценке тестовых заданий (за решенное задание начисляется 1 балл, а за нерешенное 0 баллов) в соответствии со статистическими методами классической теории тестирования коэффициент трудности вычисляется как доля испытуемых, справившихся с тестовым заданием:
где п - количество испытуемых верно решивших задание, N - общее количество испытуемых. Традиционно задания с коэффициентом не превосходящим 0,2 относят к трудным, а задания с коэффициентом не меньшим 0,8 - к легким.
На основе метода контрастных групп коэффициент
дискриминативности тестового задания вычисляется по формуле:
в=_
Nb
^-количество испытуемых в группе лучших, набравших 1 балл за
задание;
^-количество испытуемых в группе худших, набравших 1 балл за задание;
Nb- общее количество испытуемых в группе лучших; Nw- общее количество испытуемых в группе худших; Принято подвергать пересмотру и отбраковке задания, имеющие показатель дискриминативности меньший 0,3.
Говоря о структуре тестовых заданий, будем придерживаться следующей терминологии:
• стем - содержательная постановка задачи;
• опции - варианты ответов на тестовое задание;
• ключ - правильный ответ на тестовое задание;
• дистрактор - неправильный ответ на тестовое задание.
В российской и зарубежной литературе встречаются рекомендации по составлению и исправлению содержания тестовых заданий, которые можно обобщить следующим образом [1, 2, 7, 11, 8]:
• в тексте задания должна отсутствовать двусмысленность и неясность формулировок;
• следует избегать слов-подсказок и общих грамматических подсказок, таких как род, число или падеж, позволяющих «вычислить» верный ответ;
• стем (основная часть) задания должен быть сформулирован в утвердительной форме;
• предложения, составляющие стем, следует формулировать максимально полно, оставляя в ответах и дистракторах как можно меньше слов;
• желательно избегать частично верных дистракторов;
• дистракторы должны быть разумны, правдоподобны и привлекательны для испытуемых;
• варианты ответов, выраженные числами, следует упорядочивать по убыванию или возрастанию;
• варианты ответов, выраженные словами, следует упорядочивать по алфавиту;
• желательно избегать повторяющихся слов в начале ответов и дистракторов, повторения должны быть вынесены в стем;
• и др.
Кроме того, при составлении тестовых заданий необходимо учитывать такие индивидуальные особенности студентов, как, например, слабое зрение или отсутствие определенных навыков [11]. О тестовых заданиях по программированию
Несмотря на то, что эти рекомендации являются достаточно общими, в публикациях [1, 4, 8] они сопровождаются, в основном, примерами тестовых заданий по гуманитарным и естественнонаучным дисциплинам.
Отдельные источники [7] опираются на абстрактные и искусственные примеры заданий. Разбор заданий, связанных с программированием, встречается редко и соотносится, преимущественно, с процедурными учебными языками программирования (школьный алгоритмический, Бейсик и Паскаль).
В высших учебных заведениях в дисциплинах, связанных с объектно-ориентированным программированием, в качестве учебных используются современные языки программирования (C#, C++, Java) и интегрированные среды разработки (MS Visual Studio, NetBeans IDE и проч). Нарушение перечисленных выше рекомендаций для тестовых заданий по таким дисциплинам редко анализируются в публикациях и не всегда очевидно.
Количество решивших задание
1
1 ■ 1 1
123456739 10111213141516171S1920212223242526272B29 30
Рисунок 1
В данной работе рассмотрены особенности некорректных тестовых заданий, ориентированных на язык программирования C#. Задания с низкими показателями качества отобраны из тестов промежуточного контроля по дисциплине «Программирование», преподающейся на первом курсе бакалавриата Отделения программной инженерии Национального исследовательского университета Высшая школа экономики. Более подробно о форме и содержании тестов и их результатах написано в работах [3, 9, 10]. Отметим, что указанные тесты в целом имеют удовлетворительные показатели надежности и валидности [10]. То, что появление некачественных заданий в этих тестах является достаточно редким событием, видно из рисунков 1 и 2, демонстрирующих количество испытуемых, решивших отдельные задания некоторых конкретных тестирований. Исходя из приведенных на рисунках гистограмм, можно обратить внимание на задания с номерами 17 (один верный ответ) и 25 (два верных ответа), на рис.1 и задание 29 на рис.2.
Покажем на конкретных примерах как могут быть сформулированы такие «провальные» задания и каким образом можно их модифицировать с целью повышения их качества. Еще раз подчеркиваем, что работа посвящена заданиям по дисциплине «Программирование»._
50 45 40 35 ЗО 25 20 15 Ю 5 О Количество решивших задание
■ № задания
■
1
12345673 9 Ю1112131415161713 19 20 2122 23242526272329 ЗО
Рисунок 2
Исправление некорректных тестовых заданий проведем на основе перечисленных выше рекомендаций.
Примеры модификации заданий _Задание 1 закрытого типа с несколькими верными ответами_
Верно ли, что:
+ 1) При объявлении локальной переменной её тип может определяться типом инициализирующего значения.
2) Локальная переменная, объявленная во вложенном блоке, может иметь то же имя, что и переменные охватывающего блока.
3) Локальная переменная, объявленная во вложенном блоке, доступна во всех операторах охватывающего блока.
4) Локальная переменная, объявленная во вложенном блоке, доступна в операторах охватывающего блока, размещенных вслед за вложенным блоком.
+ 5) Локальная переменная доступна для всех операторов вложенных блоков.
Здесь и далее верные варианты ответов тестового задания отмечены знаком «+».
Существует несколько способов повышения качества приведенного задания.
Вопросительная формулировка стема неявно подразумевает ответы «верно»/«не верно», что соответствует форме задания с двумя ответами.
Первый способ. Создание пяти заданий с двумя ответами с
переформулированным в утверждение стемом. Варианты заданий:_
Верно, что при объявлении локальной переменной её тип может
определяться типом инициализирующего значения._
+ 1) да
_2) нет_
Верно, что локальная переменная, объявленная во вложенном блоке, может иметь то же имя, что и переменные охватывающего блока. 1) да
_+ 2) нет_
Локальная переменная, объявленная во вложенном блоке,
доступна во всех операторах охватывающего блока._
1) да
_+ 2) нет_
Локальная переменная, объявленная во вложенном блоке, доступна в операторах охватывающего блока, размещенных вслед за
вложенным блоком._
1) да
_+ 2) нет_
Верно, что локальная переменная доступна для всех операторов
вложенных блоков._
+ 1) да
_2) нет_
При выполнении задания с двумя ответами испытуемым затрачивается меньше времени, чем при выполнении задания с несколькими верными ответами. Поэтому увеличение числа заданий теста не скажется на времени его прохождения испытуемыми. К недостаткам заданий с двумя ответами относят высокую вероятность угадывания верного ответа, поэтому при такой замене исходного задания пятью для снижения вероятности угадывания общее количество заданий в тесте увеличивают.
Второй способ. Предложенные варианты ответов и дистракторы содержат избыточные слова, которые могут быть вынесены в стем. Пример того, как это можно выполнить в данном задании, очевиден из предыдущего изменения задания.
Задание 2 открытого типа с кратким ответом_
_В результате выполнения следующего фрагмента кода:_
int x = 14;
Console.Write("{0,3:f4)", x*1000);_
на экране появится представление числа, содержащее X нулей.
_Укажите значение X: _
Ответ: 7
Во фрагменте кода использована переменная с именем x, инициализированная числом 14, в формулировке задания требуется указать некоторое значение X, под которым подразумевается количество отобразившихся на экране нулей. Апробация данного тестового задания показала, что сильные студенты, подозревая подвох, в качестве ответа указывают не 7, а 14 (значение переменной x). Одинаковые имена переменной и неизвестной вносят в задание двусмысленность, которую
легко ликвидировать, заменив одно из имен:_
_В результате выполнения следующего фрагмента кода:_
int a = 14;
Console.Write("{0,3:f4}", a*1000);
на экране появится представление числа, содержащее X нулей.
_Укажите значение X: _
Ответ: 7
_Задание 3. Закрытого типа с одним верным ответом_
Полная форма условного оператора имеет вид:
if (<выражение_условие>)
<оператор_1>
else
<оператор_2>
_В сокращенной форме условного оператора отсутствует:_
1) (<выражение_условие>)
2) <выражение_условие>
3) <оператор_1>и<оператор_2>
4)else
_+ 5)е^еи<оператор_2>_
Низкие показатели качества данного задания связаны с тем, что дистрактор №4 является частично верным. Студенты ошибочно выбирают его вместо верного ответа №5. Это во многом связано с шаблонной формулировкой, встречающейся в учебной литературе: «В сокращенной форме условного оператора отсутствует else». Также из формулировки задания не очевидно, что речь идет об анализе структуры оператора, приведенной в стеме.
Для исправления предлагается в качестве вариантов ответа к заданиям дать только структурные составляющие условного оператора, преобразовать задание к форме со множественным выбором и внести уточнения в стем.
Структура полной формы условного оператора имеет вид:
if (<выражение_условие>)
<оператор_1>
else
<оператор_2>
_В структуре сокращенной формы условного оператора отсутствует:
ljif
2) <выражение_условие>
3) <оператор_1> + 4)else
_+ 5)<оператор_2>_
Задание 4 открытого типа с кратким ответом_
Что будет выведено на экран в результате выполнения следующего
фрагмента кода:_
static void Main(){ int i = 7; while (i > 0) { do
if (i > 3) Console.Write(i); while (i-- > 2); Console.WriteLine(i); break;
} }
Если Вы считаете, что код содержит ошибки - укажите в качестве
ответа ***_
Ответ: 76541
Очевидным расхождением с рекомендациями по составлению тестовых заданий является, во-первых, вопросительная форма формулировки текстовой части стема. Второе затруднение связано с особенностью средств языка программирования С#. В приведенном в задании коде использован оператор Console.WriteLine(), выводящий в консольное окно строку и переводящий курсор на новую строку в консольном окне. Применение такого оператора вывода с переводом строки не желательно для заданий с открытым ответом, так как вызывает дополнительные сложности у студентов при вводе ответа в случае компьютерного тестирования, а также при оформлении ответа в случае бланкового тестирования. Комментарий «Если Вы считаете, что код содержит ошибки - укажите в качестве ответа ***» к заданию описывает только случай наличия ошибки в коде. Из приведенной формулировки задания не ясно, например, что именно требуется ввести (внести в бланк) в качестве ответа от испытуемого в случае, если программа не выведет на
экран ничего.
_Исправить задание предлагается следующим образом:_
В результате выполнения следующего фрагмента кода: static void Main() { int i = 7; while (i > 0) { do
if (i > 3) Console.Write(i); while (i-- > 2); Console.Write(i); break;
} }
на экран будет выведено:_
Примечание:
Если возникнет ошибка компиляции, введите: *** Если ошибок и исключений нет, но на экран не выведется ничего, введите: ---
_Если возникнет ошибка исполнения или исключение, введите: +++
Ответ: 76541
Заметим, что задание представляет собой комбинацию заданий отрытого и закрытого типов.
_Задание 5 открытого типа с кратким ответом_
В результате выполнения следующего фрагмента программы: char s, beg = 'S', end = (char)(beg+5); for ( s = beg; s < end; s++) if (s % beg == 0) Console.Write(s);
_на экран будет выведено: _
Ответ: S
В качестве значения переменной beg выбран символ S, имеющий одинаковый вид как в строчном, так и заглавном начертании. Имя другой переменной, выводимой на экран, с точностью до регистра совпадает с верным ответом. Разбор кода займет больше времени у студентов со слабым зрением. Кроме того, в некоторых случаях при выводе на дисплей символ S можно спутать с цифрой 5.
Студенты, не знакомые с последовательностью букв в латинским алфавите, могут испытать существенные затруднения при выполнении задания, так как в формулировке отсутствует подсказка в виде латинского алфавита. Хотя знание алфавита не требуется в данном задании, тестируемый может решить, что только алфавита ему не хватает.
Устранить перечисленные трудности можно переформулировав
задание:_
В результате выполнения следующего фрагмента программы: char s, beg = 'G', end = (char)(beg+5); for ( s = beg; s < end; s++)
if (s % beg == 0) Console.Write(s); на экран будет выведено:__ Примечание:
ABCDEFGHIJKLMNOPQRSTUVWXYZ_
Ответ: G
Задание 6 закрытого типа с одним верным ответом_
В результате выполнения следующего фрагмента программы: intdif;
char ch1 = 'A'; char ch2 = 'c';
dif = Char.ToUpper(ch2).CompareTo(ch1); Console.WriteLine(dif);
на экран будет выведено:_
1)-1 2)l + 3)2 4)34
5)0_
В результате работы метода CompareTo() с символами будет получено «расстояние» между ними в алфавите (разность значений числовых кодов символов). В задании использованы символы A и c, имеющие одинаковое начертание в русском и латинском алфавитах. Догадаться, что используется латинский алфавит можно из анализа дистракторов, но это повышает время выполнения задания. Кроме того, дистрактор №4 неправдоподобен. Напомним, что в случае, когда в качестве вариантов ответа приводят цифры, рекомендовано упорядочивать их.
Важным изменением в задании является замена букв А и с истинно латинскими буквами. Кроме того, аналогично изменениям задания №5 в формулировку следует добавить латинский алфавит, заменить дистрактор №4 на более правдоподобный и упорядочить варианты ответов по
возрастанию (убыванию):_
В результате выполнения следующего фрагмента программы: intdif;
char ch1 = 'L'; char ch2 = 'n';
dif = Char.ToUpper(ch2).CompareTo(ch1); _Console.WriteLine(dif);_
на экран будет выведено: Примечание:
ABCDEFGHIJKLMNOPQRSTUVWXYZ_
1)0 2)-1 3)1 +4)2
5)3_
Задание 7 открытого типа с кратким ответом_
В результате выполнения следующей программы: using System; namespace Тест{ class A { public int Fieldl;
}
class B:A { public int Field2;
}
class Program { static void Main() { A myVarl = new A(); B myVar2 = (B)myVar1;
}
}
}
на экран будет выведено:_
Примечание:
Если возникнет ошибка компиляции, введите: *** Если ошибок и исключений нет, но на экран не выведется ничего, введите: ---
_Если возникнет ошибка исполнения или исключение, введите: +++
Ответ: +++
В формулировке задания предлагается определить результат вывода при выполнении фрагмента кода. Отметим, что в коде отсутствуют обращения к методам вывода на экран. В коде присутствует ошибка, приводящая к возникновению исключения.
При исправлении задания следует уточнить формулировку (код
программы), добавив оператор вывода на экран._
В результате выполнения следующей программы: using System; namespace Тест{
_class A {_
public int Fieldl;
}
class B : A { public int Field2;
}
class Program { static void Main() { A myVarl = new A(); B myVar2 = (B)myVar1;
Console.Write(myVar2.Field1);
}
}
}
на экран будет выведено:_
Примечание:
Если возникнет ошибка компиляции, введите: *** Если ошибок и исключений нет, то на экран не выведется ничего, введите: ---
_Если возникнет ошибка исполнения или исключение, введите: +++
Ответ: +++
Задание 8 закрытого типа с несколькими ответами_
Верно, что декларация интерфейса может быть снабжена
модификаторами:_
+ 1) new + 2) public + 3)protected + 4)internal
_+ 5)private_
Все приведенные варианты ответов являются верными. Отсутствие дистракторов повышает вероятность угадывания ответа на задания и повышает время его выполнения, так как испытуемые (в особенности группа сильнейших) подозревают скрытые в задании хитрости.
Рекомендуется заменить некоторые верные ответы на дистракторы,
или создать несколько новых заданий._
Верно, что декларация интерфейса может быть снабжена
модификаторами:_
1) static + 2) public + 3) protected + 4)internal
_+ 5) private_
Заключение
Рассмотренные примеры демонстрируют некоторые особенности общих неточностей, допускаемых при составлении тестовых заданий. Кроме того, из детального разбора каждого задания видно, что к составлению тестовых заданий по программированию могут быть предъявлены следующие рекомендации:
• Не использовать в кодах операторы вывода на экран, переводящие после вывода курсор на новую строку.
• В инструкции к заданию или в формулировке задания с открытым ответом, содержащим код, предусматривать все возможные варианты, такие как возникновение ошибок компиляции, ошибки исполнения или пустой вывод (отсутствие результата).
• В заданиях, содержащих в кодах символы и строки, приводить (при необходимости) в качестве справки алфавит, используемый в задании.
• В заданиях, содержащих в кодах символы и строки, применять хорошо различимые символы, не одинаковые в строчном и прописном начертании, и не совпадающие по начертанию в русском и латинском алфавитах.
Литература
1. Майоров А.Н. Теория и практика создания тестов для системы образования. (Как выбирать, создавать и использовать тесты для целей образования). М.: «Интеллект-центр», 2001. 296 с.
2. Звонников В.И., Челышкова М.Б. Современные средства оценивания результатов обучения. М.: Издательский центр «Академия», 2009. 224 с.
3. Подбельский В.В., Максименкова О.В. Разработка тестов по программированию для тестирования в компьютерной форме // Информатизация образования - 2011: материалы Международной научно-практической конференции. Елец: ЕГУ им. И.А. Бунина, 2011. 192-195 с.
4. Бурлачук Л.Ф., Морозов С.М. Словарь-справочник по психодиагностике. С-Пб.: Питер, 2008.
5. Карданова Е.Ю. Моделирование и параметризация тестов: основы теории и приложения. М.: ФГУ «Федеральный центр тестирования», 2008.
6. McKenna C., Bull J. Designing effective objective test questions: an intoructory workshop, CAA Centre, June, 1999.
7. Anderson P. , Morgan G. National assessments of educational achievement, volume 2: Developing tests and questionnaires for a national assessment of educationa achievement, World Bank Publications, 2008.
8. Osterfind S.J. Constructing Test Items: Multiple-Choice, Constructed-Response, Performance and Other Formats. Kluwer academic publishers, 1997.
9. Podbelskiy V.V., Maksimenkova O.V. Programming as a part of the Software Engineering education // Proceedings of the 4-th Spring/Summer Young Researchers' Colloquium on Software Engineering (SYRCoSE 2010), 2010. 165 - 168 pp.
10. Podbelskiy V.V., Maksimenkova O.V. Educationaltestsin "Programming" academicsubjectdevelopment // SYRCoSE 2011. Proceeding of the 5-th Spring/Summer Young Reseachers' Colloquium on Software Engineering, 2011. 88—93 pp.
11. Alabama professional development modules [Электронный ресурс] http://www.alabamapepe.com/profdevmodule/index.htm (дата обращения: 15.05.2012)