Uploaded by chino. lluvia

CS自学指南:计算机科学学习规划与资源

advertisement
CS⾃学指南
CS⾃学指南
前⾔
cs-self-learning
搜索
v1.0.0
⼀个仅供参考的 CS 学习规划
13.6k
⽬录
必学⼯具
如何使⽤这本书
好书推荐
⼀个仅供参考的CS学习规划
计算机领域⽅向庞杂,知识浩如烟海,每个细分领域如果深究下去都可以说学⽆⽌境。因此,⼀
必学⼯具
个清晰明确的学习规划是⾮常重要的。我在多年⾃学的尝试中也⾛过不少弯路,最终提炼出了下
PC 端环境配置
好书推荐
⾯的内容,供⼤家参考。
服务器端环境配置
数学基础
数学进阶
编程⼊⻔
不过,在开始学习之前,先向⼩⽩们强烈推荐⼀个科普向系列视频 Crash Course: Computer
Science,在短短 8 个⼩时⾥⾮常⽣动且全⾯地科普了关于计算机科学的⽅⽅⾯⾯:计算机的历
环境配置
课程地图
数学基础
史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正
微积分与线性代数
电⼦基础
如它的⼝号所说的 Computers are not magic!,希望看完这个视频之后,⼤家能对计算机科学有
信息论⼊⻔
数据结构与算法
个全貌性地感知,从⽽怀着兴趣去⾯对下⾯浩如烟海的更为细致且深⼊的学习内容。
数学进阶
软件⼯程
离散数学与概率论
体系结构
数值分析
操作系统
并⾏与分布式系统
计算机系统安全
计算机⽹络
必学⼯具
微分⽅程
俗话说:磨⼑不误砍柴⼯。如果你是⼀个刚刚接触计算机的24k纯⼩⽩,学会⼀些⼯具将会让
你事半功倍。
数学⾼阶
凸优化
信息论
USTC Computer Networking:A
Top-Down Approach
学会提问:也许你会惊讶,提问也算计算机必备技能吗,还放在第⼀条?我觉得在开源社区中,
应⽤统计学
学会提问是⼀项⾮常重要的能⼒,它包含两⽅⾯的事情。其⼀是会变相地培养你⾃主解决问题的
初等数论
Computer Networking: A TopDown Approach
能⼒,因为从形成问题、描述问题并发布、他⼈回答、最后再到理解回答这个周期是⾮常⻓的,
密码学
如果遇到什么鸡⽑蒜⽪的事情都希望别⼈最好远程桌⾯⼿把⼿帮你完成,那计算机的世界基本与
编程⼊⻔
Stanford CS144: Computer
Network
数据库系统
编译原理
计算机图形学
1.8k
你⽆缘了。其⼆,如果真的经过尝试还⽆法解决,可以借助开源社区的帮助,但这时候如何通过
简洁的⽂字让别⼈瞬间理解你的处境以及⽬的,就显得尤为重要。推荐阅读提问的智慧这篇⽂
章,这不仅能提⾼你解决问题的概率和效率,也能让开源社区⾥⽆偿提供解答的⼈们拥有⼀个好
⼼情。
Shell
Python
C++
Rust
MIT-Missing-Semester 这⻔课覆盖了这些⼯具中绝⼤部分,⽽且有相当详细的使⽤指导,强烈建
议⼩⽩学习。
翻墙:由于⼀些众所周知的原因,⾕歌、GitHub 等⽹站在⼤陆⽆法访问。然⽽很多时候,⾕歌
和 StackOver@ow 可以解决你在开发过程中遇到的 99% 的问题。因此,学会翻墙⼏乎是⼀个内地
CSer 的必备技能。(考虑到法律问题,这个⽂档提供的翻墙⽅式仅对拥有北⼤邮箱的⽤户适
⽤)。
命令⾏:熟练使⽤命令⾏是⼀种常常被忽视,或被认为难以掌握的技能,但实际上,它会极⼤地
提⾼你作为⼯程师的灵活性以及⽣产⼒。命令⾏的艺术是⼀份⾮常经典的教程,它源于 Quora 的
⼀个提问,但在各路⼤神的贡献努⼒下已经成为了⼀个 GitHub ⼗万 stars 的顶流项⽬,被翻译
成了⼗⼏种语⾔。教程不⻓,⾮常建议⼤家反复通读,在实践中内化吸收。同时,掌握 Shell 脚
本编程也是⼀项不容忽视的技术,可以参考这个教程。
IDE (Integrated Development Environment):集成开发环境,说⽩了就是你写代码的地⽅。作为
⼀个码农,IDE 的重要性不⾔⽽喻,但由于很多 IDE 是为⼤型⼯程项⽬设计的,体量较⼤,功能
也过于丰富。其实如今⼀些轻便的⽂本编辑器配合丰富的插件⽣态基本可以满⾜⽇常的轻量编程
需求。个⼈常⽤的编辑器是 VS Code 和 Sublime(前者的插件配置⾮常简单,后者略显复杂但颜
值很⾼)。当然对于⼤型项⽬我还是会采⽤略重型的 IDE,例如 Pycharm (Python),IDEA (Java)
等等(免责申明:所有的 IDE 都是世界上最好的 IDE)。
Vim:⼀款命令⾏编辑⼯具。这是⼀个学习曲线有些陡峭的编辑器,不过学会它我觉得是⾮常有
必要的,因为它将极⼤地提⾼你的开发效率。现在绝⼤多数 IDE 也都⽀持 Vim 插件,让你在享
受现代开发环境的同时保留极客的炫酷(yue)。
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 ⽤户,可以参考这个相对简略的教程。
另外⼤家可以参考⼀份灵感来⾃ 6.NULL MIT-Missing-Semester 的 环境配置指南,重点在于终端
的美化配置。此外还包括常⽤软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及⼀些
IDE 的配置与激活教程。
服务器端环境配置
推荐⼀个⾮常不错的 GitHub 项⽬ DevOps-Guide,其中涵盖了⾮常多的运维⽅⾯的基础知识和教
程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。
课程地图
正如这章开头提到的,这份课程地图仅仅是⼀个仅供参考的课程规划,我作为⼀个临近毕业的
本科⽣。深感⾃⼰没有权利也没有能⼒向别⼈宣扬“应该怎么学”。因此如果你觉得以下的课程
分类与选择有不合理之处,我全盘接受,并深感抱歉。你可以在下⼀节定制属于你的课程地图
以下课程类别中除了含有 基础 和 ⼊⻔ 字眼的以外,并⽆明确的先后次序,⼤家只要满⾜某个课
程的先修要求,完全可以根据⾃⼰的需要和喜好选择想要学习的课程。
数学基础
微积分与线性代数
作为⼤⼀新⽣,学好微积分线代是和写代码⾄少同等重要的事情,相信已经有⽆数的前⼈经验提
到过这⼀点,但我还是要不厌其烦地再强调⼀遍:学好微积分线代真的很重要!你也许会吐槽这
些东⻄岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻⻣铭
⼼的程度。如果觉得⽼师课上讲的内容晦涩难懂,不妨参考 MIT 的 Calculus Course 和 18.06:
Linear Algebra 的课程 notes,⾄少于我⽽⾔,它帮助我深刻理解了微积分和线性代数的许多本
质。顺道再安利⼀个油管数学⽹红 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 编程语⾔,在图像处理、社会科学与数据科学、⽓候学建模
三个 topic 下带领学⽣理解算法、数学建模、数据分析、交互设计、图例展示,让学⽣体验计算
与科学的美妙结合。内容虽然不难,但给我最深刻的感受就是,科学的魅⼒并不是故弄⽞虚的艰
深理论,不是诘屈聱⽛的术语⾏话,⽽是⽤直观⽣动的案例,⽤简练深刻的语⾔,让每个普通⼈
都能理解。
上完上⾯的体验课之后,如果意犹未尽的话,不妨试试 MIT 的 18.330 : Introduction to numerical
analysis,这⻔课的编程作业同样会⽤ Julia 编程语⾔,不过难度和深度上都上了⼀个台阶。内容
涉及了浮点编码、Root dnding、线性系统、微分⽅程等等⽅⾯,整⻔课的主旨就是让你利⽤离
散化的计算机表示去估计和逼近⼀个数学上连续的概念。这⻔课的教授还专⻔撰写了⼀本配套的
开源教材 Fundamentals of Numerical Computation,⾥⾯附有丰富的 Julia 代码实例和严谨的公
式推导。
如果你还意犹未尽的话,还有 MIT 的数值分析研究⽣课程 18.335: Introduction to numerical
method 供你参考。
微分⽅程
如果世间万物的运动发展都能⽤⽅程来刻画和描述,这是⼀件多么酷的事情呀!虽然⼏乎任何⼀
所学校的 CS 培养⽅案中都没有微分⽅程相关的必修课程,但我还是觉得掌握它会赋予你⼀个新
的视⻆来审视这个世界。
由于微分⽅程中往往会⽤到很多复变函数的知识,所以⼤家可以参考 MIT18.04: Complex
variables functions 的课程 notes 来补⻬先修知识。
MIT18.03: differential equations 主要覆盖了常微分⽅程的求解,在此基础之上 MIT18.152:
Partial differential equations 则会深⼊偏微分⽅程的建模与求解。掌握了微分⽅程这⼀有⼒⼯
具,相信对于你的实际问题的建模能⼒以及从众多噪声变量中把握本质的直觉都会有很⼤帮助。
数学⾼阶
作为计算机系的学⽣,我经常听到数学⽆⽤论的论断,对此我不敢苟同但也⽆权反对,但若凡事
都硬要争出个有⽤和⽆⽤的区别来,倒也着实⽆趣,因此下⾯这些⾯向⾼年级甚⾄研究⽣的数学
课程,⼤家按兴趣⾃取所需。
凸优化
Standford EE364A: Convex Optimization
信息论
MIT6.441: Information Theory
应⽤统计学
MIT18.650: Statistics for Applications
初等数论
MIT18.781: Theory of Numbers
密码学
Standford CS255: Cryptography
编程⼊⻔
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.
Shell
MIT-Missing-Semester
Python
Harvard CS50: This is CS50x
UCB CS61A: Structure and Interpretation of Computer Programs
C++
Stanford CS106B/X: Programming Abstractions
Stanford CS106L: Standard C++ Programming
Rust
Stanford CS110L: Safety in Systems Programming
OCaml
Cornell CS3110 textbook: Functional Programming in 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: Data Structures and
Algorithms 和普林斯顿的 Coursera: Algorithms I & II,这两⻔课的都讲得深⼊浅出并且会有丰富
且有趣的编程实验将理论与知识结合起来。此外,对⼀些更⾼级的算法以及 NP 问题感兴趣的同
学可以学习伯克利的算法设计与分析课程 UCB CS170: Emcient Algorithms and Intractable
Problems。
软件⼯程
⼊⻔课
⼀份“能跑”的代码,和⼀份⾼质量的⼯业级代码是有本质区别的。因此我⾮常推荐低年级的同学
学习⼀下 MIT 6.031: Software Construction 这⻔课,它会以 Java 语⾔为基础,以丰富细致的阅
读材料和精⼼设计的编程练习传授如何编写不易出 bug、简明易懂、易于维护修改的⾼质量代
码。⼤到宏观数据结构设计,⼩到如何写注释,遵循这些前⼈总结的细节和经验,对于你此后的
编程⽣涯⼤有裨益。
专业课
当然,如果你想系统性地上⼀⻔软件⼯程的课程,那我推荐的是伯克利的 UCB CS169: software
engineering。但需要提醒的是,和⼤多学校(包括贵校)的软件⼯程课程不同,这⻔课不会涉及
传统的 design and document 模式,即强调各种类图、流程图及⽂档设计,⽽是采⽤近些年流⾏
起来的⼩团队快速迭代 Agile Develepment 开发模式以及利⽤云平台的 Software as a service 服
务模式。
体系结构
⼊⻔课
从⼩我就⼀直听说,计算机的世界是由 01 构成的,我不理解但⼤受震撼。如果你的内⼼也怀有
这份好奇,不妨花⼀到两个⽉的时间学习 Coursera: Nand2Tetris 这⻔⽆⻔槛的计算机课程。这
⻔麻雀虽⼩五脏俱全的课程会从 01 开始让你亲⼿造出⼀台计算机,并在上⾯运⾏俄罗斯⽅块⼩
游戏。⼀⻔课⾥涵盖了编译、虚拟机、汇编、体系结构、数字电路、逻辑⻔等等从上⾄下、从软
⾄硬的各类知识,⾮常全⾯。难度上也是通过精⼼的设计,略去了众多现代计算机复杂的细节,
提取出了最核⼼本质的东⻄,⼒图让每个⼈都能理解。在低年级,如果就能从宏观上建⽴对整个
计算机体系的⻦瞰图,是⼤有裨益的。
专业课
当然,如果想深⼊现代计算机体系结构的复杂细节,还得上⼀⻔⼤学本科难度的课程 UCB
CS61C: Great Ideas in Computer Architecture。UC Berkeley 作为 RISC-V 架构的发源地,在体系
结构领域算得上⾸屈⼀指。其课程⾮常注重实践,你会在 Project 中⼿写汇编构造神经⽹络,从
零开始搭建⼀个 CPU,这些实践都会让你对计算机体系结构有更为深⼊的理解,⽽不是仅停留于
“取指译码执⾏访存写回”的单调背诵⾥。
系统⼊⻔
计算机系统是⼀个庞杂⽽深刻的主题,在深⼊学习某个细分领域之前,对各个领域有⼀个宏观概
念性的理解,对⼀些通⽤性的设计原则有所知晓,会让你在之后的深⼊学习中不断强化⼀些最为
核⼼乃⾄哲学的概念,⽽不会桎梏于复杂的内部细节和各种 trick。因为在我看来,学习系统最关
键的还是想让你领悟到这些最核⼼的东⻄,从⽽能够设计和实现出属于⾃⼰的系统。
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.S081: Operating System Engineering,MIT 著名 PDOS 实验室出品,11 个 Project 让你在
⼀个实现⾮常优雅的类Unix操作系统xv6上增加各类功能模块。这⻔课也让我深刻认识到,做系
统不是靠 PPT 念出来的,是得⼏万⾏代码⼀点点累起来的。
UCB CS162: Operating System,伯克利的操作系统课,采⽤和 Stanford 同样的 Project —— ⼀个
教学⽤操作系统 Pintos。我作为北京⼤学2022年春季学期操作系统实验班的助教,引⼊并改善
了这个 Project,课程资源也会全部开源,具体参⻅课程⽹站。
NJU: Operating System Design and Implementation,南京⼤学的蒋炎岩⽼师开设的操作系统课
程。蒋⽼师以其独到的系统视⻆结合丰富的代码示例将众多操作系统的概念讲得深⼊浅出,此外
这⻔课的全部课程内容都是中⽂的,⾮常⽅便⼤家学习。
并⾏与分布式系统
想必这两年各类 CS 讲座⾥最常听到的话就是“摩尔定律正在⾛向终结”,此话不假,当单核能⼒
达到上限时,多核乃⾄众核架构如⽇中天。硬件的变化带来的是上层编程逻辑的适应与改变,要
想充分利⽤硬件性能,编写并⾏程序⼏乎成了程序员的必备技能。与此同时,深度学习的兴起对
计算机算⼒与存储的要求都达到了前所未有的⾼度,⼤规模集群的部署和优化也成为热⻔技术话
题。
并⾏计算
CMU 15-418/Stanford CS149: Parallel Computing
分布式系统
MIT 6.824: Distributed System
系统安全
不知道你当年选择计算机是不是因为怀着⼀个中⼆的⿊客梦想,但现实却是成为⿊客道阻且⻓。
理论课程
UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、⽹站安全、
⽹络安全等等内容。
实践课程
掌握这些理论知识之后,还需要在实践中培养和锻炼这些“⿊客素养”。CTF 夺旗赛是⼀项⽐较热
⻔的系统安全⽐赛,赛题中会融会贯通地考察你对计算机各个领域知识的理解和运⽤。北⼤今年
也成功举办了第 0 届和第 1 届,⿎励⼤家后期踊跃参与,在实践中提⾼⾃⼰。下⾯列举⼀些我平
时学习(摸⻥)⽤到的资源:
CTF-wiki
CTF-101
Hacker-101
计算机⽹络
没有什么能⽐⾃⼰写个 TCP/IP 协议栈更能加深对计算机⽹络的理解了。
⼤名鼎鼎的 Stanford CS144: Computer Network,8 个 Project 带你实现整个 TCP/IP 协议栈。
如果你只是想在理论上对计算机⽹络有所了解,那么推荐计⽹著名教材《⾃顶向下⽅法》的配套
学习资源 Computer Networking: A Top-Down Approach。
数据库系统
没有什么能⽐⾃⼰写个关系型数据库更能加深对数据库系统的理解了。
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+ 树索引和故障恢复的关系
型数据库。
编译原理
没有什么能⽐⾃⼰写个编译器更能加深对编译器的理解了。
Stanford CS143: Compilers 带你⼿写编译器。
Web开发
前后端开发很少在计算机的培养⽅案⾥被重视,但其实掌握这项技能还是好处多多的,例如搭建
⾃⼰的个⼈主⻚,抑或是给⾃⼰的课程项⽬做⼀个精彩的展示⽹⻚。
两周速成版
MIT web development course
系统学习版
Stanford CS142: Web Applications
计算机图形学
Stanford CS148
Games101
Games103
Games202
数据科学
其实数据科学和机器学习与深度学习有着很紧密的联系,但可能更侧重于实践。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
Artidcial Intelligence。这⻔课的 Project 复刻了经典游戏糖⾖⼈,让你运⽤⼈⼯智能算法玩游
戏,⾮常有趣。
机器学习
机器学习领域近些年最重要的进展就是发展出了基于神经⽹络的深度学习分⽀,但其实很多基于
统计学习的算法依然在数据分析领域有着⼴泛的应⽤。如果你之前从未接触过机器学习的相关知
识,⽽且不想⼀开始就陷⼊艰深晦涩的数学证明,那么不妨先从 Andrew Ng (吴恩达)的
Coursera: Machine Learning 学起。这⻔课在机器学习领域基本⽆⼈不晓,吴恩达以其深厚的理
论功底和出⾊的表达能⼒把很多艰深的算法讲得深⼊浅出,并且⾮常实⽤。其配套的作业也是质
量相当上乘,可以帮助你快速⼊⻔。
但上过这⻔课只能让你从宏观上对机器学习这⼀领域有⼀定了解,如果想真正理解那些“神奇”算
法背后的数学原理甚⾄从事相关领域的科研⼯作,那么还需要⼀⻔更“数学”的课程,例如
Stanford CS229: Machine Learning 或者 UCB CS189: Introduction to Machine Learning。
深度学习
前⼏年 AlphaGo 的⼤热让深度学习进⼊了⼤众的视野,不少⼤学甚⾄专⻔成⽴了相关专业。很
多计算机的其他领域也会借助深度学习的技术来做研究,因此基本不管你⼲啥多少都会接触到⼀
些神经⽹络、深度学习相关的技术需求。如果想快速⼊⻔,同样推荐 Andrew Ng (吴恩达)的
Coursera: Deep Learning,质量⽆需多⾔,Coursera 上罕⻅的满分课程。此外如果你觉得英⽂课
程学习起来有难度,推荐李宏毅⽼师的 国⽴台湾⼤学:机器学习 课程。这⻔课打着机器学习的
名号,却囊括了深度学习领域的⼏乎所有⽅向,⾮常全⾯,很适合你从宏观上对这个领域有⼀个
⼤致的了解。⽽且⽼师本⼈也⾮常幽默,课堂⾦句频出。
当然因为深度学习领域发展⾮常迅速,已经拥有了众多研究分⽀,如果想要进⼀步深⼊,可以按
需学习下⾯罗列的代表课程,
计算机视觉
Stanford CS231n: CNN for Visual Recognition
⾃然语⾔处理
Stanford CS224n: Natural Language Processing
图神经⽹络
Stanford CS224w: Machine Learning with Graphs
强化学习
UCB CS285: Deep Reinforcement Learning
定制属于你的课程地图
授⼈以⻥不如授⼈以渔。
以上的课程规划难免带有强烈的个⼈偏好,不⼀定适合所有⼈,更多是起到抛砖引⽟的作⽤。如
果你想挑选⾃⼰感兴趣的⽅向和内容加以学习,可以参考我在下⾯列出来的资源。
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 课程列表。
👍
最后更新: October 22, 2022
4 个反应
4
2 条评论 – 由 giscus 驱动
输⼊
最旧
最新
预览
登录以评论
⽀持 Markdown
GitHub 登录
FretroH 29 天前
有没有关于游戏开发的推荐课程呢?
1
0 条回复
wang33art 5 天前
有没有系统设计⽅⾯的推荐?
1
0 条回复
上⼀⻚
下⼀⻚
如何使⽤这本书
翻墙
Copyright © 2021-present PKUFlyingPig
Made with Material for MkDocs
Download