跳到主要内容

斯坦福 CS106B/CS106X 程序抽象

课程名称: Programming Abstractions in C++ 课程官网地址:cs106b官网CS106X官网
先修课程: cs106a
重要程度: 计算机专业必修核心课程
课程评点: C++在斯坦福大学计算机专业以及所有工科院系具有非常重要的地位,在以Python(cs106a)入门后,建议再学习CS106B,官方还推荐继续学习更难的CS106X,两门课都是C++,这里将两课资源合并。

课程说明

① 课程介绍

本课程主要讲解软件开发的基本原则和技术,即如何编写没有Bug、易于理解和不断更新迭代的软件。

主题包括规范和不变量;测试、测试用例生成和覆盖;抽象数据类型和表示独立性;面向对象编程的设计模式;并发编程,包括消息传递和共享并发,以及防止竞争和死锁;以及具有不可变数据和高阶函数的函数式编程。包括每周编程练习和更大的小组编程项目。

② 课程大纲

校园版计算机科学导论CS50正课主要是教算法思维以及解决问题的能力,基本上是每周一讲,最后两周则会让你自由选择三个方向:Python全栈(HTML、CSS、JavaScript、Python、SQL)、移动应用开发(Java、Swift)、Lua游戏开发等:

  • 01: Static Checking
  • 02: Basic Java
  • 03: Testing
  • 04: Code Review
  • 05: Version Control
  • 06: Specifications
  • 07: Designing Specifications
  • 08: Avoiding Debugging
  • 09: Mutability & Immutability
  • 10: Recursion
  • 11: Debugging
  • 12: Abstract Data Types
  • 13: Abstraction Functions & Rep Invariants
  • 14: Interfaces
  • 15: Equality
  • 16: Recursive Data Types
  • 17: Regular Expressions & Grammars
  • 18: Parser Generators
  • 19: Concurrency
  • 20: Thread Safety
  • 21: Sockets & Networking
  • 22: Queues & Message-Passing
  • 23: Locks & Synchronization
  • 24: Graphical User Interfaces
  • 25: Map, Filter, Reduce
  • 26: Little Languages
  • 27: Team Version Control

③ 学习视频

这门课在B站上有录制好的视频,每一讲对应着每一周要学习的内容,除了有视频外,在官方网站上还可以下载到官方的Slides、源代码,以及每讲都有详细的课后作业Problem Sets。

B站视频:【MIT公开课】6.005 软件构建

④ 参考书籍

本课程没有配套的教材,但是官方也为学生指定了三本教材,这三本教材并不是很推荐,因为老师为了学生的成本考虑,所以推荐的教材都是免费的,所以都比较老。这里推荐大家去购买以下关于Python和C语言的教材:

⑤ 课程参考资料

官方教学资料

研讨会Seminars

研讨会主要是来探索课程教学大纲以外的主题,这些主题和最终的毕业项目Final Project息息相关。研讨会内容包括以下内容:

  • Web应用程序在手机端、PC端的交互问题;
  • 使用Git来进行团队协作和版本控制;
  • 掌握VS Code进行本地项目的开发;
  • 使用LÖVE 2D和Lua制作小型2D游戏;
  • 了解机器学习、机器学习模型在Python的实现;

进阶学习

毕业项目Final Project

当学完本课之后,你需要利用你所学习到的编程知识来开发一个属于自己的软件。你可以使用任何编程语言来实现你的想法。课程建议你和其他同学两个或三个人成立一个学习小组一起来开发出包括但不限于以下的项目:

  • 使用 JavaScript、Python 和 SQL 的基于 Web 的应用程序;
  • 开发一个使用 Swift 的 iOS 应用;
  • 使用 Lua 和 LÖVE 进行游戏开发;
  • 使用 Java 开发一个Android 应用程序
  • 使用 JavaScript 开发Chrome 扩展程序
  • 使用 C 开发命令行程序
  • 给硬件设备编写应用程序

在开始开发项目时,你应该考虑清楚以下问题,毕竟创建整个项目还是蛮让人生畏的:

  • 你的软件会做什么?它会有什么特点?它将如何执行?
  • 你需要掌握哪些新技能?你需要研究哪些主题?
  • 如果和一两个同学一起工作,这个工作怎么分配?
  • 在软件世界中,大多数事情的实施时间都比你预期的要长。因此,在固定时间内完成的工作比你希望的少的情况并不少见。你认为什么对你的项目来说是一个好的结果?更好的结果?最好的结果?