简介
这里收集了很多学习资源,都是关于一些适合本科生学习的计算机科学“话题(Topics)”。这里仅仅只提供“话题”列表,而不会提供诸如知识点剖析、练习题等内容。如果你对某一个话题特别感兴趣,想深入研究一下,但又买不起文中提到的书籍(实体书),那你可以尝试通过 LibGen(http://gen.lib.rus.ec/) 这个网站来搜索有关的文章或书籍。如果你想要一个比本文更详细一点的浓缩版本计算机科学介绍,那可以看看 Great Theoretical Ideas in Computer Science 系列文章,在这里可以找到你感兴趣的话题。因为每一部分的学习资源都包含了必要的背景介绍,所以如果没有看第二章——预热的话,也没关系。
学习策略
根据牛顿用以自学几何学的迭代学习法:
当他看懂了前两三页,他从头重新开始并继续多看三四页,发现懂的更多了,直到碰到其他令他感到困难的课题为止,弄懂这个难题后,他继续重新开始并且越读越多他懂的也越多,就这样循环往复直到他能够精通于所有书上的知识而不需要任何人的启发和指导
我在理解一场讲座时会遵循这样的章法:看完一场讲座或者读一篇文章,然后做实验,然后自己动手写笔记,然后假装在课堂上向学生讲解自己笔记的内容,讲解时用最少量的专业术语,如此,直到我能完全理解这个章节或讲座。这种学习方法叫做费曼学习法,在这个网站(http://www.calnewport.com/)上详细解释了何为费曼学习法。这个网站有很多营销学的知识,还有很多关于学习的奇闻异事,比如 如何在离散几何课上取得好成绩。除此以外,网上还有很多其他关于学习方法的建议,比如 如何做学习计划并付诸实践。
预热
关于“计算”的简介
命令行是如何工作的?如何搭建网络?基础防火墙是什么?包管理工作是如何进行的?
- (Slides) CS 2043 Unix Tools & Scripting 这个PPT中介绍了emacs、vim一类的编辑器
- The Unix Programming Environment 这本书介绍了Awk\Grep\Sed以及Bash脚本
- 这本书 更加清楚的解释了现代计算机硬件、软件以及交互网络的基础概念
关于“编程”的简介
- Programming and Programming Languages 布朗大学的教科书,介绍了编程基础概念并分析了编程语言
- How to Design Programs 同上一本书的作者,并且是一个在线教育项目Bootstrap(不是那个前端框架Bootstrap)的一部分
译者注:这本书中用的示范编程语言是Pyret,一门在风格上和Python很像,而且是专门用于教编程语言的编程语言
其他内容
Common Lisp(Lisp编程语言的一门方言,适用于人工智能领域)
本文列出的所有课程,至少在理论上,都可以用Common Lisp去实践一遍,比如当你学完了 15-213 计算机系统之后打造一个你自己的domain-specific machine code,或者玩转一下基于Common Lisp的函数式数据结构,或者写一个自己的模式匹配器(编译器的一部分?),或者模拟一台图灵机,等等。当然你也可以用课程里推荐的编程语言与工具,但是用Lisp语言做一些属于自己的原型玩具,可以加深你对知识的理解。另外,CommonLisp有一个特点是,即使它的三方库已经超过20年没有更新过了,依然可以正常使用...
- (Book) Common Lisp - A Gentle Introduction to Symbolic Computation 这本书假设读者毫无编程基础,引导读者用纸和笔一步一步的学习编程
- Road to Common Lisp 也是介绍CommonLisp,但是示例内容比较新,全是基于2017年的开发规范
- Paradigms of Artificial Intelligence Programming 循序渐进教你学Lisp
- On Lisp
Little Schemer Series(一系列经典教材,学好Lisp很重要)
- The Little Schemer 教你搞懂递归
- The Seasoned Schemer 教你搞懂高阶函数
- The Little MLer 教你加深对递归思想的理解
卡耐基梅隆大学的Python课程
- (Full Course) 15-112 Fundamentals of Programming and Computer Science 2019年春季推出的课程,按周教学,每一节在油管上都有对应的视频讲解,而且每一节都有课后作业(Python完成)
- 介绍如何撰写好的代码提交备注 (???)
假设你有数学专业背景
函数式编程
函数式编程的原则(卡耐基梅隆大学的课程)
- (Lecture Notes) 15-150 Principles of Functional Programming
- Daniel R.Licata教授给这门课程做的笔记
- Programming in Standard ML 课程中的一部分
使用OCaml编程
- 康奈尔大学的OCaml课程
- Data Structures and Functional Programming 康奈尔大学 2018年春季的课程,正如其名,既讲了数据结构也讲了函数式编程
代数
线性代数
- Wildberger Liner Algebra 一个学习线性代数的油管教学视频
- (Full Course) CS053 - Coding the Matrix 布朗大学的线性代数课程
- Linear Algebra - As an Introduction to Abstract Mathematics 有很多练习题的线性代数免费在线课程
译者补充
网上公认的讲授线性代数最好的教授 网易云课堂-线性代数 by Prof. Gilbert Strang from MIT
原视频来自油管,不过网易云课堂出了整理翻译版本,适合国人学习
感谢Gilbert教授,让我这样的数学渣渣也能理解线性代数
抽象代数
- Wildberger Abstract Algebra 一个学习抽象代数的油管教学视频
- (Full Course) Math-371 Abstract Algebra 宾夕法尼亚大学的抽象代数课程
- Abstract Algebra Open Learning Course 哈佛大学的抽象代数课程
离散数学
理论数学
- (Book) An Infinite Descent into Pure Mathematics 收集了卡耐基梅隆大学的讲座笔记,这个课程时离散数学、理论数学的基础!
- 康奈尔大学2019年春季的数学课程
用StandardML学离散数学
计算机科学领域的伟大Ideas
- (Full Course) 15-251 Great Theoretical Ideas in Computer Science 卡耐基梅隆大学的课程,是一门大杂烩课程,包含了很多重要的数学概念,但是要先学完前面提到的理论数学的课程
计算机系统与架构
计算机科学不仅仅是关于计算机,你之所以认为计算机科学就是关于计算机的科学,是因为你在计算机科学的诸多领域中都刚刚起步,而且无法完全理解其中的各种概念、思维、知识点。
这一部分从一个程序员的视角去学习计算机架构,比如,如何写缓存友好的代码,如何为x86-64架构做优化,用汇编语言写循环,搞清楚递归在最底层是如何运行的,学习机器指令,了解编译器如何工作,return oriented programming (ROP) to bypass stack protections,内存层级,网络,等等。在这部分,你可以简单了解C语言编程这本书,不过这部分课程会从汇编语言的层级去阐述指针(这句不会翻译了。。)。
- (Full Course) 15-213 Intro to Computer Systems (CMU) 卡耐基梅隆大学的计算机系统课程,这个课程包罗万象,从计算机原理、计算机系统、数据库、计算机网络等,都有涉及
- The labs (Data Lab, Bomb Lab ect) are on the book website 课程配套的在线实验课程
设计系统(Designing Systems)
- (Book) MMIXware: a RISC computer for the third millennium - Donald E Knuth 非常老的一本书,阐述了如何设计一个计算机系统架构
分析系统(Analyzing Systems)
网络
计算、经济、社会学的世界是如何连接在一起的?
- (Book) Networks, Crowds and Markets - Kleinberg & Easley 这本书是基于我们在康奈尔大学教授的跨学科课程,讲的不仅仅是计算机网络,而是广义的网络概念,除了信息技术,还涉及经济学、市场学、社会学等等。
计算机网络
- (Book) Computer Networks: A Systems Approach - Larry Peterson and Bruce Davie 在上文提到的15-213课程(计算机系统)中介绍了计算机网络和Socket编程,这本书详细解释了网络架构设计的底层原理
- 15-744: Computer Networks Syllabus 卡梅隆大学的计算机网络课程,里面有很多PPT和PDF可以看
编译器(Compilers)
- (Full Course) CSE 131: Compilers 加州大学圣地亚哥分校的编译原理课程
- 卡耐基梅隆大学的编译器课程(一)
- 卡耐基梅隆大学的编译器课程(二)
- 一个讲如何搭建虚拟机的视频讲座
数据库系统
- 一位教授在2015年写的关于数据库技术未来发展的讲座
- (Full Course) 15-445 Database Systems (CMU) 卡耐基梅隆大学的数据库系统课程
- 15-445/645 Intro to Database Systems (Fall 2017) 油管上与上面课程对应的数据库系统讲解视频,一共25个视频
- (Book) DatabaseSystem Concepts 一本经典教材,但是最好在学完前面提到的15-213课程后再看
- (Full Course) 15-721 Database Systems (CMU) 进阶课程,基于Peloton自己动手打造一个数据库系统
数据科学实践
- (Full Course) 15-388 Practical Data Science 卡耐基梅隆大学(额 好像不是)的课程,很有用的一门课,全面讲述了数据科学领域需要用到的各种技术,包括数据收集与处理、数据可视化与展示、通过深度学习构建静态模型、大数据等等
- Computational and Inferential Thinking 康奈尔大学的课程,同样是全面讲解数据科学技术,用的示例开发语言是Python,用到了jupyter notebooks
- (Book) Foundations of Data Science 康奈尔大学的教材
元语言概念(Meta-Linguistic Abstraction)
In computer science, metalinguistic abstraction is the process of solving complex problems by creating a new language or vocabulary to better understand the problem space. It is a recurring theme in the MIT textbook, the Structure and Interpretation of Computer Programs, which uses Scheme as a framework for constructing new languages.【来自wiki的解释】
- 简单说就是为了解决一个特定领域的复杂问题,发明一种新的语言或者词汇表。源于麻省理工的一门开创性课程——(Full Course) 6.037 Structure and Interpretation of Computer Programs
- 1985年MIT的教授给HP员工上这门课时的全部录像
- 如果对Lisp这门语言感兴趣,可以看看Norvig的一本关于人工智能的书(github)
自然语言处理(NLP)
- 11-411 Natural Language Processing 卡耐基梅隆大学的NLP课程
- 11-411课程对应的视频讲解
- sci-hub 一个论文搜索引擎,上面可以直接搜索NLP有关的文献资料
- 一些和NLP算法有关的笔记,也是卡耐基梅隆大学的
编程语言理论
- 一篇文章讲解为什么要学习编程语言
- (Book) Practical Foundations for Programming Languages - Robert Harper(已失效)卡耐基梅隆大学的教材
- Oregon Programming Languages Summer School 一些和上面那本书有关的讲座
软件质量保证
- (Lecture Notes) 15-316 Software Foundations of Security and Privacy CMU的讲座笔记,将软件安全、隐私、测试等
- (Book) Verified Functional Algorithms Andrew Appel 写的书
- 上面那本书的作者的讲座记录
- (Full Course) 15-424 Foundations of Cyber-Physical Systems
算法
串行与并行算法简介
这里讲的不是传统的数据结构与算法,而是专注讲解并行与串行机制,如何用基于开发语言的分析模型去评估一些抽象问题的复杂度,比如垃圾回收。
高级算法
- (Full Course) CS224 Advanced Algorithms 哈佛大学的高级算法课程
- Purely Functional Data Structures 和上面课程相关的书
- Functional Data Structures 加拿大滑铁卢大学的教材,里面的练习题是用OCaml语言做的
译者补充
神童教授Prof. Erik Demaine from MIT的算法导论课程(油管)
复杂度理论
本科生阶段的复杂度理论课程
研究生阶段的复杂度理论课程
- (Full Course) 15-855 Graduate Computational Complexity Theory CMU的课程
- 上面课程的讲座视频
- Computational Complexity: A Modern Approach 剑桥大学的教材
量子计算简介(研究生阶段课程)
- (Full Course) 15-859BB: Quantum Computation CMU的课程,学习这个课程之前需要先学习完复杂度理论、线性代数、离散概率论等课程
- 上面课程的讲解视频
一大堆贴近实战的专业笔记(或书籍)
研究生研究课题:类型理论(Type Theory)
研究生研究课题:机器学习与人工智能
- (Full Course) 15-780 Graduate Introduction to AI CMU在2019年春季的研究生人工智能课程
- CMU: Spring 2017: 15-780 Graduate Artificial Intelligence CMU在2017年的研究生人工智能课程视频
- 15-780 Graduate Artificial Intelligence | CMU 研究生人工智能课程视频
- 一系列MIT的人工智能讲座视频
- 2017年的一套研究生课程,专注回顾一些往年论文中未解决的AI难题或者观点
- Artificial Intelligence MIT在2010年面向本科生的AI课程
深度学习
- CMU在2016年关于并行GPU编程训练的课程视频、讲座
- (Full Course) 11-785 Introduction to Deep Learning CMU在2017年秋季的课程,介绍深度学习
- CMU 11-785 spring 2018 CMU在2018年春季的课程,介绍深度学习
- 18-739: Security and Fairness of Deep Learning CMU在2019年春季的课程,介绍深度学习的安全与公正
译者补充
吴教授的机器学习课程 网易云课堂-斯坦福公开课:机器学习,斯坦福的公开课课程主页上有更加详细的笔记、讲义等资料
台大李宏毅的深度学习课程,B站-李宏毅深度学习
大数据
- (Full Course) CS229r Algorithms for Big Data 哈佛大学的大数据算法课程,这个课程的首页还介绍了非常多的其他大学的往年的大数据课程
- Principles of Large-Scale Machine Learning 大规模机器学习 康奈尔大学在2019年春季的课程
- https://www.textbook.ds100.org/ 加州大学伯克利分校的本科生入门教材,全英文,介绍数据科学原理,内容较简单,需要统计学和 Python 基础