it-swarm.cn

大学生必须知道的CS科目

在大学里,我从不对理论感兴趣。我没看过无论我尝试了多少,我都无法阅读内容,也不知道实际发生了什么。例如,在我的自动机理论课程中,我的教授告诉我所有可能与它的数学方面有关的内容,但他甚至没有提到任何将其实际应用的地方。这只是一个例子。

我设法通过了大学,并在一家公司实习,在那里我做了一个项目,但幸运的是,他们没有理会我的成绩,因为他们的成绩高于平均水平。

现在,我想知道CS学生必须绝对肯定地了解哪些主题?在行业中可能具有相关性的主题。这是因为我有一些空闲时间,这对我更好地了解它们会有所帮助。

您有什么建议?就像一个,算法是一门学科。

34
Karl

信不信由你,后来对我来说至关重要的一件事是编译器构造。不是使用Lex和Yacc的现代namby-pamby版本,那就是假人。

REAL编译器构造,您可以从头开始编写自己的符号扫描器和解析器。

我认为这是我永远不会再使用的东西。但是在过去的20年中,该路线已经证明了其在黄金中的重量超过4倍。我曾经写过的命令处理器,每个传入消息扫描程序,每个用户调度程序,每个脚本解释程序都使用了该课程中的原理。那样做,生活就会甜蜜,清晰,简单。而且我什至将所有信息提供给了一个没有做过的同事-他实际上必须为抽象机编写一个编译器。我可能会补充说,这在商业上非常成功。

如果我必须上任并感谢任何学科的大学课程讲师,就是这样。否则,我的解决方案将变得更加丑陋。

(然后有人跳起来说“好吧,您本可以使用Lex和yacc ...”,答案可能是-很大程度上取决于系统。在某些情况下,编程语言不是C(例如PL/M和Ada),在某些情况下,该平台没有可用的Lex或Yacc。了解基础知识意味着可以立即找到解决方案,而不必费力地试图弄清楚如何弯曲一些工具来解决问题。)

42
quickly_now
  1. 数据结构/算法,尤其是图。我设法使用与图相关的算法的现实世界的数量让我感到惊讶。着重于了解何时适合使用数据结构或算法的特征。例如,能够发现问题并知道使用动态编程/贪婪算法非常重要,并且可以节省大量时间。

  2. 具有计算复杂性的工作知识。您不必完全知道基数排序的下限是什么,但是知道如何弄清楚所写内容的最坏情况下的运行时间很重要,特别是对于性能至关重要的项目。

  3. O.S.概念。内存管理,调度程序等。考虑到您编写的代码一直在与之交互,每个开发人员都应该对操作系统真正有深刻的了解。

  4. 网络安全我遇到的开发人员很少,他们对开发的基本安全问题(缓冲区溢出,xss,SQLI等)有深刻的了解。如果您想在行业中取得成功,这确实是必须的。如果您可以编写下一件大事,这很好,但是如果您不保护他们的数据,那么您将不会有很多用户。

  5. 编程范例。了解OO /功能/过程编程的特征和区别。我曾经遇到过的最好的本科课程之一是用语言本身为fortan,scheme,prolog等编写简单的20条指令解释器。仅仅是曝光本身就可以真正帮助您理解软件开发的基本概念。

37
Kurtis

满足毕业要求并不一定足以成为最好的计算机科学家。对于典型的大学课程,以下是您应确保学习的十大知识:

  1. 经济学基础-涵盖 补充和替代 等主题的入门课程对于在更大的经济领域工作至关重要简单地了解它。尽管吉芬商品的概念不一定会为您带来帮助,但了解 externalities 会有所帮助。它还可能会帮助您理解,双赢的局面比您可能想象的要多。

  2. 如何编写证明-所有计算机科学专业的人都应该知道如何编写证明。而离散数学虽然是均衡早餐的一部分,却不算在内。 [归纳只是一种证明技术,您可能在不真正了解证明的情况下就可以通过。]代数或实数分析课程对于真正编写证明是必不可少的。代数是指群论或抽象代数,而不是您在高中学习的课程。为了获得全部收益,请在同一术语中进行代数和实数分析。

    为什么证明文件必不可少?因为是编程!想想您什么时候第一次学习如何编程的:如果一项任务需要if和一个循环,那么您可能对将它们放置在彼此之间的位置没有任何直觉。但是现在,同一任务将变得完全自然。编写证明非常相似。您将学习一组技巧,一旦学习它们,事情就会大相径庭。

  3. 如何写作-书面沟通技巧至关重要,无论您是从事行业还是学术工作。最好是找到一门机械课程,而不是一门有效地围绕另一个主题的写作课程。也就是说,许多学校将通过使其成为一个特殊主题来尝试使写作课程更具针对性或趣味性。尝试去学习该课程的“无聊”版本。

  4. 概率和统计信息-有些事情只有通过学习才能正确掌握。连同CS的主要要求(应该为您提供离散数学,单变量和多变量演算以及线性代数)以及代数和/或实际分析一起,掌握统计信息可能会使您在数学上有所作为。学习统计数据可以帮助您与其他科学家一起研究他们的项目。

  5. 当前热门话题-在过去的几十年中,它可能是数据库或面向对象的编程。今天,它可能是Web编程或面向服务的体系结构。不管当前的时尚是什么,请务必从中学习。如果只是看看时尚是什么。

  6. 停顿问题-大多数问题无法由机器解决。这是一个相当深刻的想法,我们的文化已经很好地吸收了,以至于不再听起来令人震惊。广播,哥德尔和原子弹也是如此。直到后现代艺术和冷战时代,我们才能再次应对这些概念。但是,修读可计算性理论课程可以使您重新认识这个相当惊人的证明。

  7. 纯函数式编程-您极有可能不会进行纯函数式编程,除非您对其进行研究或为部分公司服务,但知道它将帮助您成为一个更好的程序员。原因是您将学习许多新的抽象形式,以及诸如教堂号,延续和单子之类的概念,是的,还有递归,并且这些工具也可以应用于下一个Java程序。

  8. P和NP-好的,这个已经在您的关键路径上了,但是还是要注意。您想确定当某人错误地调用NP“非多项式”。

  9. 您一定会讨厌的课程主题-这可能是CS课程,您发现课程太低级,太理论化,或者非CS课程,您会发现令人反感,过于刻苦或过于无聊。如果这样的课程对您来说似乎是一个问题,并且您发现自己向他人解释了为什么您如此高兴而不必参加某某某事,它应该告诉您您将学到很多东西通过参加课程!也许您不会学习本课程的材料,但是您将了解自己的局限性,也许还会更多地了解自己为自己做的论证。 [提示:它们通常很虚弱。]

  10. 您肯定会喜欢的非CS课程-最后,您应该会觉得很有趣。这是您可能最少能学到的课程,但是无论如何都要学。做一次。如果您碰巧喜欢很多课程,那么对您有好处,但请确保它不会妨碍您覆盖此列表中的其余课程。

我的方法在这里很实际,根据您可以实际学习的课程而定。我专注于学习可能要学习的目标。注意:此答案改编自我的博客文章 每个计算机科学专业应学习的十件事

21
Macneil

与几位接受过多次采访的公司代表和朋友交谈后:

  • 资料库
  • OOP
  • 演算法
  • 数据结构

对于新员工(或如他们所说的“强烈推荐”的课程),往往是“ musts”.

其他可能有用的课程是计算机安全,组装和机器体系结构。我的许多教授也向我推荐了编译器课程。另外,如果您有时间,我会强烈推荐数学课程,例如图论,离散数学和组合数学。您可以在大多数CS课程无法掌握的课程中学习很多推理技能,但最终在编写非常复杂的程序时非常有用。

希望有帮助!

8
K-RAN

在很大程度上取决于您计划对学位的处理方式。看来,大多数CS专业人士最终都是某种软件工程师。考虑到这一点,我真的不确定为什么会有更多的人不只是主修软件工程。我怀疑没有足够的软件工程程序,尤其是在公共机构。

我来自嵌入式背景。与我一起工作的每个人都拥有EE学位或CE学位,部分原因是,当“老家伙”上大学时,没有那么多的CE课程。因此,很明显,如果您想在嵌入式领域工作,则需要硬件背景。

但是,无论您要从事哪个领域,我都相信每个程序员都应该学习汇编程序设计课程。您可能永远不会使用它,但是它将确切地讲授函数调用期间处理器级别上发生的事情,如何处理中断,如何构造内存或如何使用不同的寻址模式。我相信所有这些都会使您成为一个更好的程序员。

同样,尽管可能并不明显,所以在考虑特定平台的数据结构和算法时,其中一些都是重要主题。

6
Pemdas

有两种方法可以回答您的问题。让我尝试两者。第一种方法是从潜在的就业市场角度,编码技能等方面看待问题。这是我的清单:

  1. 数据结构
  2. 算法分析
  3. 面向对象编程
  4. 使用C++或Java的特定课程
  5. 操作系统
  6. 用户界面设计
  7. 并行编程

第二种方法是从抽象的角度看待事物,谁知道也可能是哲学上的。后面的列表可能没有工作市场所需的最热门技能,但是我很确定,当您完成这些课程之后,您将对软件开发的艺术有更深刻的了解。

  1. 有限语言与自动机理论
  2. 编译器构造
  3. 图论
  4. 人工智能
5
Fanatic23

我也将软件工程或设计实践添加到列表中,尽管它们的内容通常由行业中的学生来学习。

而且,在我看来(虽然没有很多经验支持),公司实际上并不希望在数据库等课程中教授大多数理论知识,他们希望人们理解并能够使用这些东西。

编辑:由于不满意,我想解释一下我的答案。我是计算机科学专业的大一学生,我的经验是根据我在该领域的领先公司的实习和工作面试而得出的。根据我的经验,很少有人会在面试或工作中使用复杂的算法或编写非常复杂的数据结构。

如果您可以创建和使用数据库,使用源代码控制,知道如何正确调试,知道如何使用设计模式等,则将更为有用。但是,正如我所说的,这些技能通常是在行业中掌握的,因此在课程中没有涉及。软件工程/设计实践通常涉及构建一个中等规模的项目,对于学习所有这些技能非常有用。

2
apoorv020

有许多重要的课程,具体取决于您打算走的方向。但是,假设您完全可以编程,则最重要的课程必须是:

  • 数据结构和算法

    实际上,计算中的所有内容都回到了使用算法处理数据的角度。要特别注意数组和哈希表,因为它们是迄今为止最有用的数据结构,但是列表和树和图(好吧,列表是树的受限类型,树是图的受限类型)同样重要。而且,理解算法对于生成糟糕的代码至关重要。 (否则,您会做的事情很糟糕,例如使用O(ñ3)算法,其中O(ñ 日志ñ)会的。)如果您的CS学位上没有必修DS + A课程,则不是CS。还是软件工程。甚至只是编程。

除此之外,多年来我发现在多个领域中最有用的课程是:

  • 并发

    并发涉及很多方面,但是我希望能对共享内存和消息传递之间的区别有所了解。我还希望对锁定策略(互斥量,信号量等)和事务进行广泛的介绍。

    当然,这对于理解并行化至关重要,但是对于分布式的任何事物(例如,编写暴露于Internet的服务,,即使它是单线程的也是如此),因为无论如何客户端都是异步的。我了解它对于编写游戏(通常是多线程)和使用嵌入式设备也很有用。

除此之外,我认为让大多数本科生接触尽可能多的不同想法对他们最有利。许多编程语言和范例。许多不同的应用领域。合理数量的数学运算(再次,因为它经常使用),并且也暴露于人为因素和心理(因为与用户交互的任何软件都在与人打交道)。毕竟,您永远不会确切地知道将来要做什么,因此规划灵活性是一个很棒的生活策略。

2
Donal Fellows

我每天在大学里学到的东西:

  • 面向对象的设计方法
  • 设计模式
  • 常用表达
  • 基本算法和分析
  • 数据结构

我希望我参加了数据库课程。 (自毕业以来,我已经学习了很多东西,但是我希望我能知道更多。)我也希望教授版本控制-它无处不在,非常有用,并且在我学校的课程中被完全忽略了。

我不得不参加几门数学课程。自毕业以来,我从未使用过微积分。我希望我参加统计学课程。 (再次,自毕业以来,我已经学会了足够的生活,但我希望我能知道更多。)

除CS部门外,还参加写作课程。良好的书面交流能力对于成功至关重要。

2
pwc

当我上大学时,有很多主题在我的现实生活中看不到用处,有时直觉被证明是正确的(形式方法在大多数情况下仅适用于琐碎的问题),有时是这是完全错误的(Big-O表示法非常有用),所以我想总体上来说我年轻的部分是正确的。

如果您想为现实世界做好准备,除了上面@ K-Ran建议的内容外,我建议阅读代码完整,并以此为基础来深入研究您发现困难的任何主题或觉得自己没有足够的保障。

1
glenatron

作为定期为编程工作面试应聘者的人,以及从事该行业12年以上的人感到有一定成就的人,我建议以下几点:

  • 数据库设计和SQL:令人惊讶的是,有这么多程序员不懂简单的SQL,而那些拥有良好SQL技能的程序员却是无价的。在拥有固定数据库结构的公司中,要能够设计一个好的数据库可能没有用,对于初创企业和正在经历变革的公司来说,这是必须的!
  • 设计模式。他们只会帮助您做出更好的设计决策
  • OOP:这通常是大多数课程的先决条件,但会有所帮助。
  • 算法:因为很少有人知道递归,所以更不用说什么时候可以为他们节省很多复杂的编码了
  • 数据结构:大多数现代语言都会为您处理这些内容,但是了解它们是进行良好设计的关键。

然后,进行一些额外的课程工作,请阅读:

  • 认证书。他们经常教您语法和运算符的底层类型。要知道为什么要做某事,而不是“因为它行得通”,这是很平常的事情,这是非常重要的。
1
Codemwnci

取决于,这个问题没有一个好的答案。

程序员是识别一个编写计算机软件的人的一般世界。

现在,那里有各种各样的软件。例如,使用Wikipedia作为概括的来源,我们可以满足 大概括

  • 系统程式设计
  • 编程软件
  • 应用程序软件

在第一个字段系统编程中,开发设备驱动程序,操作系统,服务器,因此,例如,您可以学习操作系统课程。

但是编程软件呢?正如Wikipedia所说,您可以对编译器,调试器,解释器,链接器,文本编辑器进行编码,因此,自动化理论,语言理论,语言和编译器课程将非常有用。

我们不能谈论任何类型的应用软件:
-电子游戏:代数,物理学,面向对象的课程?
-数学软件:数学课程?
-图片编辑:数学,物理学,算法课程?
-工业自动化:数学,物理学,算法,机器人课程?
-医学软件:生物学,医学,还有哪些课程?
-这里有很多东西:这里有很多课程。

如您所见,您可以遵循很多课程,这些课程将对您的工作有用。

根据我的经验,我是security(您想学习安全课程?)领域的系统软件工程和应用软件,我从一点点编程经验开始在算法和分布式系统中变得越来越有趣,而我再次对我编写的通用应用程序(嗅探器,网络入侵检测系统,协议解剖器和检测器等)的简单性感到不自在。

正如您在理论计算机科学中学到的那样!你是否参加了这门课程? :P

例如,您已经了解到所有计算机语言都可以适用于一组可计算的数学函数,并且例如,如果您的经验与我相同,那么您很快就会对这套微积分感到不适,并且像我一样,您可以开始了解如何发展该软件并没有那么吸引人和令人惊奇,因为相同的DESIGN PATTERN再次回来(您是否遵循设计模式课程?),例如,您可以开始对WHY产生更多的兴趣,并且可以将语言翻译成数学函数并开始了解计算机语言不是那么复杂!例如,您很快就会对人和心理感到更加惊讶,并且可以对此产生更多的兴趣,并成为一名优秀的项目经理!您是否遵循有关软件生命周期的课程?

那么,现在,您的CS生涯必须修读什么课程?

我建议您在所有领域,尤其是在理论领域学习尽可能多的知识,因为在常见的工作领域中,您很快就会对周围的琐事感到无聊,而成为一名全职工作人员,您的学习时间却很少事情是如何真正起作用的,还有更多的时间来了解具有深厚理论知识的人们如何预测事情的产生,并为您提供编码以在家中获得食物的可能性。

在计算机科学中存在一种错误的现实感。例如,计算机科学家有时确实与软件开发人员相距甚远。

看一下维基百科的解释。

玩得开心:)

我的2美分。

对不起,我的英语真不好。

1
boos

我认为您应该研究以下内容:

操作系统:-尽管您可能不需要它作为程序员来工作,但是值得了解一个操作系统是如何工作的,并且应该是CS毕业生所期望的。任何一本好书都能帮上忙。

糟糕:-这是面包和黄油。必须的。如果您想问书:您的第一本书应该是:-首先是OOAD,然后您可以去读Grady Booch和Ivar Jacobson的书

数据结构和算法:-对发展逻辑思维和思维方式非常重要。

对我来说,这足够了。永远不会太迟。 :)

1
Abhi

我从一个略有不同的角度来看待这个问题,因为我没有毕业于CS,而是毕业于电子工程(辅修商业)。

基于此,我认为您必须了解的事情列表相对较短,因为我(以及许多非CS专业的其他毕业生)在不了解编译器设计之类的情况下快乐地生存着。

我要说的是我发现确实有用的东西:

  • RDBMS设计-RDBMS位于大多数系统和站点的后面,您至少应该了解正在发生的事情的基本知识(我在工作中学到了这一点)。
  • 基本的UI设计-与我合作的所有最好的程序员都可以生成一个可用的应用程序,它并不像地狱般难看。除了一个,但他是证明规则的例外。
  • 一些基本的编程-我的意思是基本的。我学了一些C(用于图像处理和嵌入式系统),一些汇编语言(在完成课程的几周内就忘记了)和一些Pascal(基本的计算机课程是所有工程师的标准)。在面试时,我很惊讶,几乎没有CS毕业生能够以商业组织认为有用的任何方式进行编程,因此我期望不高,但是我希望他们知道基础知识。
  • 逻辑-我是通过数字电子学来学习的,数学家是通过理论来学习的,CS是通过编程来毕业的,但是无论如何,您都应该很好地掌握它,因为它归结为逻辑。
  • 沟通技巧-除了实际学位,表达技巧和自信之外,我还在大学里做了几门课程。很多常识,但几次被告知明智的事情也不会有什么坏处。
  • 商业和会计基础。一些程序员的举动似乎并不重要,但在我看来,这对公司中的任何人都至关重要-这就是游戏的运作方式,它将控制您的生活,所以您为什么不想要至少了解事情如何以及为什么发生?

而且,如果您有机会全面了解项目管理,那确实不会有什么坏处,但是在许多情况下,这在大学里都是很糟糕的教导,而您仅通过从事项目工作就可以在工作中学到一些东西。

1
Jon Hopkins

传授CS学生应流利的第一件事是英语。

如果不懂英语的口语和书面,您将永远处于不利地位。

只需看看Stack网站上出现的众多问题即可。他们太多的方式很难破译。有些人混合使用33t和短信(不确定正确的用语)。其他人则发表声明,并简单地在问号后面附加一个问号,而缺少诸如动词或形容词之类的重要小思想。

如果您无法交流,那么您将无法使自己的理解程度大大降低,而无法理解他人在说什么。

其他一切都只是细节。如果您能够沟通,至少具有中等水平的智慧,并且能够理解所读内容,那么您也可以拥有成功的职业规划。

1
NotMe

我还将在列表中添加一些基本的人力资源/心理学课程。

这似乎是一个奇怪的补充,但专业工作的一部分是学习如何推销自己和进行谈判。在没有扎实了解HR-drone动机的情况下进入您的第一个“真实”面试很容易成为灾难,最终可能会导致学生陷入低薪状态。

了解您的敌人,以便您可以保护自己。

0
Peter Bernier