一个仅供参考的 CS 学习规划
计算机领域方向庞杂,建议先建立整体知识框架,再按基础与目标选择课程。以下规划仅供参考。
不过,在开始学习之前,先向小白们强烈推荐一个科普向系列视频 Crash Course: Computer Science,在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面:计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正如它的口号所说的 Computers are not magic!,希望看完这个视频之后,大家能对计算机科学有个全貌性地感知,从而怀着兴趣去面对下面浩如烟海的更为细致且深入的学习内容。
必学工具
俗话说:磨刀不误砍柴工。如果你是一个刚刚接触计算机的24k纯小白,学会一些工具将会让你事半功倍。
学会提问:先独立尝试解决问题,查阅文档并整理复现步骤,再向社区清楚地说明问题与已有尝试。可参考提问的智慧。
MIT-Missing-Semester 这门课覆盖了这些工具中绝大部分,而且有相当详细的使用指导,强烈建议小白学习。不过需要注意的一点是,在课程中会不时提到一些与开发流程相关的术语。因此推荐至少在学完计算机导论级别的课程之后进行学习。
翻墙:由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 99% 的问题。因此,学会翻墙几乎是一个内地 CSer 的必备技能。(考虑到法律问题,这个文档提供的翻墙方式仅对拥有北大邮箱的用户适用)。
命令行:熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程,它源于 Quora 的一个提问,但在各路大神的贡献努力下已经成为了一个 GitHub 十万 stars 的顶流项目,被翻译成了十几种语言。教程不长,非常建议大家反复通读,在实践中内化吸收。同时,掌握 Shell 脚本编程也是一项不容忽视的技术,可以参考这个教程。
IDE (Integrated Development Environment):集成开发环境。轻量编辑可使用 VS Code 或 Sublime,大型项目可根据语言与需求选择 PyCharm、IDEA 等工具。
Vim:命令行编辑工具,学习曲线较陡;多数 IDE 也支持 Vim 插件,可用于提高键盘操作效率。
Emacs:与 Vim 齐名的经典编辑器,同样具有极高的开发效率,同时具有更为强大的扩展性,它既可以配置为一个轻量编辑器,也可以扩展成一个个人定制的 IDE,甚至可以有更多奇技淫巧。
Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的童鞋必须掌握的神器之一。
GitHub:基于 Git 的代码托管平台。全世界最大的代码开源社区,大佬集聚地。
GNU Make:一款工程构建工具。善用 GNU Make 会让你养成代码模块化的习惯,同时也能让你熟悉一些大型工程的编译链接流程。
CMake:一款功能比 GNU Make 更为强大的构建工具,建议掌握 GNU Make 之后再加以学习。
LaTeX:逼格提升 论文排版工具。
Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。
实用工具箱:下载工具、设计工具和学习网站等资源。
Thesis:毕业论文 Word 写作教程。
好书推荐
环境配置
你以为的开发 —— 在 IDE 里疯狂码代码数小时。
实际上的开发 —— 配环境配几天还没开始写代码。
PC 端环境配置
如果你是 Mac 用户,那么你很幸运,这份指南 将会手把手地带你搭建起整套开发环境。如果你是 Windows 用户,在开源社区的努力下,你同样可以获得与其他平台类似的体验:Scoop。
另外大家可以参考一份灵感来自 6.NULL MIT-Missing-Semester 的 环境配置指南,重点在于终端的美化配置。此外还包括常用软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及一些 IDE 的配置与激活教程。
服务器端环境配置
服务器端的运维需要掌握 Linux(或者其他类 Unix 系统)的基本使用以及进程、设备、网络等系统相关的基本概念,小白可以参考中国科学技术大学 Linux 用户协会编写的《Linux 101》在线讲义。如果想深入学习系统运维相关的知识,可以参考 Aspects of System Administration 这门课程。
另外,如果需要学习某个具体的概念或工具,推荐一个非常不错的 GitHub 项目 DevOps-Guide,其中涵盖了非常多的运维方面的基础知识和教程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。
课程地图
以下路线仅供参考,请按个人基础与兴趣定制属于自己的课程地图。
以下课程类别中除了含有 基础 和 入门 字眼的以外,并无明确的先后次序,大家只要满足某个课程的先修要求,完全可以根据自己的需要和喜好选择想要学习的课程。
数学基础
微积分与线性代数
微积分和线性代数是重要基础。可参考 MIT 的 Calculus Course 和 18.06: Linear Algebra,结合 3Blue1Brown 的动画建立直观理解。
信息论入门
MIT 6.050J: Information theory and Entropy 面向低年级学生,几乎没有先修要求,涵盖编码、压缩、通信与信息熵。
数学进阶
离散数学与概率论
集合论、图论和概率论是算法推导与证明的重要工具,也是高阶数学课程的基础。学习时可结合算法实例,理解理论的用途。
UCB CS70 : discrete Math and probability theory 和 UCB CS126 : Probability theory 是 UC Berkeley 的概率论课程,前者覆盖了离散数学和概率论基础,后者则涉及随机过程以及深入的理论内容。两者都非常注重理论和实践的结合,有丰富的算法实际运用实例,后者还有大量的 Python 编程作业来让学生运用概率论的知识解决实际问题。
数值分析
作为计算机系的学生,培养计算思维是很重要的,实际问题的建模、离散化,计算机的模拟、分析,是一项很重要的能力。而这两年开始风靡的,由 MIT 打造的 Julia 编程语言以其 C 一样的速度和 Python 一样友好的语法在数值计算领域有一统天下之势,MIT 的许多数学课程也开始用 Julia 作为教学工具,把艰深的数学理论用直观清晰的代码展示出来。
ComputationalThinking 是 MIT 的计算思维入门课,利用 Julia 在图像处理、社会科学与数据科学、气候学建模等主题中介绍算法、数学建模、数据分析与交互设计。
上完上面的体验课之后,如果意犹未尽的话,不妨试试 MIT 的 18.330 : Introduction to numerical analysis,这门课的编程作业同样会用 Julia 编程语言,不过难度和深度上都上了一个台阶。内容涉及了浮点编码、Root finding、线性系统、微分方程等等方面,整门课的主旨就是让你利用离散化的计算机表示去估计和逼近一个数学上连续的概念。这门课的教授还专门撰写了一本配套的开源教材 Fundamentals of Numerical Computation,里面附有丰富的 Julia 代码实例和严谨的公式推导。
如果你还意犹未尽的话,还有 MIT 的数值分析研究生课程 18.335: Introduction to numerical method 供你参考。
微分方程
微分方程提供了描述动态变化与建模的方法,可作为数学方向的拓展内容。
由于微分方程中往往会用到很多复变函数的知识,所以大家可以参考 MIT18.04: Complex variables functions 的课程 notes 来补齐先修知识。
MIT18.03: differential equations 主要覆盖了常微分方程的求解,在此基础之上 MIT18.152: Partial differential equations 则会深入偏微分方程的建模与求解。掌握了微分方程这一有力工具,相信对于你的实际问题的建模能力以及从众多噪声变量中把握本质的直觉都会有很大帮助。
数学高阶
以下数学进阶课程面向高年级本科生或研究生,可按兴趣和需要选择。
凸优化
Standford EE364A: Convex Optimization
信息论
应用统计学
MIT18.650: Statistics for Applications
初等数论
密码学
编程入门
Languages are tools, you choose the right tool to do the right thing. Since there’s no universally perfect tool, there’s no universally perfect language.
General
Java
Python
- CS50P: CS50’s Introduction to Programming with Python
- UCB CS61A: Structure and Interpretation of Computer Programs
- MIT6.100L: Introduction to CS and Programming using Python
C++
Rust
OCaml
电子基础
电路基础
作为计算机系的学生,了解一些基础的电路知识,感受从传感器收集数据到数据分析再到算法预测整条流水线,对于后续知识的学习以及计算思维的培养还是很有帮助的。EE16A&B: Designing Information Devices and Systems I&II 是伯克利 EE 学生的大一入门课,其中 EE16A 注重通过电路从实际环境中收集和分析数据,而 EE16B 则侧重从这些收集到的数据进行分析并做出预测行为。
信号与系统
信号与系统通过傅里叶变换等工具研究和描述信号,为后续相关领域提供数学基础。
MIT 6.003: signal and systems 提供了全部的课程录影、书面作业以及答案。也可以去看这门课的远古版本
而 UCB EE120: Signal and Systems 关于傅立叶变换的 notes 写得非常好,并且提供了6 个非常有趣的 Python 编程作业,让你实践中运用信号与系统的理论与算法。
数据结构与算法
算法是计算机科学的核心。学习重点是将实际问题抽象为算法问题,并在时间与空间限制下选择数据结构求解。可参考 UCB CS61B 和 Coursera: Algorithms I & II,结合编程实验学习。
以上两门课程都是基于 Java 语言,如果你想学习 C/C++ 描述的版本,可以参考斯坦福的数据结构与基础算法课程 Stanford CS106B/X: Programming Abstractions。偏好 Python 的同学可以学习 MIT 的算法入门课 MIT 6.006: Introduction to Algorithms
对一些更高级的算法以及 NP 问题感兴趣的同学可以学习伯克利的算法设计与分析课程 UCB CS170: Efficient Algorithms and Intractable Problems 或者 MIT 的高阶算法 MIT 6.046: Design and Analysis of Algorithms。
软件工程
入门课
MIT 6.031: Software Construction 通过阅读材料与编程练习介绍如何编写不易出错、简明易懂、易于维护修改的代码,包括数据结构设计、规格说明、测试与代码注释。
专业课
UCB CS169: software engineering 侧重敏捷开发(Agile Development)和软件即服务(Software as a Service),可用于系统学习团队软件开发。
体系结构
入门课
Coursera: Nand2Tetris 从逻辑门开始搭建计算机,涵盖数字电路、体系结构、汇编、虚拟机与编译器,并最终运行俄罗斯方块。课程通过简化现代计算机的复杂细节,帮助初学者建立整体理解。
专业课
当然,如果想深入现代计算机体系结构的复杂细节,还得上一门大学本科难度的课程 UCB CS61C: Great Ideas in Computer Architecture。UC Berkeley 作为 RISC-V 架构的发源地,在体系结构领域算得上首屈一指。其课程非常注重实践,你会在 Project 中手写汇编构造神经网络,从零开始搭建一个 CPU,这些实践都会让你对计算机体系结构有更为深入的理解,而不是仅停留于“取指译码执行访存写回”的单调背诵里。
系统入门
学习计算机系统时,可先建立各领域的整体概念,理解通用设计原则,再深入具体实现。
MIT6.033: System Engineering 是 MIT 的系统入门课,主题涉及了操作系统、网络、分布式和系统安全,除了知识点的传授外,这门课还会讲授一些写作和表达上的技巧,让你学会如何设计并向别人介绍和分析自己的系统。这本书配套的教材 Principles of Computer System Design: An Introduction 也写得非常好,推荐大家阅读。
CMU 15-213: Introduction to Computer System 是 CMU 的系统入门课,内容覆盖了体系结构、操作系统、链接、并行、网络等等,兼具广度和深度,配套的教材 Computer Systems: A Programmer’s Perspective 也是质量极高,强烈建议阅读。
操作系统
没有什么能比自己写个内核更能加深对操作系统的理解了。
操作系统通过抽象底层硬件为应用提供服务。以下课程侧重点与实验设计不同,可按需要选择。
MIT 6.1810 (原 6.S081): Operating System Engineering:通过 11 个 Project,为类 Unix 教学操作系统 xv6 增加功能模块。
UCB CS162: Operating System:采用教学操作系统 Pintos 作为 Project。相关中文实验资料可参考北京大学操作系统实验课程网站。
NJU: Operating System Design and Implementation,南京大学的蒋炎岩老师开设的操作系统课程。蒋老师以其独到的系统视角结合丰富的代码示例将众多操作系统的概念讲得深入浅出,此外这门课的全部课程内容都是中文的,非常方便大家学习。
HIT OS: Operating System,哈尔滨工业大学的李治军老师开设的中文操作系统课程。李老师的课程基于 Linux 0.11 源码,十分注重代码实践,并站在学生视角将操作系统的来龙去脉娓娓道来。
并行与分布式系统
想必这两年各类 CS 讲座里最常听到的话就是“摩尔定律正在走向终结”,此话不假,当单核能力达到上限时,多核乃至众核架构如日中天。硬件的变化带来的是上层编程逻辑的适应与改变,要想充分利用硬件性能,编写并行程序几乎成了程序员的必备技能。与此同时,深度学习的兴起对计算机算力与存储的要求都达到了前所未有的高度,大规模集群的部署和优化也成为热门技术话题。
并行计算
CMU 15-418/Stanford CS149: Parallel Computing 会带你深入理解现代并行计算架构的设计原则与必要权衡,并学会如何充分利用硬件资源以及软件编程框架(例如 CUDA,MPI,OpenMP 等)编写高性能的并行程序。
分布式系统
MIT 6.5840 (原 6.824): Distributed System 和 MIT 6.S081 一样,出品自 MIT 大名鼎鼎的 PDOS 实验室,授课老师 Robert Morris 教授曾是一位顶尖黑客,世界上第一个蠕虫病毒 Morris 病毒就是出自他之手。这门课每节课都会精读一篇分布式系统领域的经典论文,并由此传授分布式系统设计与实现的重要原则和关键技术。同时其课程 Project 也是以难度之大而闻名遐迩,5 个编程作业循序渐进带你实现一个基于 Raft 共识算法的 KV-store 框架,让你在痛苦的 debug 中体会并行与分布式带来的随机性和复杂性。
系统安全
不知道你当年选择计算机是不是因为怀着一个中二的黑客梦想,但现实却是成为黑客道阻且长。
理论课程
UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、网站安全、网络安全等等内容。
SU SEED Labs 是雪城大学的网安课程,由 NSF 提供130万美元的资金支持,为网安教育开发了动手实践性的实验练习(称为 SEED Lab)。课程理论教学和动手实践并重,包含详细的开源讲义、视频教程、教科书(被印刷为多种语言)、开箱即用的基于虚拟机和 docker 的攻防环境等。目前全球有1050家研究机构在使用该项目。涵盖计算机和信息安全领域的广泛主题,包括软件安全、网络安全、Web 安全、操作系统安全和移动应用安全。
CTF 实践
可通过 CTF 夺旗赛 练习系统安全知识,也可参考北京大学相关赛事。下面是相关学习资源:
计算机网络
没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了。
大名鼎鼎的 Stanford CS144: Computer Network,8 个 Project 带你实现整个 TCP/IP 协议栈。
如果你只是想在理论上对计算机网络有所了解,那么推荐阅读 UCB CS168 这门课程配套的教材。
数据库系统
没有什么能比自己写个关系型数据库更能加深对数据库系统的理解了。
CMU 的著名数据库神课 CMU 15-445: Introduction to Database System 会通过 4 个 Project 带你为一个用于教学的关系型数据库 bustub 添加各种功能。实验的评测框架也免费开源了,非常适合大家自学。此外课程实验会用到 C++11 的众多新特性,也是一个锻炼 C++ 代码能力的好机会。
Berkeley 作为著名开源数据库 postgres 的发源地也不遑多让,UCB CS186: Introduction to Database System 会让你用 Java 语言实现一个支持 SQL 并发查询、B+ 树索引和故障恢复的关系型数据库。
编译原理
没有什么能比自己写个编译器更能加深对编译器的理解了。
理论学习推荐阅读大名鼎鼎的《龙书》。当然动手实践才是掌握编译原理最好的方式,推荐北京大学编译原理实践课程,丰富的实验配套和循序渐进的文档带你实现一个类C语言到 RISC-V 汇编的编译器。当然编译原理课程目录下也有众多其他优质实验供你选择。
Web 开发
前后端开发很少在计算机的培养方案里被重视,但其实掌握这项技能还是好处多多的,例如搭建自己的个人主页,抑或是给自己的课程项目做一个精彩的展示网页。如果你只是想两周速成,那么推荐 MIT web development course。如果想系统学习,推荐 Stanford CS142: Web Applications。
计算机图形学
计算机图形学方向可参考以下课程:
数据科学
其实数据科学和机器学习与深度学习有着很紧密的联系,但可能更侧重于实践。Berkeley 的 UCB Data100: Principles and Techniques of Data Science 通过丰富的编程练习让你在实践中掌握各类数据分析工具和算法,并带领你体验从海量的数据集中提取出想要的结果,并对未来的数据或用户的行为做出相应的预测。但这只是一门基础课,如果想学习工业级别的数据挖掘与分析技术,可以尝试 Stanford 的大数据挖掘课程 CS246: Mining Massive Data Sets。
人工智能
近十年人工智能应该算是计算机界最火爆的领域。如果你不满足于整日听各路媒体争相报道人工智能相关的进展,而想真正一探究竟,那么非常推荐学习 Harvard 神课 CS50 系列的人工智能课程 Harvard CS50: Introduction to AI with Python。课程短小精悍,覆盖了传统人工智能领域的几大分支,并配有丰富有趣的 Python 编程练习来巩固你对人工智能算法的理解。美中不足的是这门课因为面向在线自学者的缘故内容较为精简,并且不会涉及特别深入的数学理论,如果想要系统深入地学习还需要一门本科生难度的课程,例如 Berkeley 的 UCB CS188: Introduction to Artificial Intelligence。这门课的 Project 复刻了经典游戏糖豆人,让你运用人工智能算法玩游戏,非常有趣。
机器学习
机器学习领域近些年最重要的进展就是发展出了基于神经网络的深度学习分支,但其实很多基于统计学习的算法依然在数据分析领域有着广泛的应用。如果你之前从未接触过机器学习的相关知识,而且不想一开始就陷入艰深晦涩的数学证明,那么不妨先从 Andrew Ng (吴恩达)的 Coursera: Machine Learning 学起。这门课在机器学习领域基本无人不晓,吴恩达以其深厚的理论功底和出色的表达能力把很多艰深的算法讲得深入浅出,并且非常实用。其配套的作业也是质量相当上乘,可以帮助你快速入门。
但上过这门课只能让你从宏观上对机器学习这一领域有一定了解,如果想真正理解那些“神奇”算法背后的数学原理甚至从事相关领域的科研工作,那么还需要一门更“数学”的课程,例如 Stanford CS229: Machine Learning 或者 UCB CS189: Introduction to Machine Learning。
当然,如果你之后致力于从事机器学习理论相关的科学研究,那么可以参考 Yao Fu 分享的进阶学习路线学习一些更深入的研究生难度的课程。
深度学习
前几年 AlphaGo 的大热让深度学习进入了大众的视野,不少大学专门成立了相关专业。很多计算机的其他领域也会借助深度学习的技术来做研究,因此基本不管你干啥多少都会接触到一些神经网络、深度学习相关的技术需求。如果想快速入门,同样推荐 Andrew Ng (吴恩达)的 Coursera: Deep Learning,质量无需多言,Coursera 上罕见的满分课程。此外如果你觉得英文课程学习起来有难度,推荐李宏毅老师的 国立台湾大学:机器学习 课程。这门课打着机器学习的名号,却囊括了深度学习领域的几乎所有方向,非常全面,很适合你从宏观上对这个领域有一个大致的了解。而且老师本人也非常幽默,课堂金句频出。
当然因为深度学习领域发展非常迅速,已经拥有了众多研究分支,如果想要进一步深入,可以按需学习下面罗列的代表课程:
如果你想系统打牢基础,可以优先看 CMU 11-785:这门课风格非常扎实,内容一点不水,作业也能很好地锻炼训练与调参能力;MIT 6.7960 的覆盖面更广,除了主流 LLM 路线之外也兼顾 CV 等方向,作业和项目对自学者也比较友好;NYU DLSP21 的亮点则是 Yann LeCun 亲自授课,对很多人来说这是非常难得的公开系统课程资源。
综合与基础
CMU 11-785: Introduction to Deep Learning
NYU DLSP21: NYU Deep Learning Spring 2021
计算机视觉
UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision
Stanford CS231n: CNN for Visual Recognition
自然语言处理
Stanford CS224n: Natural Language Processing
图神经网络
Stanford CS224w: Machine Learning with Graphs
强化学习
UCB CS285: Deep Reinforcement Learning
深度学习系统
随着深度学习模型的重要性和资源需求越来越大,针对其训练和推理相关的底层系统优化也越发重要。如果想入门这个领域,推荐 CMU 10-414/714: Deep Learning Systems,内容覆盖了深度学习系统“全栈”的知识体系。从现代深度学习系统框架的顶层设计,到自微分算法的原理和实现,再到底层硬件加速和实际生产部署。为了更好地掌握理论知识,学生将会在课程作业中从头开始设计和实现一个完整的深度学习库 Needle,使其能对计算图进行自动微分,能在 GPU 上实现硬件加速,并且支持各类损失函数、数据加载器和优化器。在此基础上,学生将实现几类常见的神经网络,包括 CNN,RNN,LSTM,Transformer 等等。有一定基础后,还可以学习 Song Han 老师开设的 MIT6.5940: TinyML and Efficient Deep Learning Computing 课程,了解让神经网络轻量化的各种关键技术,例如剪枝、量化、蒸馏、网络架构搜索等等。此外,课程中还会涉及很多更前沿的深度学习模型例如大语言模型相关的系统优化。
深度生成模型
大语言模型方向可参考学习路线。
定制属于你的课程地图
授人以鱼不如授人以渔。
可根据基础、兴趣与目标调整课程选择,以下资源可用于定制学习地图。
- MIT OpenCourseWare: 麻省理工学院的课程资源开放共享项目,收录了数以千计的各科课程资源,其中计算机类的课号是 6.xxx。
- MIT CS Course List: 麻省理工学院的 CS 课程列表。
- UC Berkeley EECS Course Map: UC Berkeley 的 EECS 培养方案,以课程地图的方式将各门课程的类别和先修关系一目了然地呈现,其中绝大多数课程本书中均有收录。
- UC Berkeley CS Course List: UC Berkeley 的 CS 课程列表。
- Stanford CS Course List: 斯坦福的 CS 课程列表。