Николай Киров
Преподаване
Тестова система за проверка на знания по програмиране
Департамент Информатика, Нов български
университет
Преподаването на програмиране на студентите от началните курсове е
една трудна и отговорна задача за всеки преподавател. Това се
обуславя от спецификата на програмирането, предварителната
подготовка на студентите, важността на програмирането за много от
следващите в учебната програма курсове и др.
Трите основни курса, които се четат обикновено от първи до трети
семестър са:
- Въведение в програмирането,
- Обектно-ориентирано програмиране и
- Структури от данни.
Усвояването на учебния материал е свързано с:
- научаването на принципите на програмиранета като терминология,
идеология и техники, и
- придобиване на практически умения за писане на програми.
Затова преподаването на програмиране е съставено от две части
– лекции в лекционна зала и упражнения в компютърна лаборатория.
Съответно проверката на знанията и уменията по прграмиране се състои
от 3 компонента:
- тест;
- домашни (курсови) работи за писане на програми по зададени
индивидуални задачи;
- контролна работа на компютър.
Днес ще разгледаме една тестова система, отнасяща се само до първата
компонента.
Тестовете, са от типа
“множествен избор” (multiple choice), всеки въпрос има предложения
за 4 отговора, маркирани с a), b), c) и d), за които са възможни
всички варианти на елементите вярно-невярно (в-н), т.е.
- Всички са верни вввв;
- Един е верен вввн, ввнв, внвв, нввв;
- Два са верни ввнн, внвн, вннв, нввн, нвнв, ннвв;
- Три са верни вннн, нвнн, ннвн, нннв;
- Няма верен нннн.
Броят на вариантите (вариации с повторения) е 42 = 16. За
всеки отговор студентът има 3 възможности за определянето му:
- знам, че това е (верен) отговор на въпроса;
- знам, че това е неверен отговор на въпроса, или по-точно,
предложението не е отговор на въпроса;
- не мога да преценя, не знам дали предложението е отговор на
въпроса.
Подготовка
Подготовката на тестовете включва формулиране на въпросите и подбор
на отговорите – верни и неверни. По-точно предложения за отговори на
въпросите, като някои от тях са (верни) отговори, а други не са. Тъй
като всеки индивидуален тест
съдържа по 4 предложения на въпрос, то всеки въпрос трябва да има
подготвени най-малко 4 отговора. За да се избегне преписване от
съседа, е добре да се подготвят поне десетина предложения за
отговори на всеки въпрос.
Въпросите и отговорите формират текстов файл със строго
определена структура. Този файл служи за вход на програма test_generator,
която генерира индивидуалните тестове – толкова, колкото е броят на
студентите. Използва се генератор на случайни числа за избор и на
въпросите и на отговорите на всеки индивидуален тест. Всеки такъв
тест има уникален 4-цифров номер. Най-често един индивидуален тест съдържа от
10 до 20 въпроса. Програмата test_generator
създава LaTeX файл с индивидуалните тестове (out.tex), файл с
отговорите на всеки индивидуален тест (tab.tex) и трети
файл, който е допълнен с данни за програмата за обработка на тестове
test_checker вариант
на входния файл (data.tex).
LaTeX файлът с индивидуалните тестове се включва в заглавен
файл на LaTeX (main.tex),
след което се компилира (напр. със системата MiKTeX) и така се
произвежда pdf файл, готов
за отпечатване на тестовете.
.
Поне една седмица преди датата на теста въпросите и по два примерни
отговора (верен и грешен) се публикува в Интернет на сайта на курса
(виж напр. test1 от NETB151). Така студентите имат
възможност да се запознаят с теста предварително. Няколко дни преди
теста се организира и обща консултация, на която се разглеждат
подробно въпросите на теста и се обсъждат възможни отговори.
Обикновено първите два теста включват учебен материал от последните
(преди теста) лекции, а последният (трети тест) е обобщаващ (включва
целия учебен материал), като съдържа и въпроси от предишните два
теста, често леко променени – сменени имена на променливи, отрицания
на някои от твърденията и др. подобни.
Провеждане
Преди да се раздадат индивидуалните
тестове се припомня, че по време на теста студентите могат да
използват лекции, учебници и всякакви други печатни материали.
Понякога може да се разреши и използване на компютри - или само за
четене или и с използване на компилатор.
По-подробно за феномена преписване. Класическият подход е когато
студентът прави контролно, тест, явява се на изпит и трябва да
покаже какво е научил, му се забранява да ползва външни източници на
информация, т.е. учебният материал се запомня и после или се
възпроизвежда или трябва да се приложи – например за решаване на
задачи или писане (на хартия) на програми. В специфичната дейност
програмиране, която е основна цел като придобито умение, крайният
продукт е компютърна програма. Написването и до голяма степен
е творчески процес (който е основен предмет на оценяванто) и
ограничаването на използваната информация е напълно безсмислено.
Представете си ръководител на екип от програмисти (в някоя фирма на
ИТ сектора) да даде задача за написване на софтуер и да не разрешава
да използва литература. Напротив, изискването обикновено е да се
намери литература и да се създаде софтуера според най-новите
практики в специфичната област. Този подход трябва да се прилага още
на “студентската скамейка”.
Целта от провеждане на теста е не само да се проверят знанията на
студентите, а и да се стимулират (принудят) да отворят учебника, да
потърсят конкретна информация там, да направят логическата връзка
между въпросите на теста и написаното в учебника и т.н. Дори да
проверят с компютъра синтаксис или действието на някаква програмна
конструкция.
В часа за теста всеки студент получава лист хартия А4 с индивидуален тест. Всички
тестове са различни, което до голяма степен елиминира елемента на
преписване от съседа при попълване на теста. Използвайки даден шаблон за отговори, срещу всяко предложение
за отговор студентът трябва да
- даде положителен отговор (да, вярно, истина; yes,
correct, true; 1) или
- даде отрицателен отговор (не, невярно, неистина; no,
incorrect, false; 0) или
- не отговори (–, не знам; или нищо; I don’t know; -).
Времето да провеждане на теста е 2 учебни часа или един учебен блок
(една лекция) във времето за лекции. Когато студентът е готов, той
предава двата листа хартия – индивидуалния тест и попълнен шаблон с
отговорите.
Проверка от преподавателя
При проверката на индивидуален тест всеки въпрос получава тестови
точки в интервала [−4, 4]. Те са сума от точките за всеки отговор,
които могат да бъдат:
- +1 когато студентът е дал правилен отговор (да или не);
- −1 при неправилен (обратен) отговор;
- 0 при отговор “не знам”.
За целия индивидуален тест се прави сума на броя на получените точки
по всеки въпрос. Изпитните точки са пропорционални на получените,
като винаги се закръглява нагоре до цяло число (ceil(x)).
Например, нека индивидуалният тест да съдържа N въпроса
и нека студент е събрал t тестови точки (t ≤ 4N).
Ако този тест носи максимално M изпитни точки, то
студентът получава ceil(t*M/N/4) изпитни точки (пример).
Често в литературата се срещат препоръки от вида: “Не се препоръчва
приписването на наказателни точки за неправилен отговор, тъй като
тогава изпитваните се страхуват да отговарят, ако не са напълно
убедени, и така не показват истинското ниво на своите
знания/умения.”[6]. Аргументът за неспазване на това правило е, че
програмирането е специфична дейност и знанията в тази област трябва
да са категорични – програмистът трябва да си дава ясна сметка каво
знае и какво не знае. Една съвсем дребна грешка в компютърна
програма (напр. липса на запетая) може да доведе да абсолютно
непредвидими последици – от “невинна” правописна грешка в някой
текст до застрашаване на човешки живот ила загуба на космически
кораб.
Проверката на тестовете се извършва ръчно с помощта на таблицата и/или автоматично
с програмата test_checker.
Въвеждането на отговорите на студентите може да е ръчно с програмата
или да се използва специален шаблон и
скенер. Програмата създава текстов файл (save.txt), съдържащ
проверените тестове.
Проверка от студента
В началото на следващата лекция се обявяват резултатите от теста и
се връщат тестовете на студентите. Всеки студент трябва внимателно
да види какво е сгрешил, да прецени дали е съгласен с отбелязаните
грешки и ако нещо не му е ясно, да попита. Целта на тази проверка от
студентите е те да осъзнаят грешките си, което очевидно спомага за
по-доброто усвояване на учебния материал. Освен това, тъй като не е
лесно да се формулират кратко и точно някои въпроси, също така може
да има не съвсем ясни предложения за отговори, практиката е да се
приемат мненията на студентите, които интерпретират по по-различен
начин някой въпрос или някой отговор и да се увеличават изпитните
точки. След проверката може да се събират всички тестове (условия и
отговори) или да се оставят на студентите. Добра практиката е да не
се връщат тестове на студенти, които отсъстват от лекцията с
проверката.
Анализ на теста
Програмата test_checker
създава файл (data_result.txt),
аналогичен на файла,
съдържащ всички въпроси и отговори (вход за test_generator) с
добавени данни за резултатите. След всеки отговор на всеки въпрос са
дадени 6 числа във формат % a1:a2:a3 b1:b2:b3, където:
- a1 е брой тестове, в които има (се е паднал
случайно) този въпрос и отговор;
- a2 е брой тестове с верен отговор;
- a3 е брой тестове с грешен (обратен) отговор.
За втората тройка числа b1:b2:b3 смисълът е същия, но се
отчитат само тестове, които имат не по-малко от половината на
максималния брой изпитни точки, т.е. броят се само студенти,
получаващи положителна оценка (3 или повече) на целия тест.
За софтуера
Текстовете на програмите с примери и кратки описания за в GitHub:
https://github.com/nkirov/tests_generator
https://github.com/nkirov/tests_checker
Написани са на С++ с платформата Qt.
Тази работа е представена на семинар
на департамент "Информатика" на 12.05.2014 г. в зала 703-2.