Обучение студентов, которые борются с основами в C ++ [закрыто]

26

Я обучаю нескольких студентов, которые испытывают значительные трудности в изучении основ их первого языка программирования: C ++. Я знал много отличных и ярких учеников, которые не сдали или бросили свой первый курс CS. Каждый, кого я читаю, дает аналогичный отчет о своем опыте в классе: преподаватель движется слишком быстро, в лекциях нет никакого смысла, и др. До этого урока CS большинство из этих учеников не проявляли никакого интереса к компьютерам как к чему-то большему, чем текстовые процессоры, веб-браузеры или какой-либо другой вид развлечений. Компьютер - это черный ящик, который работает, так зачем с ним связываться?

Я думаю, у них возникли проблемы с соединением абстракций информатики с привычными концепциями. То есть эти ученики могут знать, как изучать математику, биологию или физику, но эти методы не работают, когда дело доходит до программирования.

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

AdmCrunch
источник
2
Комментаторы: если у вас есть ответ, оставьте его как ответ: не оставляйте его как комментарий. Если ваш ответ уже добавлен, проголосуйте. Если вы хотите обсудить тему этого вопроса с другими, используйте чат .
1
Не? Из моего опыта достаточно людей, которые программируют и не должны ...

Ответы:

42

Есть несколько вещей, с которыми борется практически каждый новичок. Студенты должны знать, как читать код, прежде чем они смогут научиться писать код.

  • Последовательная природа императивных языков. Люди с трудом понимают, что функции выполняются последовательно, по одному элементу за раз, как рецепт. Один из способов преодолеть это - показать некоторый код, работающий через отладчик.
  • Оператор присваивания ( =) в языках C-стиля вводит в заблуждение. Вы должны очень тщательно объяснить, что a = 5означает «присваивать 5 переменной a, а не « равно 5 ».
  • Для начинающих безопасно описать функции как структурированные блоки кода, к которым могут переходить другие функции. Кроме того, новичкам трудно понять, что в C ++ аргументы функции определяются по порядку, а не по имени.
  • Большинство императивных языков программирования имеют некоторые декларативные компоненты и некоторые процедурные компоненты, и C ++ не является исключением. Убедитесь, что учащийся понимает, что некоторые части кода описывают структуру программы, а другие части (функции) описывают, что должна делать программа.
  • Выполнение программы с помощью отладчика является чрезвычайно важным и часто игнорируемым инструментом обучения .
  • У выражений есть типы . 3+3является целым числом, 3.5 + 3является двойным, "3" + "3"(в C #) является строкой, x == 5 * 3 + 25является логическим (или целым числом в C ++). Потратьте много времени на то, чтобы убедиться, что ученик полностью доволен этим понятием.
  • Переменная сфера - это то, что новички все время путают. Объясните учащимся, как работает область действия, и убедитесь, что они знают, что xопределенный в одной области отличается от xопределенного в другой области.
  • На каждую переменную ссылаются как минимум три раза за время ее существования: объявление, присваивание (часто выполняется в той же строке, что и объявление), потребление. Если что-то из этого отсутствует, то где-то есть концептуальная ошибка. По той же причине, если вы анализируете работающую программу, вы всегда можете найти эти три вещи в коде, чтобы выяснить назначение переменной.
  • forЦиклы не должны преподаваться, пока не будут whileданы адекватные примеры итерации с использованием циклов Сокращенный синтаксис сбивает с толку, и это заставляет студентов задуматься, почему они не могут просто использовать whileциклы. Может быть полезно иметь шпаргалку, которая описывает forцикл в терминах whileцикла.
  • Массивы и указатели довольно просты в обучении, но учатся кошмарно. Другими словами, до щелчка важна практика.
  • Идея, что код является текстом, а скомпилированная программа на самом деле является файлом , неуловима для некоторых новичков. Обязательно покажите им .cpp, .h и двоичные файлы в оболочке.

Компоненты ООП в C ++ - это совершенно другой зверь, и я надеюсь, что инструктор этого не добьется - потому что ООП лучше всего преподавать с использованием языков, которые были разработаны с нуля как ООП. По моему опыту, преподавание ООП через C ++ никогда не шло хорошо.

Рей Миясака
источник
2
«Люди не понимают, что функции выполняются последовательно»? Я думаю, что именно с этим практически ни у кого не возникает проблем (за исключением, возможно, людей, которые уже выучили некоторый функциональный язык до начала процедурного). Но я согласен обо всем, что вы говорите.
оставлено около
3
+1 для перехода к отладчику, чтобы они почувствовали разницу между самой программой и ее выполнением.
Майк Данлавей
4
@leftaroundabout Вы будете удивлены. Математика в основном декларативна, поэтому императивные языки могут отбросить любого, кто изучил алгебру.
Рей Миясака
2
Этот ответ, кажется, немного «сбивает с толку». Понятия, несомненно, правильны и, безусловно, важны, но учить таким образом - все равно, что пытаться научить кого-то водить машину, нарушая правила дорожного движения.
Rewalk
@ Stargazer712 Каждый изучает правила дорожного движения, прежде чем им разрешают пройти дорожное испытание. Я мог бы представить пушистые идеи широкого применения, такие как «практика - это ключ», «быть креативным» или «мыслить логически», но эти вещи, по-видимому, совершенно очевидны для любого преподавателя, а также для большинства студентов. Можно также преподавать абстрактные вещи, такие как дискретная математика или теория языка, как предшественник программирования, но это становится важным только тогда, когда механика настолько сложна, что проблемы не могут быть решены одной интуицией. Рано или поздно люди должны перестать быть дзен и начать преподавать контент .
Рей Миясака
19

Вы преподавали программирование раньше?

Я преподавал программирование для CS и не-CS майоров в течение четырех лет. Первый семестр, мой опыт был похож на ваш, пока я не узнал несколько вещей.

То, что мне показалось бессмысленно простым, было совсем не просто для начинающих.

Независимо от языка, вам нужно создать ментальные рамки - такие очевидные вещи, что вы даже не понимаете, что знаете их, такие как:

  • Компьютеры делают только одну вещь одновременно. (Любой, кто говорит, что у них есть параллелизм и конвейеризация, уходите. Вернитесь, когда студенты что-то знают.) Компьютеры могут делать только небольшое количество разных вещей, и они не могут начать делать один шаг, пока предыдущий не закончен. Я только говорю это, потому что компьютеры, кажется, делают так много вещей, и делают их мгновенно, что для новичка кажется, что они делают все сразу, а также читают ваши мысли.

  • Переменные важны. Важно понимать, что имя переменной и ее содержимое во время выполнения - это две совершенно разные вещи. Новички борются с этим. Если я скажу «Напишите программу для ввода вашего имени, а затем скажите« Привет вам »», им нужно выяснить, что им нужна переменная для хранения их имени, и они должны придумать имя для переменной, и они испытывают искушение. назвать его в честь себя и спросить, что означает «вход».

  • Существует огромная разница между временем написания / редактирования программы и временем ее выполнения. Во время их первых упражнений им нужно напоминать об этом довольно часто.

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

Мы часто пишем программу на доске, а затем «играем в компьютер». То есть поместите X рядом с текущим оператором, сделайте это вручную, затем переместите X к следующему оператору. Переменные были прямоугольниками на доске, где мы будем записывать текущее содержимое. Когда происходит присвоение, мы стираем его и вводим новое значение.

Одним из приемов, который я разработал, был имитированный десятичный компьютер с 1000 ячейками памяти, каждая из которых могла содержать четырехзначное число. Был небольшой набор «кодов операций», таких как загрузка аккумулятора, добавление, сохранение, переход и т. Д. Я хотел бы, чтобы они написали небольшие программы на этом «машинном языке», а затем пошагово, чтобы он работал. Затем, такие понятия, как переменные, прыжки и т. Д., Гораздо легче объяснить.

Надеюсь, это поможет.

Майк Данлавей
источник
Мне нравится эта компьютерная идея. У вас есть официальный язык для этого, или вы просто обсуждаете идеи в псевдокоде / простом английском?
Рей Миясака
@Rei: я написал (на бейсике) симулятор под названием Simple. Это был весь интерфейс клавиатуры. Пользователь может вводить значения в «память»; затем они могли бы пошагово и проверить аккумулятор и память в каждой точке, если они хотели. Я думаю, что это было действительно важно, потому что это заставило их делать это, а не просто говорить об этом.
Майк Данлавей
Ах, хорошо. Спасибо, я должен попробовать что-то подобное.
Рей Миясака
Это должен быть ответ № 1 по моему мнению.
Rewalk
12

На мой взгляд, C ++ является излишним как первый язык.

Если бы я был вами, и у меня было достаточно времени, я бы занялся внедрением концепций программирования и CS с использованием Python (или аналогичного).

Когда концепции ясны, т. Е. Когда они знакомы с базовыми структурами данных, косвенным обращением, базовыми алгоритмами и т. Д., Я постепенно внедряю C ++, и они очень быстро смогут соотнести то, что они уже изучили.

Яти Сагаде
источник
2
Я согласен, но профессионалы обычно не имеют права выбирать, какой язык преподавать, тем более ТП.
Рей Миясака
4
Я не согласен с Python. Я прошел мой первый класс CS 101 на C ++, а затем перешел в школу, где преподавали CS 101 на Python. Студенты Python были настолько смущены даже основами, когда мы все брали один класс CS 201 ... Но все студенты C ++ преуспели.
ОгмаОсирис
@OghmaOsiris, Честно говоря, я не знаю достаточно о Python, но, может быть, то, что вы засвидетельствовали, могло быть проявлением предвзятости самоотбора. В конце концов, C ++ ужасно страшен для некоторых студентов (особенно для самых неопытных студентов в программировании).
Стефан Бранчик
@ Ohma Что было в классе 201? Если это что-то низкоуровневое, то, вероятно, это должна быть его собственная ветка с C в качестве предварительного условия.
Рей Миясака
1
@OghmaOsiris: Хммм, я должен не согласиться, ну, не согласиться, поделиться другим опытом моего перехода в университет на python, поскольку первый язык оказался очень полезным, насколько я знаю (первым был Java без C ++). Я не думаю, что отдельные переживания считаются пуфом, что одно лучше другого, это бесконечная война пламени. Хотя я могу утверждать, что Python может быть отличным языком программирования для начала, потому что он не встает на вашем пути, он на самом деле делает это лучше, чем большинство языков программирования, которые получают много студентов ....
Trufa
4

Вот что я бы посоветовал:

  1. Дайте им все детали, которые им нужны, чтобы понять это
  2. Поощряйте их, чтобы попытаться понять детали
  3. Убедитесь, что у них есть данные, хранящиеся в компактной форме, когда они им нужны

По сути, я бы посоветовал вам создать одну бумагу формата А4, в которой есть все необходимые детали. Какой-то справочник, в котором есть все детали. Также могут помочь некоторые книги, например, книга «Язык программирования Си» очень помогла, потому что в ней были все необходимые детали, доступные в компактной форме. Сжатие информации является необходимой частью при создании статьи формата А4, которая содержит все детали.

ТР1
источник
3

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

Чтобы по-настоящему знать, что происходит с программированием, им нужно ПРАКТИКОВАТЬ МНОГО. Часто пропускаемая техника состоит в том, чтобы заставить их писать псевдо-код на любом родном языке. Попросите, чтобы они продолжали расширять это, пока у них нет довольно подробного решения проблемы. Тогда это вопрос перевода этого в реальный код.

Питер Смит
источник
3

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

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

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

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

Они могут чувствовать себя настолько потерянными в классе, что даже не знают, где остановиться и задать вопросы. Если это так, вернитесь к основам с ними. Где они были в курсе, когда в последний раз понимали, что происходит? Если они не уверены или «никогда» не поняли, вам, возможно, придется вернуться к началу объяснения «привет», научить их таким вещам, как переменная, как компьютер берет их список «инструкций» и пытается делайте их по порядку, но компьютер не такой «умный», как мы, поэтому вы должны быть очень буквальными и говорить то, что компьютер должен понимать, и т. д.

На самом деле, это точка борьбы и разочарования, которые я довольно часто видел на курсах программирования не по специальности. Студенты пишут код. Это кажется «примерно» правильным, но затем они идут на компиляцию, и это дает ошибку, очень загадочную ошибку. И они понятия не имеют, что с этим не так. И смотреть на их код в течение нескольких часов. Затем, наконец, выясните, что это было что-то, что кажется тривиальным, например, отсутствующая точка с запятой или скобка в неправильном месте. Затем они снова компилируют его, и все равно есть ошибка, это что-то еще. Они записали имя переменной по-разному во второй раз, когда использовали его. И так далее. Поэтому они просят помощи у друга, репетитора или кого-то другого, и они могут ответить на вопрос «о, просто добавь это туда, и тогда это сработает». Таким образом, их опыт показывает, что программирование немного "загадочно"

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

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

Но сохраняйте анальный интерес к тому, что студенты делают свой код «правильно» - так часто начинающие программисты создают проблемы с вложенностью и областью видимости, потому что у них несовпадающие фигурные скобки или тому подобное, потому что они не обращают внимания на то, что вложено под чем. Дайте им контрольный список «вещей, которые нужно проверить, когда ваша программа не скомпилируется», например, правильно сделайте отступ для всего кода и убедитесь, что фигурные скобки совпадают, убедитесь, что все строки заканчиваются точкой с запятой, особенно вокруг номера строки, где отображается первая ошибка и т. д.

Научите их собирать рано и часто собирать. Напишите минимальный скелетный код (скажем, привет мир), скомпилируйте / протестируйте. Добавьте несколько строк, скомпилируйте снова. Гораздо проще находить ошибки, если вы смотрите только на маленькую корзину изменений, а не на большую корзину.

Помогите им научиться разбивать проблему на более мелкие разрешимые проблемы. Это то же самое, что мы делаем как профессиональные программисты, решающие гораздо более сложные задачи, которые мы не знаем, как их решить. Вы продолжаете разбивать его на части, пока не доберетесь до того, что вы либо знаете, как решить, либо сможете провести какое-то исследование, чтобы узнать, как решить. «Какие шаги нужно предпринять, чтобы получить рабочее решение?» Ну, во-первых, вам понадобится код скелета (привет мир). Ты знаешь как это сделать? Да, отлично, поэтому, когда мы закончим говорить, вы можете начать с этого! Затем он должен прочитать файл в качестве ввода. Вы помните, что читали об этом в главе 4? На самом деле, нет? Почему бы вам не взглянуть на это после того, как вы запустите привет, и посмотреть, как далеко вы можете добраться до того, чтобы заставить это работать, а затем перезвоните мне, и я Я помогу вам еще, когда вы застряли на этом. В первые несколько раз вам может понадобиться составить нумерованный список шагов, необходимых для решения проблемы, чтобы они могли на примере узнать, как разобрать проблему.

Если они получают некоторые, но не все материалы в классе, предложите им задавать вопросы в классе, потому что в девяти случаях из десяти они не единственные ученики, не понимающие, и профессор, вероятно, просто замаскировал что-то важное.

Если они тратят «часы», уставившись на одну ошибку, но не выясняя ее, это пустая трата времени, они не многому учатся на этом. Часто ошибки - это проблемы со способностью проникновения в суть, и для их решения необходимо придумать правильное понимание, и у них может не быть ловкости для подобных проблем. Предложите другие общие подходы, которые следует использовать, когда они застряли: попросите другого друга в классе о помощи (узнайте некоторых одноклассников, если это необходимо), начните выполнять свою домашнюю работу заранее, чтобы у них было время остановиться, а затем приходите в Учебную лабораторию и задавайте вопросы в нерабочее время, или идите в кабинет профессора. Если они привыкли к зубрежке, что хорошо подходит для запоминания предметов, они попадут в стену разочарования, когда они сталкиваются с программированием, которое больше о решении проблем, чем запоминание. Покажите им, как искать примеры синтаксиса в их учебнике, в стеке и т. Д. Предложите им опубликовать вопрос на форуме вопросов частного класса, если таковой имеется.

Научите их, как сузить, где код перестает работать. Комментируйте вещи до тех пор, пока не вернетесь к тому, что работает, а затем медленно добавляйте вещи обратно, пока вы снова не получите этот сегмент.

Многие из этих идей могут быть превращены в раздаточный материал, если они много выдвигаются. Стратегии - это, как правило, профессора-часть, которая затушевывает - они тратят свое время на синтаксис, семантику того, как писать циклы, массивы, ввод-вывод и т. Д. Но не хватает времени на то, «что мне делать, когда я пытаюсь» запустить мой код, и он просто не скомпилируется или не зависнет? "

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

Поскольку вы преподаете на C ++, я представляю, что уроки представляют собой абстрактную тему, которую некоторые студенты пытаются «получить». Часто абстракция классов преподается с примерами, соответствующими некоторому случайному объекту реального мира, например, «банкомату», и проводятся аналогии с объектом реального мира. У вас могут быть переменные для отслеживания того, сколько денег находится внутри, у вас есть методы, которые похожи на правила, которые сообщают банкомату, как реагировать на определенные условия, и т. Д. Иногда одна аналогия является той, которая «придерживается» определенного человека и другие студенты лучше понимают другого.

По возможности, рисуйте для них картинки. Как диаграмма последовательности того, что происходит со временем, чтобы помочь им увидеть общую картину того, что делает код, который они пишут. Пользователь нажимает эту кнопку. Затем программа должна ответить, выполнив x, y и z. Нарисуйте в почтовом отделении массив, похожий на группу почтовых ящиков, каждый из которых может содержать только один номер, а указатели - стрелки, указывающие на «адрес» на передней части коробки. И т.п.

Джессика Браун
источник
2

Из всех замечательных вариантов для языков программирования, этот колледж использует C ++ в качестве своего вводного класса CS для специализаций не-CS ?? В руках талантливого инструктора, это может быть отдаленно мыслимо - но зачем делать это так сложно?

Когда я выучил «Паскаль» на уроках колледжа, мы провели первые 3 недели, работая с « Карелом роботом ». Это была очень простая песочница, похожая на лого-среду программирования, в которой все основные концепции (включая рекурсию) были тщательно изучены, прежде чем делать это в Pascal. В «Карел-робот» вы управляете роботом в 2D-пространстве, используя небольшой набор простых команд. Это дает студентам полезную конкретную основу, на которой они могут опираться для того, что будет дальше.

Возможно, теперь существуют более современные учебные языки программирования, которые выполняют роль «Карел Робот»? Возможно, уже слишком поздно для ваших учеников.

Angelo
источник
У нас была похожая программа под названием Алиса.
ОгмаОсирис
Это Алиса: " en.wikipedia.org/wiki/Alice_(software) "
OghmaOsiris,
@OghmaOsiris Ссылка Алисы не работает. Трейлинг "был добавлен в URL.
Zoot
Да, без этого окончание ')' было отрезано.
OghmaOsiris
Попробуйте en.wikipedia.org/wiki/Alice_(software%29 Соответствующее обсуждение мета: meta.stackexchange.com/questions/25706/…
Zoot
2

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

0 - дать им простую задачу (скажем, оценить выражение).

1 - дай им время разобраться.

2 - дай им ответ.

3 - пройти ответ построчно

4 - попросите их сравнить ваш ответ с их презрением

5 - попросите их извлечь урок из этой проблемы

6-добавить еще один шаг к той же проблеме, скажем, условие, требующее оператора IF

7 - повторите вышеупомянутое задание на нескольких задачах. К тому времени они уже поняли бы основы языка и то, как использовать окружающую среду. Будет готов к тому, что будет дальше.

Также,

- имейте простую бонусную задачу для них, чтобы попробовать дома каждые 2 класса или около того

-связаться с каждым студентом, чтобы увидеть, какой смысл мешает ему идти дальше

-обеспечить легкий справочный материал, забыть сложные темы и сложные книги

- часто получайте отзывы и используйте их

- попросите их подготовиться к следующей теме, прежде чем они придут в класс

Без шансов
источник
2

Когда я прошел CS 101, мне помогло изучение логики, прежде чем даже смотреть на код. Мы просмотрели таблицы истинности и исчисление высказываний просто для того, чтобы начать думать «это правда или ложь», а не «это равно тому или другому».

Это было правильно, когда все щелкнуло для меня. Как только я понял, что программирование - это просто манипулирование истинными / ложными значениями по своей сути, все стало относительно простым.

И это сделало так, чтобы не имело значения, какой язык я использовал, логика везде одинакова. Синтаксис может сбивать с толку, но я могу сказать что-то вроде: «Хорошо, в Obj CI отправлять сообщения классам, подобным этому, и в C ++ сообщения отправлялись таким же образом. Но алгоритм вообще не изменился». и т.п.

OghmaOsiris
источник
2

Где-то есть статья ACM или IEEE, в которой рассматриваются некоторые детали того, почему новичкам (даже выпускникам CS, начинающим в этой области) нужно сидеть за старшим программистом и смотреть, как они кодируют проблему.

Профессионалы часто спариваются для сложных задач. Студентам слишком часто говорят не делать этого. Преимущества соединения (по очереди на клавиатуре): 1. Студенту сразу сообщают, что он делает неправильно. Мгновенная обратная связь. 2. Когда ученик наблюдает за учителем, ученик замечает то, о чем учитель никогда бы не подумал указать.

Вместо того, чтобы позволить ученику развить плохие методы, они пресечены в зародыше. (Я бы перевернул # 1 здесь # 2 и позволил бы ученику смотреть инструктора / TA FIRST )

Обучение CS со статическим набором слайдов PowerPoint не очень хорошо подходит для временного процесса написания программы. (Конечно, есть приемы, которые вы можете делать с растущими функциями построчно, но они обычно неудобны.)

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

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

Кроме того, связана нелепая идея, что CS нужно учить без компьютера и только карандашом и бумагой. Интересно, сколько нанятых специалистов по программированию действительно считают, что это лучший способ, или же это просто то, что делают инструкторы CS, потому что им самим не нравится работать с компьютерами? Любая попытка удалить компьютер с картинки - подлая. Это делает программирование менее увлекательным и менее интерактивным, чем должно быть. Мы давно прошли дни ввода данных в перфокарту и терпеливо ждали. Сегодняшние профессиональные разработчики являются поклонниками мгновенного удовлетворения. К счастью, большинство студентов тоже.

Очевидно, что рисование красивых рисунков карандашом и бумагой до и во время процесса разработки является мощным инструментом как для профессиональных, так и для начинающих программистов. Это как время «руки на клавиатуре» также должно быть потрачено в паре! Может быть, здесь имеет смысл позволить ученику сделать первый круг перед наблюдением за учителем, хотя даже с этим, вероятно, стоит увидеть реальный мыслительный процесс учителя.

Наконец, горячие клавиши и приемы редактирования, которые использует профессиональный разработчик, не являются "шумом" для обучения студента. Самое главное, они привлекают и интересуют студента. Во-вторых, они повышают осведомленность об общих потребностях развития. Кроме того, самые основные из этих практик часто легко выполнить, но изначально они не очевидны. Молодой ученик лесного цеха может легко научиться удалять гвоздь с помощью молотка, но в большинстве случаев сначала нужно сказать, для чего нужен этот коготь. Некоторые чрезвычайно легкие вещи просто не тривиальны, чтобы учиться без обучения. Даже профессиональные разработчики постоянно забывают об этих «хитростях» и получают выгоду от таких инструментов рефакторинга, как resharper для удаления избыточного или недоступного кода и т. Д.

Дэвид
источник
1
Кстати, если бы кто-то мог указать мне на название этой статьи, я был бы признателен!
Дэвид
2

Компьютерное программирование часто является одним из первых курсов, где когнитивные навыки синтеза требуются для проходного балла. Этот навык очень трудно передать кому-то еще. Вы можете объяснить все компоненты, которые у них есть, и как они работают. Вы можете привести множество примеров того, как другие люди использовали синтез, чтобы объединить эти компоненты в более полезное целое, но вы можете сделать только так, чтобы что-то «щелкнуло» в голове студента.

По моему опыту, это умение синтеза, которое чаще всего ускользает от людей, которые не «понимают» программирование. Они прекрасно разбираются в деталях, таких как переменные, функции и циклы, но они задают такие вопросы, как: «Я понимаю, почему это работает, но как вы узнали, что вам нужно поставить цикл там?» Вы просто должны практиковаться, пока не получите это.

Карл Билефельдт
источник
2

Чтобы неправильно процитировать Аарона Хиллегаса, напомните им, что они не глупы, это просто сложно. Программированию сложно тренировать свой ум, это совсем другой способ мышления, и хотя они, возможно, борются с основами, они, вероятно, вполне осведомлены об этом, и это сделает их довольно унылыми.

Я говорю об этом как о человеке, который также провалил свой первый курс CS, я программировал много раньше и получил все концепции (VB, да, детка), но C ++ просто не захотел бы для меня. Я закончил тем, что вернулся к самому основам и отработал его, затем он щелкнул, но если бы кто-то сказал: «Ты не идиот, это просто тяжело», это сделало бы мою жизнь проще.

Николас Смит
источник
0

Вы сказали, что «эти студенты могут знать, как изучать математику, биологию или физику, но эти методы не работают, когда дело доходит до программирования».

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

В этом последнем случае необходимо помочь «визуальному познанию». Важно не просто сосредоточиться на понятии и тексте (тип -> compile -> look, ошибки не могут работать, если вы не можете «прочитать» ошибки), но и предоставить способ визуализации вещей либо во время разработки ( имитируя то, что происходит на машине: будьте готовы с белой доской и набором цветных постов) и во время выполнения.

Чтобы эта последняя часть была успешной, необходимо дать представление об операционных системах и о том, «как программы работают на машине» (и что это за машина на самом деле). И должна быть дана не пугающая IDE. Я обычно "настроенные блоки кода" со многими вещами, удаленными, чтобы "не отвлекать". Понятие проекта, созданного из источников для создания объектов, которые должны быть связаны с библиотекой, должно быть дано ДО начала разговора о языке.

Традиционный привет мир C ++ требует точки входа и устройства вывода. Студент должен быть уже знаком с этим. Успех такого рода курсов зависит от самых первых дней. Вам нужно стимулировать визуализацию того, что происходит внутри компьютера, чтобы они могли понять, что такое программирование.
Остальное - синтаксис (наука) и абстракция (фантазия)

Эмилио Гаравалья
источник