本文已经年久失修,谨慎观看。
- 汇集互联网上的优质免费教材、视频资源。
- 为在读的计算机系学生,编程爱好者提供系统的学习方案。
- 为通过培训班出身和跨领域的IT相关从业者提供知识进阶路线。
- 帮助在学习计算机科学中感到迷茫的朋友们寻找兴趣领域。
- 破除快餐学习风气和“IT门槛低”偏见。
- 学习计算机的硬核小建议。
- 去繁求简,避免单纯的平行资料堆叠,只选择最好最值得的资源推荐。
- 建议直接从编程入门开始,写出可以跑的东西来,有成就感~
- 计算机组成,计算机网络,操作系统是三门重要基础哦~
- 英语和数学非常重要~如果对英语感到不适,利用英文视频强迫一下自己~
- 实践出真知!
类别 | 科目 | 自学书籍(中文版/英文版) | 视频课程 | 学习目标 |
---|---|---|---|---|
基础必修 | 编程入门(三选一) | Python编程导论 Introduction to Computation and Programming Using Python 程序设计方法 How to Design Programs 程序语言的应用和解释(在线阅读) Programming Languages: Application and Interpretation(在线阅读) |
麻省理工:计算机科学和Python编程导论(中英字幕) |
学会基础的编程方法,拥有使用编程语言和工具解决问题的能力。 |
计算机架构 | 计算机组成与设计 Computer Organization and Design |
北京大学:计算机组成(中文无字) | 基础的硬件知识大局观。理解计算机的结构,便于从机器角度思考分析现实问题。 | |
算法和数据结构 | 算法 Algorithms |
麻省理工学院:算法导论(中英字幕) | 培养使用编程工具解决实际问题的能力,理解程序的设计方式和效率。重要程度五颗星~ | |
计算机网络 | 计算机网络:自顶向下方法 Computer Networking: A Top-Down Approach |
斯坦福大学:计算机网络(中英字幕) |
重要的知识基础。理解网络通讯的原理,便于多方面分析实际问题。 | |
操作系统 | 现代操作系统 Modern Operating Systems |
加州理工学院:操作系统(英文无字幕) 清华大学:操作系统(中文无字幕) |
重要的知识基础。理解并发、资源管理和软件设计中的权衡原则,锻炼分析解决实际问题的能力。 | |
进阶选读 | 数据库导论 | 数据库系统基础教程 A First Course in Database Systems |
斯坦福大学:数据库导论(英文无字幕) | 理解应用对通用存储的需求,提升代码效率。理解数据模型的设计。 |
高级编程技术 | 计算机程序的构造和解释 Structure and Interpreter of Computer Programs |
计算机程序的构造和解释(中英字幕) |
编程还有很多东西要学哦~ | |
深入理解计算机系统 Computer Systems: A Programmer's Perspective |
斯坦福大学:编程方法学(中英字幕) |
|||
离散数学 | 离散数学及其应用 Discrete Mathemtaics and Its Application |
麻省理工:计算机科学中地数学(英文字幕) | 计算机科学通用数学基础。 | |
进阶数学 |
具体数学 Concrete Mathematics |
暂无 | 分析算法,高级编程和用于解决复杂问题的数学基础。 | |
编译原理 | 编程语言实现模式 Language Implementation Patterns 编译原理 Compilers |
斯坦福大学:编译原理(中英字幕) | 理解编程工具,锻炼抽象能力。 | |
分布式系统 | 分布式系统原理与范型 Distributed Systems: Principles and Paradigms |
麻省理工:分布式系统概念(无字幕) | 理解分布式系统的应用和规则。此方面涉及很广,远非一本书一门课可以囊括。 | |
编程语言语用学 | 程序设计语言-实践之路 Programming Language Pragmatics 计算机编程的概念,技术和模型 Concepts, Techniques and Models of Computer Programming |
斯坦福大学公开课:编程范式(中英字幕) |
更深层次地掌握编程语言。 | |
计算机程序数学基础 | 软件基础(在线阅读) Software Foundations(在线阅读) |
暂无 | 更深层次的计算机科学数学基础。 | |
热门领域 | 人工智能导论 | 人工智能-一种现代的方法 Artificial Intelligence: An Modern Approach |
伯克利:人工智能导论(英文无字幕) | |
机器学习 | 机器学习(周志华) Interpretable Machine Learning Pattern Recognition and Machine Learning |
吴恩达:机器学习(中英字幕) | ||
深度学习 | Neural Networks and Deep Learning | 李宏毅:深度学习理论(中文无字幕) | ||
自然语言处理 | 语音与语言处理 Speech and Language Processing |
斯坦福深度自然语言处理(中英字幕) | ||
计算机图形学 | 计算机图形学 Fundamentals of Computer Graphics |
上海交通大学:计算机图形学(中文无字幕) |
||
计算机视觉 | Computer Vision: Models, Learning, and Inference | 斯坦福大学:深度学习与计算机视觉(中文字幕) |
||
自动推理 | Certified Programming with Dependent Types | 暂无 |
本节是关于计算机科学学习观的主观理念,希望可以给你提供对于计算机科学学习的“大菊观”。适用于各路萌新和迷茫的CS学子,不适用CS界精英学子,IOer,各领域大牛和专家。
Q:如何选择大学和专业?
A:如有出国能力,建议去美国学习计算机科学。否则,请直接选择“计算机科学”专业。最新开设的”人工智能“”多媒体“”大数据“等专业都不建议申报,理由是基础课不够充实,杂而不精,没有任何实用意义。
Q:如何自学计算机科学?
A:请使用英文教材、英文翻译教材、官方中文文档,按照正确的顺序,配合习题与实践项目进行自学;也可以直接看名校的公开课视频和课件。如W3Cschool、菜鸟教程此类资源网站可以帮助理解和整理知识,当作备忘笔记。大部分情况下,请避开**作者的教材。
Q:学习计算机科学就是学编程吗?
A:绝对不是!编程语言只是基础和工具。绝对不要拘泥于某一门编程语言,也不要神话它。记住,编程语言的使用和学习是轻松写意,自然而然的事情,并不需要苦练数年才能上阵。
Q:系统地进行学习重要吗?
A: 十分重要。对于计算机系统的认知,是提升自身综合能力的第一个“瓶颈”。学会之后可以对问题进行多方位思考、分析,建立对计算机科学的大局观,做一个解决实际问题的人。
Q:英语重要吗?
A: 十分重要。学英语不仅仅是因为编程语言的关键字是英文单词,有以下好处:
- 学习“概念”和“专业词汇”时,可以顾名思义,加强理解速度。专业词汇的中文翻译大部分都无法直接理解它的意思,如果读书时时间花在了理解词汇上,效率大打折扣。
- 中文翻译的外国教材质量较差。这是一客观事实,是因为计算机书籍销路窄,译者对于英文经典教材的翻译几乎是义务的,无法保证翻译质量。
- **教材普遍质量极差。这些教材大部分是作者根据相关书籍改写来的,知识讲解不清晰,也比较过时。
- 便于查阅论文和研究成果,以及学术交流。 建议在全英文环境中学习。
Q:数学基础?
A: 因人而异。
- 学习编程最低限度的数学基础是:二进制、十六进制计算、指数、对数算术,简单的布尔逻辑、命题逻辑以及数学归纳法,在高中数学中已经基本涵盖了。如果有不清楚的地方,可以阅读《程序员的数学》,初中数学水平即可看懂。
- 对于以软件开发者和算法工程师为目标进行学习的同学来说,大部分情况下不涉及数学。如果涉及,使用维基百科进行知识补充就够了。
- 如果想成为专家、大牛级程序员,或者某领域专家,则很大程度上与数学联系紧密。
Q:如何学习数学?
A: 人生有涯,数学无涯,应避免南辕北辙,丢失学习重点。对计算机科学有兴趣,可以在涉及到数学问题的时候,利用维基百科知识补充(不懂啥搜啥)。一般情况下,不必系统学习(甚至不必学习离散数学、线性代数)。对于数学的历史、数学的证明等,更不需太过重视。一般而言,有以下三门核心基础数学:离散数学,线性代数,概率论与统计学。
Q:如何选择兴趣领域?
A: 在20世纪60年代,计算机科学研究的重点是程序语言,编译器,操作系统,以及这三方面涉及的数学。70年代则以算法的研究最为火热。于今的计算机科学研究更重视“应用”。在自然科学中,观察、收集和存储数据最为关键。在商业中,重要的是对数据的“理解”和“掌控”。这些是计算机科学的传统领域。
这些传统领域地研究已经相对完善。现在计算机科学的研究,集中在获取和处理有效信息,以使计算机解决特定实际问题。机器学习的快速发展是一个例子。一个当前(2019年)流行雇员种类和研究领域的不完全列表如下:
- 全栈开发
- 人机交互
- 机器各种学习(包括深度学习,优化学习,强化学习)
- 计算机视觉
- 数据科学
- 自动推理
- 游戏开发
- 自然科学对计算机的应用
- 专家系统
- …… 多咨询身边的“大牛”,可以让他们为你指路。
Q:应该对编程语言进行研究吗?
A: 对于程序语言和编程方法的研究非常有用。
- 编程语言是程序员的工具,理解工具的作用原理和设计原则,可以更深入的理解编程语言,并锻炼编程能力。
- 对于编程语言的范式、语用学的学习,可以使编程思维更灵活,编写更易读、易维护的代码。
- 然而,并不建议一般同学太过深入研究编程语言和PLT(编程语言理论)。此领域的理论研究已经相对完善,且对于个人而言, “投入产出比”极其小。
Q:计算机科学有哪些神书?怎么读?
A:被神话的书籍很多,比如《计算机程序的构造和解释》(SICP),《深入理解计算机系统》(CSAPP)等。这些书都是名校基础入门教材,并不值得花太多时间研读透彻,而应该主动寻找更深刻的课题。要通过读书提升能力,不是用尽全力把一本书理解到100%,而是在把一本书理解到60%的时候,看一本更深奥的书,并紧密配合实操。这样当你回过头来看第一本书时,对其问题的理解就非常自然轻松了。
Q:实践重要吗?如何实践?
A:实践极其重要,理论知识也很重要,二者相辅相成。实践需要花费很多精力:
- **保持编程和思考的习惯。**可以在LeetCode上刷题热手,也可以寻找开源项目贡献代码。
- 接触新领域,多写“玩具程序”。
- 有一定水平之后可以寻找合适自己的项目加入。 应该避免:
- 单纯地学习新框架、使用新工具,而不涉及理论补充。
- 学而不练。
- “死学”一门,追求“精通”,特别是基础的内容。
Q: 逻辑思维重要吗?
A: 逻辑思维对于初级程序员来说有一定锻炼思维的作用。但是如果工作内容涉及到数理逻辑,那么所谓的逻辑思维就太简单、太非形式化了。逻辑思维和逻辑学是完全不同领域的两个概念。
Q: 数理逻辑?
A: 数理逻辑是和理论计算机科学紧密相连的一科,基础的数理逻辑已由《离散数学及其应用》囊括。数理逻辑主要分支有证明论,模型论,公理化集合论和递归论,其中证明论和递归论与计算机科学的研究相关较密切。然而,不想从事编程语言、自动推理等领域研究的同学们,对此不必太过看重。
- 找到错误!找到更好的资源!好的建议!邮箱:akiritsu@outlook.com;QQ群:296867034,性感群主,在线女装。
- Github加星。
- 转载,帮助更多的初学者,也请注明出处(本网站不定期更新)。
本指南是个人一时兴起所为,如果能对大家有一些帮助就很开心了~如果有建议、新的想法,或者找到了本网站的漏误,欢迎发邮件哦(akiritsu@outlook.com)。本站一部分内容参考了Quora,知乎,teachyourselfcs.com,如有侵权立即删除。