Не секрет, что на занятиях по программированию самостоятельно пишут действительно сложную программу от силы 20% человек из группы студентов (исключения есть, но они редки как "зависания" linux-серверов). Остальные представляют собой "примазавшихся", использующих готовый программный код или части от него в своей работе, которую затем демонстрируют преподавателю. Соответственно, перед преподавателем возникает несколько проблем:
1) Принимать или не принимать такое решение?
2) Если не принимать, то как обеспечить отчисление 80% группы?
3) Если принимать, то по каким критериям?
Выбор второго пункта достоин истинного героя, ибо только настоящий джедай в состоянии продавить в вузе отчисление или хотя-бы перевод на другую, более простую специальность или факультет четверых из каждой пятерки студентов.
Герои не истинные, а нормальные (которые, как известно "всегда идут в обход"(с)), выбирают обычно третий вариант и вот тут все и начинается. Как проверить понимание студентом сложного, объемного, с многочисленными ветвлениями, циклами и рекурсиями программного кода? Какие вопросы следует задавать и при этом не попадаться на классические студенческие крючки и подначки, которые фактически заставляют преподавателя отвечать на им-же поставленный вопрос? Каким образом формулировать вопросы, чтобы для ответа на него заставить студента не придумывать сферического коня в вакууме, а разбираться в коде?
Недавно нашел, на мой взгляд, оптимальное решение, которое требует от преподавателя минимальных усилий, гарантировано доказывает, что студент понимает код, и сводит на нет возможность применения всяких хитростей, основанных на плетении словесных кружев, со стороны экзекутируемого.
Идея в следующем: после проверки студенческого решения на корректность в произвольное место программы вставляется оператор (функция, процедура и т.п.), выводящая на экран (в файл, на консоль и т.п.) значение какой-нибудь часто изменяющейся переменной. После этого, до запуска программы, студенту предлагается предсказать, сколько раз сработает этот оператор и какие значения появятся на экране. Запуск программы доказывает или опровергает предположения студента. Три подряд верных предположения - решение зачтено. И ВСЕ! Классическое противоборство преподавателя со студентом сведено к противоборству студента со своей программой. Подводный камень только один - от преподавателя требуется от момента формулировки вопроса до момента ответа не спускать со студента глаз. При малейшем подозрении на несанкционированный запуск программы - менять исходные данные.