为什么要教导CS记住记忆?[关闭]


23

过去一年,我在高中时就读了高级位置计算机科学。似乎我们被教导只是记住代码和功能,而不是如何在使用文档等方面变得足够聪明和有效。

实际上,我想很多(如果不是全部)编程工作都可以让您浏览文档,回顾过去的代码和其他代码,本质上是做我的老师认为“作弊”的事情。

尽管我确实同意核心概念对于记忆(在任何主题中)都是必不可少的,但对我来说,为CS类进行笔试似乎是多余和不切实际的,尤其是在实际上您需要编译器,调试器,参考文件的情况下手册以及整个互联网,以便在任何实际工作情况下都能参考。

为什么讲授CS 而不是讲授有用的技能(包括如何使用和解释文档,示例代码,调试器等),而是专注于代码和功能的记忆


34
CS不是要记住代码和功能。您在哪里学习CS?我是否可以建议真正的问题是您所选择的课程很糟糕?
安德列斯·F

1
@AndresF。OP是一门面向高中生(大学之前)开设的课程,即“ 高级位置计算机科学”。

3
@GlennNelson哎呀!我看错了。好的,在这种情况下:esqew:您会放心地知道,在大学级别,CS(主要)与代码存储无关。不过,您必须阅读很多东西;)CS教育也不一定与找到工作有关(如果您认为自己会感到失望)
Andres F.

1
您应该知道,大多数大学不是这样。在我的学校,每一个计算机科学考试都是公开笔记/公开书。
Casey Patton 2012年

2
请注意,部分答案很可能是CS不是编程程度。不要期望从CS课学习编程。期望学习各种恰好与程序员相关的基础理论和概念。并且可以肯定的是,您将学习一些编程语言并学习一些基本的编程知识,但是主要的是,实际编程是他们认为您会得到的,以便您可以专注于所有CS知识,而不能以其他方式学习周围。
2012年

Answers:


37

在高中课程中,您处于通往精通道路的最基本层次。您的课程中涉及的事情是专业程序员应该知道的那种事情。在许多方面,这类似于学习“时间表”。当然,您始终可以在“真实世界”的环境中使用计算器,但是这种记忆不仅可以提高您处理更复杂任务的速度,而且可以增进对基本原理的透彻理解。

例如,您应该了解几种排序算法,如何实现它们,如何工作,何时最佳使用它们以及何时不使用它们。可以一直查询,但不必这样-数学家必须查询6次8。


9
您应该了解排序算法的基本性质,但是距我有机会编写除气泡排序以外的其他内容已有15年了。(对于非常小的N,有时是一个更好的答案。)
Loren Pechtel 2012年

1
我希望我能说所有计算机科学课都那么好。在我高中的时候,他们教了Java的基本语法。当他们甚至无法解释Bubble排序和Dijkstra的算法之间的区别时,许多班级就吹嘘自己是“程序员”。
丹尼尔·格拉茨

2
举例来说,假设您可以在字典中查找任何单词,那么从理论上讲,您应该能够在Meandone上理解本文。但是我们的大脑只能处理有限的嵌套式理解。
Benjol 2012年

1
令人惊讶的是,记住我的时间表对我绝对没有用。一般的软件工程师花费多少时间来实施排序算法?哦,等等-大概是0。即使在极端遥不可及的环境提供的排序对您来说都不足够的情况下,您只需要一个人编写一个更合适的算法即可,并且他可以使用诸如Wikipedia之类的简单信息来选择和实现最佳算法-然后您可以在其余时间重复使用它。
DeadMG

2
@kaoD:记住这个参考资料对那一点没有帮助。它不涉及任何设计,仅是复制粘贴。记忆应答和Wikipedia复制粘贴之间的唯一区别是,一个存储在RAM中,另一个存储在您的大脑中。仍然是复制粘贴。
DeadMG

14

通常以这种方式进行授课,因为教师通常不知道其他任何测试理解能力的方法。您的感觉是完全正确的,因为这样的教导毫无价值。迫切需要改革人们的教育方式!

但是,生活会变得更好,至少在UIUC,我发现,您在CS课上学习的次数越多,您所描述的考试方向就越少,并且在我的大多数课程中,我们都允许所有杂项都有备忘单如果您实际上坐在计算机旁,可能会用谷歌搜索。

话虽这么说,我在课堂上的学习程度越高,他们对语言或如何实现某些东西的实际教导就越少。实际上,我只有一堂课,他们实际上教过我们任何关于编程的知识,这主要是抽象的数学概念,我们期望自己弄清楚编程的一部分(前提是他们总是乐于提供帮助,但这是从来没有考试的东西)。


2
+1阿门。我曾经在大学阶段教授编程,而我的目标是使学生尽快迁移到可以从事自己独特项目的地步。当老师将其视为以“正确的方式”记住或做事时,我会讨厌它。我试图做的是,放置足够的技能来释放学生自己的创造力。
Mike Dunlavey'2

...我的学生非常聪明,并且非常善于记忆。在我传达您需要编写程序才能学习编程而不是记住内容之前,需要先进行一两个测试。
Mike Dunlavey '02

听见!有趣的是,长大后我从未在学校读书过。ACT分数不佳,成绩不佳等。但是,将其引入CS后,一切都变得很有意义。我确实在某些领域挣扎,但是我只学会了通过理解我在CS课上学到的概念来克服使我退缩的东西。
rudolph9'2

10

不要让上学干扰您的教育。

-马克吐温

我是墨西哥人,告诉您这一点,因为至少在公共教育中,墨西哥在任何地方都不是一个理想的教育场所。

好吧,在我职业生涯中期(CS),我的感觉与您完全一样,所以我开始自己学习,花了一年的时间学习算法,Linux,脚本,计算机的工作方式以及一些关系数据库,html,css等(全部)。当然,为了学习,我不得不跳过课程*,放低分数*,然后在一年后毕业*。

那年之后,我回到了我的“正常”常规,回到常规班级,作业,考试和项目。这些课程仍然很无聊,没有什么新鲜的东西可以学习,都是一样的。因此,我决定进入编程竞赛网站,例如在线UVA评委代码厨师项目euler,然后观看了MIT开放式课件上的一些讲座,但我仍在自己学习,但以不同的方式。

课程:不要让事情发生,要让事情发生。如果您对学习方式不满意,请更改它!

*不是我做出的最明智的决定。


4
“不要让事情发生,要让事情发生”,-如果有话可以说的话!
GrandmasterB

+1报价。我<几乎>不必阅读其余的答案
Chani 2012年

3

这取决于您要记住的内容...

例如,为了学习数学,您必须熟悉代数,并且在执行代数操作以简化方程式方面经常必须很有创造力。但是您必须记住某些构建块,以便能够专注于这些有趣的部分。例如,您必须内心地知道乘法表,并且必须知道一些身份,以便可以识别如何操纵方程式以便使用这些身份。

为了学习计算机科学,类似地,您需要熟悉基本的构建块数据结构和算法,因为您将需要将它们应用于更高级别的问题。例如,您极不可能在现实世界中编写自己的链表实现,而仅使用库提供的方法即可。但是,知道如何实现链表以及如何实现自己的链表,您就可以在开始处理更高级别的问题时就在哪里以及是否使用链表进行推理。同样,您永远也不会编写自己的二进制搜索功能,但了解它的工作原理非常重要,这样您就可以推断出数据库可以在哪里使用索引以及在哪里不能使用索引。

一旦记住了一些基本的构建基块,便可以轻松完成诸如解释文档之类的工作。文档可能表明正在使用列表,并假定程序员隐式知道这意味着插入为O(1),搜索为O(n)。随着时间的推移,构建基块也变得更加稳定-您很有可能每隔几年使用一次新的调试器,您很可能在整个职业生涯中都使用相同的二进制搜索。


在何处以及是否使用链表是基于诸如各种操作的复杂性以及内存性能之类的事情。您无需实现就可以了解其中任何一件事。数据库在哪里可以使用二进制搜索?对于它知道如何比较的键。好吧,那很容易。
DeadMG

3

“为什么CS讲授记忆法而不是教授有用的技能?”-我认为您对记忆法的看法有点过分。正如您应该练习编写代码,解释文档,使用调试器一样,您也应该练习记忆。

如果您不必经常访问API参考或查找许多调试器命令,您可能会感到效率提高了多少,您可能会感到惊讶。

我在高中时学到的最好的事情之一就是观察一个从未在课堂上记笔记的朋友。他的论点是他能记住重要的事情。我开始做同样的事情,并认为它提高了我的记忆能力,即使可以方便地使用所有这些API引用,我每天也非常有用。


2
不必查找API是通过实践而来的,而不是将API当作正规教育来教授。
DeadMG

@DeadMG:能够记住更多的东西是练习带来的,就像其他所有东西一样。要求您记住某些API本身并不是目标,而是一种训练您的头脑来保留信息的方法,因此您不必经常查找它。而且我并不是在谈论API,如果我还记得一件事,那就是我需要对Google / MSDN /另一个源文件进行的行程减少了一次,并且通过实践,这确实改变了您的工作速度。
DXM 2012年

使用特定的API进行练习。一般不记住事情。与专业时间相比,在教育上花费的时间只是一个很小的脚注。
DeadMG 2012年

2

如果目标是测试对当前主题的完全理解,则笔试和纸笔考试确实有意义。差不多十年前,我确实参加了计算机科学AB考试,并且我同意笔和纸的方法。

您应该对在计算机科学的较低级别学习的任何算法都足够了解,以便能够推理出如何用目标语言编写实现代码。学生还应该能够用大多数正确的语法手工编写代码。有时我们都错过了分号或括号:)。此外,无需进行有用的IDE推断,即可测试调试和设计技能。

如果学生不能做到这一点,那么他们就不会精通该主题,也许只是短暂的熟悉。


-1:所有手写语法正确的代码都告诉您,该人能够编写可编译的程序(可能比最慢的计算机慢大约一百万倍),但可能无法正常工作。更糟糕的是,他们的记忆力很强,如果被要求,他们可能会背诵Shakespare。它几乎不能说明开发人员的技能。
mattnz

这个答案没有任何理由提出意见。为什么任何人都可以用自己喜欢的语言编写任何排序算法的实现?
DeadMG

关键不是这个人是一个好的开发人员,而是他们知道他们在课堂上教的计算机科学材料。如果已教过学生如何绘制函数图,则可以合理地期望该学生在考试中这样做。好的测试还通过提出一些需要概念性理解的问题来打败记忆,例如,我只是凭空地对这个数据结构使用多个键来实现冒泡排序,或者解释了我给您的这种搜索伪代码与二进制搜索之间的区别。
彼得·史密斯

-2

以我的经验,背诵是简单的练习,绝对没有必要教它。更重要的是,这种方法意味着只记住您在做任何事情时实际上需要记住的内容,而不是一堆老师希望您可能会想要但永远不会想要的随机垃圾。记忆一些算法的实现所花费的时间可以更好地用于其他原因。

毕竟,您为什么需要练习编写算法?一旦编写了一次,您就可以一直重复使用它,即使极少数人没有为您选择的语言编写可免费获得的实现,并且您的环境尚未提供这样的实现,也是如此一种供您使用的算法,对于绝大多数简单算法(例如排序等)而言,这是不正确的。在一开始就极不可能需要做的事情上进行练习,即使您这样做,也只需要做一次?没有宝贵的时间。

有关Heapsort的重要信息根本不是如何实现它。这是在最佳和最差情况下以及类似情况下的操作复杂性。但是,令人惊讶的是,维基百科上有一个方便的表格,可以立即为您提供此信息。同样,拥有这些知识没有任何价值。从现在到时间结束,无论何时需要,它都可以立即为您免费使用。那么,为什么要记住它呢?这是毫无意义。

根据我的经验,绝对没有理由要求学生记住任何东西。如果您要问的问题可以从参考来源得到回答,那么您就在问一个问题,在哪里可以回答没有任何价值。


2
哎呀,伙计们,也懒得解释您的downvotes或类似的东西....
DeadMG

我唯一需要了解堆排序的时间是何时需要可修改的优先级队列(堆排序作为优先级队列工作得很好)。能够适应已知算法是了解如何实现它们的一个很好的理由。
David Thornley

@David:您不需要知道heapsort是如何工作的。使用任何排序算法的实现都可以。
DeadMG

在那种情况下,不是这样。它必须经常在可能已经过分紧张的系统上处理大量事件。对于那个项目,我们需要效率,而我们却做到了。就上下文而言,这是一个相当长的职业生涯中的一次,而且我很长一段时间都一直在进行诸如SQL ORDER BY和C ++ std::sort家族之类的排序。
David Thornley,2012年

@David:因此,我建议这几乎不是每个程序员都需要的。
DeadMG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.