本科还在教造库,该改练的是规格和验证|The Pragmatic Engineer × Titus Winters
- 原始标题
- Software engineering at Google & CS education with Titus Winters
- 节目 / 来源
- The Pragmatic Engineer
- 嘉宾
- Titus Winters
- 原始发布日期
- 2026-10-29
- 时长
- 约 101 分钟
- 内容类型
- 播客访谈 / 规模化工程与 CS 教育
- 原始内容
- 前往原始来源 ↗
搜索发不出版,是因为每次改动都带着回归。Titus Winters 复述的经过大约在 2006、2007 年:搜索想按月发,后来大概一个季度才能发一次。当时架构还没拆开,改 Gmail 仍可能碰到搜索。发布工程师划了一条线。没有测试不准合并。副总裁怎么说、功能多重要,都不算。他们会回滚。
这是他讲 Google 后来为什么敢改地基。节目导语把同一段收成大约 2006 年做出的 Test Manager。导语是粘在一起的长句。专名按对谈里的发布工程师和测试线来写,不把 Test Manager 补成一份产品史。
他是《Software Engineering at Google》的主要作者,离开前负责可读性项目。书之后进入 ACM 和 IEEE 的本科 CS 课程指导委员会。字幕把 IEEE 听成 ILE。委员会里,他是当时唯一还在业界干活的工程师。节目导语把这件事放在 2023 年。
原始来源:Software engineering at Google & CS education with Titus Winters。中文深度整理,非逐字翻译。本文依据 YouTube 自动生成的英文字幕,专有名词和数字可能有识别误差。中插的 Linear、Turbopuffer 赞助略去。行数和人数是口述估计,不升成官方统计。
害怕改,代码库就不成立
他 2010 年到纽约的 Google。前面在一家大约三五十人的咨询公司,间接给 DirecTV 做机顶盒。博士在 UC Riverside,方向是计算机科学教育。本科在 Harvey Mudd,字幕听成 Harvey Mud。
进 Google 不久,他转到维护很老的 C++ 基础设施:缓存、容器、字符串、命令行标志,数据库下面的那一层。敢接,是因为测试这道线已经划过。2010 年的业界,人人写测试还不是显然的事。有测试,重构之后要么通过,要么暴露覆盖不够。暴露不够也是赢。今天崩一次,比一年后流量翻倍时才崩要便宜。他的句子写在书的前几页,他说自己讲了十年:代码库可持续,是指任何有价值的变更来了,你有能力安全地做。你可以因为债务或产品优先级选择不做。你若没有能力反应,就是在押这个变更不重要。安全这几年他觉得已经坏到没有东西可以不改。害怕,不是工程上可以接受的理由。
后来的 Abseil 是把这套 Google 内部的 C++ 说法整理出来开源。字幕听成 Absale、Absel。整理之前先问:这些说法里有的很糟,要不要在永远承诺之前清掉。答案是要。十到十二个人全职,用当时外面还没有的工具,让外部的惯用法和内部对得上。这些部件躺在搜索、Gmail、地图中间。他愿意辩护:这大概是人类历史上最大的一次重构。他证明不了。如果有人做过更大的,他会觉得意外。
规模他这样说。当时大约 2 亿或 2.5 亿行第一方 C++,不含外部依赖。2.5 亿行他记得像是当时的公开数字。一个月里在这个库上做编辑的工程师,大概一万,而且他说的是大概。比喻是帝国大厦换地基,楼不关,路不封,地下室还发现了核废料。
能这么改,是因为他们拥有那些接口。一处 API 要动,可能是五万个调用点,或者十万处编辑。他和 Clang、LLVM 的人一起,在抽象语法树上做变换。字幕在 map reduce 那里断掉。能留下的是:接口在你手里,批量改写才可能。
可读性是教育,伤疤在合并之前
这本书的动机,接在「也许要把开发工具送出去」的尾巴上。不解释,这些工具会像外星人送来的东西,在别人的世界里没有意义。他们敢写,是因为规模化重构里见过太多工程师当时觉得聪明的解法。伤疤在测试、本地设计和 API,不在生产值班。他说自己的工作到合并为止。他更懂的是把代码库当成一件还要继续工作的工件。书很细地写到进入生产。运维那本是另一本 SRE 的书。再写进去,这本会变成两倍长。
封面上三个人:他自己、Hyram Wright、Tom Manshreck。字幕把 Tom 听成 Manrek。Hyram 和他做技术带领。Hyram 产生了数百万次编辑交给他审,他有权限审库里几乎所有东西。Tom 多年做技术写作,管编辑和结构。找各章的专家,有的一开始就好,很多要捉刀。前后将近两年,最多大概四分之一到一半的时间,不是全职。印出来他才觉得超了。
可读性审查是第二道许可。改动能进库,作者或审阅者要有两种权限。一种是所有权,你在可以改这些文件的名单里。一种是认证:我们认为你懂怎么用这门语言、在这个库里写惯用的代码。一致性的战略价值,他说大到不行。
早期是工号靠前的人,字幕里叫 Craig,坐下来带每一个新人走完第一次实质性改动。带不动了,就找人代理。后来大多数改动不是从零写一个组件,而是在已有产品上加一点。一次改动证明不了你什么都会,这套开始像折磨仪式。Java 那边先改成导师制。你做平常的工作,组里签过之后,从 Java 导师池里轮一个人来看有没有实质值得说的。组里标准已经高,评语就少,毕业就快。不学,就慢,或者毕不了业。他离开 Google 时差不多三年前,自己是可读性项目的总责。他愿意说,这可能是科技业里、也许是世界上最大的教育项目,因为任何时刻都有数以万计的人在里面。人数是他的判断。参加不是自愿的,有人很火大。设计意图就是把代码审查做成这门语言的深度教育。水面下它还是信息共享:你看见别的代码、别的技术、别的人。
数得出的产量,量不到变贵的那种活
他没见过一份基于研究的数字,说 AI 之后的生产率上升超过大约 20% 或 30%。同时到处有人讲 10 倍。他明确不认为真的是 10 倍。缺口在于:AI 的价值常常是去做一件更难、你以前不会去想的事。生产率度量如果等于数工厂出来多少零件,你开始生产更贵的零件时,没有序列可以跟踪。因为没有「这个组件值多少」的记录。
他转述资深工程师的感觉:代码量上去大约 70%,故障上去大约 30%,功能个数不变。说不准的是这些功能的价值有没有上去。70 和 30 是谈话里的感觉,不是普查。
一个他挂在安全圈子里的例子:带上你需要的功能,用几周写出一个 JPEG 解析器。三年前这句话说出来会像疯了。主持讲的另一家公司在一个细分行业。组件按收入分成授权,比例他在几个百分点之间摆,本文不取其中一个。对方判断自己写要一组五到十人做几年,还不一定成。工程师把已有的大量测试交给 AI,做出一个更快的实现,事先没有这块的领域知识。供应商反过来付钱,买下这个实现、换一种授权,条件是先别开源。如果那位负责人当时按「同样的活、一半的人」去裁员,这个人可能已经不在,游戏被改写的那条路就没人看见。这是主持转述的一家公司,不是行业比率。
课程停在造库和操作系统
他的判断很直。大部分 CS 课程从 2000 年左右、也许更早,就没有实质变化。课程里平均的那一门,正好是九十年代造数据库或操作系统所需要的。一个以创新自许的领域,这样说不好听。他要分的是三件事:教这个,是因为它仍然相关,是因为传统,还是因为我们知道怎么教。最早的 CS 系也不过五十年、六十年、七十年。这个领域年轻到不该靠传统过日子。AI 之前他就认为有很多该拆掉。要求是堆上去的。往里加东西,旧内容的深度每次削掉一点点。他想要的是练习和钻研,把人练成能流畅写程序、能做算法思考的人,而不是对一百万个题目各知一点。
AI 之后,本科作业可以整份交给模型,它在那些题上会做得够好。于是人可以拿下一个学位,而从没有想过。他推的是离开「写代码」这一层,明显地上移。你仍要能读代码,仍要能按系统、按结构、按执行去想。没有人需要自己实现链表。他甚至觉得链表不该教:太慢,内存是慢的东西。时间应该放到设计、规格的精度、测试、确认和验证。规格是把你要发生的事说准。验证是确认模型真的做了你要的事。
大问题是这仍然叫 CS,还是 CS 招生会掉下去、软件工程项目会起来。他认为 AI 时代还能找到工作的,是协作、沟通、设计、规格、测试和确认。这些是软件工程的题目。这是他的猜想。指导委员会里有些教训他承认没有写进要求,因为校园里做不到,得到现场学。他对「一门团队课」也担心。真实团队不会是一群背景完全相同的人。一门课比没有好。它给的团队味道是错的。
他自己算过,一个 CS 学位的小时数,大概相当于平均十五个月的全职工作,里头还有理论和未必相关的部分。训练营常常三到六个月,从第一天做应用。滑铁卢这一类带多次实习的项目,主持用来说明重复练习更接近雇人的人要的东西。Titus 补的是:很多加拿大学校的实习和合作教育更强,有些学位因此排到五年。十五个月是他的算术。
给分看提示和测试
初级工程师若只把工单贴进提示再提交结果,一个人可以被一段很短的脚本替换。AI 用来加宽输入、用来让自己变好。输出仍要人站得住。他喜欢的比喻叫 Andrew's axe,来自大约一年前的一次讨论:我用斧头砍倒树,不会说是斧头砍的。1979 年 IBM 培训手册里的句子:计算机不会被追责,所以不该做管理决定。AI 实验室不会为这些错误赔偿。名字签在合并请求上的人,得站得住。
教授们告诉他的图景:B+ 及以上的学生比以往更好。他们有一个无限耐心、随时在、读得很多、有时会幻觉的导师,又有元认知,不去整段复制。最差的学生比以前好一点,因为以前什么都做不出,现在能交出 slop。中间塌了。他们宁愿去玩,作业就这一次交给模型,坡越来越滑。有的像样学校的教授说,B 以下的人大概根本不懂代码怎么工作。系统没有在追踪这个。
一开始的讨论是怎么禁止学生用这些工具。他认为这站不住,像高级语言出现之后还要求人人从汇编学起。业界已经在用。新毕业生说自己没用过,会是一个信号。他这个月和一批学者在《Communications of the ACM》发了一篇。开篇大意是:想象 2040 年,我们仍把使用 AI 一律当成作弊。这一代学生和 AI 一起长大,像网络原住民和网络一起长大。继续让他们在字符串里找回文、在图里算降雨量,传统学位还能让他们学到什么。答案在他看来显然是不能。假设他们在用,改学习目标和评估,让摩擦留在会迫使他们思考的那一层。
本科上,简单的改法是停止只给结果打分。就算题目没有变得更难,也改成看过程:你用了哪些提示才走到这里,你提供了哪些测试来确认它做了你要的事。交上来的代码只是代理。代理的是你挣扎过、学到了。不需要再多一篇关于《麦田里的守望者》的论文,也不需要再多一个链表。交上整包。口试是同一方向上的另一种做法,对谈里只点到。
如果由他排一门课,第一学期先不要靠 AI,至少读得懂代码,控制流有个大概。然后才是故意不直接给答案的、带马具的 AI。评估看整包和过程,学生去要一份完整答案就没那么致命。他没有剧本,也说没人有。一个具体想法是把入门课做成非专业和专业都上:怎么描述输入、输出、结构和接口。复选框和单选框有什么差别,什么时候用按钮。非界面的例子是命令行标志怎么组合。只上过这一门的人,自己用出来的东西至少有一套稍微连贯的设计。他住的纽约公寓,洗衣房的应用把菜单当成按钮,设计语言是错的。从这里开始。再往后才是项目和团队。人要先碰到一个自己想解决的大问题,才会需要「网页怎么工作、远程调用怎么工作」。
Kent Beck 几个月前的说法,他转述成:现在正在工作的人是在有剧本的时代长大的,至少理论上知道正确做法。现在没有剧本。什么还算基础,没有共识。
可带走的有五条。
- 代码库可持续,等于有价值的变更来了你改得动,而且安全。害怕改,先补测试和覆盖。
- 一致性是教育出来的。审查若只盖章,库会回到各写各的。
- 生产率不要只数代码行和功能个数。问这次变更让哪件以前做不起的事变得做得起。
- 课程把实现往下卸。设计、规格精度、测试、验证往上加。链表可以让路。
- 作业按提示和测试给分。第一学期仍要能读代码。工具从第一天就在业界,评估若假设学生不用,会失真。