本文介绍斯坦福大学计算机科学相关课程以及学习建议,为广大自学朋友提供一些有价值的信息。

CS106B:程序设计抽象思维

CS106B 是斯坦福大学 CS 核心课程的第一门编程课,主要训练解决复杂问题的能力,课程的重点是介绍业界广泛使用的数据结构和算法。除此之外,课程还会特别训练计算机科学中最重要的思维——递归,通过对这些成熟案例的研究以启发学生的创造力。

对于从来没有接触过编程的同学,如果担心跟不上这门课,斯坦福还提供了先修课程 CS106A,主要训练抽象思维以及分治思想。如果说 CS106A 的重点是把程序写对,那么 CS106B 的重点就是把程序写好。

本项目的起源是之前春节在家,闲来无事,恰好看到了 CS106B 开课,所以就想着跟一下。每做完一份作业,无不感叹斯坦福老师的厉害之处,这是真正在“教”这件事上下足了功夫

递归部分的作业比较烧脑,需要反复研究课件,反复揣摩每句话老师的用意。好在基本上保持每周完成一个 Assignment,后半部分相对简单些,基本上三天就能做完一份作业。

环境搭建

务必严格按照官网要求搭建环境,斯坦福 C++ 库常年更新,只有课程配套的库才能正常使用。本系列环境搭建可以参考官网,也可以在我的代码仓库里面查找。

成功运行后,Windows 在下面的位置会有编译好的斯坦福库,macOS 也有对应文件夹。

C:\Users\用户名\AppData\Local\cs106

配套教材

Programming Abstractions in C++》,中文版《C++ 程序设计:基础、编程抽象与算法策略

随书配套的库 SimpleCxxLib 和课程的不配套,需要单独配置。注意图形部分依赖 spl.jar 包,需要安装 JRE 环境。目前在最新版本 Ubuntu 下测试没有问题,喜欢 Linux 下开发的同学可以试一下。

学习建议

Q:如何开始作业?

每个作业开始之前,仔细阅读相关的讲义和随堂代码,理解了课堂内容后再开始作业。每个作业,一方面是巩固课堂内容,另一方面是补充升华。如果作业内容涉及课堂知识,还需要反复看课件,通过作业才能真正领会课堂知识点的精髓。

Q:这门课讲数据结构和算法吗?

本课程重点不是设计数据结构和算法,而是 Problem Solving 问题求解。所以涉及到相关内容的,都会给出算法步骤,只需要按步骤转换成 C++ 就好了。有些算法不太理解,可以全网搜索相关内容,比如 BST 或 Graph 相关东西,明白之后再开始作业。

Q:有些题始终做不出来怎么办?

如果压力测试始终通不过,可以先放一放,做做其他题可能就有思路了。或者没事多看看作业说明,字里行间都会有老师埋下的伏笔,一旦领会某一句话就很容易做出来了。

Q:C++ 需要学到什么程度?

C++ 不需要精通,课堂提供的 C++ 技巧足够完成作业的。如果对 C++ 感兴趣,可以尝试学习 CS106L,尝试自己写一下斯坦福 C++ 库。

其他说明

每次作业务必自己思考一周以上,不要去网上找别人的解答。特别是递归的解法,很多非常简洁,看了别人的解法就会少了很多学习体验,看懂不代表你已经掌握。斯坦福的题每年不会变太多,题量有限,且做且珍惜。

最后再给个老师的主页 Keith Schwarz,推荐 Keith 版本的 CS106B,整整十个作业,详尽的单元测试,课程体验非常好。

CS106L:标准 C++ 编程

学完了 CS106B,对于 C++ 知识体系的了解,可以说已经(仅仅)涵盖了《C++ Primer》第一部分的内容;这些语法知识对于完成算法题已经完全够用了。

如果你想更深入的学习 C++,创建真实高效的应用,那么接下来应该学习的课程非 CS106L 莫属!下面就来谈谈这门课的学习。

课程内容

直观上来讲,这门课的内容包含了《C++ Primer》剩下的几个部分,除此之外,这门课也会介绍一些最新标准的东西。整个课程主要会讲解以下几个主题:

  • I/O 流的概念
  • STL 标准模板库的几个模块,除此之外,还会穿插一些 template function 相关的主题
  • 数据抽象 关于如何抽象出自己的数据容器,C++ 提供了大量的工具(move semantics,template class,RAII,etc)
  • 多线程模板元编程等更高阶的技巧

可以看出整个课程的脉络,基本和《C++ Primer》章节顺序类似。所以,这门课的最佳教材,除了配套的课程手册可以读一读之外,建议搭配《C++ Primer》一起享用,系统地建立一个 C++ 知识体系。

由此,我们也可以看出斯坦福教学体系的完备性。从 CS106B/CS106L 这两门课中剥离出 C++ 部分的内容,就相当于讲了一遍《C++ Primer》了。更值得称道的是,学完了 C++ 语法知识,如果你找不到合适的进阶项目练手,那么课上用的斯坦福 C++ 库便是很好的研究案例。

这也是笔者为什么偏爱斯坦福课程的原因,讲师及助教们真是太贴心了。在“教”这件事情上,不管是课程逻辑,还是随堂课件、配套练习,都下足了功夫。更难得的是,这些课程能够常年保持更新,紧贴业界需求!

学习建议

如果没有学完 CS106B,不建议上手这门课。如果刚学完了 CS106B,其实也不太推荐直接开启这门课的学习。

推荐的学习顺序应该是,学完 CS106B 后,紧接着学习 CS107 或 CSAPP 这样的体系结构课程。在准备学习操作系统、网络这类专题课程之前,把 CS106L 完整过一遍,并用刚学到的 C++ 工具去解决操作系统、网络相关的编程问题,从而达到学以致用的目的。

体系结构的课程,一般都会用 C 语言和汇编。学完这样的课程,你的脑海里会逐渐浮现出软件工程的一些想法。经过这类课程的磨练,你不仅会知道计算机的局限性,还能够体会用 C 语言处理这样的问题会有多么的痛苦。

这个时候,C++ 的出现就仿佛是一道光,其内置的强大工具会带你脱离思维的苦海。怎么写出通用的函数(算法),怎么写出高度抽象还能参数化类型的类(数据结构)……这些是系统编程中绞尽脑汁需要解决的问题。而现在,解决这类问题的通用工具,在 C++ 中唾手可得!这怎么能不让人拍案叫绝!

学习的过程还是优先看课堂讲义,先理解随堂代码,并尝试手写一些斯坦福 C++ 库的接口。针对每一个主题,参考《C++ Primer》对应章节,补充缺失的内容。相信用不了 10 周,你便能建立一个关于 C++ 知识框架的心智模型。

关于课件

视频已经整理并上传至B 站主页,这是 Win19Win20 两个学期的整合版。这两期的风格偏课堂讨论和现场写代码,所以这两期没有完整的课件。

这里笔者推荐看最新版本的 PPT,再结合公开的视频以及参考书,自行整理一份属于自己的 C++ 知识笔记。

关于作业

作业部分建议直接尝试官网最新版即可,因为旧版课程是基于老版本的 Qt 环境,相关依赖不太好解决。另外,最新版基于 Linux 和 CMake,更贴近工业实践。

比较劝退的一点是,这些工具是基于 Linux 命令行的。所以,如前所述,笔者建议先学习 CS107 或 15-213 相关的系统课程,培养 Linux 环境下的开发习惯,特别是 GDB 调试的能力。这些能力也将在后续进阶课程中,给你带来极大的帮助。有这样的机会,让你尽早熟悉这些工具,何乐而不为呢?


TIP

❤️ 广而告之

三个月还没学完这 CS106B/L?六个月了还在学?

别再浪费时间了,欢迎参加《CS101:C++ 编程抽象思维