YouTube2Text

《代码整洁之道》作者不读AI生成的代码!审查能力,正在被AI重新定价 — Transcript

by 为什么叫QQ · 671 words · 295 segments · language en · Watch on YouTube

Full transcript

  1. 0:00大家好 我是为什么叫QQ
  2. 0:02今天先给你出一道题
  3. 0:032007年 伯克利 一个实验
  4. 0:05来自Ka-Ping Yee的博士论文
  5. 0:07研究的是投票机软件的可靠性
  6. 0:09他和David Wagner往代码里 亲手埋了三个bug
  7. 0:13难度分三档 easy medium hard
  8. 0:15然后他们去请审查的人, 来的阵容堪称梦幻
  9. 0:18分别是Yoshi Kohno,Mark Miller,Dan Sandler,Ian Goldberg。
  10. 0:234位经验丰富的审查者 都熟悉安全威胁
  11. 0:26实验方还特别厚道 直接告诉他们
  12. 0:29bug在这约100行里 你想想这个条件
  13. 0:32已知有bug 已知位置
  14. 0:34还都是安全审查这个行当的老手
  15. 0:36你猜 三个bug能找出几个 先记住你的答案
  16. 0:39这期看到最后 回来对账 我把过程也给你
  17. 0:42Sandler最快 约70分钟 找出easy和medium
  18. 0:45Kohno和Miller花了约4小时 只找到easy
  19. 0:49Goldberg约2小时 也只找到easy
  20. 0:51前后砸进去约20个审查人时 那个hard bug
  21. 0:54没有一个人找到 Lemmer-Webber还回忆过一件事
  22. 0:57她私下听Mark Miller复盘 缺陷被指出以后
  23. 1:00大家都觉得 回头看太明显 按理应该找得到
  24. 1:03要交代一句 这话是她的转述 不在博士论文里
  25. 1:07但你听听这个味道 连他们都觉得本该找到
  26. 1:10可事实就是没找到 这个案例没有测出
  27. 1:13人类审查能力的硬上限
  28. 1:15它证明的是一件更现实的事 哪怕范围缩到100行
  29. 1:18哪怕审查者经验丰富 人工阅读依然可能漏掉
  30. 1:22刻意隐藏的缺陷 AI把代码产量放大以后
  31. 1:25这个漏检风险 不会自动消失
  32. 1:27所以真正的问题来了 你每天那点认真审查的带宽
  33. 1:31在AI时代 到底值多少钱 又该怎么花
  34. 1:34这个7月整个社区吵翻天的 其实就是这一件事
  35. 1:37先把时间线拉清楚 4月14日 Uncle Bob先出手
  36. 1:41《Clean Code》的作者
  37. 1:43从60年代末写代码 超过55年
  38. 1:46他说他不再逐行审查agent代码
  39. 1:48改看覆盖率 依赖结构 圈复杂度
  40. 1:51Grady Booch当场反对
  41. 1:53他说这些指标能增加对功能的信心
  42. 1:55却不能让他确信 代码没有引入漏洞和死代码
  43. 1:59没有影响性能的结构问题 最后留下一句话
  44. 2:02信任 但要验证 这两位老前辈 其实在给审查定价
  45. 2:06一个嫌人审太贵 一个嫌不审更贵
  46. 2:085月6日 Simon Willison发文 一年多前
  47. 2:11他还把边界划得很清楚 绝不提交解释不清的代码
  48. 2:15现在他承认 自己的生产代码也不逐行审了
  49. 2:18他还借越轨正常化这个词
  50. 2:20承认自己也有点心里没底
  51. 2:22连他这样的人 线都在往后挪
  52. 2:24导火索 烧在北京时间7月3日
  53. 2:27HashiCorp联合创始人 桥本 在X上只回了一句话
  54. 2:31I read the code 我读代码
  55. 2:33截至7月底 约83万次浏览
  56. 2:35一句工作习惯 被读成了宣战
  57. 2:387月17日 Lemmer-Webber发长文
  58. 2:40Spritely联合创始人兼执行总监
  59. 2:43ActivityPub协议的共同作者
  60. 2:45她给这场争论送上了理论弹药
  61. 2:487月23日 Bob回复开发者Ori
  62. 2:51这位Ori 1983年就开始编程
  63. 2:53他说让AI直接改文件 心里发毛
  64. 2:56要负责 就必须理解代码 Bob回他 我比你老得多
  65. 3:00我现在的策略 一行都不读 这条回复 截至7月底
  66. 3:04浏览量超过480万 接近桥本那条的六倍
  67. 3:07两边阵营 彻底成型 这里先抛一个争议观点
  68. 3:11坚持全读的人 反而更危险
  69. 3:13同意的反对的 打在公屏上 先看读代码这一侧
  70. 3:16Cindy Sridharan把底线讲得最狠
  71. 3:19每次听到有人说 代码全是Claude写的
  72. 3:21我自己也不懂它怎么工作
  73. 3:23她就认定 这人调试不了它
  74. 3:25调试不了 你就不算拥有它
  75. 3:27她在工作里见多了这种场面
  76. 3:30遇到bug 把报错扔给Claude
  77. 3:32修复方案贴回来 跑通就算完 稍微棘手一点的
  78. 3:35立刻卡在原地撞墙 地基是空的
  79. 3:38话很重 但你仔细品品 好像真是这个理
  80. 3:41不过要交代完整 几天后她自己补了一条
  81. 3:45仍尽量理解每一行
  82. 3:46但也承认 实践里正长出一套新技能
  83. 3:48能高效交付 能调试陌生代码
  84. 3:51连她 也不想被钉死在全读派
  85. 3:53那很多人会觉得奇怪了 审查这么重要
  86. 3:56怎么人人都在悄悄放弃它
  87. 3:58Lemmer-Webber在长文里 还提到一个现象
  88. 4:01Flask的作者Armin观察到 vibe出来的系统
  89. 4:04代码一层摞一层 摞到最后 没有任何人
  90. 4:06能完整看懂整个代码库 但系统还在跑
  91. 4:10因为LLM能给你解释其中一段
  92. 4:12大家就靠着这种局部解释 继续往上盖楼
  93. 4:15楼在长高 地基没人看过 要交代清楚
  94. 4:18这是观察 不是实证研究
  95. 4:20他本人也没为这种状态站台
  96. 4:23Lemmer-Webber的回答 是雪橇
  97. 4:25她说用LLM写代码 像坐雪橇
  98. 4:28滑道只有一条 一路向下
  99. 4:30山顶上你说 只当高级自动补全
  100. 4:34滑一段 变成agent生成我来审
  101. 4:36再滑一段 不怎么看输出了 但我信任它
  102. 4:39到了山脚 你连prompt都不写了
  103. 4:41每一步 你都以为是自己的选择
  104. 4:43其实每一步 都是惯性在推你
  105. 4:45这股惯性 她算了一笔账 算得特别扎心
  106. 4:49写代码 慢的部分在两头 一头建立理解 一头审查
  107. 4:53生成 本来就是最快的环节 AI把生成变得飞快
  108. 4:57你一旦认真审查 速度优势当场作废
  109. 5:00所以审查 天然第一个被牺牲
  110. 5:02今天跳过一个小函数
  111. 5:04明天觉得这个模块差不多就行
  112. 5:06每一步都很小 都很合理 等你回头 已经在山脚了
  113. 5:10她还有一个更狠的概念
  114. 5:11vibe sickness vibe不适症
  115. 5:14词来自Glyph的PyCon感想
  116. 5:16说的是slop已经无处不在
  117. 5:18开源社区正被slop式安全PR压垮
  118. 5:21客服是机器人 海报是AI味 最难受的是 你躲不开
  119. 5:25同事扔来一个他自己都不懂的贡献 你去审它
  120. 5:29你就被迫加入了vibe coding的工作流
  121. 5:31Glyph的比喻 我给满分 靠拒绝LLM软件来抗议
  122. 5:36就像靠不呼吸 来抗议汽油加铅
  123. 5:38她特别强调的地方在于
  124. 5:40下滑这个过程 往往不是你的选择
  125. 5:43更像顺着惯性 越滑越快
  126. 5:45等你反应过来 已经停不下来
  127. 5:47你以为能控制好这个度
  128. 5:49只是在不重要的地方偷个懒
  129. 5:51现实里 很难找到刹车点 她的态度也很明确
  130. 5:54凡是不用genAI的项目 她都多一分尊重
  131. 5:58她担心的事情更远 世界正被没人理解的系统
  132. 6:01一点一点替换掉 这一侧的逻辑链 到这里闭环了
  133. 6:05人工审查会漏检 自控又靠不住
  134. 6:08弹幕走一波 你现在站哪边 但先别急着下结论
  135. 6:11Bob那套做法 值得完整看一遍
  136. 6:13他不读代码 但他没有躺平
  137. 6:15他给agent围了一圈关卡
  138. 6:17单元测试 Gherkin测试 QA流程
  139. 6:20质量指标 变异测试 测试覆盖率
  140. 6:23外加一大堆别的机制
  141. 6:24代码想进主干 先闯完这套关 闯完 他就敢合并
  142. 6:28他信任的对象换了 从代码本身 换成了关卡
  143. 6:32代码可以撒谎 关卡不会客气
  144. 6:34你看 他不是对AI有信心 他是对验证体系有信心
  145. 6:38马上有人追问第一层 谁来保证 关卡本身可靠
  146. 6:42万一测试写错了呢 Bob很坦白
  147. 6:45检查工具 他也让agent写
  148. 6:47但工具规模很小 规则也是确定的 在固定环境里
  149. 6:50同一输入能得到可复现的结果
  150. 6:53他还让Claude用Clojure
  151. 6:55写过一个变异测试的工具 追问第二层
  152. 6:58那你审这些工具的代码吗 不审 还是同一套流程
  153. 7:01工具同样被大量测试包围
  154. 7:03追问第三层 最尖锐的一层 这不就是无限递归吗
  155. 7:07AI写代码 AI写测试 AI再写工具检查AI
  156. 7:11Bob当然想过这一点 他的底牌是变异测试
  157. 7:14故意往代码里塞错误 看你的测试抓不抓得住
  158. 7:18agent想靠刷覆盖率蒙混 成本会被明显抬高
  159. 7:21但要把话说全 变异测试也不是万能的
  160. 7:24它只检查测试对变化敏不敏感
  161. 7:27规格对不对 断言错没错 它回答不了
  162. 7:30而且他不是甩手掌柜 Gherkin验收测试 他亲手审
  163. 7:34QA流程 他亲手审 还定期做最终的人工测试
  164. 7:38有人问他 凭什么信agent守规矩
  165. 7:40他答 它们和人差不多可靠 所以你盯着它们
  166. 7:44追问第四层 测试能保功能 代码质量呢
  167. 7:47写得乱但能跑通 行不行 Bob的态度非常明确
  168. 7:51质量比以前更重要 烂代码 照样拖慢AI
  169. 7:55他亲眼见过agent被自己的烂结构困住
  170. 7:57来回折腾 就是解不出来
  171. 7:59最后他亲自下场 把乱麻理顺
  172. 8:02所以函数长度 圈复杂度 他设了极严的上限
  173. 8:05约束agent 是为了让它跑得顺
  174. 8:07有人嘲讽他 你已经不算工程师了
  175. 8:10他回 我才是工程师 因为负责的人 是我
  176. 8:13西班牙工程师Carrión看得最透
  177. 8:16Bob根本没放弃审查 他把审查 上移了一层
  178. 8:19眼睛从语法 挪到关卡设计
  179. 8:21说到这儿 两边的牌都摊开了
  180. 8:24你注意一个被忽略的事实
  181. 8:26两个人的前提 一模一样
  182. 8:27都承认审查带宽是稀缺资源
  183. 8:30都承认逐行阅读撑不住产量
  184. 8:32分歧只在怎么应对这个上限
  185. 8:35Lemmer-Webber的答案是收缩
  186. 8:37自控靠不住 就别高估自己 能不用的地方 就不用
  187. 8:40审查预算 留给要命的代码 Bob的答案是改造
  188. 8:44人审撑不住 就把信任搬家 搬进验证体系里
  189. 8:47人只守最高杠杆的几个点 再抛一个争议观点
  190. 8:51我觉得Lemmer-Webber会赢道理 但Bob会赢历史
  191. 8:54你押哪边 打在公屏上 那落到你身上 该怎么办
  192. 8:58我给你一个能直接用的框架
  193. 9:00别再问 这段代码我要不要读 这个问题太粗了
  194. 9:03它默认所有代码一视同仁
  195. 9:05也默认你只有读和不读两个选项
  196. 9:07两个默认 都该扔了 换成三个问题 像走决策树
  197. 9:11第一问 它出错的时候 谁会第一个发现
  198. 9:14如果是测试当场报警 审查压力就小一档
  199. 9:17如果要等到用户投诉 压力直接拉满
  200. 9:20第二问 从出错到发现 要隔多久
  201. 9:23十分钟能定位的问题 和三个月后爆雷的问题
  202. 9:26完全是两种生物 第三问 发现之后 代价有多大
  203. 9:30改一行就修好的 和数据污染 资损 合规事故
  204. 9:33也完全是两种生物 三问走完 答案自己分层
  205. 9:36发现快 代价小的代码 交给测试体系去守
  206. 9:40发现慢 代价大的代码 你的逐行审查 就砸在这里
  207. 9:44这就是审查预算的分配逻辑
  208. 9:46三个问题的本质 是定价 给发现速度估价
  209. 9:49给事故代价估价
  210. 9:51综合起来 定出这段代码的审查等级
  211. 9:54你的认真阅读 是有限资源
  212. 9:56花在检测慢 代价大的地方
  213. 9:58剩下的地方 用关卡围起来
  214. 10:00举个具体的例子走一遍 你写了一个临时脚本
  215. 10:04每周跑一次 整理报表 第一问 出错谁发现
  216. 10:07第二天看报表就知道 第二问 隔多久 一天
  217. 10:10第三问 代价多大 重跑一次 三问走完 这种代码
  218. 10:14扫一眼都嫌多 再看另一个极端
  219. 10:17支付回调的验签逻辑 出错谁发现 可能没人发现
  220. 10:20隔多久 可能几个月 代价多大 资损加合规
  221. 10:24这种代码 逐行读 反复读 再找两个人交叉读
  222. 10:27还是这位Carrión 他在Mercadona Tech遇到过
  223. 10:30一个更能说明问题的案例 四个AI辅助完成的PR
  224. 10:34功能正确 测试全绿
  225. 10:36却把同一条商品家族业务规则 复制了四遍
  226. 10:39测试没有报警 是人工阅读发现了结构性重复
  227. 10:42这个案例值得停下来想一秒 测试能验证当前行为
  228. 10:46但一条业务规则该存在几份 测试替你拿不了主意
  229. 10:50这种结构性判断 恰恰是人审最该花钱的地方
  230. 10:54落地动作 说四个 第一 盘点你的项目
  231. 10:57拿刚才那三个问题 把核心模块过一遍
  232. 11:00你很可能会发现 审查时间一直花错了地方
  233. 11:03第二 跑一次变异测试 先挑一个核心模块
  234. 11:06让变异测试工具自动生成变异
  235. 11:08看关键变异能不能被测试杀死
  236. 11:11如果大量关键变异存活 说明测试还需要补强
  237. 11:14第三 把约束写进CI 别写进prompt里
  238. 11:17prompt是口头约定 agent转头就忘
  239. 11:20再把检查设成合并必过项 不过关 就不允许合入
  240. 11:24函数长度 圈复杂度 覆盖率阈值
  241. 11:27全部做成自动关卡 第四 记住Moura那条规则
  242. 11:31不读的权利 要逐类赢得 同一类变更
  243. 11:34连续30个干净的PR 这一类才能进免读车道
  244. 11:37翻一次车 重新计数 想抄作业的 有现成轮子
  245. 11:41GitHub上有个old-coder开源Skill
  246. 11:43理念直接取自Bob Claude Code Codex CLI都能用
  247. 11:47最后泼一盆冷水 我认为 Bob那套能转
  248. 11:50离不开超过55年的底子
  249. 11:52他设计得出关卡 也看得出洞
  250. 11:54新手直接抄不读两个字 大概率是灾难
  251. 11:58先赢资格 再谈放手 回到开头那道题
  252. 12:01几位熟悉安全威胁的资深审查者
  253. 12:03100行已知有bug的代码 找不全 不丢人
  254. 12:06丢人的是假装自己找得到 这场7月的大争论
  255. 12:10表面在吵读不读 但真正值得带走的
  256. 12:13是两边各自的盲区 先看Lemmer-Webber这一侧
  257. 12:16她诊断出了病 没开出药 收缩 管住的是自己
  258. 12:20管不住同事甩来的PR 管不住整个行业的惯性
  259. 12:23她自己都承认 你躲不开
  260. 12:25那躲不开的人 明天上班怎么办 她没有回答
  261. 12:28再看Bob这一侧 关卡也有关卡的天花板
  262. 12:32测试能暴露缺陷 不能证明缺陷不存在
  263. 12:35模糊测试和属性测试 能扩大搜索范围
  264. 12:39规格之外的盲区 依然存在
  265. 12:41那个hard bug漏过了人眼
  266. 12:43也可能漏过一套想当然的测试
  267. 12:45他的关卡能拦住不少代码层面的错误
  268. 12:48却防不住规格本身就想错了 递归追问问到头
  269. 12:52真正兜底的 很可能还是他55年的判断力
  270. 12:55这套药 药引子是他自己 流程别人抄得走
  271. 12:58药引子抄不走 你看 两个人的终点
  272. 13:00指向同一个缺口 生成能力涨得再快
  273. 13:03理解能力的增长 远远落在后面 过去的软件工程
  274. 13:07建立在一个默认假设上 写的人懂 审的人懂
  275. 13:10责任 跟着理解走 现在理解跟不上产量了
  276. 13:14这个假设 开始松动
  277. 13:15真正值得每个程序员想的问题是
  278. 13:17责任 还要不要跟着理解走 如果还要
  279. 13:20那你点击合并的那一刻
  280. 13:22你懂的到底是代码 还是流程 如果不要
  281. 13:25出事故那天 锅又该跟着什么走
  282. 13:28跟着签字 跟着流程 还是跟着那个写代码的AI
  283. 13:32责任到底该跟着理解走 还是跟着流程走?
  284. 13:34行业还没有形成共识
  285. 13:36但它迟早会摆到每个团队面前
  286. 13:38可能是下一次线上事故 也可能是下一份责任协议
  287. 13:42在那一天到来之前 你至少能做一件事
  288. 13:45看好自己那点审查预算 花在真会出事的地方
  289. 13:48我自己其实挺矛盾 承认惯性是真的
  290. 13:51也见过关卡拦住蠢代码 拦住那一刻 是真香
  291. 13:54评论区留两道题 第一道小的
  292. 13:56每天只有一小时认真审查 你花在哪个文件上
  293. 14:00第二道大的 责任该跟着理解走 还是跟着流程走
  294. 14:03敢不敢说出你的真实想法 觉得有收获 一键三连
  295. 14:07点个关注 我是为什么叫QQ 我们下期接着聊

About this transcript

This page contains the full transcript of 《代码整洁之道》作者不读AI生成的代码!审查能力,正在被AI重新定价 by 为什么叫QQ, generated from the public captions YouTube serves with the video. The transcript has 671 words across 295 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.