4148 字
21 分钟
CS自学教程

编程入门#

CS106L#

Standard C++ Programming,这门课会深入到很多标准C++的特性和语法,让你编写出高质量的C++代码。例如auto binding,uniform initialization,lambda function,move semantics,RAII等技巧。

值得一提的是,这门课的作业里你会实现一个HashMap(类似于STL中的unordered map), 这个作业几乎把整个课程串联了起来,非常考验代码能力。

课程资源#

电子基础#

UCB EE16A&B#

Designing Information Devices and Systems I&II,电子基础知识的讲授,用Python进行编程。

课程资源#

UCB EE120#

Signal and Systems,这门课最精华的部分就是6个超有趣的编程作业了,会让你用Python通过学习到的信号与系统的理论知识,解决各类实际问题。例如lab3会让你实现FFT算法,并和Numpy的官方实现进行性能对比;lab4会通过分析手指头的影像数据推断心率;lab5就更牛了,会让你给哈勃望远镜拍到的照片进行降噪处理,恢复绚烂清晰的星空;lab6会让你构造一个反馈系统,平衡小车上的细杆。

课程资源#

数据结构和算法#

CS61B#

Data Structures and Algorithms,伯克利CS61系列的第二门课程,注重数据结构与算法的设计,同时让学生有机会接触上千行的工程代码,通过Java初步领会软件工程的思想。14个lab会让你自己实现课上所讲的绝大部分数据结构,10个homework会让你运用数据结构和算法解决实际问题, 另外还有3个Project更是让你有机会接触上千行的工程代码,在实战中磨练自己的Java能力。

课程资源#

Coursera#

Algorithms I & II,让你完全掌握一个算法的核心在于理解三点:

  • 为什么这么做?(正确性推导,抑或是整个算法的核心本质)
  • 如何实现它?(光学不用假把式)
  • 用它解决实际问题(学以致用才是真本事)

这门课的构成就非常好地契合了上述三个步骤。观看课程视频并且阅读教授的开源课本有助于你理解算法的本质,让你也可以用非常 生动浅显的话语向别人讲述为什么这个算法得长这个样子。

在理解算法之后,你可以阅读教授对于课程中讲授的所有数据结构与算法的代码实现。 注意,这些实现可不是demo性质的,而是工业级的高效实现,从注释到变量命名都非常严谨,模块化也做得相当好,是质量很高的代码。我从这些代码中收获良多。

最后,就是这门课最激动人心的部分了,10个高质量的Project,并且全都有实际问题的背景描述,丰富的测试样例,自动的评分系统(代码风格也是评分的一环)。让你在实际生活中 领略算法的魅力。

课程资源#

软件工程#

MIT 6.031#

Software Construction,这门课的目标就是让学生学会如何写出高质量的代码,所谓高质量,则是满足下面三个目标(课程设计者原话复制,以防自己翻译曲解本意):

  • Safe from bugs. Correctness (correct behavior right now) and defensiveness (correct behavior in the future) are required in any software we build.
  • Easy to understand. The code has to communicate to future programmers who need to understand it and make changes in it (fixing bugs or adding new features). That future programmer might be you, months or years from now. You’ll be surprised how much you forget if you don’t write it down, and how much it helps your own future self to have a good design.
  • Ready for change. Software always changes. Some designs make it easy to make changes; others require throwing away and rewriting a lot of code.

为此,这门课的设计者们精心编写了一本书来阐释诸多软件构建的核心原则与前人总结下来的宝贵经验,内容细节到如何编写注释和函数Specification,如何设计抽象数据结构以及诸多并行编程的内容,并且会让你在精心设计的Java编程项目里体验和练习这些编程模式。

2016年春季学期这门课开源了其所有编程作业的代码框架,而最新的课程教材可以在其最新的教学网站上找到,具体链接参见下方。

课程资源#

体系结构#

Coursera: Nand2Tetris#

让一个完全没有计算机基础的人从与非门开始 造一台计算机,并在上面运行俄罗斯方块小游戏。

听起来就很酷对不对?实现起来更酷!这门课分为硬件和软件两个部分。在硬件部分,你将进入01的世界,用与非门构造出逻辑电路,并逐步搭建出一个CPU 来运行一套课程作者定义的简易汇编代码。在软件部分,你将编写一个编译器,将作者开发的一个名为Jack的高级语言编译为可以运行在虚拟机上的字节码,然后进一步翻译 为汇编代码。你还将开发一个简易的OS,让你的计算机支持输入输出图形界面。至此,你可以用Jack开发一个俄罗斯方块的小游戏,将它 编译为汇编代码,运行在你用与非门搭建出的CPU上,通过你开发的OS进行交互。学完这门课程,你将对整个计算机的体系结构有一个全局 且深刻的理解,对于你后续课程的学习有着莫大的帮助。

你也许会担心课程会不会很难,但这门课面向的人群是完全没有计算机基础的人,课程作者的目标是让高中生都能理解。因此,只要你按部就班跟着 课程规划走,一个月内学完应该绰绰有余。麻雀虽小但是五脏俱全,这门课很好地提取出了计算机的本质,而不过多地陷于现代计算机为了性能而 设计出的众多复杂细节。让学习者能在轻松愉快的学习体验中感受计算机的优雅与神奇。

课程资源#

CS61C: Great Ideas in Computer Architecture#

伯克利CS61系列的最后一门课程,深入计算机的硬件细节,带领学生逐步理解C语言是如何一步步转化为RISC-V汇编并在CPU上执行的。和Nand2Tetris不同,这门课在难度和深度上都会大很多,具体会涉及到流水线、Cache、虚存以及并发相关的内容。

这门课的Project也非常新颖有趣。Project1会让你用C语言写一个小程序,20年秋季学期是著名的游戏Game of Life。Project2会让你用RISC-V汇编编写一个神经网络,用来 识别MNIST手写数字,非常锻炼你对汇编代码的理解和运用。Project3中你会用Logisim这个数字电路模拟软件搭建出一个二级流水线的CPU,并在上面运行RISC-V汇编代码。Project4 会让你使用OpenMP,SIMD等方法并行优化矩阵运算,实现一个简易的Numpy。

课程资源#

CSAPP#

CMU大名鼎鼎的镇系神课,以其内容庞杂,project巨难而闻名遐迩。课程内容覆盖了汇编语言、体系结构、操作系统、编译链接、并行、网络等,作为系统入门课,兼具深度和广度,如果自学确实需要相当的毅力和代码功底。

这门课配合的教材由CMU计算机系主任Bryant教授执笔,也即所谓的CSAPP。这也是我第一本认认真真一页一页读过去的计算机教材,虽然很难啃,但着实收获良多。

北大购买了这门课的版权并开设了Introduction to Computer System这门课,但其实CSAPP所有的课程资源和实验代码都能在它的官方主页上访问到(具体参见下方链接)。

这门课由于过于出名,全世界的码农争相学习,导致其Project的答案在网上几乎唾手可得。但如果你真的想锻炼自己的代码能力,希望你不要借鉴任何第三方代码。

认真学完这一门课,你对计算机系统的理解绝对会上升一个台阶。

相信大家在看完CSAPP这本书以后,可能会对书中的第七章链接有一定的疑问。这里推荐一本书《程序员的自我修养》,书的副标题是链接,装载与库。这本书能够帮助我们完善对程序链接的理解,以及对CSAPP第七章部分知识点的一个详细的阐述。相信你在看完这本书以后可以对程序的链接,ELF文件,动态库有一个更加深入的理解。十分推荐在读完CSAPP,对计算机系统有一定的了解以后作为补充资料来阅读。

课程资源#

操作系统#

MIT 6.S081: Operating System Engineering#

麻省理工学院大名鼎鼎的PDOS实验室开设的面向MIT本科生的操作系统课程。开设这门课的教授之一 —— Robert Morris教授曾是一位顶尖黑客,世界上第一个蠕虫病毒Morris就是出自他之手。

这门课的前身是MIT著名的课程6.828,MIT的几位教授为了这门课曾专门开发了一个基于X86的教学用操作系统JOS,被众多名校作为自己的操统课程实验。但随着RISC-V的横空出世,这几位教授又基于RISC-V开发了一个新的教学用操作系统xv6,并开设了MIT6.S081这门课。由于RISC-V轻便易学的特点,学生不需要像此前JOS一样纠结于众多X86“特有的”为了兼容而遗留下来的复杂机制,而 可以专注于操作系统层面的开发。

这几位教授还专门写了一本教程,详细讲解了xv6的设计思想和实现细节。

这门课的讲授也很有意思,老师会带着学生依照xv6的源代码去理解操作系统的众多机制和设计细节,而不是停留于理论知识。每周都会有一个lab,让你在xv6上增加一些新的机制和特性,非常注重学生动手能力的培养。整个学期一共有11个lab,让你全方位地深刻理解操作系统的每个部分,非常有成就感。而且所有的lab都有着非常完善的测试框架,有的测试代码甚至上千行,让人不得不佩服MIT的几位教授为了教好这门课所付出的心血。

这门课的后半程会讲授操作系统领域的多篇经典论文,涉及文件系统、系统安全、网络、虚拟化等等多个主题,让你有机会接触到学界 最前沿的研究方向。

课程资源#

CS162: Operating System#

这门课让我记忆犹新的有两个部分:

首先是教材,这本书用的教材Operating Systems: Principles and Practice (2nd Edition)一共四卷,写得 非常深入浅出,很好地弥补了MIT6.S081在理论知识上些许空白,非常建议大家阅读。相关资源会分享在本书的经典书籍推荐模块。

其次是这门课的Project —— Pintos。Pintos是由Ben Pfaff等人基于X86编写的教学用操作系统,Ben Pfaff甚至专门发了篇 paper来阐述Pintos的设计思想。和MIT的xv6小而精的lab设计理念不同, Pintos更注重系统的Design and Implementation。Pintos本身仅一万行左右,只提供了操作系统最基本的功能。而4个Project,就是让你在这个极为精简的操作系统之上,分别为其增加线程调度机制(Project1),系统调用(Project2),虚拟内存(Project3)以及文件系统(Project4)。所有的Project都给学生留有很大的设计空间,总代码量在5000行以上。根据Stanford学生自己的反馈,在3-4人组队的情况下,后两个Project的人均耗时也在40个小时以上。

虽然其难度很大,但Stanford,Berkeley,JHU等多所美国顶尖名校的操统课程均采用了Pintos。因为如果你真的对操作系统很感兴趣,Pintos会极大地提高你编写和debug底层系统代码的能力。在本科阶段,能自己设计、实现并debug一个大型系统,是一段非常珍贵的经历。

课程资源#

计算机网络#

Computer Networking: A Top-Down Approach#

《自顶向下方法》是计算机网络领域的一本经典教材,两位作者Jim Kurose和Keith Ross精心制作了教材配套的课程网站,并且公开了自己录制的网课视频,交互式的在线章节测试,以及利用wireshark进行抓包分析的lab。唯一遗憾的是这门课并没有硬核的编程作业,而Stanford的CS144能很好地弥补这一点。

课程资源#

CS144: Computer Network#

这门课的主讲人之一是网络领域的巨擘Nick McKeown教授。这位拥有自己创业公司的学界业界双巨佬会在他慕课每一章节的最后采访一位业界的高管或者学界的高人,非常开阔眼界。

在这门课的Project中,你将用C++循序渐进地搭建出整个TCP/IP协议栈,实现IP路由以及ARP协议,最后利用你自己的协议栈代替Linux Kernel的网络协议栈和其他学生的计算机进行通信,非常amazing!

课程资源#

编译原理#

Stanford CS143: Compilers#

斯坦福的编译原理课程,设计者开发了一个Class-Object-Oriented-Language,简称COOL语言。这门课的核心就是通过理论知识的学习,为COOL语言实现一个编译器,将COOL高级语言编译为MIPS汇编并在Spim这个MIPS模拟器上成功执行。

理论部分基本按照龙书的顺序覆盖了词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容,实践部分则相应地分为词法分析、语法分析、语义分析、代码生成四个阶段,难度循序渐进,并在优化部分给学生留下了很大的设计空间。

课程资源#

计算机图形学#

GAMES101#

大名鼎鼎无需多言。

人工智能#

CS188: Introduction to Artificial Intelligence#

伯克利的人工智能入门课,课程notes写得非常深入浅出,基本不需要观看课程视频。课程内容的安排基本按照人工智能的经典教材Artificial intelligence: A Modern Approach的章节顺序,覆盖了搜索剪枝、约束满足问题、马尔可夫决策过程、强化学习、贝叶斯网络、隐马尔可夫模型以及基础的机器学习和神经网络的相关内容。

2018年秋季学期的版本免费开放了gradescope,大家可以在线完成书面作业并实时得到测评结果。同时课程的6个Project也是质量爆炸,复现了经典的Packman(吃豆人)小游戏,会让你利用学到的AI知识,去实现相关算法,让你的吃豆人在迷宫里自由穿梭,躲避鬼怪,收集豆子。

课程资源#

  • 课程网站
  • 课程视频
  • 课程教材
    • Artificial intelligence: A Modern Approach
  • 课程作业

其他资料#

CS自学指南

CS自学教程
https://blog.xiaobaizhang.top/posts/cs-self-learn/
作者
张小白
发布于
2022-03-27
许可协议
CC BY-NC-SA 4.0