4
$\开始组$

计算机科学教育家教一些东西,却没有提供参考或证据证明他的方法有用,这是正常的吗?如果一个学生被教授了一些听起来有用但不是最佳实践的东西,他应该怎么做?

$\端组$
10
  • 23
    $\开始组$ 你有一个例子吗? $\端组$
    – 戈伦
    3月25日16:22
  • 6
    $\开始组$ 计算机科学教育中有一些部分类似于科学(或者至少是有效的数学)。其中很多基本上是贸易学校的技能(学习语言的语法、特定的API和编译器工具集等)。你需要举一个例子,让答案不仅仅是泛泛而谈,可能与你的实际担忧无关。 $\端组$ 3月25日23:24
  • 7
    $\开始组$ @这听起来很像课程特定要求或讲师偏好。这在行业中并不常见,但它会使评分变得容易得多。 $\端组$ 3月26日14:50
  • 5
    $\开始组$ @客人谢谢。你能编辑提供上下文的帖子?展示您正在讨论的代码的实际示例可能会有所帮助。如果测试代码在注释中,它将如何执行?或者你指的是Python的doctest一些事情是否是好的实践往往取决于这些细节。我理解你的要求是笼统的,但从细节开始,然后转移到一般是一个好方法。 $\端组$
    – 戈伦
    3月26日15:54
  • 4
    $\开始组$ 我不认为你的例子是“不科学的”。 $\端组$ 3月26日16:41

6个答案6

重置为默认值
16
$\开始组$

从你的语气来看,我想你是在问一个你不同意的做法。由于我们所说的是非常笼统的,您可以遵循的一般程序是:

  1. 向教授提出后续问题。你在那里学习!
  2. 在那门课上,一定要听从教授的建议。否则将是无礼的。
  3. 尝试寻找其他信息来源,并思考如何当你不受教授指令的约束时,你会处理这个问题,以解决教授的技术稍后解决的任何问题。
$\端组$
4
  • 14
    $\开始组$ “2.否则会……”自我塑造似乎是一个更贴切的形容词。 $\端组$ 3月25日21:39
  • 2
    $\开始组$ @user121330 LOL这也是一个好词:) $\端组$
    – 本一世。
    3月25日21:52
  • $\开始组$ @贝尼。我不会说不听从老师的建议是无礼的。如果你有自己的做事方式,他们会给你一些建议,当然,你应该尝试一下(不这样做肯定是不礼貌的),但如果你认为它不如你已经做的那样有效,就不要继续尝试。 $\端组$
    – 恶魔
    3月28日1:14
  • 1
    $\开始组$ @它还取决于它是建议还是要求。我有过这样的老师,他们对我的要求很高。不遵守它会导致你不及格。如果这只是关于他们如何认为可以做得更好的建议,绝对要看看它是否对你有用,但如果不行,你就不必遵循它。 $\端组$ 3月28日11:00
13
$\开始组$

我的观点是,课堂上的例子永远都不应该是“最佳实践”,这在我执教时似乎很管用。学习ComSci就像学习在一个空旷的大停车场开车,然后在空荡的街道上开车;或者一开始只是把钉子钉在一块板上——最好是在没有太多分心的情况下学习基础知识。

一个问题是,“现实世界”的例子充斥着细节,直到它们花费了太多时间,毫无意义。我看过教科书中每个示例都有try/catch错误检测,或者更喜欢成员函数示例而不是普通函数。下面是级联的一个很好的例子,如果这种级联永远不会在实践中使用:

如果n==1打印(“一个”)否则,如果n==2打印(“二)否则,如果n==3{打印(“三”)}否则。。。

我们可以搜索一个真实的例子,但它可能使用枚举类型(这在课堂上还没有涉及),也许它真正处理的是GPU图形中的三元组与四元组与四元组——这使得它很长,很难阅读,学生不可能自己尝试。

另一个问题是,最佳实践随着时间和地点的变化而变化很大。随着时间的推移,我们从采访中需要了解设计模式转变为“设计模式是毁灭性的代码”。我们从检查前置条件到尝试捕获,再到添加新的“throws”注释。至于风格(如何命名变量等)——谁知道呢。从地方上看,你会在这里看到编程Q,其中一个人的解决方案是另一个人的“如果我写这样的代码,我会被解雇”。

但我觉得,最重要的是编程更像数学。也许我们在7x4之类的东西上进行训练,但没有“4x^2+5x-6”的闪存卡。你学会了保理技巧。一旦你知道如何进行分解、按部分积分等等,你就可以用组合来解决新的数学问题。这些技巧是通过抽象的非真实世界的例子来学习的。许多编程问题都是相同的。一旦有人用简单的例子来学习if's、循环、列表、嵌套循环、类。。。他们会知道如何把一个大问题分解成“使用列表来解决这个问题”等等。

换句话说,编写训练营强调解决实际问题。一个批评是,他们的毕业生只能做那些精确的事情,而在新事物上并不擅长。

$\端组$
7
  • $\开始组$ “在实践中永远不会使用”。。。如果只是+尽管是1。 $\端组$
    – 大卫
    3月26日15:12
  • 1
    $\开始组$ “课堂上的例子永远不应该是“最佳实践”,这就是为什么今天的现实生活中存在许多不良实践的例子。。。我想我不应该责怪学生们做了教他们的事。。。。我知道。但我不应该。CS老师真的是应该受到责备的人。。。。 $\端组$ 3月26日20:47
  • $\开始组$ @发问者:我认为它们并不是“你总是需要遵守的最佳实践”——根据给定课程的级别,在我们关注“使每个变量都成为符号常量”之前,人们通常会关注语法,然后关注有助于完成任务的算法,和“确保你永远不会有四级压痕深度”;很有可能,最佳实践会发生变化,然后你必须适应新的最佳实践&但其他事情会发生变化。你将学会在必要时打破最佳实践(参见:SRP vs Singletons)。 $\端组$ 3月27日8:35
  • 1
    $\开始组$ “我们从在一次采访中需要了解设计模式转向了“设计模式是毁灭代码”“我第一次听到这个!从评论中,这听起来无处不在。有任何链接或其他可以阅读的内容吗?我很想知道为什么现在人们会这么想 $\端组$ 3月28日14:03
  • $\开始组$ @Kirgad哈!我已经这样做了——假设有些东西足够模糊,我需要一个链接。但在这种情况下,谷歌搜索“设计模式正在破坏代码”是一场洪水。 $\端组$ 3月28日16:30
9
$\开始组$

这里有一个误解:“科学方法”与CS中所教的“方法”无关。

科学方法,在尽可能短的解释中,意味着关于现实的陈述必须是可证伪的——所有这些陈述只有在证伪之前才被视为“真实”。

CS中的方法是关于如何解决手头任何问题的实用规则。这类问题是(当然,在教室前面有老师的环境中)宇宙如何运行的问题尚未解决,但设计简单的任务是为了让学生练习迄今为止所教的任何工具集。

问CS老师是否“科学”是一个类别错误——这根本没有意义。

至于你潜在的问题:不,你的老师不需要向你证明什么。他在那里是为了让你了解事实和实践,让你对CS有一个小小的初步了解。这不像是在网上或某些网站上学习教程。无论他在教什么,很可能都是按照教学法的思路来组织的,而不是什么是“最佳实践”。它最有可能的设计目的是让您用CS术语思考,以便稍后能够提出自己的解决方案。在以后的职业生涯中,你不太可能一字不差地使用在学校学到的任何东西。

从商业的角度来看,如果我雇佣一个刚从学校或大学毕业的人,我不希望他们知道与我们在现实世界中所做的事情相关的哪怕是最微小的实践。我们也没有解决科学问题;我们正在创建软件,或构建技术解决方案(云技术等)。涉及的科学很少。

如果你在实际的科学工作中使用CS(例如,作为一名物理学家建立一些模拟以得出一些理论),那么科学就是你在写论文时要做的;不是您正在构建的软件。该软件充其量只是您理论的实际应用或演示,甚至不是科学证据(那个只能来自于观察现实)。

例如,如果你正在研究的科学是实际的CS,你想发明一种新的排序算法或类似的东西,那么当然,你在仔细思考之后编写的程序更“科学”,因为它可以是证明或反驳你的新理论的实际实验,但我只能再次想到这样一个程序被视为任何事情的科学证明的极少实例——即使在CS中,实际证明大多是你用大脑、笔和纸做的事情。重要的是,当老师站在教室前面时,这种东西不是任何课程的一部分;这将是博士的材料。

所有这些都是针对实际的CS课程(在那里实际教授方法)。如果你正在学习理论CS课程,你将主要学习基于它们的数学定义、公理和证明——它们本身也不遵循科学方法,而是建立一个数学/逻辑建筑,对每个人开放检查。如果你认为,在理论CS课程中,有些地方出了问题,那么你最好的办法就是让老师再解释一遍。你很可能只是被误解了(部分原因可能是还遗漏了一些事实)。

$\端组$
6
$\开始组$

“但不是最佳实践”

你当然知道最好的做法是什么。顺便说一句,你可能想查一下dunning kruger效应.

有一些最佳实践。。。还有一些最佳实践。

工程最佳实践。

始终使用库方法,而不是自己创建。不要重新发明轮子等。。。

CS课程中没有遵循这些规则,因为你想让学生学习如何编写冒泡排序、快速排序、合并排序、二叉树等……因为构建这些算法的经验有助于成为更好的程序员。

样式最佳实践

例如,对变量和方法使用描述性名称。而且不使用幻数。。。是的常数int FIVE=5;仍然是一个神奇的数字。其中作为const int WEEK_WORK_DAYS=5不是一个神奇的数字。因为“五”没有附加含义。

其中有些并不重要,例如:

  • 空格而不是制表符(除非你认为制表符更好,在这种情况下,死异端Scum)。
  • 或者如何放置花括号。
  • 缩进中的空格数(3,4……保持一致)。
  • snake_case vs camelCase vs camelCase(再次保持一致)。
  • 这个列表真的很长。。。

最大的风格最佳实践当然是你的客户IE教授告诉你做什么。只要你的代码可读和可维护。。。

毕竟,客户“在风格问题上总是正确的”

有一些良好的设计实践,或者可能是最著名的方法:

我会读罗伯特·C·马丁的文章,想得到一个更好的答案,然后我想放在这里。。。但基本上可以归结为解耦你的东西。尽可能编写单元测试。编写集成测试。编写功能测试。如果可能的话,不要让代码行为依赖于隐藏状态(避免全局变量)。。。等。

使用对您正在解决的问题有意义的设计模式。例如,不要锤入螺钉。

$\端组$
1
  • $\开始组$ 我认为正确的答案取决于班级的水平。在我的文章中,我假设这是一个新生编程,你似乎认为这是一种jr.level软件工程。Q被标为intro,但随后他们谈论测试用例,所以谁知道呢。 $\端组$ 3月28日16:39
1
$\开始组$

我同意其他人的观点,如果有人告诉/教你一些东西,而你认为其中有缺陷,那么就向他们询问/挑战。这对生活中的任何事情都是有效的,不限于大学里的课程。

正如欧文·雷诺兹(Owen Reynolds)在回答中所说的那样,做事的方式往往不是最佳的,这往往是有好处的。冒泡排序就是一个很好的例子。冒泡排序是一种效率极低的排序算法,我想不出有什么实际应用程序在我脑海中。但是,它相对容易理解和编码。下一步是评估代码。它符合标准吗?有更好的方法吗?这叫做重构。在现实生活中,你很少会在第一次尝试时就得到最好的解决方案。通常,您会发现隐藏的边缘情况或其他需要更新解决方案的情况。

我想说,重构技能是作为一名程序员所能拥有的最重要的技能之一,因为你需要能够理解代码及其含义,并想出一个没有这些缺点的更好的解决方案。

从这个角度来看,我认为这是一个富有成效的教训,可以教授和讨论冒泡排序。如果你马上从merge sort开始,你可能会发现冒泡排序,然后想“哦,这看起来简单多了”,然后就用它,因为你从来没有了解过为什么它效率低下。

总而言之,我们可以推测,因为没有你的消息,但我想让你的教授放心。

$\端组$
  • 4
    $\开始组$ 冒泡排序的一个实际应用程序是分布式冒泡排序。假设每个项目都是有感知的,并且能够与其邻居进行交互。例如,假设您要求排队去电影院的人按照他们有票的放映时间进行分类。他们会怎么做?最有可能的是,每个人都会与前面有稍后筛查的人和后面有较早筛查的人交换位置,直到排队的人稳定下来。这就是分布式冒泡排序。 $\端组$
    – 斯特夫
    3月26日14:24
  • $\开始组$ 此外,如果你认为冒泡排序算法是正确的(即它成功地对任何列表进行排序),那么它会立即遵循群论中的以下定理:转置的子集(i,i+1) 生成排列组. $\端组$
    – 斯特夫
    3月26日14:28
  • 2
    $\开始组$ @Stef是的,有一些冒泡排序的导数,其中包括优化。这支持了我的观点,即学习基本版本有时是必要的,尽管从未在实践中使用过。 $\端组$ 3月26日14:43
0
$\开始组$

从我在评论中得到的信息来看,这与“科学”无关,更多地与“行业标准”有关。

事实上,在纯CS中,你只需要学习一般概念、想法和解决问题的方法。因此,如果这是关于数学或逻辑基础的,而你的老师没有解释或详细说明为什么它们是最优的,以及在什么情况下,你肯定应该问后续问题。

虽然这仅仅是关于风格和偏好,或者关于特定编程语言的怪癖等等(不是范例的级别,而是实现的细节),但是这些都是快速变化的元素,可能会受到个人或领域特定偏好的影响,程序员之间通常会有所不同。因此,除非代码被破坏,否则就顺其自然,然后按照您的喜好或内部风格指南和其他建议进行操作。

此外,你应该记住,“优化”不是一个客观标准。它只是“最佳(相对于一组条件)”。因此,最快的代码可能只是一系列二进制命令,减少了所有不必要的内容,并利用了您实际使用的硬件的所有特殊特性。

现在,如果您设计的仿真应该真正针对速度进行优化,或者使用一组固定的、不可更改的硬件,在这些硬件上您可以最大限度地利用现有资源,那么这可能是有意义的。

另一方面,如果您没有这些限制,代码可能会很难阅读、理解和维护,并且很难移植到任何其他系统。因此,更新可能会以新硬件和新软件的形式出现,基本上是从头开始的。

因此,随着现代技术的发展,需求不再是纳秒级的,而是“看起来不像是冻结的”,你可以用绝对优化的时间换取开发人员友好性、维护人员友好性,甚至用户友好性。所以不是单词你可能会写“week_days(周_天)“并为名称的额外字符浪费了一些内存,但最终可能会安全地花费大量时间来记录代码,并让其他人能够在没有词汇表的情况下理解它。

另一方面,对于硬科学无法计算的所有模糊目标,什么是被认为是“最佳风格”和最佳方法,这些目标可能会随着时间而改变,所以你可能只需要跟上发展的步伐,所以在一件事上分区可能不是最佳主意。

因此,从CS的角度来看,更重要的是要知道在概念层面上发生了什么,以及各种方法的优点、缺点和缺陷是什么。所以,你是在优化内存、稳定性、最佳情况、平均情况、最差情况等等吗?如果你知道他们做什么以及如何做,那么找出实现这一点的最佳实践就是查找它。

$\端组$

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.