我如何完全自学计算机科学?[关闭]


46

作为一个完全自学成才的程序员,如果我能通过自学针对一个典型的CS毕业生的计算机科学课程来提高自己的水平,我会很高兴。

在互联网上查找不同的资源非常容易,当然还有MIT开放课程软件,还有斯坦福大学和其他大学提供的Coursera课程。Internet上散布着许多其他开放资源,并且反复推荐了一些好书。

我已经学到了很多东西,但是我的学习分散了很多,这确实使我很烦。我很乐意如果在某个地方,我可以找到我应该走的路,应该限制自己的学习范围,这样我就可以确定自己学习了哪些计算机科学的重要组成部分,然后系统地处理了我没有学过的那些部分。

维基百科的问题在于它没有告诉您什么是必不可少的,而是坚持要作为完整的参考。

麻省理工学院针对计算机科学和电气工程的开放课程软件。有大量的课程列表,但并没有告诉您根据每个人的兴趣/要求哪些课程是必不可少的,哪些是可选的。我没有提到要学习不同学科的命令。

我希望创建一个可以跟踪的列表,例如这个假人

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

您可以清楚地看到,我对计算机科学的具体主题一无所知。

即使有人按照推荐的学习顺序指出MIT课程软件中的基本课程(+ MIT OCW中没有提供的基本课程),这也将非常有帮助。

我将列出我已经经历过的帖子(但我没有得到我想要的信息)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major-最佳答案表示不值得研究cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science-指向MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming


完全吗 所有有趣的理论资料呢?

是的,我实际上喜欢有趣的理论知识,我认为它会增进我对该主题的理解(尽管这是我圈子中的辩论问题)。另外,当我的CS朋友讨论CS内容时,我感到很孤单,或者我问了太多问题而激怒了他们。
Optimus 2012年

2
请注意,课程中存在一些“孤岛”,事物相互交织在一起。例如,您在图论中很少需要λ演算。还应考虑到有导师陪伴可能很好-您是否住在合适的教育机构附近?

实际上,我愿意,并且对教授很友好,但是我不能一直都在打扰他们。首先,它们为我提供了许多零散的知识。
Optimus 2012年

3
在这种情况下,您可能可以选择一门或两门选定的课程-这使您始终可以对教授进行调试。

Answers:


24

我看过麻省理工学院的一些课程资料,真是糟糕透顶。他们有需要VC5的教材,一堆隐式全局变量,将颜色传递为“蓝色”而不是32位ARGB,更不用说4x [0,1]浮点数了。我不会仅仅因为课程或代码来自知名大学而相信它。

我的CS学位(来自英国CS排名前10的大学)包括:

第一年:

  1. OOP-超级基础
  2. 计算机系统之类的东西,二进制整数表示。
  3. 关系数据库基础理论
  4. 用于CS的数学-简单的2D和3D几何。
  5. 一点HTML / JS-完整的初学者资料
  6. 同样很小的PHP。
  7. 一点点函数式编程

第二年:

  1. 计算方面的法律问题-例如围绕保护用户数据的法律
  2. 编程语言-涵盖了乔姆斯基层次结构和词法分析
  3. 操作系统,网络和Internet,主要是虚拟内存和页面调度,IP堆栈
  4. 2D计算机图形学-大多只是证明基础数学定理
  5. AI-神经网络,贝叶斯信念系统等的基本描述
  6. 需求分析-UML,功能/非功能需求的简要概述。
  7. 团队项目

第三年:

  1. 算法分析-复杂度理论,主要是
  2. 编程语言的实现-LL / LR解析技术,CFG等。
  3. 软件项目管理-看瀑布/敏捷模型
  4. 国际计算-Unicode和其他本地化乐趣
  5. 先进的AI-老实说,我不知道,我很快就会通过考试
  6. 3D计算机图形学-再一次,主要只是证明旋转矩阵等定理
  7. 基于代理的系统-主要涉及异步代理进行通信,达成组决策等。
  8. 微处理器应用-数字信号处理
  9. 机器人技术-涵盖计算机视觉和机器人决策等高级知识

您会注意到,几乎所有内容都是某事的“基础”,几乎没有任何内容涵盖有用的深度。

实际上值得做的事情是必不可少的:

  1. 面向对象,然后更多,然后更多
  2. 函数式编程-还有更多。尝试选择一种语言,例如C ++或C#,而不必重新学习语法和工具等,以涵盖这两种样式。
  3. 操作系统部分的虚拟内存非常好,内核模式与用户模式也是一样。跳过分段和IP堆栈。
  4. 需求分析-对任何项目都有用
  5. 算法分析-了解什么是算法复杂度,如何降低算法复杂度以及常见操作的复杂度很重要。
  6. 软件项目管理模型-许多商店都采用敏捷方法,而许多老店仍然采用瀑布式模型。
  7. 国际计算-Unicode是必不可少的

值得做的事情,可以选择:

  1. 编程语言-Chomsky层次结构,词法分析工具。跳过LL或LR解析器背后的理论-LR解析器几乎可以接受任何现实的明确CFG,并且当它不能接受时,解析器生成器的文档将告诉您。
  2. 3D图形。我的意思不是说“证明这是一个旋转矩阵公式”是浪费时间,而是指实际的“这是一个顶点着色器”或GPGPU。那很有趣,很有趣,而且与众不同。
  3. 一些AI东西很有趣-像潜在领域和寻路。

至关重要的东西,但我还是没有涵盖:

  1. 并发性-2012年任何人都必须知道的至少是基础知识。

其余的完全是浪费时间。不幸的是,我已经知道了这九点中的大部分,或者从其他地方获得了有用的部分。如果您阅读有关FizzBu​​zz问题的信息,那么您很快就会发现,您实际上并不需要了解所有东西,这很幸运,这是幸运的,因为我的学位和我在网上看到的许多材料其他学位真的一点也没有教。


3
@ThorbjørnRavnAndersen:理论是编写代码的工具,仅此而已。如果您不能使用理论来编写更好的代码,那么它就一文不值。
DeadMG 2012年

3
@Optimus:绝大多数理论都无法帮助您编写更好的代码。
DeadMG 2012年

3
理论是了解可以编写什么代码,不可以编写什么代码的基础。

17
这篇文章中有一些非常好的建议,但是对于声明某些字段浪费时间您太教条了。如今,编程工作种类繁多,而浪费一项工作的时间可能对另一项工作至关重要。而不是简单地驳回作为东西浪费时间也将是有益的描述还是你已经参与了开发。
查尔斯·E·格兰特

4
在过去的几年中,我进行了很多采访,看来如今大学中最大的差距是在教授数据结构和算法。第二大差距是在了解如何在内部实施工具。我认为,使用特定工具的课程是在浪费时间。如果您无法解释何时使用哈希表以及何时使用树,那么了解C ++语法没有什么意义。

5

开放课程软件只是他们提供的课程列表。如果您想知道学生会接受什么,请转至MIT(非OCW)的网站,看看实际的课程。他们列出了所需的条件以及被认为是条件的先决条件。 这是他们的页面。


我正在研究它,但是我发现他们的要求非常简洁。一长串的课程在哪里?
Optimus 2012年


谢谢,这也将是有帮助的,很高兴知道大型大学正在遵循哪些课程
Optimus

1
我现在正在伯克利做EECS。如果MIT EECS程序的结构类似于Berkeley的结构,那么在那里您将不会得到太多指导:我们有简短的介绍序列,然后只要您进行最少数量的高级学习,它就可以按照您想要的顺序进行任何您想要的操作课程。我认为这很棒,但可能无法帮助您确定要选择的课程:我必须自己做出相同的决定。(我得到了我的老师的帮助,但恰恰是他的建议是参加他的研究生研讨会:)。
Tikhon Jelvis

@TikhonJelvis一旦了解了该领域的范围以及至少应涵盖的范围,就可以更轻松地选择要学习的内容和不想要的内容。我是土木工程专业的研究生,对计算机科学和Engg的发展一无所知。场
Optimus 2012年

5

尝试从ACM / IEEE获得的2001年计算机科学课程建议,链接如下:http : //www.acm.org/education/curricula-recommendations

以及2008 CS更新。

2001年报告的第17页有一个方便的图表,突出显示了所有“核心”知识,并且仍然列出了选修课。

本科课程甚至没有时间涵盖这些建议所认为的核心课程,因此它们会将一些类别集中在一起,让学生从中选择(例如,将操作系统,编程语言和软件工程集中在一起)软件,然后学生选择曲目)。

您可以在CS部门的网站上找到几乎所有学校所需的课程,它们应该是该课程的某种版本。


很好,有些过时了,但是在正常课程中仍有很多科目可供选择,如果您用完了排队的书,可以有更多的学习选择是很好的+1。
Optimus 2012年

对于懒惰者,该列表包含:离散结构(DS)编程基础知识(PF)算法和复杂性(AL)体系结构和组织(AR)操作系统(OS)网络中心计算(NC)编程语言(PL)人机交互(HC)图形和视觉计算(GV)智能系统(IS)信息管理(IM)社会和专业问题(SP)软件工程(SE)计算科学和数值方法(CN)。
Damien Roche 2014年

-4

如果可以的话,我想建议加入github.com一部分你的学习过程。

然后,您可以搜索具有您感兴趣的真实世界应用程序的代码,自己克隆,使用它,对其进行编码,然后逐渐了解,最后开始将补丁提交给源项目,然后继续进行您有兴趣的开源项目。

而且,当然,您会熟悉git,这会更好。


5
-1:虽然很有价值,但是并没有使他接触到他需要知道的计算机科学的理论方面。
肯·布鲁姆

做到了这一点,我们还有一个个人git repo,尽管在github上闲逛确实可以使您成为一个更好的程序员
Optimus
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.