CS自学计划
❤️💕💕CS自学指南,大学教育无论是深度还是广度都没有办法支撑我们的职业素养,这个板块算是自己在CS学习中额外补充和记录的。个人博客:http://nsddd.top
前言
不少学员经常抱怨自己的计算机基本功不行,大学的时候荒废了,既然如此,为啥不考虑为自己制定一个为期3~5年的重学CS目标,然后投入时间精力去实现这个目标呢?具体点,这个目标可以是这样的:重学CS(Computer Science)核心课程,夯实CS基本功,达到美国一流大学CS专业本科毕业水平。如果你的年龄还没有超过30岁,想在IT行业做得长久,想成为一名更优秀的工程师,甚至想往架构师或者技术领导层方向发展,那么波波认为这个目标是值得投入的,长期会有回报。
假设你的职业方向是偏向软件工程和系统架构方向的,那么下面是波波推荐的一个为期3年左右的重学CS细分学习计划。我把这份计划同时分享在我的公众号和github站点上,供大家参考。
注意,这份学习计划的所有参考课程,基本上都是美国一流大学最知名的CS课程,也称为硬核hardcore课程,所以对学习者的要求比较高。即使有兴趣愿意投入时间精力,估计国内的工程师大致只有Top 10%的人能全部啃下来,不然的话大家都可以轻松上美国一流大学了。所以不是所有工程师都适合,请务必量力而行。如果不服,尽管放马挑战,反正除了书以外,所有资料都是免费公开的。
二、CS学习计划
先导课(3个月)
课程:C语言基础
参考课程:密歇根州立大学CSE 251 Programming in C
参考书:The Absolute Beginner’s Guide to C(或其它C语言参考书)
参考视频:B站上有很多不错的C语言教程,自己找
挑战难度:3星
产出目标:完成课程站点上的所有14个Steps实验+3个Projects
说明:
- 这门课相当于是CS101,为什么要学C语言?因为C语言是现在主流语言的鼻祖,也是主流系统编程语言,系统架构师必须懂C语言。另外,下门课程[深入理解计算机系统]需要C语言+Linux编程基础。
- 课程站点上面的PPT可以大致浏览一下,如果已经有足够编程基础的话,书可看可不看,关键是14个实验和3个项目要搞定。
第1年上半年
课程:深入理解计算机系统
参考课程:华盛顿大学CSE351: The Hardware/Software Interface
参考书籍:深入理解计算机系统(CSAPP)
参考视频:B站 Washington CSE351 2017
产出目标:完成CSAPP书籍配套的所有Labs
挑战难度:4星
说明:这门课程是系统编程基础,也是后续操作系统/网络/数据库/编译等课程的基础,相关内容是通向系统架构师的基本功。这门课比较贴近企业实战,对动手能力要求很高,课程一大目标是要程序员写出对机器友好的高性能代码。
第1年下半年
课程:数据结构
参考课程:伯克利大学CS61B Data Structures
参考书籍:Head First Java + 数据结构书自选
参考视频:B站 UCB CS 61B Data Structures
产出目标:完成CS 61B站点上的所有Labs/Homeworks/Projects。
挑战难度:4星
说明:数据结构的重要性毋庸置疑,伯克利的CS课程都是比较偏向实战型工程师的,纯理论的东西相对少。本课的重点是树立抽象编程思维,务必把所有Labs/Homeworks/Projects都搞定。
第2年上半年
课程:操作系统
参考课程:麻省理工MIT 6.828 Operating System Engineering
参考书籍:操作系统导论(Operating Systems: Three Easy Pieces)
参考视频:B站 HMC CS 134 2019 Operating System
产出目标:完成MIT 6.828站点上的所有7个Labs
挑战难度:5星
说明:6.828是MIT的神课,这门课难度不小,含金量也不小。如果能把所有实验都搞定,对操作系统的认识会有质的飞跃。
第2年下半年
课程:计算机网络
参考课程:斯坦福 CS 144 Introduction to Computer Networking
参考书籍:计算机网络:自顶向下方法
参考视频:B站 斯坦福大学:CS144 计算机网络介绍
产出目标:完成CS 144 站点上的所有8个Labs。
挑战难度:4星
说明:计算机网络知识和技能,是互联网应用开发的基础,也是成为系统架构师的基础。这门CS 144和配套书《计算机网络:自顶向下方法》,是目前最佳的学习计算机网络基础的课程和参考书。这也是一门投入产出比比较高的课(学了马上能用)。
2.6 第3年上半年
课程:编译原理
参考书籍:Crafting Interpreters 或者 Write an Interpreter in Go
参考视频:B站 CS143 斯坦福编译原理
产出目标:参考Crafting Interpreters,使用Java或者golang语言(或其它你熟悉的语言),实现Lox小型编程语言。
或者,参考Write an Interpreter in Go,或Write A Compiler in Go,使用Java语言实现Monkey小型语言。
挑战难度:5星
说明:视频可以不看,但是一定要自己动手实现一个小语言解释器或者编译器。
2.7 第3年下半年
课程:数据库系统
参考课程:卡耐基梅隆CMU 15-445/645 Database Systems
参考书籍:数据库系统概念
参考视频:B站 卡耐基梅隆大学15-445 数据库系统介绍
产出目标:参考vanilladb项目,使用golang语言实现clone版的vanilladb(原项目是Java实现的)。
挑战难度:5星
说明:视频/课程/书可以不看,但是一定要自己动手实现一个小型的数据库系统,包括服务器端的存储引擎、SQL解析器、查询引擎和JDBC访问接口。企业开发大部分是基于数据库的应用,如果要成为企业级架构师,必须对数据库底层实现有一定掌握。课程项目要求用golang,对golang语言不熟悉的,自己找资料自学,如果你按照课程计划坚持学到这门课,那么你已经具有足够基础,可以轻松pick up任何一门编程语言。
额外说明
- 上面7门课是CS的核心课程(Core CS),偏向软件工程和系统架构方向。波波认为作为打基础的话,认真消化吸收这7门课就足够了,不需要再多,国内的计算机专业核心课也是这7门。其它的像人工智能,大数据,计算机图形学,软件工程,Web或者无线开发,网络安全,分布式系统等等,都可以算是专业或应用课,在学完7门核心课的基础上,有了一个扎实的基础,可以轻松按需拓展学习其它专业或应用课。
- 除了第一门先导课3个月,其它6门课每一门大致都需要半年(6个月),每周投入时间不少于10小时。
- 上面的课程列表中没有数学课,如果你不是想搞研究或者投入大数据分析行业,那么数学可以暂时忽略。波波认为做软件工程和架构师不怎么需要数学,当然有数学背景会更好。
- 如果说你想达到90%的留存率,彻底掌握这些CS核心课,那么建议你要把所学的知识点再梳理出来,整理成博文或者B站视频课,再教授给其它人。注意,你做完的实验/项目的代码不要分享出来,这个有版权问题,请尊重原课程老师的版权。
- 因为这些课程很有名,所以你可以很容易的,在github上找到一些其他人放上去的实验或者项目的答案,但是你应该先自己动脑动手搞定这些实验和项目,完成以后你可以对比一下其他人的答案,但是切勿先去看别人的答案。就像玩游戏一样,你拿了秘籍再玩游戏就没有意思了,也没有学习效果。
- 最后两门课(编译原理和数据库系统)有两个大项目,相当于是毕业设计项目,工作量不小,要认真计划+投入足够时间才能搞定。
- 上面课程的资料大部分是英文的,你必须自己先搞定英语,至少能流畅阅读。如果你英语不行,这些课程很难搞定,而且我认为你在IT这个行业也很难走远,因为大部分优质的IT资料是英文的。
- 搞定上面的7门课(尤其是所有的实验和项目)是有挑战的,即使是正二八斤美国一流大学的本科生,搞定这些实验和项目也不是轻松的,而且他们有一起的同学可以交流,你基本上要独立搞定。但是我相信,只要你对技术有足够热情,能足够自律,制定计划并严格执行,投入足够时间/精力,那么你一定可以克服困难达成自学CS的目标,为后续的软件开发职业生涯奠定更坚实的基础。
- 除了波波推荐的CS自学计划,另外还有两份自学计划你也可以参考:
参考CS自学指南
计算机领域方向庞杂,知识浩如烟海,每个细分领域如果深究下去都可以说学无止境。因此,一个清晰明确的学习规划是非常重要的。这一节的内容是对后续整本书的内容的一个概览,你可以将其看作是这本书的目录,按需选择自己感兴趣的内容进行学习。
不过,在开始学习之前,先向小白们强烈推荐一个科普向系列视频 Crash Course: Computer Science,在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面:计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正如它的口号所说的 Computers are not magic!,希望看完这个视频之后,大家能对计算机科学有个全貌性地感知,从而怀着兴趣去面对下面浩如烟海的更为细致且深入的学习内容。
必学工具
俗话说:磨刀不误砍柴工。如果你是一个刚刚接触计算机的24k纯小白,学会一些工具将会让你事半功倍。
学会提问:也许你会惊讶,提问也算计算机必备技能吗,还放在第一条?我觉得在开源社区中,学会提问是一项非常重要的能力,它包含两方面的事情。其一是会变相地培养你自主解决问题的能力,因为从形成问题、描述问题并发布、他人回答、最后再到理解回答这个周期是非常长的,如果遇到什么鸡毛蒜皮的事情都希望别人最好远程桌面手把手帮你完成,那计算机的世界基本与你无缘了。其二,如果真的经过尝试还无法解决,可以借助开源社区的帮助,但这时候如何通过简洁的文字让别人瞬间理解你的处境以及目的,就显得尤为重要。推荐阅读提问的智慧这篇文章,这不仅能提高你解决问题的概率和效率,也能让开源社区里无偿提供解答的人们拥有一个好心情。
MIT-Missing-Semester 这门课覆盖了这些工具中绝大部分,而且有相当详细的使用指导,强烈建议小白学习。
翻墙:由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 95% 的问题。因此,学会翻墙几乎是一个内地 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:逼格提升 论文排版工具(typora里面也可以小部分的嵌入latex)。
Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。
实用工具箱:除了上面提到的这些在开发中使用频率极高的工具之外,我还收集了很多实用有趣的免费工具,例如一些下载工具、设计工具、学习网站等等。
Thesis:毕业论文 Word 写作教程。
好书推荐
私以为一本好的教材应当是以人为本的,而不是炫技式的理论堆砌。告诉读者“是什么”固然重要,但更好的应当是教材作者将其在这个领域深耕几十年的经验融汇进书中,向读者娓娓道来“为什么”以及未来应该“怎么做”。
环境配置
你以为的开发 —— 在 IDE 里疯狂码代码数小时。
实际上的开发 —— 配环境配几天还没开始写代码。
推荐一个非常不错的 GitHub 项目 DevOps-Guide,其中涵盖了非常多的运维方面的基础知识和教程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。
另外大家可以参考一份灵感来自 6.NULL MIT-Missing-Semester 的 环境配置指南,重点在于终端的美化配置。此外还包括常用软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及一些 IDE 的配置与激活教程。
课程地图
正如这章开头提到的,这份课程地图仅仅是一个仅供参考的课程规划,我作为一个临近毕业的本科生。深感自己没有权利也没有能力向别人宣扬“应该怎么学”。因此如果你觉得以下的课程分类与选择有不合理之处,我全盘接受,并深感抱歉。你可以在下一节定制属于你的课程地图
以下课程类别中除了含有 基础 和 入门 字眼的以外,并无明确的先后次序,大家只要满足某个课程的先修要求,完全可以根据自己的需要和喜好选择想要学习的课程。
另外由于贡献者的不断增加,这份课程地图已经从最初我的学习经历,发展成为很多 CS 自学者的资源合集,其中难免有内容交叉甚至重复的。但之所以都列出来,还是希望集百家之长,给大家尽可能多的选择与参考。
数学基础
微积分与线性代数
作为大一新生,学好微积分线代是和写代码至少同等重要的事情,相信已经有无数的前人经验提到过这一点,但我还是要不厌其烦地再强调一遍:学好微积分线代真的很重要!你也许会吐槽这些东西岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻骨铭心的程度。如果觉得老师课上讲的内容晦涩难懂,不妨参考 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 finding、线性系统、微分方程等等方面,整门课的主旨就是让你利用离散化的计算机表示去估计和逼近一个数学上连续的概念。这门课的教授还专门撰写了一本配套的开源教材 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
信息论
应用统计学
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.
Shell
Python
- Harvard CS50: This is CS50x 最好的计算机基础入门课,你绝对会爱上的。
- UCB CS61A: Structure and Interpretation of Computer Programs
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 编程作业,让你实践中运用信号与系统的理论与算法。
数据结构与算法
数据结构与算法
算法设计与分析
软件工程
入门课
一份“能跑”的代码,和一份高质量的工业级代码是有本质区别的。因此我非常推荐低年级的同学学习一下 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
分布式系统
系统安全
不知道你当年选择计算机是不是因为怀着一个中二的黑客梦想,但现实却是成为黑客道阻且长。
理论
UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、网站安全、网络安全等等内容。
实践
掌握这些理论知识之后,还需要在实践中培养和锻炼这些“黑客素养”。CTF 夺旗赛是一项比较热门的系统安全比赛,赛题中会融会贯通地考察你对计算机各个领域知识的理解和运用。北大今年也成功举办了第 0 届和第 1 届,鼓励大家后期踊跃参与,在实践中提高自己。下面列举一些我平时学习(摸鱼)用到的资源:
计算机网络
计网著名教材《自顶向下方法》的配套学习资源 Computer Networking: A Top-Down Approach。
没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了,所以不妨试试 Stanford CS144: Computer Network,8 个 Project 带你实现整个协议栈。
数据库系统
没有什么能比自己写个关系型数据库更能加深对数据库系统的理解了。
C++版
CMU 15-445: Introduction to Database System
Java版
UCB CS186: Introduction to Database System
编译原理
没有什么能比自己写个编译器更能加深对编译器的理解了。
计算机图形学
Stanford CS148 Games101 Games103 Games202
Web开发
网站的开发很少在计算机的培养方案里被重视,但其实掌握这项技能还是好处多多的,例如搭建自己的个人主页,抑或是给自己的课程项目做一个精彩的展示网页。
两周速成版
系统学习版
Stanford CS142: Web Applications
数据科学
UCB Data100: Principles and Techniques of Data Science
人工智能
入门课
Harvard CS50’s Introduction to AI with Python
专业课
UCB CS188: Introduction to Artificial Intelligence
机器学习
入门课
专业课
深度学习
入门课
计算机视觉
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 课程列表。
评论区