Я преподавал вводное программирование на уровне колледжа. Это был курс хлеба и масла, все преподаватели делали это, и я думаю, что мы сделали это довольно хорошо. Мы следовали общему тексту и сдавали общие экзамены, но у каждого из нас был свой метод работы в классе. С тех пор прошло много времени, но иногда я учу некоторых детей программированию, и вся картина примерно одинакова.
То, как я это делаю, - это начинать снизу как можно более конкретно. То, что знают студенты, - это структура. У них уже есть много понятий. Я строю новые концепции поверх них и отбрасываю концепции, которые они могут сформировать, которые приводят к обратным результатам. В то же время я заставляю их учиться на практике .
Я построил маленький компьютер с чипом Intel 8008, немного СППЗУ и несколько микросхем. Я запрограммировал его на небольшой дуэт, когда микросхема ввода-вывода была подключена к паре динамиков. Я бы объяснил, как работает маленькая программа, с внутренним циклом для обратного отсчета счетчика. Это будет действовать как задержка. Затем он переключит выходной бит и сделает это снова. Это будет делать это некоторое время, а затем переключаться на другую задержку, давая еще один шаг и так далее. У микросхемы памяти был небольшой таймер, и, если бы я подключил провод конденсатора к одному из входов таймера, программа работала бы очень медленно . Класс мог слышать, как ораторы щелкают, щелкают, щелкают ... Я хотел, чтобы класс понял, что компьютер делает очень простые вещи по шагам за раз, Тогда я бы отсоединил провод конденсатора, и «музыка» разразилась. (аплодисменты)
Затем я построил симулятор для очень простого десятичного компьютера, имеющего 1000 ячеек памяти, каждая из которых содержит 4-значное десятичное число со знаком. У него были очень простые коды операций, такие как «добавить в аккумулятор», «прыгать, если отрицательный», и так далее. Я бы попросил их написать небольшие программы на этом «машинном языке», например, добавить два числа или добавить список чисел. Затем они могли наблюдать за его работой, пошагово или удерживая клавишу Enter, чтобы посмотреть, как он работает «быстро».
Смысл этого состоял в том, чтобы создать концепцию, согласно которой компьютеры могут выполнять очень небольшое количество различных базовых операций, и они выполняют их по одному. Это должно противодействовать сложившемуся у них впечатлению, что компьютеры сложны, что они делают все одновременно и читают ваши мысли по выгодным ценам.
Оттуда мы перешли к программированию на «реальном» языке (BASIC :), начав с очень простых, но интересных программ, работая с условными выражениями, циклами, массивами, файлами, объединением и так далее. Цель состояла в том, чтобы создать достаточный набор навыков, чтобы они могли взять на себя проект по своему выбору, потому что это единственное, что делает программирование интересным - использование, которое вы можете использовать. Я выбрасывал некоторые идеи для проектов, а потом они брали их оттуда. Я хотел бы попросить письменные идеи, а затем отчеты о прогрессе, чтобы они не откладывали его до последней минуты, а затем паниковали. Я думаю, что проекты были лучшей частью, потому что они учились своими силами.
Это первоначальное обоснование в очень конкретном понимании того, что делают компьютеры, значительно упростило дальнейшее обучение концепциям, которые в противном случае были бы реальными ограничителями скорости, такими как массивы или (в более позднем курсе) указатели. Мы склонны прославлять понятие «абстракция» как эту замечательную вещь, но она должна быть построена на бетонном фундаменте, а не на воздухе.