骑鹿人的计算机科学自学指南

本指南目的

  • 汇集互联网上的优质免费教材、视频资源
  • 为在读的计算机系学生,编程爱好者提供系统的学习方案
  • 为通过培训班出身和跨领域的IT 相关从业者提供知识进阶路线
  • 帮助在学习计算机科学中感到迷茫的朋友们寻找兴趣领域
  • 破除快餐学习风气和“IT 门槛低”偏见。
  • 学习计算机的硬核小建议。
  • 去繁求简,避免单纯的平行资料堆叠,只选择最好最值得的资源推荐。

基础科目自学材料

  1. 建议直接从编程入门开始,写出可以跑的东西来,有成就感~
  2. 计算机组成,计算机网络,操作系统是三门重要基础哦~
  3. 英语和数学非常重要~如果对英语感到不适,利用英文视频强迫一下自己~
  4. 实践出真知!
类别 科目 教材 视频课程 学习目标
基础必修 编程入门(三选一) 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: 十分重要。学英语不仅仅是因为编程语言的关键字是英文单词,有以下好处:

  1. 学习“概念”和“专业词汇”时,可以顾名思义,加强理解速度。专业词汇的中文翻译大部分都无法直接理解它的意思,如果读书时时间花在了理解词汇上,效率大打折扣。
  2. 中文翻译的外国教材质量较差。这是一客观事实,是因为计算机书籍销路窄,译者对于英文经典教材的翻译几乎是义务的,无法保证翻译质量。
  3. 中国教材普遍质量极差。这些教材大部分是作者根据相关书籍改写来的,知识讲解不清晰,也比较过时。
  4. 便于查阅论文和研究成果,以及学术交流。 所以,骑鹿人建议在全英文环境中学习

Q:数学基础?
A: 因人而异。

  1. 学习编程最低限度的数学基础是:二进制、十六进制计算、指数、对数算术,简单的布尔逻辑、命题逻辑以及数学归纳法,在高中数学中已经基本涵盖了。如果有不清楚的地方,可以阅读《程序员的数学》,初中数学水平即可看懂。
  2. 对于以软件开发者算法工程师为目标进行学习的同学来说,大部分情况下不涉及数学。如果涉及,使用维基百科进行知识补充就够了。
  3. 如果想成为专家、大牛级程序员,或者某领域专家,则很大程度上与数学联系紧密。

Q:如何学习数学?
A: 人生有涯,数学无涯,应避免南辕北辙,丢失学习重点。对计算机科学有兴趣,可以在涉及到数学问题的时候,利用维基百科知识补充(不懂啥搜啥)。一般情况下,不必系统学习(甚至不必学习离散数学、线性代数)。对于数学的历史、数学的证明等,更不需太过重视。一般而言,有以下三门核心基础数学:离散数学,线性代数,概率论与统计学。

Q:如何选择兴趣领域?
A: 在 20 世纪 60 年代,计算机科学研究的重点是程序语言,编译器,操作系统,以及这三方面涉及的数学。70 年代则以算法的研究最为火热。于今的计算机科学研究更重视“应用”。在自然科学中,观察、收集和存储数据最为关键。在商业中,重要的是对数据的“理解”和“掌控”。这些是计算机科学的传统领域
这些传统领域地研究已经相对完善。现在计算机科学的研究,集中在获取和处理有效信息,以使计算机解决特定实际问题。机器学习的快速发展是一个例子。一个当前(2019 年)流行雇员种类和研究领域的不完全集合为:全栈web开发,人机交互,机器各种学习(包括深度学习,优化学习,强化学习),计算机视觉,游戏开发,自然科学对计算机的应用,专家系统,自动定理证明,编程语言理论,分布式系统……
多咨询身边的“大牛”,可以让他们为你指路。

Q:应该对编程语言进行研究吗?
A: 对于程序语言和编程方法的研究非常有用。

  • 编程语言是程序员的工具,理解工具的作用原理和设计原则,可以更深入的理解编程语言,并锻炼编程能力。
  • 对于编程语言的范式、语用学的学习,可以使编程思维更灵活,编写更易读、易维护的代码。
  • 然而,并不建议一般同学太过深入研究编程语言和 PLT(编程语言理论)。此领域的理论研究已经相对完善,且对于个人而言, “投入产出比”极其小。

Q:计算机科学有哪些神书?怎么读?
A:被神话的书籍很多,比如《计算机程序的构造和解释》(SICP),《深入理解计算机系统》(CSAPP)等。这些书都是名校基础入门教材,并不值得花太多时间研读透彻,而应该主动寻找更深刻的课题。要通过读书提升能力,不是用尽全力把一本书理解到 100%,而是在把一本书理解到 60%的时候,看一本更深奥的书,并紧密配合实操。这样当你回过头来看第一本书时,对其问题的理解就非常自然轻松了。

Q:实践重要吗?如何实践?
A:实践极其重要,理论知识也很重要,二者相辅相成。实践需要花费很多精力:

  1. 保持编程和思考的习惯。可以在 LeetCode 上刷题热手,也可以寻找开源项目贡献代码。
  2. 接触新领域,多写“玩具程序”
  3. 有一定水平之后可以寻找合适自己的项目加入。 应该避免:
  4. 单纯地学习新框架、使用新工具,而不涉及理论补充。
  5. 学而不练。
  6. “死学”一门,追求“精通”,特别是基础的内容。

Q: 逻辑思维重要吗?
A: 逻辑思维对于初级程序员来说有一定锻炼思维的作用。但是如果工作内容涉及到数理逻辑,那么所谓的逻辑思维就太简单、太非形式化了。逻辑思维和逻辑学是完全不同领域的两个概念。

Q: 数理逻辑?
A: 数理逻辑是和理论计算机科学紧密相连的一科,基础的数理逻辑已由《离散数学及其应用》囊括。数理逻辑主要分支有证明论,模型论,公理化集合论和递归论,其中证明论和递归论与计算机科学的研究相关较密切。然而,不想从事编程语言、自动推理等领域研究的同学们,对此不必太过看重。

支持本网站

  1. 找到错误!找到更好的资源!好的建议!
  2. 在 Github 上 fork 本网站,添加资源至_post 文件家并 pull request
  3. 转载,帮助更多的初学者,也请注明出处(本网站不定期更新)。

计算机科学免费在线资源列表

标题 更新日期
骑鹿人推荐156本计算机科学书单 Apr 26, 19