本科生必须知道的CS学科[关闭]


34

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

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

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

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


3
正则表达式基于自动机理论,如果您必须解析任何内容,它将为您提供帮助。我在学校做过的事情和学到的东西与我所从事的工作无关,但这至少说明了我从事的工作和学到的东西。在任何情况下,我所学到的东西在该领域中都是没有用的。
David Thornley 2010年

2
我不喜欢使用您的类型... jk(有点)。如果我是你,我首先会花时间回顾一下你在学校应该知道的东西,那样,你在下一次面试时就不会显得白痴。之后,我将学习合理数量的数据结构和算法,看起来它们可以在现实世界中使用。您需要弄清楚自己想去的地方。如果是游戏开发人员,那么您可能需要线性代数,3d图形和计算几何。通常,您需要至少回顾数据str,alg,数据库,os和编译器的内容,并继续学习。
工作

命名自动机理论的特定应用程序就像命名算术的特定应用程序一样困难。也许有点夸张,但不是那么夸张。状态图通常是有用的,并且在代码中进行操作对于许多目的都是有用的。决策树(最小化为有向图)对我来说是一个相对较新的示例,我什至甚至需要使用状态模型(以规范形式)作为容器的键。如果看不到应用程序中的应用程序,请考虑添加一个间接层-代码生成。
Steve314 2011年

1
您在下面得到了很多很棒的CS答案,但是我认为通过限制您的问题,就像您错过了自获得BSCS以来15年来我见过的一些最有用的东西一样,这些使人们与众不同在行业中表现出色的:小组沟通和团队合作能力。看起来很傻,直接去演讲/语言/戏剧部门,参加“小组交流”或“团队/小组领导/管理”等课程。即使您不打算进行管理,您在这里掌握的技能也会使您成为更好的工程师和团队成员。
cabbey 2011年

Answers:


41

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

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

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

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

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


6
+1编译器是我在uni上最喜欢的课程之一,并且总是很有用。我很少使用lex / yacc / bison,基本原理更为具体。
2011年

我完全同意,尽管出于不同的原因。即使我使用Lex和Yacc,也要知道如何编写代码生成器,这是我对面向对象编程的第一次也是最好的沉浸。
彼得·特纳

您可以(并且还应该知道如何)用纯C或其他非OO语言编写代码生成器。然后是上一课的内容,即编写非常大的过程代码,并将解析器/扫描器/代码生成分解为明智和可理解的阶段。
quick_now 2011年

+1编译器结合了许多模式和原理,使您可以在完成设计后以完全不同的方式查看设计和代码。
Andrew T Finnell

2
“这是我以为永远也不会再使用的东西。” 如果我有一块钱,每次我说,对自己年轻的时候....
尼克和Spreitzer

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

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

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

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

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


1
+1整个列表几乎是必需的,(4)在现代分布式时代尤其重要。
2011年

1
在数据结构/图表上+1。我知道多少程序员不知道如何正确使用哈希表,或者为什么在某些情况下为什么用链表代替简单数组却每天令我惊讶。
马查多

+1用于编程范例。很好地理解不同类型的语言之间的对比很有帮助。
apoorv020 2011年

19

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

  1. 经济学基础 -涵盖补充和替代之类主题的入门课程对于在更大的经济体系中工作或只是简单地理解它至关重要。尽管吉芬商品的概念不一定会帮助您,但了解外部性会有所帮助。这也可能会帮助您理解,双赢的局面比您想象的要多。

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

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

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

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

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

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

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

  8. P和NP-好的,这个已经在您的关键路径上了,但是还是要注意。您要确保当某人错误地将NP称为“非多项式”时,您可以对其进行纠正。

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

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

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


对下降投票的解释将是有帮助的。也许我可以更改答案,然后您可以改变主意。
Macneil

教授,我不会否决你的答案,但是我要解决一件事。证明编写:到目前为止,除非您要求我证明数字为奇数或偶数,否则我仍然无法编写离散证明。我看不到这与行业之间的联系。也许我错过了“问题解决方面”?我永远无法将自己的大脑包裹在数学归纳法或抽水引理上。我认为这不会减慢我的速度。
布莱恩·哈灵顿

编写证明就像编写程序一样。例如,学习如何证明a * 0 = 0就像是FizzBu​​zz数学(好吧,也许有点困难)。乍一看似乎令人生畏,但很快您就会学到一些小窍门,就像在学习编程时一样。证明可以具有不同的结构,可以帮助您进行递归和结构化思考。正如我所说,一门离散的数学课程并不能用来学习真实的证明。您需要为此进行小组理论或实际分析。
Macneil

虽然赞美的知识当然是有用的,但我相信补语的知识与经济学更为相关。
ijw 2011年

1
@ijw:关于CS学生的经济学问题,Joel进行了很好的讨论,值得一读:joelonsoftware.com/articles/CollegeAdvice.html
Macneil

8

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

  • 资料库
  • 面向对象
  • 演算法
  • 数据结构

往往是新员工的“野心”(或如他们所说的“强烈推荐”的课程)。

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

希望有帮助!


1
将同意OOP和数据结构。
apoorv020 2010年

4
基本数据结构...非常重要。我认为比OOP更重要。您需要能够考虑如何存储和组织信息。而且,如果在嵌入式系统上,数据结构的内存布局是必死无疑的东西。
quick_now 2010年

3
+1为数学课程。它们还可以帮助您学习跟踪大型问题/系统。
Michael K 2010年

1
联网也是一个不错的选择。
Keyo

哎呀?您可以在不使用OOP的情况下使用Haskell或C进行编程...我会为您提供广泛使用的编程方法,但我认为这不是基础。另一方面,接触各种范例似乎很有用。
Matthieu M.

6

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

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

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

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


+1是因为计算机科学学位可为您提供各种学科/技术的经验。只要确保注意软件设计过程即可。
蚂蚁先生2010年

+1对于组装,始终明智的做法是真正了解堆栈底部的情况。如果每个人也都知道硬件,那就太好了,但是对于许多人来说,这是一个太远的步骤。
2011年

5

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

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

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

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

不要只列出您认为必不可少的一系列课程,提供列出清单的原因和经验。

2

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

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

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

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


请提供有关您的经历以及为什么有人应该参加这些课程的更多详细信息。

@Mark:您能解释一下downvote背后的原理吗?
apoorv020 2010年

@ apoorv020没有解释为什么你推荐软件工程或设计实践,你的答案是没有用的。您的修改仍然无法解释您为什么推荐它们。

@ apoorv020 采取软件工程或设计实践的唯一兑换价值是您通常构建一个中型(无论意味着什么)项目?您从这些课程中学到了什么?

他们很高兴知道,但这些不是CS科目。
Thomas Owens

2

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

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

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

我不得不参加几门数学课程。自毕业以来,我从未使用过微积分。我希望我参加统计学课程。(再次,自毕业以来,我已经接受了很多东西,但我希望我能知道更多。)

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


+1令您感到惊讶的是,数据库在您的课程中并不是强制性的,通常被认为是必不可少的。
2011年

它是。我从技术上走了出来,对此感到遗憾。
pwc

@Orbling:通常,小型部门(与大型公立学校相对)根本没有足够的讲师来要求每个主要主题。例如,在我学校,数据库是选修课。
Macneil

@Macneil:在我的课程中,主数据库课程是先决条件(涵盖所有基础知识:ER建模,范式,SQL(不仅是基本SQL,复合/嵌套等),索引放置等),后者则更为复杂,数据库课程为选修课(我认为总共有3门课程)。我从不选择参加这些课程,因为我认为这是我可以比其他课程更容易独立吸收的东西。认为我改用高级或。
2011年

@pwc:我敢打赌,你还记得为什么要摆脱困境吗?
2011年

2

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

  • 数据结构和算法

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

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

  • 并发

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

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

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


1

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

如果您想为现实世界做好准备,除了上面@ K-Ran推荐的内容外,我建议阅读“代码完成”,并以此为基础进行更深入的研究,以发现您发现有困难或感觉不到的任何主题足够覆盖。


有时我发现形式化方法很有用,尽管显然仅适用于小型组件。我想到了Dijkstra等。就像说“如果您是一个完美的数学家,您就可以成为一个优秀的程序员”。
David Thornley 2010年

我怀疑您是否正在开发将取决于您的代码,基本上必须牢牢掌握这些知识。但是对于我已经完成的工作,它从来没有必要。如果我现在确实需要它,我将不得不回过头重新学习它……
glenatron 2010年

就像Z所说的,仅在存在生命危险的组织中才真正用于关键任务软件。但是,我认为学习它们可以使人们更加清楚代码的正确性,并且可以深入支持各种规范。有时,您学到的并不是为了自己,而是有助于确定最重要的内容。
2011年

可以将其视为坚固的更大的构建基块。如果您已证明您的组件正确(并对其进行了测试以发现您在设计和证明中犯下的愚蠢错误),则在编写和调试时无需担心的事情就更少了。
David Thornley

1

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

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

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

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

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


1

作为定期访问编程职位候选人的人,以及在该行业工作12年以上的人感到有一定成就的人,我建议以下几点:

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

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

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

1

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

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

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

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

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

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

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

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

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

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

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

那么,现在,您的CS生涯中必须学习什么课程?

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

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

看一下维基百科的解释。

玩得开心:)

我的2美分。

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


1

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

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

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

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

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


1

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

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

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

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

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


0

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

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

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


-1

第一年:

  1. 高级语言的基本OOP
  2. 数据结构

第二年:

  1. 编译器,您构建了一个简单的从头开始
  2. 并发

第三年:

  1. 算法
  2. 操作系统,您可以在一个简单的功能中添加功能和增强功能
  3. 形式语言

第四年:

  1. 联网
  2. 分布式系统
  3. 用户界面
  4. 高级编译器
  5. 进阶作业系统
  6. 人工智能
  7. 计算机图形学

这些课程应提供大量的理论和编码实践。


-2

没有人提到计算机体系结构,这很奇怪。


我认为,计算机体系结构重要的是要知道,如果你想了解内存高速缓存,页面错误等的影响
apoorv020
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.