我应该知道的计算机科学理论知识是什么?[关闭]


27

以拥有电子工程学位而不是计算机科学学位的的身份讲,要使我成为一个更好的现实世界程序员,我应该知道的一点计算机科学知识是什么?

(在现实世界中,我的意思是我在作为程序员的日常工作中会使用并从中受益—例如,我建议理解数据库规范化比理解快速的分类更实用。的图书馆)。


42
1(对不起,我不得不)
haylem 2010年

5
哦,还是最重要的一个!(我现在就去...)
haylem 2010年

理论计算机科学stackexchange证实了这里其他人所提到的:复杂性,数据结构和算法。cstheory.stackexchange.com/tags
chrisaycock 2010年

2
我觉得有必要反对这个问题。没有“一点”足以学习,而且(IMHO)也没有“最重要”的一点。(对于恕我直言,有几个方面对CS 同样重要)。因此,我认为,尽管对这个问题的答案可能很有趣,但本来可以更好地提出这个问题。
Konrad Rudolph 2010年

1
如果您还没有能力,我会说布尔逻辑和/或离散数论。几乎每一个ifloop声明写过用途研究这两个领域的一个子集。
史蒂文·埃弗斯

Answers:


52

如果我只需要选择一点,这是一个困难的决定,那我就说使用Big O表示法。了解O(n),O(ln n),O(n²),O(2 ^ n),O(n!)的含义有助于您避免很多昂贵的错误,这些错误在测试环境,但灾难性地使生产失败。


2
+1,而我要说的更重要的是,仅知道O(n ^ 2)比O(lg n)差(例如)就是知道如何为给定的代码派生 Big-O。
迪恩·哈丁

3
强烈不同意。这些东西相对来说微不足道,并且在CS中还有更多有趣的话题。另外,我觉得大多数人想到的复杂性直觉,虽然他们可能不会把它的复杂性,他们可能不能称之为二次,指数等
马格努斯Wolffelt

Magnus:根据我的经验,大多数非编程人员根本不考虑复杂性,他们直观地假设所有问题均为O(n)。
user281377 2010年

我还没有正式需要这个。
CaffGeek 2010年

1
乍得:关于大O表示法,没有什么过于正式的说法,但是如果没有事物的名称,您几乎就不会想到这些事物,更不用说与同行谈论它了。
user281377 2010年

19

这是一个问题,每个人都会有不同的答案。我会说:复杂性理论是最重要的部分,无论如何您都不是直接以程序员的身份学习的(例如算法和数据结构),但是可能会影响您的工作。如果我知道问题是三次复杂的,这将很有帮助,如果知道问题的规模增加,它将很难扩展。


我想补充一点,如果您正在解决一个可以用简单语言轻松重述的问题,这对您很有帮助。
哲学

复杂性作为一个概念很重要,但是实际上计算它并不重要。了解什么不太复杂是重要的一点。
比尔

@比尔:是的。但这部分是您不一定要通过实践获得的一件事。该理论在这方面非常有帮助。
Mnementh,2010年

12

了解数据结构,算法和复杂性。

仅仅为了了解机器不是无限功率的魔盒,也不过分。您不能向它扔任何东西,并且期望它在毫秒内崩溃。您知道有限制。您需要学习不使用代码测试它们。

还可以查看解决编程中特定设计问题的常用方法。设计模式即。不要崇拜他们,只是接受他们交流的想法。

数据库建模知识也是必不可少的。

之后,只有不同的编程语言,框架和库才能实现或让您实现核心概念。拿起您喜欢的东西,然后与他们一起练习。


细节-有很多算法和数据结构。
乔恩·霍普金斯

只是了解事物的基本知识。拿起一些不太厚的书,直到完成。

1
多数民众赞成在一个多。

7

这是一个棘手的问题。

计算机科学的各个方面都以一种或另一种方式很重要。

关于您每天将受益的方面,可能是代码从代码到CPU的“幕后”工作的概括概述。

理解Big O表示法很重要,而且在现实世界中,了解如何执行代码也非常重要。


7

是的,这把我踢了好几个小时。

在此过程中,我已经删除了此处给出的一些常见答案。

没有清单

  1. 大O(n)表示法。很难把它放在这里,但是不,我们可以直观地算出效率低下的情况,并比较不同的过程集,而无需甚至没有听说过渐近算法分析。

  2. 功能语言 不,一种语言只是思考问题的一种方法。为什么只有这一点很重要?

  3. 停止问题 有些问题过于具体,人们过着不知道存在的生活。

  4. 聆听 如果您不听,那么您将生活在自己的世界中。不一定有害!

  5. 软件开发周期不 !我们仍然可以尝试一些令人难以置信的软件或英雄般的努力。

  6. 复杂性理论, 我想可能是这样,但是没有所有形式主义

Comp Science的一点想法

我会说-“ 抽象抽象抽象... ”。了解它。查看周围的示例,并学习如何使用它进行构建。到处都是。整个计算机科学,工程学和应用程序看起来像抽象的分层。

一旦知道了这一点,便开始学习环顾四周。

当您看到list insertionpython和中使用某个代码时not append,您会笑着,因为您知道python列表是使用数组抽象构建的,其中插入既昂贵又附加廉价。

这只是一个例子。


+1是您显然已经深思熟虑的答案。
乔恩·霍普金斯

只是对您对“暂停问题”的评论:“在不知道存在的情况下生活”对于任何计算机科学主题都是正确的。


3

数据结构的竞争用例。

在某些情况下,需要使用带有红黑树的映射来保证性能,而在其他情况下,则不能再次使用数组来保证性能。知道何时选择哪种数据结构是一项宝贵的技能。


3

只有三个数字很重要:

  • 许多

但这不是意味着“ 3”也很重要吗?
哈维尔2010年

它应该是零,一和无穷大:en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@哈维尔:3是很多游戏的子集
史蒂文·劳

@托马斯:说谁?
史蒂文·A·洛

@Steven在这里,我的理解可能不是100%,但我认为您的想法是,您应该一无所有,一件一件事情,或者您拥有的物品数量应该不受限制。如果您不限于一个实例或一个实例,则不应限制实例。但是,我不能完全确定为什么会这样(我只是对零/一/无穷大概念有些含糊的熟悉)。
Thomas Owens

3

我在CS(以及作为开发人员和架构师的多年经验)中学到的最重要的事情是,能够基于波动性而非功能来分解问题。所有好的设计都可以隔离并封装波动。所有优秀的开发人员/架构师都可以直观地做到这一点,即使他们尚未将其形式化。项目失败的主要原因是无法根据波动性分解问题并将其封装。封装波动性的失败不可避免地会导致复杂性和项目失败。


您所说的波动到底是什么意思?
amara

3

停顿问题

存在与计算机相关的问题这一事实根本无法通过计算机解决。


3

您应该了解足够的自动机理论,以便能够知道您要处理的问题在形式语言的层次结构中所处的位置。由此,您可以找出一些重要的实际用途,例如为什么不应该使用REGEX来解析HTML。(HTML需要上下文无关的语法来描述它),以及为什么编译C ++所需的时间要长得多,而不是Java或C#(C ++需要使用图灵机,而Java和C#可以使用上下文无关的语法来描述)。

形式语言最重要的层次是从最弱到最强:

  1. 可以通过有限自动机或REGEX解析的语言(带有反向引用的REGEX实现比该类别更强大,但它们仍然无法解析类别2中的所有内容)

  2. 可以由具有堆栈存储器的自动机或上下文无关语法解析的语言。

  3. 可以由图灵机或具有随机存取存储器的自动机解析的语言。


不。正则表达式解析正则语法。这正是有限状态自动机可以接受的语法类别。“ Chomsky语法”并不专门指上下文无关文法,这是堆栈计算机处理的内容。
philosodad 2010年

@philosodad-上下文无关的语法更加精确,我已经更新了帖子以使用该术语。我对正则表达式所说的话,我不理解您的问题。
Dan Monego 2010年

@Dan-我的问题是正则表达式与有限状态自动机一样强大,并且如果您可以使用机器解析任何确定性上下文无关文法,则可以解析所有确定性上下文无关文法。
philosodad

或者,更精确地说:要么需要堆栈,要么不需要堆栈。如果确实需要堆栈来解析语言,则必须具有堆栈来解析语言,因此,如果语言需要堆栈来解析语言,则可以解析该语言。
philosodad

@philosodad-正则表达式有两种类型-理论上的正则表达式和在软件中实现的正则表达式。您对理论正则表达式是正确的,但是大多数实现都具有超出其理论基础的若干功能,并且可以匹配某些非正则语言,例如a ^ n代表非素数n。因为这是实践中关于理论的主题,所以我不遗余力地指出,正式定义与野外使用的定义之间存在差异。
Dan Monego 2010年

2

好吧,我可以给您一个无聊的答案:自动机理论和信息论。

或者我可以告诉你我很久以前从硬件顾问那里学到的东西:

  • “足够好”还不够好。

1

我建议您了解软件开发生命周期。当然,这是在第二年的计算机科学课程中介绍的,并且在软件项目中反复使用。这对于了解项目从头到尾如何运作很有用,尽管如果您想更深入地了解,可以学习瀑布方法或敏捷方法,以获取更多具体知识。


2
墨菲定律:任何可能出错的地方都会出错
理查德(Richard)2010年

这不是CS理论,但这是一个很好的答案。
justkt 2010年

1

程式设计

数学和计算机科学系的霍巴特大学和威廉史密斯学院提供了计算机科学124程序设计导论

主题包括控制结构,对象,类,继承,简单数据结构和软件开发的基本概念。

如果您不能编程,那么您在实际计算中就不会走得太远。

而且,是的,我已经注意到您是程序员。这是为了提高您对编程理论的全面了解,以及您可以使用哪些其他方法。

是我们所知道的编程计算机科学吗?

在回应@Thomas Owens的评论时(非常正确地指出编程不是严格的计算机科学),我想引用Wikipedia的Computer Science文章:

...计算机科学的重点更多是在理解用于实现软件(例如游戏和网络浏览器)的程序的属性,并利用这种理解来创建新程序或改进现有程序...

因此,在我阅读本文时,通过编程,您正在展示对编程理论的理解。反过来,这应该可以帮助您创建简单,优雅的代码,这对于其他人来说很有趣。


编程不是CS理论。实际上,我很容易辩称编程根本不是计算机科学。
汤玛斯·欧文斯

@托马斯·欧文斯(Thomas Owens)我已经更新了答案,以支持我的说法是有效的。您可以查看一下,让我知道您的想法吗?
加里·罗

1
仍然不要以为编程就是CS。编程可能对想要实现算法或数据结构的计算机科学家有用,但是CS理论的主题(从我的Intro到CS Theory书籍,因此可能还有更高级的主题)包括逻辑,自动机理论,图论,可计算性,计算复杂度以及算法分析。我还要说,编程语言(一种语言的设计和实现背后的理论)也是计算机科学的一部分。但是,您不必具备成为一名出色的计算机科学家的程序即可。
Thomas Owens

@托马斯·欧文斯(Thomas Owens),我明白你的意思,并且(戴上纯粹的帽子)我同意。但是,OP要求获得一点点CS,这将有助于他在现实世界中的发展。我坚持认为,编程理论(以良好的代码实现)只是这一点。我做了相应的略微编辑。
加里·罗

是的 从CS来说,我想了解编程语言和范例可能会有所帮助(特别是如果您正在实现DSL,但是了解许多范例,例如过程,功能,OO,逻辑等只会对软件开发有所帮助)。了解算法和数据结构还可以帮助您选择合适的解决方案,以最有效的方式解决问题。自动机理论可能会有所帮助(我曾经使用过曾经是巨大的FSM的系统,但我不知道那是多么普遍)。因此,我想说数据结构,算法和PL理论是从CS中了解到的最有用的东西。
Thomas Owens

1

我不得不不同意康拉德·鲁道夫。为了使您成为更好的“现实世界的程序员”,您应该了解计算机科学的“一点点”。如果您没有其他答案,请至少考虑一下-满足要求与满足客户不同!最终用户将始终以您从未想到或未编码的方式尝试使用您的程序。总是,总是,总是。

因此,为了成为一个更好的程序员,您必须首先收听。听客户。听他们的需求。听他们的想要。特别是,听听他们的“技术专长”水平。我无法告诉您我已经看到多少次构建的项目正是所要求的,但根本没有客户实际需要的。都是因为收集需求的程序员没有真正在听。

除非您具有UI设计的背景知识,否则您可以带走的其他东西就是让别人来设计UI。我总能发现一个由程序员而非专家设计的用户界面。对您而言合理的逻辑对客户而言毫无意义。而且,如果您的客户不精通技术(谁是谁?),那么您的“功能正确但外观上很丑陋”的解决方案将在晚宴上令人回味。


3
这个答案与霍普金斯所问的CS理论无关。
詹姆斯

1

功能语言!

学习函数式语言可以使您根据表达式而不是步骤和命名的可变状态(变量)进行思考。这对您有效处理日常编程问题的能力产生了重大影响-尤其是现在几乎每种流行语言都具有功能特性。

算法和复杂性理论也很重要,但是它没有那么有趣,因为它主要是让您在通常已经知道并可以推断出的名称上加上名称。


0

计算机本质上就是模式匹配器,仅此而已。一切都归结为图灵机-解释模式处理的经典计算机科学概念。


-2

解决问题和继续学习的愿望!

他们比了解快速排序和数据库规范化要好得多。


6
那不是计算机科学理论,它们同样适用于电子(或几乎任何其他形式的工程)。
乔恩·霍普金斯

以我的观点来看,以您的示例为例,知道快速排序是没有帮助的。知道它的存在以及什么特别之处是有帮助的,但是如果我一无所知,那也是一个Google搜索。知道任何一种算法也无济于事。但是,知道如何创建一个和解释一个是!也许如果我可以改变答案,那么复杂性可能是最重要的。
布莱恩·哈灵顿

1
如果您不知道自己是否需要某物或该物存在,则无法搜索。您的答案列出了开发人员要具备的重要素质,但没有回答提出的问题。
亚当李尔
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.