Я обучаю нескольких студентов, которые испытывают значительные трудности в изучении основ их первого языка программирования: C ++. Я знал много отличных и ярких учеников, которые не сдали или бросили свой первый курс CS. Каждый, кого я читаю, дает аналогичный отчет о своем опыте в классе: преподаватель движется слишком быстро, в лекциях нет никакого смысла, и др. До этого урока CS большинство из этих учеников не проявляли никакого интереса к компьютерам как к чему-то большему, чем текстовые процессоры, веб-браузеры или какой-либо другой вид развлечений. Компьютер - это черный ящик, который работает, так зачем с ним связываться?
Я думаю, у них возникли проблемы с соединением абстракций информатики с привычными концепциями. То есть эти ученики могут знать, как изучать математику, биологию или физику, но эти методы не работают, когда дело доходит до программирования.
У кого-нибудь есть какие-либо предложения или советы? Студенты, которым я помогаю, не заслуживают провала этого занятия. Понятно, что преподаватель не учитывает стиль обучения этих учеников. То есть инструктор подводит не своих учеников.
Ответы:
Есть несколько вещей, с которыми борется практически каждый новичок. Студенты должны знать, как читать код, прежде чем они смогут научиться писать код.
=
) в языках C-стиля вводит в заблуждение. Вы должны очень тщательно объяснить, чтоa = 5
означает «присваивать 5 переменнойa
, а не « равно 5 ».3+3
является целым числом,3.5 + 3
является двойным,"3" + "3"
(в C #) является строкой,x == 5 * 3 + 25
является логическим (или целым числом в C ++). Потратьте много времени на то, чтобы убедиться, что ученик полностью доволен этим понятием.x
определенный в одной области отличается отx
определенного в другой области.for
Циклы не должны преподаваться, пока не будутwhile
даны адекватные примеры итерации с использованием циклов Сокращенный синтаксис сбивает с толку, и это заставляет студентов задуматься, почему они не могут просто использоватьwhile
циклы. Может быть полезно иметь шпаргалку, которая описываетfor
цикл в терминахwhile
цикла.Компоненты ООП в C ++ - это совершенно другой зверь, и я надеюсь, что инструктор этого не добьется - потому что ООП лучше всего преподавать с использованием языков, которые были разработаны с нуля как ООП. По моему опыту, преподавание ООП через C ++ никогда не шло хорошо.
источник
Вы преподавали программирование раньше?
Я преподавал программирование для CS и не-CS майоров в течение четырех лет. Первый семестр, мой опыт был похож на ваш, пока я не узнал несколько вещей.
То, что мне показалось бессмысленно простым, было совсем не просто для начинающих.
Независимо от языка, вам нужно создать ментальные рамки - такие очевидные вещи, что вы даже не понимаете, что знаете их, такие как:
Компьютеры делают только одну вещь одновременно. (Любой, кто говорит, что у них есть параллелизм и конвейеризация, уходите. Вернитесь, когда студенты что-то знают.) Компьютеры могут делать только небольшое количество разных вещей, и они не могут начать делать один шаг, пока предыдущий не закончен. Я только говорю это, потому что компьютеры, кажется, делают так много вещей, и делают их мгновенно, что для новичка кажется, что они делают все сразу, а также читают ваши мысли.
Переменные важны. Важно понимать, что имя переменной и ее содержимое во время выполнения - это две совершенно разные вещи. Новички борются с этим. Если я скажу «Напишите программу для ввода вашего имени, а затем скажите« Привет вам »», им нужно выяснить, что им нужна переменная для хранения их имени, и они должны придумать имя для переменной, и они испытывают искушение. назвать его в честь себя и спросить, что означает «вход».
Существует огромная разница между временем написания / редактирования программы и временем ее выполнения. Во время их первых упражнений им нужно напоминать об этом довольно часто.
Язык, который я использовал, был бейсик, потому что он очень прост для начинающих. Нетрудно перейти на другие языки после того, как они создали набор базовых навыков программирования.
Мы часто пишем программу на доске, а затем «играем в компьютер». То есть поместите X рядом с текущим оператором, сделайте это вручную, затем переместите X к следующему оператору. Переменные были прямоугольниками на доске, где мы будем записывать текущее содержимое. Когда происходит присвоение, мы стираем его и вводим новое значение.
Одним из приемов, который я разработал, был имитированный десятичный компьютер с 1000 ячейками памяти, каждая из которых могла содержать четырехзначное число. Был небольшой набор «кодов операций», таких как загрузка аккумулятора, добавление, сохранение, переход и т. Д. Я хотел бы, чтобы они написали небольшие программы на этом «машинном языке», а затем пошагово, чтобы он работал. Затем, такие понятия, как переменные, прыжки и т. Д., Гораздо легче объяснить.
Надеюсь, это поможет.
источник
На мой взгляд, C ++ является излишним как первый язык.
Если бы я был вами, и у меня было достаточно времени, я бы занялся внедрением концепций программирования и CS с использованием Python (или аналогичного).
Когда концепции ясны, т. Е. Когда они знакомы с базовыми структурами данных, косвенным обращением, базовыми алгоритмами и т. Д., Я постепенно внедряю C ++, и они очень быстро смогут соотнести то, что они уже изучили.
источник
Вот что я бы посоветовал:
По сути, я бы посоветовал вам создать одну бумагу формата А4, в которой есть все необходимые детали. Какой-то справочник, в котором есть все детали. Также могут помочь некоторые книги, например, книга «Язык программирования Си» очень помогла, потому что в ней были все необходимые детали, доступные в компактной форме. Сжатие информации является необходимой частью при создании статьи формата А4, которая содержит все детали.
источник
Программирование существенно отличается от других общих областей, с которыми сталкивается студент. Многие студенты до колледжа преуспели, просто уделив внимание в классе и, возможно, выполнив несколько домашних заданий с легкими проблемами и ответами в конце книги. Это больше о запоминании процессов, а затем их создании. Кроме того, многие студенты впервые получают неправильный ответ (синтаксические ошибки, логические ошибки, ошибки сегментов и т. Д.). Это может снизить мотивацию студента при работе над программами.
Чтобы по-настоящему знать, что происходит с программированием, им нужно ПРАКТИКОВАТЬ МНОГО. Часто пропускаемая техника состоит в том, чтобы заставить их писать псевдо-код на любом родном языке. Попросите, чтобы они продолжали расширять это, пока у них нет довольно подробного решения проблемы. Тогда это вопрос перевода этого в реальный код.
источник
Когда я учился в колледже, я был репетитором для введения в курс программирования среди других курсов. Проблема, которую вы описываете, не редкость. В зависимости от вашей конкретной роли у вас могут быть разные подходы, которые вы хотите использовать.
Во-первых, если это широко распространенная проблема, затрагивающая значительную часть учащихся в классе, если у вас есть доступ к этому, я бы обратился к преподавателю, который преподаёт курс, с конкретными отзывами о том, какие концепции студенты не понимают, чтобы он или она может либо включить дополнительный обзор этого материала по мере его появления в семестре, либо улучшить учебный план для будущих терминов.
Если вы будете преподавать дискуссионный раздел для курса в дополнение к вашему лабораторному занятию, это было бы прекрасным временем, чтобы разъяснить вещи, которые сбивают с толку в лекции, и помочь сделать их более конкретными и убедиться, что все основы поняты.
Если вы работаете с этими студентами только в течение учебного курса, вы все равно можете использовать это время для обучения студентов один на один или несколько за раз, концептуальным строительным блокам, которые им нужны для понимания и завершить свою домашнюю работу.
Они могут чувствовать себя настолько потерянными в классе, что даже не знают, где остановиться и задать вопросы. Если это так, вернитесь к основам с ними. Где они были в курсе, когда в последний раз понимали, что происходит? Если они не уверены или «никогда» не поняли, вам, возможно, придется вернуться к началу объяснения «привет», научить их таким вещам, как переменная, как компьютер берет их список «инструкций» и пытается делайте их по порядку, но компьютер не такой «умный», как мы, поэтому вы должны быть очень буквальными и говорить то, что компьютер должен понимать, и т. д.
На самом деле, это точка борьбы и разочарования, которые я довольно часто видел на курсах программирования не по специальности. Студенты пишут код. Это кажется «примерно» правильным, но затем они идут на компиляцию, и это дает ошибку, очень загадочную ошибку. И они понятия не имеют, что с этим не так. И смотреть на их код в течение нескольких часов. Затем, наконец, выясните, что это было что-то, что кажется тривиальным, например, отсутствующая точка с запятой или скобка в неправильном месте. Затем они снова компилируют его, и все равно есть ошибка, это что-то еще. Они записали имя переменной по-разному во второй раз, когда использовали его. И так далее. Поэтому они просят помощи у друга, репетитора или кого-то другого, и они могут ответить на вопрос «о, просто добавь это туда, и тогда это сработает». Таким образом, их опыт показывает, что программирование немного "загадочно"
Это область для репетиторов, где у вас есть много возможностей, чтобы помочь. В зависимости от их уровня разочарования, у меня могут быть разные подходы, чтобы помочь им понять, почему их код не работает. Если они что-то понимают, я мог бы дать им подсказки и попытаться помочь им разобраться самостоятельно. Но если они как раз в конце своей веревки готовы отказаться от разочарования, я часто даю им пару халявных ответов, а затем пытаюсь хотя бы задать им вопросы типа: «Вы понимаете, почему это изменение исправило вашу программу? ?»
Для некоторых студентов, особенно не-майоров, у них может не быть методического внимания к деталям, необходимого, чтобы быть хорошим программистом или получать удовольствие от программирования. Вы можете держать их в руках с помощью стратегий, чтобы помочь им обратить внимание на детали и быть достаточно методичными, чтобы решать проблемы, даже если для них это вызов.
Но сохраняйте анальный интерес к тому, что студенты делают свой код «правильно» - так часто начинающие программисты создают проблемы с вложенностью и областью видимости, потому что у них несовпадающие фигурные скобки или тому подобное, потому что они не обращают внимания на то, что вложено под чем. Дайте им контрольный список «вещей, которые нужно проверить, когда ваша программа не скомпилируется», например, правильно сделайте отступ для всего кода и убедитесь, что фигурные скобки совпадают, убедитесь, что все строки заканчиваются точкой с запятой, особенно вокруг номера строки, где отображается первая ошибка и т. д.
Научите их собирать рано и часто собирать. Напишите минимальный скелетный код (скажем, привет мир), скомпилируйте / протестируйте. Добавьте несколько строк, скомпилируйте снова. Гораздо проще находить ошибки, если вы смотрите только на маленькую корзину изменений, а не на большую корзину.
Помогите им научиться разбивать проблему на более мелкие разрешимые проблемы. Это то же самое, что мы делаем как профессиональные программисты, решающие гораздо более сложные задачи, которые мы не знаем, как их решить. Вы продолжаете разбивать его на части, пока не доберетесь до того, что вы либо знаете, как решить, либо сможете провести какое-то исследование, чтобы узнать, как решить. «Какие шаги нужно предпринять, чтобы получить рабочее решение?» Ну, во-первых, вам понадобится код скелета (привет мир). Ты знаешь как это сделать? Да, отлично, поэтому, когда мы закончим говорить, вы можете начать с этого! Затем он должен прочитать файл в качестве ввода. Вы помните, что читали об этом в главе 4? На самом деле, нет? Почему бы вам не взглянуть на это после того, как вы запустите привет, и посмотреть, как далеко вы можете добраться до того, чтобы заставить это работать, а затем перезвоните мне, и я Я помогу вам еще, когда вы застряли на этом. В первые несколько раз вам может понадобиться составить нумерованный список шагов, необходимых для решения проблемы, чтобы они могли на примере узнать, как разобрать проблему.
Если они получают некоторые, но не все материалы в классе, предложите им задавать вопросы в классе, потому что в девяти случаях из десяти они не единственные ученики, не понимающие, и профессор, вероятно, просто замаскировал что-то важное.
Если они тратят «часы», уставившись на одну ошибку, но не выясняя ее, это пустая трата времени, они не многому учатся на этом. Часто ошибки - это проблемы со способностью проникновения в суть, и для их решения необходимо придумать правильное понимание, и у них может не быть ловкости для подобных проблем. Предложите другие общие подходы, которые следует использовать, когда они застряли: попросите другого друга в классе о помощи (узнайте некоторых одноклассников, если это необходимо), начните выполнять свою домашнюю работу заранее, чтобы у них было время остановиться, а затем приходите в Учебную лабораторию и задавайте вопросы в нерабочее время, или идите в кабинет профессора. Если они привыкли к зубрежке, что хорошо подходит для запоминания предметов, они попадут в стену разочарования, когда они сталкиваются с программированием, которое больше о решении проблем, чем запоминание. Покажите им, как искать примеры синтаксиса в их учебнике, в стеке и т. Д. Предложите им опубликовать вопрос на форуме вопросов частного класса, если таковой имеется.
Научите их, как сузить, где код перестает работать. Комментируйте вещи до тех пор, пока не вернетесь к тому, что работает, а затем медленно добавляйте вещи обратно, пока вы снова не получите этот сегмент.
Многие из этих идей могут быть превращены в раздаточный материал, если они много выдвигаются. Стратегии - это, как правило, профессора-часть, которая затушевывает - они тратят свое время на синтаксис, семантику того, как писать циклы, массивы, ввод-вывод и т. Д. Но не хватает времени на то, «что мне делать, когда я пытаюсь» запустить мой код, и он просто не скомпилируется или не зависнет? "
Когда речь идет о концептуальных вещах, особенно основах, таких как «что такое переменная» или «что такое цикл?» непонимание, которое помешает им не отставать от остальной части курса. На лекционном курсе у профессора может не быть времени, чтобы ответить на каждый вопрос или помочь лампочке сработать каждому студенту. И это одна из причин, почему репетиторы так важны для обучения программированию. Им может потребоваться индивидуальное обучение с дополнительными аналогиями, чтобы конкретизировать конкретную тему.
Поскольку вы преподаете на C ++, я представляю, что уроки представляют собой абстрактную тему, которую некоторые студенты пытаются «получить». Часто абстракция классов преподается с примерами, соответствующими некоторому случайному объекту реального мира, например, «банкомату», и проводятся аналогии с объектом реального мира. У вас могут быть переменные для отслеживания того, сколько денег находится внутри, у вас есть методы, которые похожи на правила, которые сообщают банкомату, как реагировать на определенные условия, и т. Д. Иногда одна аналогия является той, которая «придерживается» определенного человека и другие студенты лучше понимают другого.
По возможности, рисуйте для них картинки. Как диаграмма последовательности того, что происходит со временем, чтобы помочь им увидеть общую картину того, что делает код, который они пишут. Пользователь нажимает эту кнопку. Затем программа должна ответить, выполнив x, y и z. Нарисуйте в почтовом отделении массив, похожий на группу почтовых ящиков, каждый из которых может содержать только один номер, а указатели - стрелки, указывающие на «адрес» на передней части коробки. И т.п.
источник
Из всех замечательных вариантов для языков программирования, этот колледж использует C ++ в качестве своего вводного класса CS для специализаций не-CS ?? В руках талантливого инструктора, это может быть отдаленно мыслимо - но зачем делать это так сложно?
Когда я выучил «Паскаль» на уроках колледжа, мы провели первые 3 недели, работая с « Карелом роботом ». Это была очень простая песочница, похожая на лого-среду программирования, в которой все основные концепции (включая рекурсию) были тщательно изучены, прежде чем делать это в Pascal. В «Карел-робот» вы управляете роботом в 2D-пространстве, используя небольшой набор простых команд. Это дает студентам полезную конкретную основу, на которой они могут опираться для того, что будет дальше.
Возможно, теперь существуют более современные учебные языки программирования, которые выполняют роль «Карел Робот»? Возможно, уже слишком поздно для ваших учеников.
источник
В дополнение к тому, что было сказано, я предполагаю, что как новичкам им нужно только поцарапать поверхность, так что подгоняйте свой учебный план соответствующим образом, чтобы избежать сложных вещей.
0 - дать им простую задачу (скажем, оценить выражение).
1 - дай им время разобраться.
2 - дай им ответ.
3 - пройти ответ построчно
4 - попросите их сравнить ваш ответ с их презрением
5 - попросите их извлечь урок из этой проблемы
6-добавить еще один шаг к той же проблеме, скажем, условие, требующее оператора IF
7 - повторите вышеупомянутое задание на нескольких задачах. К тому времени они уже поняли бы основы языка и то, как использовать окружающую среду. Будет готов к тому, что будет дальше.
Также,
- имейте простую бонусную задачу для них, чтобы попробовать дома каждые 2 класса или около того
-связаться с каждым студентом, чтобы увидеть, какой смысл мешает ему идти дальше
-обеспечить легкий справочный материал, забыть сложные темы и сложные книги
- часто получайте отзывы и используйте их
- попросите их подготовиться к следующей теме, прежде чем они придут в класс
источник
Когда я прошел CS 101, мне помогло изучение логики, прежде чем даже смотреть на код. Мы просмотрели таблицы истинности и исчисление высказываний просто для того, чтобы начать думать «это правда или ложь», а не «это равно тому или другому».
Это было правильно, когда все щелкнуло для меня. Как только я понял, что программирование - это просто манипулирование истинными / ложными значениями по своей сути, все стало относительно простым.
И это сделало так, чтобы не имело значения, какой язык я использовал, логика везде одинакова. Синтаксис может сбивать с толку, но я могу сказать что-то вроде: «Хорошо, в Obj CI отправлять сообщения классам, подобным этому, и в C ++ сообщения отправлялись таким же образом. Но алгоритм вообще не изменился». и т.п.
источник
Где-то есть статья ACM или IEEE, в которой рассматриваются некоторые детали того, почему новичкам (даже выпускникам CS, начинающим в этой области) нужно сидеть за старшим программистом и смотреть, как они кодируют проблему.
Профессионалы часто спариваются для сложных задач. Студентам слишком часто говорят не делать этого. Преимущества соединения (по очереди на клавиатуре): 1. Студенту сразу сообщают, что он делает неправильно. Мгновенная обратная связь. 2. Когда ученик наблюдает за учителем, ученик замечает то, о чем учитель никогда бы не подумал указать.
Вместо того, чтобы позволить ученику развить плохие методы, они пресечены в зародыше. (Я бы перевернул # 1 здесь # 2 и позволил бы ученику смотреть инструктора / TA FIRST )
Обучение CS со статическим набором слайдов PowerPoint не очень хорошо подходит для временного процесса написания программы. (Конечно, есть приемы, которые вы можете делать с растущими функциями построчно, но они обычно неудобны.)
Учащиеся должны знать, с чего начать писать, а где остановиться и скомпилировать. Наш мозг в основном предназначен для чтения слева направо сверху вниз, но программа, как целое, выбирает свою собственную книгу приключений, втиснутую в одну страницу!
Слишком часто начинающий копирует целую программу, а затем компилирует. Даже профессионал может сделать первый шаг в этом направлении, прежде чем понять, что он должен был оставить все функции пустыми и скомпилировать программу, а затем итеративно добавить ее в рабочий скелет.
Кроме того, связана нелепая идея, что CS нужно учить без компьютера и только карандашом и бумагой. Интересно, сколько нанятых специалистов по программированию действительно считают, что это лучший способ, или же это просто то, что делают инструкторы CS, потому что им самим не нравится работать с компьютерами? Любая попытка удалить компьютер с картинки - подлая. Это делает программирование менее увлекательным и менее интерактивным, чем должно быть. Мы давно прошли дни ввода данных в перфокарту и терпеливо ждали. Сегодняшние профессиональные разработчики являются поклонниками мгновенного удовлетворения. К счастью, большинство студентов тоже.
Очевидно, что рисование красивых рисунков карандашом и бумагой до и во время процесса разработки является мощным инструментом как для профессиональных, так и для начинающих программистов. Это как время «руки на клавиатуре» также должно быть потрачено в паре! Может быть, здесь имеет смысл позволить ученику сделать первый круг перед наблюдением за учителем, хотя даже с этим, вероятно, стоит увидеть реальный мыслительный процесс учителя.
Наконец, горячие клавиши и приемы редактирования, которые использует профессиональный разработчик, не являются "шумом" для обучения студента. Самое главное, они привлекают и интересуют студента. Во-вторых, они повышают осведомленность об общих потребностях развития. Кроме того, самые основные из этих практик часто легко выполнить, но изначально они не очевидны. Молодой ученик лесного цеха может легко научиться удалять гвоздь с помощью молотка, но в большинстве случаев сначала нужно сказать, для чего нужен этот коготь. Некоторые чрезвычайно легкие вещи просто не тривиальны, чтобы учиться без обучения. Даже профессиональные разработчики постоянно забывают об этих «хитростях» и получают выгоду от таких инструментов рефакторинга, как resharper для удаления избыточного или недоступного кода и т. Д.
источник
Компьютерное программирование часто является одним из первых курсов, где когнитивные навыки синтеза требуются для проходного балла. Этот навык очень трудно передать кому-то еще. Вы можете объяснить все компоненты, которые у них есть, и как они работают. Вы можете привести множество примеров того, как другие люди использовали синтез, чтобы объединить эти компоненты в более полезное целое, но вы можете сделать только так, чтобы что-то «щелкнуло» в голове студента.
По моему опыту, это умение синтеза, которое чаще всего ускользает от людей, которые не «понимают» программирование. Они прекрасно разбираются в деталях, таких как переменные, функции и циклы, но они задают такие вопросы, как: «Я понимаю, почему это работает, но как вы узнали, что вам нужно поставить цикл там?» Вы просто должны практиковаться, пока не получите это.
источник
Чтобы неправильно процитировать Аарона Хиллегаса, напомните им, что они не глупы, это просто сложно. Программированию сложно тренировать свой ум, это совсем другой способ мышления, и хотя они, возможно, борются с основами, они, вероятно, вполне осведомлены об этом, и это сделает их довольно унылыми.
Я говорю об этом как о человеке, который также провалил свой первый курс CS, я программировал много раньше и получил все концепции (VB, да, детка), но C ++ просто не захотел бы для меня. Я закончил тем, что вернулся к самому основам и отработал его, затем он щелкнул, но если бы кто-то сказал: «Ты не идиот, это просто тяжело», это сделало бы мою жизнь проще.
источник
Вы сказали, что «эти студенты могут знать, как изучать математику, биологию или физику, но эти методы не работают, когда дело доходит до программирования».
Для этого есть причина: программирование требует чего-то, что не обязательно требуется другим дисциплинам: креативность и ... фантазия . Возможность «представить вещи на работе». Я лично обнаружил, что такое требование более распространено (конечно, со всеми вытекающими исключениями) у людей, пришедших из техникума (в частности, электроники и электромеханики): они должны «представить электрические потоки и то, как они контролируют друг друга», поскольку они не могут увидеть их!), чем из «чистой науки» (где все выглядит как поворот математики).
В этом последнем случае необходимо помочь «визуальному познанию». Важно не просто сосредоточиться на понятии и тексте (тип -> compile -> look, ошибки не могут работать, если вы не можете «прочитать» ошибки), но и предоставить способ визуализации вещей либо во время разработки ( имитируя то, что происходит на машине: будьте готовы с белой доской и набором цветных постов) и во время выполнения.
Чтобы эта последняя часть была успешной, необходимо дать представление об операционных системах и о том, «как программы работают на машине» (и что это за машина на самом деле). И должна быть дана не пугающая IDE. Я обычно "настроенные блоки кода" со многими вещами, удаленными, чтобы "не отвлекать". Понятие проекта, созданного из источников для создания объектов, которые должны быть связаны с библиотекой, должно быть дано ДО начала разговора о языке.
Традиционный привет мир C ++ требует точки входа и устройства вывода. Студент должен быть уже знаком с этим. Успех такого рода курсов зависит от самых первых дней. Вам нужно стимулировать визуализацию того, что происходит внутри компьютера, чтобы они могли понять, что такое программирование.
Остальное - синтаксис (наука) и абстракция (фантазия)
источник