Четыре урока о том, что (не) делать со студентами-программистами-новичками.

Этой весной я вел курс по недорогим датчикам качества воздуха в Джорджтаунском университете. Как я описывал в другом месте, этот класс был забавным способом для учащихся политической школы запачкать руки, фактически создавая и тестируя рабочие устройства. Большинство моих студентов изучали специальность Наука, технология и международные отношения (STIA) в Школе дипломатической службы Уолша - и почти не имели подготовки в области инженерии или программирования.

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

Это был Урок №1 на пути обучения программированию внешнеполитических специалистов: не говори им, что собираешься этим заниматься. Наши мониторы качества воздуха были основаны на микропроцессорах Arduino, и они не работали бы, если бы они не были запрограммированы в Arduino's IDE с использованием варианта C ++. Если бы в первый день я был более откровенен, посещаемость могла бы значительно упасть. Кодирование вызывает у некоторых студентов такой страх и трепет, что становится серьезным психологическим барьером на пути к обучению. Поэтому иногда лучший способ обойти это - преуменьшить значение того, что они занимаются программированием, пока не станет слишком поздно. И как я сейчас упомяну, именно это и произошло.

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

Я начал с того, что они установили IDE и запустили предварительно загруженную демонстрационную программу («Blink»), чтобы посмотреть, как работает система. После этого я начал показывать им несколько строк кода на каждом занятии и требовать, чтобы они вводили код в IDE. Поскольку я распространял слайды лекций в цифровом виде, мне нужен был способ убедиться, что они не будут просто вырезать и вставлять код. Несколько случайно мне пришла в голову идея сделать снимок экрана с написанным мной кодом и разместить его на слайдах. В результате ручного ввода кода учащиеся получали все типичные ошибки при компиляции, такие как отсутствие скобок и неправильное написание имен переменных. Когда они приступили к исправлению этих «опечаток», они получили введение в базовую отладку. Конечно, я не называл это так, по крайней мере, сначала.

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

Я подозреваю, что этот момент не очевиден для людей, которые в основном пишут эссе на естественном языке, где линейный поток идей не совсем строг - читатель может вернуться к предыдущему абзацу или сделать вывод, что следующий абзац вернется к тому же самому тема. Это был Урок № 2: основная парадигма кода (строго последовательное выполнение, с управлением потоком данных и определениями функций) не всегда интуитивно понятна и должна быть четко объяснена начинающим программистам . В более широком смысле это показывает, что среди начинающих программистов есть скрытые ловушки путаницы и неправильных представлений, которые очень трудно заметить, если вы занимаетесь программированием в течение длительного времени.

Почему было так много разных способов сделать имя параметра числом? Как я быстро обнаружил, пытаясь объяснить свои рассуждения, этого просто не должно было быть.

Другая проблема заключалась в том, что я использовал несколько разных способов сделать то же самое в коде, не понимая почему. Например, я объявил одни параметры как константы, а другие (которые не менялись) как переменные - в основном из-за того, что я был небрежен. Я использовал разные типы переменных (беззнаковые целые числа, числа с плавающей запятой, указатели на char, строки и т. Д.) По причинам, которые были не очень хорошими - в основном, пытаясь сохранить память, которая на самом деле не была ограничена - и это оказалось непонятным для ученики. Почему было так много разных способов сделать имя параметра числом? Как я быстро обнаружил, пытаясь объяснить свои рассуждения, этого просто не должно было быть. С незначительным снижением производительности я мог бы использовать всего два подхода: переменные с плавающей запятой и строки. Да, это неправильное инженерное решение, но оно избавило бы от огромной путаницы и все равно выполнило бы свою работу.

Это был Урок № 3: избегайте ненужных сложностей. Даже если кажется, что вы обучаете дурным привычкам, я бы сказал, что тем, кто впервые изучает код, следует показывать минимально возможное количество способов выполнения задачи и подвергать их сложным уточнениям только после того, как они прочно усвоят код. изучил основы. Если бы вы учились писать в детском саду, и учитель дал вам цветной карандаш в первый день, карандаш во второй и авторучку в третий, вы запутались бы. Это правда, что все эти инструменты имеют разное применение, но вас не следует просить узнать обо всех из них, прежде чем вы овладеете основами работы с одним из них. Код тот же: будьте максимально экономны в методах. Оглядываясь назад, это кажется очевидным, но трудно избавиться от привычек программирования, которые у вас были долгое время.

Если бы вы учились писать в детском саду, и учитель дал вам цветной карандаш в первый день, карандаш во второй и авторучку в третий, вы запутались бы.

Наконец, я обнаружил, что ближе к концу семестра почти все студенты действительно наслаждались этим опытом и чувствовали себя намного увереннее в идее программирования. Никто из них не сбегал, чтобы сменить специализацию на информатику, но они покинули класс с твердым базовым пониманием того, что стоит за программированием, и с уверенностью, что потенциально могут узнать больше в будущем. Полагаю, это Урок №4: Оно того стоит. Довести учащихся до уровня, при котором они не боятся программирования и будут знать достаточно о том, как продолжить обучение, - это важная победа. Я с нетерпением жду следующей возможности научить программировать еще больше внешнеполитических специалистов.