Почему CS учат запоминать? [закрыто]

23

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

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

Хотя я согласен с тем, что основные понятия необходимы для запоминания (по любому предмету), для меня кажется излишним и нецелесообразным сдавать бумажный экзамен для класса CS, особенно когда практически у вас есть компилятор, отладчик, справочник руководства и весь Интернет, к которому можно обратиться в любой реальной рабочей ситуации.

Почему CS учат сосредоточиться на запоминании кода и функций, а не на обучении полезным навыкам, в том числе тому, как использовать и интерпретировать документацию, примеры кода, отладчик и тому подобное?

esqew
источник
34
CS не о запоминании кода и функций. Где, черт возьми, ты изучаешь CS? Могу ли я предположить, что настоящая проблема в том, что курс, который вы выбираете, является дерьмом?
Андрес Ф.
1
@AndresF. OP находится в Advanced Computerment Computer Science, который является курсом для старшеклассников (до университета).
3
@GlennNelson Ой! Я неправильно понял это. Хорошо, в этом случае: esqew : вы будете рады узнать, что на уровне университета CS (в основном) не касается запоминания кода. Тем не менее, вам придется много чего читать;) Обучение CS также не обязательно связано с поиском работы (вы, вероятно, будете разочарованы, если вы так думаете)
Andres F.
1
Вы должны знать, что это не так в большинстве колледжей. В моей школе каждый тест по информатике был открытой запиской / открытой книгой.
Кейси Паттон
2
Обратите внимание, что часть ответа, скорее всего, заключается в том, что CS не является степенью программирования . Не ждите, чтобы изучать программирование в классе CS. Ожидайте изучения всевозможных основополагающих теорий и концепций, которые, как оказалось, имеют отношение к программисту. И, конечно же, вы выучите несколько языков программирования и научитесь немного основам программирования, но в основном они предполагают, что настоящее программирование - это то, что вы получите, чтобы вы могли сосредоточиться на всех вещах CS , а не наоборот около.
Джалф

Ответы:

37

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

Например, вы должны знать несколько алгоритмов сортировки, как они реализованы, как они работают, когда их лучше всего использовать и когда их не использовать. Это всегда можно посмотреть, но не должно быть - больше, чем математик должен искать 6 раз 8.

Джеффри
источник
9
Вы должны знать основную природу алгоритмов сортировки, но прошло около 15 лет с тех пор, как у меня была возможность написать что-то кроме пузырьковой сортировки. (Для очень маленьких N это иногда лучший ответ.)
Loren Pechtel
1
Хотелось бы сказать, что все классы информатики такие хорошие. В моей школе они преподавали базовый синтаксис Java ... В течение всего года. Многие из класса оставили хвастовство быть «программистом», когда они даже не могли объяснить разницу между сортировкой Bubble и алгоритмом Дейкстры.
Даниэль Гратцер
2
В качестве примера, учитывая, что вы можете найти любое слово в словаре, теоретически вы должны понимать эту статью на значении «один» . Но наш мозг обрабатывает только ограниченное количество вложенных непониманий.
Бенджол
1
И запоминание моих временных таблиц было совершенно бесполезным для меня. Сколько времени средний инженер-программист тратит на реализацию алгоритмов сортировки? Ой, подождите, вероятно, около 0 . Даже при крайне малой вероятности того, что подобная среда не подходит для вас, вам нужен только один парень, чтобы написать более подходящий алгоритм, и он может использовать тривиально доступную информацию о чем-то вроде Википедии для выбора и реализации. оптимальный алгоритм - и тогда вы можете использовать его в течение оставшегося времени.
DeadMG
2
@kaoD: И запоминание ссылки не поможет с этим немного. Это не предполагает ничего придумывать, это просто копирование. Единственное отличие между ответом из памяти и копированием из Википедии состоит в том, что один хранится в оперативной памяти, а другой - в вашем мозгу. Это все еще копия-паста.
DeadMG
14

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

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

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

rudolph9
источник
2
+1 Аминь. Раньше я преподавал программирование на уровне колледжа, и моя цель состояла в том, чтобы как можно быстрее двигать студентов до такой степени, чтобы они могли выполнять свои собственные уникальные проекты. Я ненавижу, когда учителя относятся к этому как к запоминанию или выполнению «правильного пути». То, что я пытался сделать, - это применить достаточно навыков, чтобы раскрыть собственный творческий потенциал студентов.
Майк Данлавей
... У меня были студенты, которые были очень умны и очень хорошо запоминали. Им понадобится один или два теста, прежде чем я смог передать, что вам нужно писать программы для изучения программирования, а не для запоминания вещей.
Майк Данлавей
Слышу, слышу! Забавно, в детстве я никогда не был хорош в школе; плохая оценка по ACT, плохие оценки и т. д. Но после знакомства с CS все стало иметь смысл. Я определенно борюсь в определенных областях, но я только научился преодолевать вещи, которые удерживали меня, понимая концепции, которые я выучил на уроках CS.
rudolph9
10

Не позволяйте школьному обучению мешать вашему образованию.

-- Марк Твен

Я мексиканец и говорю вам это, потому что в Мексике не совсем хорошее место для образования (на любом уровне), по крайней мере, в государственном образовании.

Ну, в середине моей карьеры (CS) я чувствую точно так же, как вы себя чувствуете, поэтому я начинаю учиться самостоятельно, и я провожу год, изучая алгоритмы, linux, скрипты, как работает мой компьютер, немного реляционного базы данных, HTML, CSS и т. д. (немного обо всем). И, конечно, мне пришлось пропустить занятия *, подвести свои оценки * и закончить через год после *, все для того, чтобы учиться.

После этого года я возвращаюсь к своей «обычной» рутине, возвращаясь к обычным занятиям, домашним заданиям, экзаменам и проектам. Занятия все еще были скучными, ничего нового для изучения, все было одинаково. Поэтому я решил принять участие в конкурсах сайтов по программированию, таких как UVA судья онлайн , шеф-повар кода и проект euler , затем я посмотрел несколько лекций в MIT Open Course Ware и все еще учился самостоятельно, но по-другому.

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

* Не самые мудрые решения, которые я принял.

razpeitia
источник
4
«Не позволяйте вещам случаться, заставляйте вещи случаться», - Если когда-либо были слова, чтобы жить, это те!
GrandmasterB
+1 за цитату. Мне <почти> не пришлось читать остальную часть ответа
Chani
3

Это зависит от того, что вы пытаетесь запомнить ...

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

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

После того, как вы запомнили некоторые базовые строительные блоки, гораздо проще выполнять такие вещи, как интерпретация документации. Документация может указывать, что список используется, и предполагать, что программист неявно знает, что это означает, что вставки - это O (1), а поиск - O (n). Строительные блоки также значительно более стабильны с течением времени - вы, скорее всего, будете использовать новые отладчики каждые несколько лет, вы, вероятно, будете использовать один и тот же бинарный поиск всю свою карьеру.

Джастин Кейв
источник
Где и нужно ли использовать связанный список, основано на таких вещах, как его сложность для различных операций и производительность памяти. Вам не нужно реализовывать один, чтобы знать любую из этих вещей. Где база данных может использовать бинарный поиск? Для ключей, которые он умеет сравнивать. Ну, это было легко.
DeadMG
3

«Почему CS учат фокусироваться на запоминании ... вместо того, чтобы преподавать полезные навыки» - я думаю, вы слишком много не учитываете запоминание. Так же, как вы должны практиковаться в написании кода, интерпретации документации, использовании отладчика, вы также должны практиковать запоминание.

Вы можете быть удивлены, насколько эффективнее вы можете стать, если вам не нужно часто обращаться к API-справке или искать столько команд отладчика.

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

DXM
источник
2
Отсутствие необходимости искать API приходит через практику, а не преподавать API как формальное образование.
DeadMG
@DeadMG: способность помнить больше вещей приходит с практикой, как и все остальное. Требование о том, чтобы вы помнили определенные API-интерфейсы, не является самоцелью, а средством тренировки головы для сохранения информации, чтобы вам не приходилось искать ее так часто. И я говорю не только об API, если я могу вспомнить одну дополнительную вещь, это на одну поездку меньше, которую мне нужно совершить в Google / MSDN / другой исходный файл, и с практикой это действительно меняет скорость вашей работы ,
ДХМ
Практикуйтесь с этим конкретным API . Не запоминать вещи вообще. И время, проведенное в образовании, является крошечной сноской по сравнению с профессиональным временем.
DeadMG
2

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

Вы должны знать достаточно о любом алгоритме, который вы изучаете на более низких уровнях информатики, чтобы иметь возможность объяснить, как писать код реализации на вашем целевом языке. Студенты также должны иметь возможность писать код вручную с в основном правильным синтаксисом. Мы все пропускаем точку с запятой или скобки иногда :). Кроме того, навыки полезной отладки и проектирования могут быть проверены без помощи полезной IDE.

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

Питер Смит
источник
-1: все написанное вручную синтаксически правильный код говорит вам, что человек способен написать скомпилируемую программу (вероятно, примерно в миллион раз медленнее, чем самый медленный компьютер) - что может работать не так, как задумано. Хуже того, у них просто хорошая память и, возможно, они могут повторять Шекспира, если их об этом попросят. Это мало что говорит о мастерстве человека как разработчика.
Mattnz
Этот ответ не приводит никаких аргументов в пользу представленного мнения. Почему кто-то должен быть в состоянии написать реализацию для любого алгоритма сортировки на своем любимом языке?
DeadMG
Дело не в том, что этот человек хороший разработчик, а в том, что они знают материал по информатике, который преподается в их классе. Если ученика научили составлять график функции, то разумно ожидать, что этот ученик сделает это на экзамене. Хорошие тесты также превосходят запоминание, задавая вопросы, требующие концептуального понимания, такие как реализация пузырьковой сортировки с использованием нескольких ключей для этой структуры данных, которую я только что вынул из воздуха, или объясняю разницу между этим поисковым псевдокодом, который я вам даю, и бинарным поиском.
Питер Смит
-2

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

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

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

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

DeadMG
источник
2
Ну и дела, ребята, не беспокойтесь, объясняя ваши отрицательные голоса или что-то в этом
роде
Единственный раз, когда мне нужно было знать, что такое heapsort, это когда мне нужна изменяемая очередь с приоритетами (heapsort прекрасно работает как очередь с приоритетами). Способность адаптировать известные алгоритмы - это хороший повод знать, как их реализовывать.
Дэвид Торнли
@ Дэвид: Вам не нужно знать, как работает heapsort. Реализация с использованием любого алгоритма сортировки будет в порядке.
DeadMG
Не в этом конкретном случае, не будет. Он должен был обрабатывать множество событий, часто в системе, которая уже может быть перегружена. Для этого проекта нам нужна была эффективность, и мы ее получили. Для контекста это произошло однажды за довольно долгую карьеру, и все мои сортировки в течение долгого времени были такими вещами, как семейство SQL ORDER BYи C ++ std::sort.
Дэвид Торнли
@ Дэвид: Следовательно, я бы предположил, что это вряд ли что-то, что нужно каждому программисту.
DeadMG