Чому CS навчають запам’ятовувати? [зачинено]


23

Протягом минулого року я в середній школі займався передовими інформаційними навичками. Схоже, нас вчать просто запам'ятовувати код і функції, а не як бути винахідливим та ефективним у використанні документації тощо.

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

Хоча я згоден, основні поняття мають важливе значення для запам'ятовування (з будь-якого предмету), мені здається зайвим і недоцільним складати іспит на папір та папір для класу CS, особливо коли практично у вас буде компілятор, відладчик, посилання посібники та весь Інтернет, на який слід посилатися в будь-якій ситуації в реальному світі.

Чому навчають CS зосереджуватися на запам'ятовуванні коду та функцій, а не на навчанні корисним навичкам, зокрема як використовувати та інтерпретувати документацію, зразок коду, налагоджувач тощо?


34
CS - це не про запам’ятовування коду та функцій. Де чорт ти вивчаєш CS? Чи можу я припустити, що справжня проблема полягає в тому, що курс, який ви приймаєте, - це лайно?
Андрес Ф.

1
@AndresF. ОП працює в галузі інформатики з розширеним розміщенням, що є курсом, пропонованим вищим учням (до університету).

3
@GlennNelson На жаль! Я це неправильно прочитав. Гаразд, у такому випадку: esqew : на університетському рівні вас звільнять від знання, CS (здебільшого) не стосується запам'ятовування коду. Вам доведеться читати багато всього, але;) Освіта з CS також не обов’язково стосується пошуку роботи (ви, мабуть, будете розчаровані, якщо вважаєте, що це так)
Андрес Ф.

1
Ви повинні знати, що це не так у більшості коледжів. У моїй школі кожен тест з інформатики - це відкриті конспекти / відкрита книга.
Кейсі Паттон

2
Зауважте, що частина відповіді, швидше за все, полягає в тому, що CS не є ступенем програмування . Не сподівайтесь вивчити програмування з класу CS. Розраховуйте вивчити всілякі основні теорії та концепції, які так само є актуальними для програміста. І звичайно, ви вивчите декілька мов програмування і навчитеся елементарному програмуванню, але, головне, власне програмування - це те, що вони передбачають, що ви отримаєте, щоб ви могли зосередитись на всіх CS-речах , а не в інший спосіб навколо.
jalf

Відповіді:


37

У середній школі ви перебуваєте на самому базовому рівні свого шляху до майстерності. Речі, які охоплені у вашому класі, - це такі речі, про які професійний програміст повинен знати холодно. Багато в чому це схоже на вивчення своїх "таблиць часу". Звичайно, ви завжди зможете захопити калькулятор у режимі «реального світу», але це запам'ятовування не тільки збільшує вашу швидкість у складніших завданнях, але й сприяє більш глибокому розумінню основних принципів.

Наприклад, ви повинні знати кілька алгоритмів сортування, як вони реалізовані, як вони працюють, коли їх найкраще використовувати та коли їх не використовувати. Це завжди можна шукати вгору, але не повинно бути цього - більше, ніж математик повинен шукати 6 разів 8.


9
Ви повинні знати основну природу алгоритмів сортування, але минуло близько 15 років, як я мав нагоду написати що-небудь, крім сортування бульбашок. (Для дуже маленького N іноді краща відповідь.)
Лорен Печтел,

1
Я хотів би сказати, що всі уроки з інформатики такі хороші. У моїй середній школі вони викладали базовий синтаксис java ... Цілий рік. Багато хто з класу вихвалявся тим, що був "програмістом", коли навіть не міг пояснити різницю між сортуванням "Bubble" і алгоритмом "Dijkstra".
Даніель Гратцер

2
Наприклад, враховуючи, що ви можете шукати будь-яке слово у словнику, теоретично ви повинні мати можливість зрозуміти цю статтю на середньому рівні . Але наші мізки справляються лише з обмеженою кількістю вкладених непорозумінь.
Benjol

1
І дивно, що запам'ятовування таблиць моїх часів мені зовсім не дало користі. Скільки часу середній інженер програмного забезпечення витрачає на реалізацію алгоритмів сортування? О, зачекайте - напевно, близько 0 . Навіть за надзвичайно віддаленого шансу на те, що створений для вас тип навколишнього середовища недостатньо хороший, вам потрібен лише один хлопець, щоб написати більш відповідний алгоритм - і він може використовувати тривіально доступну інформацію на щось на зразок Вікіпедії для вибору та реалізації оптимальний алгоритм, і тоді ви можете повторно використовувати його протягом решти часу.
DeadMG

2
@kaoD: І запам'ятовування посилання не допоможе в цьому. Це не передбачає нічого придумувати, це лише копіювальна паста. Єдина відмінність відповіді з пам’яті та вставлення копій з Вікіпедії полягає в тому, що вона зберігається в оперативній пам’яті, а одна зберігається у вашому мозку. Це все-таки копія-вставка.
DeadMG

14

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

Життя покращується, хоча, принаймні, в UIUC я виявив, що чим вище ти йдеш у своїх класах CS, тим менше іспитів орієнтовано, як ти описуєш, і в більшості моїх курсів нам дозволено чит-лист для всіх лайно що ви, ймовірно, гуглили б, якби насправді сидите за комп’ютером.

Це, як сказано, чим вище я ходив на свої заняття, тим менше вони насправді навчають вас про мови або як щось реалізувати. Насправді у мене був лише один клас, де нас насправді щось навчили програмуванню, це здебільшого це абстрактні математичні поняття, і від нас, як очікувалося, ми самі розібралися з програмовою частиною (за умови, що вони завжди раді допомогти, але це було ніколи щось на іспиті).


2
+1 Амінь. Раніше я викладав програмування на рівні коледжу, і моєю метою було якомога швидше перенести студентів до тієї точки, де вони могли робити власні унікальні проекти. Я ненавиджу це, коли вчителі трактують це як запам'ятовування чи діло "правильним чином". Що я намагався зробити, це поставити достатньо навичок, щоб розкрити власну творчість учнів.
Майк Данлаве

... У мене були студенти, які дуже розумні і дуже добре запам’ятовували. Їм знадобиться один чи два тести, перш ніж я можу довести, що вам потрібно писати програми, щоб вивчити програмування, а не запам'ятовувати речі.
Майк Данлаве

Почуй чуй! Це смішно, дорослішаючи, я ніколи не був хорошим у школі; поганий бал ACT, погані оцінки тощо. Але після введення в CS все просто мало сенс. Я безумовно борюся в певних областях, але я навчився долати лише те, що стримувало мене, розуміючи поняття, які я навчився на своїх заняттях з CS.
rudolph9

10

Не дозволяйте школі перешкоджати вашій освіті.

- Марк Твен

Я мексиканець і кажу вам це, тому що в Мексиці не зовсім вдале місце для освіти (на будь-якому рівні), принаймні для державної освіти.

Ну, в середині своєї кар'єри (CS) я відчуваю точно так само, як ви себе почуваєте, тому я починаю вчитися самостійно і витрачаю один рік на вивчення алгоритмів, Linux, сценаріїв, як працює мій комп'ютер, трохи реляційних бази даних, html, css тощо (трохи про все). І звичайно, мені довелося пропустити заняття *, відпустити оцінки * і закінчити через рік після *, все для того, щоб навчитися.

Після цього року я повертаюся до свого «звичайного» розпорядку, назад до регулярних занять, домашніх завдань, іспитів та проектів. Заняття все ще були нудними, нічого нового вивчати, все було те саме. Тож я вирішив зайти на сайти з конкурсу програмування, такі як суддя UVA в Інтернеті , шеф-кухар коду та еулер проекту , потім я переглянув кілька лекцій у відкритому курсі MIT, і я все ще навчався самостійно, але по-іншому.

Урок: Не дозволяйте, щоб це сталося, зробіть це. Якщо ви не задоволені способом навчання, змініть це!

* Не наймудріші рішення, які я прийняв.


4
"Не дозволяйте, щоб це сталося, зробіть те, що відбудеться", - Якщо коли-небудь були слова, щоб жити, його ті!
гросмайстерB

+1 за цитатою. Я <майже> не повинен був читати решту відповідей
Chani

3

Це залежить від того, що ви намагаєтеся запам'ятати ...

Наприклад, щоб вивчити математику, ви повинні бути знайомими з алгеброю, і вам часто доводиться проявляти творчість у виконанні алгебраїчних маніпуляцій, щоб спростити рівняння. Але ви повинні запам'ятати певні будівельні блоки, щоб можна було зосередити увагу на цих цікавих бітах. Наприклад, ви повинні знати напам’ять таблиці множення напам’ять, і ви повинні знати деякі тотожності, щоб ви могли розпізнати, як маніпулювати рівняннями, щоб використовувати ці тотожності.

Для вивчення інформатики вам також потрібно ознайомитися з основними структурами даних та алгоритмами будівельних блоків, оскільки вам потрібно буде застосовувати їх до проблем вищого рівня. Це малоймовірно, що ви коли-небудь, наприклад, писали б власну реалізацію пов'язаного списку в реальному світі, ви просто використовували б ту, яку надає ваша бібліотека. Але знаючи, як пов'язаний список реалізований та як реалізувати свій власний, ви зможете обґрунтувати, де і чи потрібно використовувати зв’язаний список, коли ви почнете працювати над проблемами вищого рівня. Аналогічно, ви ніколи не пишете свою власну функцію бінарного пошуку, але важливо зрозуміти, як вона працює, щоб ви могли міркувати про такі речі, як, де база даних може використовувати індекс, а де вона не може.

Після запам'ятовування основних будівельних блоків набагато простіше робити такі речі, як інтерпретація документації. Документація може вказувати на те, що використовується список, і припускати, що програміст неявно знає, що це означає, що вставки є O (1), а пошук - O (n). Будівельні блоки також набагато стабільніші з часом - ви, ймовірно, будете використовувати нові налагоджувачі кожні кілька років, ви, ймовірно, будете використовувати той самий двійковий пошук протягом усієї своєї кар’єри.


Де і чи потрібно використовувати зв'язаний список, ґрунтується на таких речах, як складність для різних операцій, і це продуктивність пам'яті. Вам не потрібно реалізовувати один, щоб знати будь-яку з цих речей. Де база даних може використовувати двійковий пошук? Для ключів, які він знає, як порівнювати. Ну, це було легко.
DeadMG

3

"Чому викладають CS, орієнтуючись на запам'ятовування ... на відміну від навчання корисним навичкам" - я думаю, ви занадто сильно знижуєте запам'ятовування. Так само, як ви повинні практикувати написання коду, інтерпретувати документацію, використовуючи налагоджувач, ви також повинні практикувати запам'ятовування.

Ви можете бути здивовані, наскільки ефективнішими ви можете стати, якщо вам не доведеться часто відвідувати посилання API або шукати стільки команд налагодження.

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


2
Якщо не потрібно шукати API, це відбувається через практику, а не викладання API як формальної освіти.
DeadMG

@DeadMG: Бути в змозі запам'ятати більше речей - це як і все інше. Вимагати від вас пам’ятати певні API - це не сама по собі мета, а засіб навчити голову зберігати інформацію, щоб не потрібно шукати її так часто. І я не говорю тільки про API, якщо я можу запам'ятати ще одну додаткову річ, це ще одна менша поїздка, яку мені потрібно зробити в Google / MSDN / інший вихідний файл, і на практиці це має значення, наскільки швидко ви можете працювати .
DXM

Практикуйте з цим конкретним API . Не запам'ятовування речей взагалі. А час, витрачений на освіту, - це крихітна виноска порівняно з професійним часом.
DeadMG

2

Екзамени з ручки та паперу насправді мають сенс, якщо мета - перевірити повне розуміння даної теми. Я склав іспит з комп’ютерних наук AB майже десять років тому, і я згоден з методом ручки та паперу.

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

Якщо студент не може цього зробити, то він не володіє цією темою, можливо, лише знайомством.


-1: Синтаксично правильний код вручну говорить вам про те, що людина здатна написати програму, яка може скластись (можливо, приблизно в мільйон разів повільніше, ніж найповільніший комп'ютер), - це може працювати не за призначенням. Гірше, що вони просто мають гарну пам’ять і, ймовірно, можуть декламувати Shakespare, якщо запитають. Це мало що вказує на майстерність людини як розробника.
mattnz

Ця відповідь не дає міркувань щодо викладеної думки. Чому хтось повинен мати змогу написати реалізацію для будь-якого алгоритму сортування на своїй улюбленій мові?
DeadMG

Справа не в тому, що ця людина хороший розробник, це те, що вони знають матеріал з інформатики, який викладають у своєму класі. Якщо студента навчали, як графік функції, то розумно очікувати, що він зробить це на іспиті. Хороші тести також перемагають запам'ятовування, задаючи питання, що вимагають концептуального розуміння, наприклад, впорядкувати міхур, використовуючи кілька клавіш для цієї структури даних, яку я щойно витягнув з повітря, або пояснюю різницю між цим пошуковим псуедокодом, який я даю вам, і двійковим пошуком.
Пітер Сміт

-2

На мій досвід, запам'ятовування відбувається з простої практики, і зовсім не потрібно цього вчити. Що ще важливіше, такий підхід означає лише запам’ятовування того, що вам насправді потрібно пам’ятати, що б ви не робили, а не купу випадкових мотлохів, які ваш учитель сподівається, що вам може знадобитися, і незмінно ви цього не зробите. Час, витрачений на запам'ятовування реалізації якогось алгоритму, може бути набагато краще присвячений якійсь іншій причині.

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

Важливе, що потрібно знати про Heapsort, - це не те, як це взагалі реалізувати. Це складність роботи в кращих і гірших випадках і подібні речі. Але, несподівано, у Вікіпедії є зручна таблиця денді, яка моментально дасть вам цю інформацію. Отже, знову ж таки, це не має значення в цих знаннях. Він моментально доступний для вас, коли ви хочете, це відтепер до кінця часу фактично без витрат. То чому б ви хотіли запам'ятати це? Це безглуздо.

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


2
Гей, хлопці, не поспішайте пояснювати свої події або щось подібне ....
DeadMG

Єдиний раз, коли мені потрібно було знати гипсорт, - коли мені потрібна була чергова черговість, що може змінюватися (чудова група чудово працює як черга пріоритету). Вміння адаптувати відомі алгоритми - це вагомий привід знати, як їх реалізувати.
Девід Торнлі

@David: Вам не потрібно знати, як працює грона. Реалізація з використанням будь-якого алгоритму сортування буде добре.
DeadMG

Не в тому конкретному випадку, це не буде. Їй доводилося обробляти безліч подій, часто в системі, яка вже може бути перенапружена. Для цього проекту нам була потрібна ефективність, і ми його отримали. З контексту, це траплялося один раз у досить тривалій кар'єрі, і все моє сортування вже давно було такими, як сім'ї SQL ORDER BYта C ++ std::sort.
Девід Торнлі

@David: Отже, я б припустив, що навряд чи щось потрібне кожному програмісту.
DeadMG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.