斯坦福 CS106B《编程抽象》:106A 之后,真正开始写「结构」
斯坦福 CS106B《编程抽象》是 CS106A 之后的第二门编程课,用 C++ 讲抽象、递归与数据结构;学校官网没有公布考核比例,评分可选字母等级或通过/不通过。
课程官网(学校官网):https://bulletin.stanford.edu/courses/1056451
CS106B 是一门什么课?
一句话:这门课从「会写代码」走到「会设计程序结构」——用 C++ 讲抽象、模块化、递归、数据结构与复杂度入门。
这是斯坦福大学(Stanford University)工程学院的本科课程,课程代码 CS106B,英文名 Programming Abstractions,中文通常叫「编程抽象」,也常被称作「斯坦福第二门编程课」。学校官网标注课程状态为 Active(在开)。
学校官网的学分写法是 Units Min 3 / Max 5,即可变区间 3–5 units;具体取值以学生选课登记为准。
从课程描述看,内容分几块:
- abstraction(抽象):只关心「这个东西能干什么」,不关心「里面怎么实现的」。像开车只用踩油门,不用懂发动机。
- data abstraction and modularity(数据抽象与模块化):把代码拆成各管一摊的小块,别人只管用、不管里面怎么写。
- object-oriented programming(面向对象编程,OOP):用「类」(class,一种自定义数据类型)把数据和操作打包。
- fundamental data structures(基础数据结构):栈(stack,后进先出)、队列(queue,先进先出)、集合(set,不重复元素的容器)。
- data-directed design(数据导向设计):先想清楚数据怎么存,再决定程序怎么写。
- recursion(递归)与递归数据结构:递归就是「函数调用自己」,用来把大问题拆成同类的小问题;链表(linked list)、树(tree)、图(graph)都是「递归式」的数据结构。
- time and space complexity analysis(时间与空间复杂度入门):估算程序跑多慢、占多少内存,写代码时有成本意识。
- C++:使用这门语言的基础功能。
整门课的主线是「抽象」:学的不只是语法,而是怎么设计出别人能直接用、自己也好维护的代码。递归是全课的核心思维工具,也是最容易卡住的地方;栈、队列、集合这类「容器」是第二门编程课的标配;链表、树、图让你第一次直接面对指针和动态结构;复杂度分析在这里只是入门,但会改变你写代码的方式。
和国内数据结构、程序设计课有什么不同?
最大的差别是:国内课常以理论讲解加手写算法为主,这门课以实现和接口设计为中心,要求把东西真正写出来并跑通。
- 国内课常以理论讲解加手写算法为主;这门课以编程大作业为主线,要求实现、调试、写出可用的结构。
- 国内常把「程序设计 → 数据结构 → 算法」分开讲;这门课把抽象、数据结构、递归和复杂度入门放在同一门课里一起推进。
- 国内课程容易以考试成绩为主;这类课按课程性质,编程作业的工程质量会占重要位置(具体比例学校官网未公布)。
- 语言上,国内数据结构课多用 C 或简化版 C++;这里强调 C++ 的基础功能加面向对象思想,更接近「用现代语言做设计」。
- 这门课明确把「抽象」作为主题;国内同类课更偏「各种结构怎么实现」,较少明确讲「为什么要这样分层」。
考核怎么算?
学校官网只写了评分方式:可选字母等级(Letter),或 Credit/No Credit(通过/不通过);没有公布作业与考试的比例和构成。
学校官网的课程页在 Grading 一栏写的是 ROP - Letter or Credit/No Credit。除此之外,没有写作业、考试、项目各占多少,也没有写有没有期末。
从课程性质看,这类课大概率以系列编程作业累加为主,可能含期末机考或大项目收尾;但这是推断,学校官网没有给出任何比例,本文也不给具体数字。实际构成以课程网站大纲为准。
这个结构意味着两件事:第一,评分方式可选,不代表要求变低——项目作业仍要按规格完成;第二,比例不公开,就更不能按「期末突击」的思路准备,平时的作业和代码质量才是主要依据。
先修要求是什么?
学校官网写明的先修只有一条:CS106A 或同等水平(Prerequisite: 106A or equivalent)。
除此之外,学校官网还列出:
- Corequisite(需同时修读):CS106M(Enrichment Adventures in Programming Abstractions)。
- Recommended Prerequisite(建议先修/同修):CME 212(Programming for Performance)、COMM 140X(Data Science for Social Impact)、CS 106S(Coding for Social Good)。
- 后续课:CS 107 / CS 107E;学校官网同时写明,本课是它们的先修课。
实际需要的基础,是会一门语言的基本控制流与函数(任意语言都可以过渡),C++ 语法会在课内从头教;零基础直接上会明显吃力。学校官网没有说明「equivalent」的具体认定标准,也没有规定必须学过哪种语言。
适合谁:已经学过一门入门编程课、想系统建立数据结构与递归思维的同学;打算继续修 CS107 等系统类课程的同学;转专业到计算机方向、想检验自己是否适合这条路的同学;国内已学过 C/C++ 和数据结构、想看看海外怎么教这些内容的同学。零基础的同学需要先补足 106A 同等水平,不建议直接上。
学完能做什么?
课程描述里的能力点可以归成五组:数据抽象与模块化、面向对象、基础数据结构、递归与递归数据结构、复杂度入门;核心是能设计并实现结构清晰的程序。
具体包括:
- 能用 C++ 独立写出结构清晰、带多个模块的中等规模程序;
- 能判断一个问题该用栈、队列、集合还是树、图来表示,并实现出来;
- 能用递归和回溯解决组合搜索类问题,比如排列、子集、路径探索;
- 能对自己的代码做粗略的时间与空间估算,知道瓶颈大概在哪;
- 能只依赖接口写代码,把实现细节藏在后面。
这些是课程描述与课程结构推出来的能力,学校官网没有另列「学习成果」条目。往后续走,这门课是算法课、系统编程课以及技术面试基础题的底子;学校官网也把 CS 107 / CS 107E 列为后续课。
难点与常见挂因
这门课难在「想」而不在「背」:递归要换一种相信方式,回溯要同时管状态和撤销,指针错误常常直接崩溃。
为什么中国学生容易在这里卡?
- 国内先修课多是过程式编程,这里要转向「以接口和数据设计为中心」。 国内多数先修课用 C 或 C++ 做过程式编程,习惯「一步一步写下去」;这门课要求先想接口、再想实现,思维切换比语言切换更难。
- 国内偏手写算法,这里看工程质量。 国内课程偏重考试里的手写算法;这类课更看重大作业里的工程质量——拆分是否合理、命名与注释是否清楚。中国学生容易低估代码风格的权重,功能跑通就以为完成了。
- 英文长规格说明容易漏读。 作业说明和题目描述全是英文,长篇 spec 里的细节要求容易漏读,导致功能「能跑但不符合要求」;这类失分最冤,因为不是不会写,是没读全。
- 习惯自己硬扛,不用答疑资源。 不少国内同学前置学得扎实,会倾向于自己硬扛,不主动用答疑资源;在递归、回溯这类需要「点拨」的内容上,硬扛的成本很高。
卡住之后会发生什么?
- 递归没真正理解,只会照着例子套;作业里换个输入就不会写,考试里也讲不清「为什么相信子调用」。
- 回溯建立在递归之上,递归不牢,回溯题会同时卡在「状态怎么存、选择怎么撤销」上,写出来的代码越改越乱。
- C++ 动态结构出错,常常表现为程序崩溃而不是清楚报错;不会用调试器的人,会靠猜和乱改,时间全耗在试错上。
- 只关心功能是否实现、不管结构和风格,作业可能「能跑但拿不到好的评价」;而这门课没有公开比例,工程质量的影响只会更大。
- 快节奏学期制不容拖延:一周没跟上,后面的树和图会连锁受影响,最后变成「每章都欠一点」。
递归为什么是第一道坎?
递归和人的直觉相反:人习惯「一步一步把每件事做完」,递归要求你「假设子问题已经做完,只处理当前这一层」。第一次接触的人,会在脑子里把每一层都展开,越想越乱;真正写代码时又忍不住去跟踪每一层,结果把递归写成了循环。
这个坎过不去,后面的树、图、回溯都会受影响:它们都是递归结构,都是「把大问题拆成同类小问题」。所以递归不能靠背例题,要靠手画调用树、靠小输入逐层跟踪,直到你能解释「为什么可以相信子调用」。
具体难在哪:六处高频卡点
- 递归的「信任跳跃」。 写递归时要相信子调用已经正确,而不是在脑子里把每一层都展开;这个思维转换对多数人是第一道坎。
- 回溯类题目。 先试一条路,走不通就退回换一条;它要同时管状态、选择和撤销,任何一处没处理好,结果就不对。
- C++ 的内存与指针。 学校官网说「covering its basic facilities」,但动态结构(链表、树)要求你清楚对象在哪、谁负责释放;出错常常表现为崩溃而不是报错。
- 数据结构的取舍。 同一个需求用数组、链表、树、哈希各能做,难点不是写出来,而是说清为什么选这个。
- 抽象与实现的分离。 要学会只依赖接口写代码,这和「能跑就行」的习惯相冲突;接口没设计好,后面越写越乱。
- 复杂度分析。 要把代码翻译成数学量级,对数学表达不熟的同学会觉得抽象;只会背结论,遇到新代码就估不出来。
常见挂因与对应动作
- 递归没真正理解,只会照着例子套。 怎么补:先手工画出调用树,再对着小输入逐层跟踪,直到能解释「为什么相信子调用」。
- 遇到崩溃就乱改代码。 怎么补:学会用调试器(debugger,逐行运行并查看变量的工具)和小样例复现问题,不要靠猜。
- 把作业拖到截止日前。 怎么补:提早开工并预留调试时间;递归类题目「想通」比「写完」更花时间。
- 只关心功能是否实现,不管代码结构与风格。 怎么补:写完后按「别人能不能看懂并复用」自查一遍。
- 不敢提问,卡住了才发现已经落后。 怎么补:卡住超过一段合理时间就去答疑,并事先准备好「我试了什么、哪里不对」。
- 对复杂度只会背结论。 怎么补:每写完一个数据结构操作,就自己说一遍它的代价是多少、为什么。
留学生特别提醒
中国学生最容易在三处吃亏:把「能跑」当「写好」、英文规格读不全、以及不好意思去答疑。
- 英文规格说明要逐条拆。 作业说明和题目描述全是英文,长篇 spec 里的细节要求容易漏读;建议把要求逐条翻成自己的话,做成检查清单,交作业前逐项对照。
- 代码风格是评分的一部分。 国内课程偏重考试里的手写算法,这类课更看重大作业里的工程质量:拆分是否合理、命名与注释是否清楚。中国学生容易低估这一块,功能跑通就以为完成了。
- 答疑要会用英文描述问题。 课堂提问、助教答疑(office hours,教师或助教的答疑时段)需要用英文把「卡在哪一步」讲清楚;不会描述问题,就很难获得有效帮助。提前准备「我试了什么、哪里不对、期望是什么」三句话。
- 别把「前置扎实」当成「不用问」。 不少国内同学前置学得扎实,会倾向于自己硬扛,不主动用答疑资源;在递归、回溯这类需要「点拨」的内容上,硬扛的成本很高。
- 快节奏学期制不容拖延。 一周没跟上,后面的树和图会连锁受影响;每周留出固定时间把上一周的内容收尾,比期末补更省力。
- 作业不是一次写完的。 递归和回溯类题目,想清楚结构往往比敲代码更花时间;拿到题先写伪代码、画调用树,再动手,返工会少很多。
- C++ 基础会在课内教,但不会等你。 学校官网说覆盖 C++ 基础功能,不等于从零慢慢讲;课前把基本语法过一遍,课上才能把注意力放在抽象和设计上。
怎么准备?
准备的关键是递归和指针:手画调用树、写清基础情形和递归步骤;遇到崩溃用调试器,不要靠猜。
- 先补 C++ 基础。 106A 或同等基础不等于会 C++;指针、引用、类这些基本语法先过一遍。
- 递归用手画。 每学一个递归例子,画出调用树,写清基础情形和递归步骤,再写代码。
- 回溯拆成三件事。 状态怎么存、选择怎么做、撤销怎么恢复;每道题先把这三件事写下来,再动手。
- 指针用调试器。 程序崩溃时逐步看变量和内存,别靠猜;这是 C++ 最省时间的技能。
- 作业当天启动。 读完题面先列子任务,留出调试时间,别留到最后。
- 从空白文件重写。 看懂的例题合上笔记自己写一遍,才知道有没有真的会。
- 把规格做成检查清单。 英文要求逐条翻译,交作业前对照一遍,避免「能跑但不合规」。
- 卡住就问。 带着具体问题去答疑,准备好「我试了什么、哪里不对」;别自己闷头耗。
中英术语速查
- abstraction —— 抽象:只关心能干什么,不关心内部怎么实现。
- data abstraction —— 数据抽象:把数据和操作封装起来,只暴露接口。
- modularity —— 模块化:把程序拆成互相独立的小块。
- object-oriented programming (OOP) —— 面向对象编程:用类和对象组织代码。
- class —— 类:一种自定义数据类型,把数据和操作打包。
- stack —— 栈:后进先出的数据结构。
- queue —— 队列:先进先出的数据结构。
- set —— 集合:不重复元素的容器。
- data-directed design —— 数据导向设计:先定数据怎么存,再定程序怎么写。
- recursion —— 递归:函数自己调用自己解决问题。
- base case —— 基础情形:递归中止的条件。
- backtracking —— 回溯:走不通就退回上一步换条路。
- linked list —— 链表:节点靠指针串起来的数据结构。
- tree / graph —— 树 / 图:有层级关系或节点连接关系的递归数据结构。
- time and space complexity —— 时间与空间复杂度:程序跑多快、占多少内存。
- pointer —— 指针:存放内存地址的变量。
- debugger —— 调试器:逐行运行并查看变量的工具。
- office hours —— 答疑时段:课后找老师或助教问问题的时间。
关于我们
鱼之跃做在读留学生的学业支持,服务分两块,界限很清楚:
辅导=老师授课:由 QS 前 200 院校的硕博老师把课程的知识点、推导链、作业要求讲透,按对口专业配课;覆盖同步辅导、论文辅导、考前辅导、预习。
护航=你的学业管家:排计划、理材料、理流程这些杂事都替你打点好,该提前准备的他先想到;你只管学,有事随时找,需要时都在。同地区的留学学姐,熟悉你所在学校的节奏。
学术问题上的申诉,我们做材料梳理与流程陪跑,不代写、不代考、不碰学术诚信边界,也不承诺任何成绩。
课程官网与核对说明
课程官网(学校官网):https://bulletin.stanford.edu/courses/1056451
本文涉及学校、课程代码、学分单位、课程内容、先行课与同时修读要求、评分方式的事实,均来自上述学校官网课程页;核对时间为 2026-10-29。文中「与国内课程差异、考核结构推测、先修判断、难点、适合谁、怎么准备、学完能力」等属于基于课程内容的分析与学习建议,不代表学校官方要求。