🎙️AI 访谈库
与 Boris Cherny 聊 Claude Code 是怎么造出来的
Boris Cherny · Anthropic Claude Code 创造者/负责人

与 Boris Cherny 聊 Claude Code 是怎么造出来的

Building Claude Code with Boris Cherny

2026-03-04 · The Pragmatic Engineer (Gergely Orosz) · 1h37m · 约 94 分钟读完 · 原文
逐层拆解 Claude Code 的构建史:从内部副业到核心产品,以及并行 agent、PR 结构与确定性 review 模式等团队工程实践。看点:当工程师不再亲手写大部分代码,代码评审与工程流程要如何重构——外加 Claude Cowork 的构建幕后。

你和 O'Reilly 合著了有史以来第一本 TypeScript 书。没错。我在日本一个小镇上发现了那本书的日文译本。那一刻简直太酷了。然后我才意识到,我根本不记得 TypeScript 了。现在我们已经到了这样一个阶段:Claude Code 平均写了 Anthropic 大约 80% 的代码。我每天大概提交 10 到 20 个 pull request。每一个 pull request 里 100% 的代码都是 Opus 4.5 和 Claude Code 写的。我没有手动编辑过一行代码。

Andrew Carpet 发帖说,作为程序员,他从未像现在这样感觉自己如此落后。这也是我非常挣扎的地方。模型迭代得如此之快,以至于适用于旧模型的思路可能对新模型不再有效。我对当下这个时代有一个比喻:15 世纪的印刷机。当时有一群会写字的抄写员,而雇佣他们的国王中有些人根本不识字。想想看抄写员后来怎么样了——他们不再当抄写员了,但现在出现了一类叫做作家和作者的人。这群人如今存在了。而他们之所以能存在,是因为文学市场大幅扩张了。

如果你加入了世界顶尖 AI 实验室之一,结果你的第一个 pull request 被拒了,不是因为代码写得差,而是因为你是手写代码的,会发生什么?这正是 Boris Cherney 加入 Anthropic 时的经历。Boris 是 Claude Code 的创造者和工程负责人。在加入 Anthropic 之前,他在 Meta 待了七年,负责 Instagram、Facebook、WhatsApp 和 Messenger 的代码质量,也是公司最高产的代码作者和代码审阅者之一。

在今天的节目中,我们会聊到 Claude Code 如何从副业项目成长为增长最快的开发者工具之一,以及 Anthropic 内部关于是否发布它的争论。Boris 每天发布 20 到 30 个 pull request、零手写代码的日常工作流,以及当 AI 包办一切时代码审阅是如何进行的。为什么 Boris 认为我们正经历一个堪比印刷机诞生的变革时代,以及现在哪些工程技能更重要、哪些不再重要。如果你想了解最接近 AI 编程 agent 的人今天实际上如何构建软件,以及这对我们其他工程师意味着什么,本期节目就是为你准备的。

本期节目由 Statsig 呈现,这是一个集成了 flags、analytics、experiments 等功能的统一平台。查看节目备注,了解更多关于 Statsig 以及我们本季其他赞助商 Sonar 和 WorkOS 的信息。

你是怎么进入科技、软件工程和编程这一行的?这得从很久以前说起。我觉得有两条平行线最终交汇到了一起。大概在我 13 岁左右的时候,我开始在 eBay 上卖旧的 Pokémon 卡片。我发现 eBay 上其实可以写 HTML。我看着别人的 Pokémon 卡片 listings,发现有些人的页面有大号字体、彩色文字之类的东西。然后我发现了 blink 标签。那个叫什么来着?是 blink 标签吗?我给卡片加上了 blink 标签,就能卖 99 美分而不是 49 美分之类的。所以我就这样接触到了 HTML,后来又买了一本 HTML 的书,正式学了一下。

第二件事大概也是在初中的时候。我们那时候有老式的 TI-83 图形计算器,数学课要用。我意识到,如果我把数学考试的答案编程输进计算器,就能考得更好。于是我写了一些小程序。一开始只是录入答案,后来考试变难了,我就得写解题程序而不是直接存答案,因为我事先不知道系数之类的具体数值。再后来,第二年数学更难了,为了让程序跑得快一点,我从 BASIC 降级到了 assembly。哦,所以你高中就开始用 assembly 了?我觉得是初中或高中的时候,可能是八年级或九年级左右。

然后我意识到,班上所有人开始发现我有这个解题程序,他们有点嫉妒。于是我买了一根小串口线,这样也能传给他们。结果下一次数学考试,全班都拿了 A。老师就说:“这是怎么回事?”最后她发现了,就说:“好吧,这次放过你,下不为例。”但对我来说,这非常实用。

你知道,我在学校学的是经济学。其实我辍学去创业了。我从来没想过编程会成为职业。它对我来说一直很实用。编程是一种手段,用来构建东西、做出有用的东西。第一个创业公司是这样的:我和朋友们想搞到大麻,于是我们就做了一个大麻点评网站。我们做了个网站,联系了一些不同的 dispensary,我想是这样。然后我们试图拿到大麻样品,好帮它们写评测。结果它居然火了。当时根本没人检测这些东西,于是我对化学检测、化学分析产生了兴趣。

之后我又做了一堆其他创业公司。然后我相当早就加入了 YC,成为了一家位于 Palo Alto 的 YC 创业公司的第一位员工。

你是怎么决定一家接一家地创业的?靠感觉,真的。因为你知道,创业从来不是一条线性路径,你总是要转型、转型、转型。你得搞清楚市场和用户想要什么,而这永远不是你一开始想的那样。你总会去尝试,但想法始终只是一个假设,然后几乎总是得转型一次、两次、三次。

在那家叫 Agile Diagnosis 的医疗软件公司就是这样,那是一家比较早期的 YC 公司,大概是 2011 或 2012 年左右。那是给医生用的医疗软件。想法是这样的:医院里有一种临床决策方案,不同医院之间差异很大。芝加哥有一家医院的心脏症状处理方案特别好,我们就想,如果全美每家医院都用同一套方案,治疗效果会不会更好?于是我们试图把它标准化。我们做了一款决策树软件,给医生使用。我写了一部分软件,团队其实就我们几个人,非常小。软件是在浏览器里运行的。我记得那时候医院还在用 Internet Explorer 6。我写了一个 SVG 渲染器,因为这是一个可视化的决策树。我们发布了产品,然后看 DAU 图表,结果 DAU 是平的,我们搞不懂为什么。

当时我们正在和几家医院试点,包括 UCSF。我们那时候在 Palo Alto。我那时候骑摩托车,就骑上去 UCSF,跟着医生观察了几天,看看他们到底怎么用。然后我发现,医生其实根本没时间坐下来用电脑,因为你刚看完一个病人,可能只有 5 分钟就要看下一个。在这 5 分钟里,你得走过走廊,到电脑工作站,打开一台老旧的电脑。等它开机就花了 3 分钟。然后打开 Internet Explorer 6 又要 30 秒。再打开我们做的那个应用。

你得先登录。5分钟时间就到了,你根本来不及用。于是我们把所有东西重写了一遍,让它能在 Android 上运行,但他们还是不用。后来我们意识到,医生身边总是跟着一群住院医师。在这种场合下,这其实是一种社交场景,对吧?关键是他们得维持权威形象,不想被人看到自己在玩手机。然后我们又 pivoted 了一次。那时候我们就想,好吧,也许医生不是目标用户,实际上我们想让护士、放射科技师之类的人用它。那时候我就离开了,因为我想,这离我想做的事已经差太远了。

这大概是我觉得最有趣的事——找到产品市场契合点,因为它总是充满意外。你不可能抱着一个宏大创意不放,因为那个创意很可能是错的。所以你要形成假设,深入探索,看看什么是对的。

另外,我觉得你讲这个故事的方式很有意思,因为我觉得在很多成功故事的背后,我们听到的都是成功故事本身,是它如何发展的路径。但首先,很多创业公司都是这样的;其次,让我印象深刻的是,你当时是被聘为软件工程师的,对吧?那时候还没有产品工程师之类的说法,这也是我们现在在讨论的。但你就是骑着摩托车去了那里,跟着那些人观察,了解他们怎么使用、为什么不用,从中获得想法。

我觉得,这就是当时乃至今天优秀软件工程师的特质,对吧?你似乎并不专注于技术本身,而是专注于最终成果。

是的,你看,工程师有很多种,做事的方式也有很多。甚至在我们现在的团队里,你看像 Jared Sumner 这样的工程师,他的技术头脑简直不可思议。他比我见过的任何人都更懂系统。你需要这样的人,需要这种深度。但对我来说,工程一直是很务实的事。而且我一直是个通才。不管是做设计、工程、用户研究还是别的什么,我都觉得无所谓。

AI 与软件工程的投资逻辑很简单:随着 AI 写出更多代码,就有更多代码需要被验证。但问题在于,AI 生成的代码平均而言比人类写的代码更难验证。这就是 Sonar(SonarQube 的开发商)存在的意义。作为 AI 时代关键的验证层,Sonar 确保 AI 带来的速度与规模不会以牺牲代码库质量为代价。Sonar 的竞争优势建立在 17 年专业经验之上,这是任何基础模型都无法复制的。我们说的是深度分析引擎,比如符号执行和跨仓库数据流追踪,它们模拟的是代码的实际行为,而不只是表面内容。

为了弥合 AI 生产力与代码质量之间的鸿沟,Sonar 发布了 SonarCube MCP server。这款工具充当 AI 应用与 SonarCube 平台之间的通用翻译器。通过使用 model context protocol,它让 Cloud Code、GitHub Copilot 和 Cursor 等 AI 工具直接访问 SonarCube 的分析能力。无需在上下文之间来回切换,你的 AI agent 就能成为全方位的代码审查与质量保证 copilot,能够分析代码语法问题、按严重程度过滤 bug,甚至在你提交代码前就检查项目的 quality gate 状态。

无论你是使用编程助手,还是通过 agent workflow 进行规模化开发,Sonar 都能提供自动化验证——75% 的 Fortune 100 企业都依赖它。它让开发者能够自由创新,不必担心破坏代码库。访问 sonarsource.com/pragmatic,了解更多关于 Sonar 如何让你有信心以 AI 的速度进行开发。说完这个,让我们回到 Boris 的职业生涯,以及他在创业公司学到的经验。

我的第一份工作,我想应该是 16 岁那年。我当时就想买一把电吉他。于是我就开始接自由职业的项目。我想,好吧,那我大概可以做网站。那时候 Fiverr 应该还不存在,所以有一些别的自由职业网站。我就建了个网站,开始竞标项目。第一笔薪水我全拿去买了电吉他。但这其实很务实,对吧?因为在这种模式下,你既要搞工程,又要做账,又要做设计,还得跟客户沟通。所以我一直都是这样的。

在经历了这几家创业公司之后,你最终去了 Facebook,现在叫 Meta。你在那里待了 7 年。能给我们讲讲你在那里做了什么、学到了什么吗?你的职业发展也非常瞩目,7 年内晋升了四次。这段经历给你带来了什么?

是的,我最初做的是 Facebook groups。那是 Vlad Kolesnikov 招我进去的,我想他其实还在 Facebook,只不过现在在某个别的团队。那其实挺酷的。当时跟我一起合作的有一大群人,都是早期搞 JavaScript 的。我也做了很多 JavaScript 相关的事,有趣的是我一直跟这些人有交集。Vlad 做过 Bolt JS,就是支撑 Ads Manager 的那个框架,后来演变成了 React JS。

我一直跟这些人有交集,后来还有更多这样的人。但总之,我当时在做 Facebook groups。我对这个特别兴奋,是因为它有连接人们与社区的使命,这正是吸引我的地方。那时候我也是 Reddit 的重度用户。我从十几岁就开始用 Reddit,因为我不认识其他会编程的人。甚至到了大学,我也不太认识会编程的人。说实话,我一直对此有点难为情,因为我觉得这是很宅的事。我会这个,但又想做个酷小孩,所以没法跟人说我写代码。

太宅了。后来有一天我在 Reddit 上发现了一个编程社区,我简直震惊了。原来还有其他人也喜欢这个。这爱好多奇怪,多小众啊。能找到志同道合的人、获得这种联结,让我特别兴奋。所以我就想做这个,想以某种方式为此出一份力。于是我在 Facebook groups 做了一段时间。然后还有一堆别的项目,如果你感兴趣我可以细说。最终我成了 Facebook groups 的 tech lead。逐渐成长起来,工作范围也变大了。

工作重心从搭建系统变成了大量写文档、协调和委派给别人。当时文化也在变。Facebook 早期的那种文化正在消失。文档越来越多,对齐会议也越来越多。在隐私、安全这类基础工作上的投入大了很多。说实话,早期为了增长确实走了很多捷径,但到某个阶段你就得还这笔债。

那件事就是那时候发生的。之后我在 Instagram 待了几年。那也是个有趣的故事。我妻子收到了一份工作邀请,她特别兴奋,过来跟我说:“嘿,我拿到了这个 offer,但我们要搬家,可以吗?”我说:“行啊,没问题,你知道的,我做科技行业,在哪儿都能远程办公。工作在哪儿?”她说:“在奈良。”我说:“奈良是哪儿?”奈良就是日本的乡下。那时候——

时差不一样,对吧。

差了大概 12 个小时之类的。

大概是那样,没错。那是 2021 年左右。

哇。

然后我试着找一个愿意接收我的团队,因为人力资源那边有些很古怪的规定,比如你所在的时区、必须和团队同地办公之类的。当时东京有一个刚起步的小团队,是 Instagram 在那边的分支。Will Bailey 带这个团队,他也是做了 Instagram Stories 的人。所以他有一段时间是我的经理。我们决定一起壮大这个团队,我在奈良远程办公,团队大部分人在东京。那段时间我在 Instagram 上折腾东西,技术栈简直让人抓狂。

Facebook 拥有全世界最好的 Web 服务技术栈,从 Hack 语言到 HHVM 运行时,再到 GraphQL 作为传输层,还有 Relay 这些客户端库,所有东西都被优化到了极致,再加上 React,太惊艳了。全世界没有比这更好的开发栈了,完全是高度优化的。结果我到了 Instagram,用的是 Python,类型检查器跑不通,点击跳转定义也跳不了。就是东拼西凑的 Django,再 fork 一个 CPython 运行时,基本上什么都不好用。

所以我到了 Instagram 之后,加入了在日本的 Labs 团队,初衷是给 Instagram 寻找下一个大机会。我们尝试了一些东西,但我很快意识到,在这个技术栈上干活效率太低了,因为它太烂了。于是我就去搞 Dev Infra,因为必须把它修好。我们做了几个项目,一个是把 Python 迁移到 Facebook 那个庞大的单体代码库里,另一个是把 Instagram 的 GraphQL 迁移过去。

这些项目其实都还在进行中,这种迁移需要几百个工程师花很多年才能完成,代码库很大,迁移量很大。

现在应该快多了吧。

对,有了我们现在这些 AI 工具,迁移简直是它们的绝佳应用场景。

没错,这简直是 AI 工具最理想的用武之地。

然后我就开始越陷越深。到我离开 Instagram 的时候,我一直在做 Dev Infra,还牵头了其中不少迁移项目。也是在那段时间我认识了 Fiona Fung,她现在是 Quad Code 团队的经理。我跟她共事过,她是一位非常出色的领导者,在技术领域有着极深的积淀和背景。我当时就觉得,没有比她更适合带这个团队的人了。后来我也开始涉足代码质量方面的工作,所以在 Instagram 的职责范围扩大了一些。

等我离职时,我已经在牵头整个 Meta 的代码质量工作了。我要对 Instagram、Facebook、Messenger、WhatsApp、Reality Labs 这些代码库的质量负责。Meta 内部有个项目叫 Better Engineering,我记得大概是 2016 或 2018 年启动的。Zuck 规定公司每个工程师必须用 20% 的时间来偿还技术债。

哦,有意思。

我们把它叫做 Better Engineering。

嗯。

其中一部分是自下而上的,毕竟团队最清楚自己有哪些技术债要还;另一部分则是自上而下的,比如需要做大型迁移,迁移到新的语言特性、新框架之类。以 Facebook 的体量,每年这类迁移就有成千上万个。于是我就牵头做这些,很快发现需要更有条理一些。当时没有目标,没人知道最终要达成什么结果,也没有追踪机制。所以我们开发了一套东西。其中一个想法是用集中化的方式来给各类代码质量工作排优先级;第二件事是弄清楚代码质量对工程效率的影响,结果发现影响非常显著。

你们怎么衡量的?发现了什么?

有很多方法。我觉得其中一些已经公开发表了,但不确定是不是全部。本质上我们是做因果分析和因果推断,这是方法论。你试图找出那些让工程师更高效的因素,有些是代码质量,有些则无关。比如 Meta 后来要求回办公室、不再居家办公,部分原因就是出于这个研究。因为我们发现了一些相当强的相关性,而且我们认为这是因果关系。

明白了。

关于这个,代码质量其实能给生产力带来两位数的百分比贡献,即便在最大规模下也是如此。

听到这个挺让人安心的,因为我觉得很少有地方真的会去度量这个,但我们都能感觉到。代码库干净、模块化,用起来就更顺手,而且我觉得对 LLM 来说可能也更容易处理,我的直觉是应该会更简单,对吧?只是目前数据很少,但这是我个人的感觉。

对,很多大公司都发表过这方面的研究,Facebook 发过,Microsoft 发了不少,Google 也有。不过完全同意。如果你每次做一个功能都要想,我到底用框架 X、Y 还是 Z?这些选项之所以都存在,是因为代码库处于部分迁移状态,各种框架的代码还散落在各处。作为工程师,你会很难受;作为新人,你也会很难受;作为模型,你可能会选错,然后用户就得来纠正你。所以实际上最好的办法就是始终保持代码库干净。一旦开始迁移,就要确保把它做完。这对工程师很好,到了现在,对模型来说也同样重要。

然后你加入了 Anthropic。我听过一个故事,你可以证实一下,或者多讲点细节——据说你的第一个 pull request 被 Adam Wolf 拒了。

他当时是我的 ramp up buddy。

所以我加入了 Anthropic。当时我在考虑接下来该做什么,见了各大实验室的很多人,而 Anthropic 对我来说是不二之选,因为它的使命。这是我个人最看重的东西。而且面对正在发生的所有这些变化,我们需要某种框架来思考这件事,思考我们在其中的角色。我还是个科幻小说迷,那绝对是我的最爱。我很爱读书,家里有一个巨大的书架什么的。我太清楚这事如果搞砸会有多糟。所以我觉得 Anthropic 是一个真正有严肃思考者的地方。

人们非常重视这件事,并思考我们能做些什么来让事情进展得更顺利。所以,当我加入 Anthropic 时,我做了一些上手项目,就是各种我在捣鼓的东西。我亲手写了我的第一个 pull request,因为我觉得代码就该这么写。过去确实是这样写代码的。但即便在当时的 Anthropic,也已经有一个叫 Claude 的东西了,它是 Claude code 的前身。它非常简陋,是用 Python 写的,启动要花 40 秒,属于研究性质的代码,并不具备 agentic 能力。

但如果你非常仔细地提示它,并且用对方法,它就能帮你写代码。于是,Adam 拒绝了我的 PR,他说:“其实,你应该用那个 Claude 工具来做。”我说:“好啊,酷。”我花了大概半天时间才搞明白怎么用这个工具,因为你得传入一堆参数,还要正确使用它。但之后它直接交出了一个能用的 PR,一次性就搞定了。哦,这大概是 2024 年,9 月或 8 月左右。我觉得对我来说,这是我在 Anthropic 第一次感受到 AI 的时刻。

我当时就想,天哪,我完全不知道模型能做到这个程度。我一直习惯了 IDE 里那种 tab 补全、行级别的补全。我完全没想到它能直接给我做出一个能用的 pull request。

刚才 War 提到他在工作中使用他们的 AI 模型时有过一次真正的“哇”时刻。另一种非常不同的“哇”时刻是,当你在工作中使用一个工具,它让事情变得前所未有的简单。这就自然引出了我们的赞助商 Statsig。Statsig 为工程团队提供实验和特性开关(feature flagging)工具,这类工具过去需要数年的内部开发才能建成。它复杂到只有 Meta 或 Uber 这样的大公司才有自己的定制化高级工具。

Statsig 的实际使用场景是这样的:你发布一个改动,先把它放在特性门(feature gate)后面,逐步灰度发布,比如先推送给 1% 或 10% 的用户。然后观察效果。不只是看有没有崩溃,而是看它对你关心的指标有什么影响:转化率、留存率、错误率、延迟。如果看起来有问题,你很快就能关掉;如果趋势向好,就继续推进。关键在于,度量是工作流的一部分。你不需要在三个工具之间切换,事后再去匹配用户分群和仪表盘。

特性开关、实验和分析都在同一个地方,使用相同的底层用户分组和数据。这就是为什么 Notion、Brex 和 Atlassian 等公司的团队都在使用 Statsig。Statsig 有慷慨的免费版可以入门,团队专业版定价每月 150 美元起。想了解更多并获取 30 天企业版试用,请访问 static.com/pragmatic。说完这些,让我们回到 Boris 和 Claude code 的起源故事。

**主持人**:是的,你加入 Anthropic 的时候,我们在一期深度访谈里聊过,但可以简单回顾一下 Claude code 是怎么诞生的,它最初看起来就像一个 side project 或者一个很酷的 hack。

**Boris**:是的,我一开始在捣鼓各种东西。我在做一些产品方面的工作。还短暂地做了强化学习,为了理解我所构建的东西下面的那一层。这至今是我给很多工程师的建议:永远要理解你下面那一层。这非常重要,因为它能给你深度,让你在实际工作的层面上有更多杠杆可以撬动。这是 10 年前的建议,今天依然适用。只是“下面那一层”现在有点不一样了。以前是说,如果你写 JavaScript,要去理解 JavaScript 虚拟机和框架之类的东西。现在则是要去理解模型。

所以我当时在捣鼓各种东西,有些发布了,有些没有。某个时候,我只是想了解一下 Anthropic 的公开 API,因为我从来没用过。我不想做 UI,只想快速 hack 点东西,因为当时还没有 Claude code,我们还在手写代码。我写了一个小小的 bash 工具,它做的就是调用 Anthropic API,本质上是一个基于聊天的应用,但跑在终端里,因为以前的 AI 就是这样。我现在仍然这么认为:工程师是最早的采纳者。

所以当我们从对话式 AI 转向 agentic AI 时,花了一点时间,但工程师们很快就理解了。我觉得现在如果你问非工程师 AI 是什么,他们会说这是一种对话式 AI,是聊天机器人之类的东西。这也是为什么我对我们新推出的产品 co-work 非常兴奋,因为它会把工程师很早以前就看到的东西带给其他所有人。

但当我想到 co-work 时,我会回想我们此刻聊到的这个非常早期的时刻。Claude code 最初不是 Claude code,它是一个聊天机器人。因为那就是我当时对 AI 的理解。但我们得去弄清楚,下一步是什么。所以我当时做了这个聊天机器人,它有点用,但只是个聊天机器人。接下来我尝试的是让它使用工具。因为 tool use 刚出来,我还不知道它是什么。我就想,做个实验吧。我给了它一个工具,就是 bash 工具,我也不知道拿这个 bash 工具做什么。

于是我就问它——其实我当时都不知道它能不能做到——我问它:我在听什么音乐?然后它就写了一段小小的 AppleScript 程序,用 sed 之类的命令,打开我的音乐播放器,然后查询我正在听什么歌。用 Sonnet 3.5 一次性就搞定了。这实际上是我的第二个 AGI 时刻,离第一个没过多久。我意识到,模型就是想用工具。这就是我发现的:如果你给它一个工具,它会想办法用它来完成任务。

我觉得当时人们在用 AI 做编码时的思路,基本上都有这样的心智模型:你把模型放进一个盒子里,然后去想界面应该是什么样的,你想怎么跟这个模型交互,你需要它做什么。本质上就像,如果你有一个程序,你 stub 出一些模块、一些函数,然后说“好了,这部分现在是 AI。”除此之外,剩下的程序还是普通程序。但这种思考方式是不对的。正确的思考方式是,模型就是它自己的东西。你给它工具,给它可以运行的程序,让它运行程序,让它写程序。但不要把它当成这种更大系统的一个组件。我觉得这就像是“苦涩的教训”(bitter lesson)的一个版本。“苦涩的教训”是一个非常具体的表述,但它有很多推论,这就是其中之一:让模型自己发挥,别试图把它塞进盒子里,别试图强迫它以特定方式行为。

**主持人**:你最早看到的方式就是给它工具,给它 bash 的权限,然后是文件系统,再到更多工具,对吗?

**Boris**:没错。是的,我们给了它 bash,然后——我说“我们”,其实前三个月只有我一个人,后来团队才壮大起来。所以先是 bash,然后是文件编辑,这是第二个。

上次深度访谈时我们聊到的一个有趣话题是,当你们把它做出来,它开始真正用你们手头的所有工具来写代码时,Anthropic 内部曾有一场争论:我们是不是应该把它留着自己用?因为它突然在整个工程团队里迅速铺开,让所有人的效率都大幅提升,对吧?

是的,没错。最终的决定是将其发布出去,以便我们能在真实环境中研究安全性。因为当你思考安全性——你知道,我一直在强调安全这个词——Anthropic 作为一家实验室存在的理由就是安全。这是它成立的原因,也是它存在的原因。如果你问 Anthropic 的任何人为什么选择这里,都是因为安全。所以,如果你思考模型安全,可以从不同层面来考量。有 alignment 和 mechanistic interpretability,这属于模型层面。

然后是 evals,有点像把模型放进培养皿里,用这种方式进行合成研究。接着你可以在真实环境中研究它,观察它的实际表现,观察用户如何谈论它,你能看到真实环境中存在哪些风险,而且通过这种方式能学到很多。正因如此,我们得以让模型变得更加安全。所以事后看来,这完全是正确的决定。

从你的视角听到这些很有意思,因为从外部看,我和很多工程师看到的是:哦,Anthropic 发布了 Claude Code。哇。第一次发布是随着 Sonnet 4 一起推出的。它最初是随 Sonnet 4 发布的,还是 Sonnet 4.5?我想是随 Sonnet 4。那是二月份的正式发布,但我觉得在那之前就有研究预览版了。没错,但当它发布时,我的理解是:这东西写代码写得相当好。而且随着时间推移,它变得越来越强。

所以从我们的视角来看,它就像是一个能力很强的编程工具,我们开始采用它,用它来做各种越来越高效的事情。而且我相信,它已经成为增长最快的开发者工具之一。而我总是很惊讶地听到,它其实源于研究,目标是理解人们如何使用模型。因为另一方面,有些创业公司一直在刻意构建开发者工具以获取用户,然而这个研究工具却获得了更多的采用。

要知道,Anthropic 是一家研究实验室,是一家安全实验室。产品某种程度上只是附带的东西。产品存在的意义是为了让我们更好地服务于研究,让模型更安全。这就是我们看待一切事物的方式。早期还有一个有趣的时刻,当时我们做了一个发布评审,决定是否要发布它。我记得那一刻,因为我们在一个房间里。当时有 Mike Krieger、Dario,还有其他一些人,我们在讨论该怎么办。我们看着内部采用率的图表,那简直就是一条垂直线。

太疯狂了。要知道,现在已经是 100% 了,对吧?就是 100%。现在 Anthropic 的每一位技术员工每天都在使用 Claude Code,几乎是 100%。对于非技术员工,实际上也相当接近 100% 了,增长速度非常快。比如,销售团队里大概有一半人在用 Claude Code,而且我觉得这个数字还在增加。简直太疯狂了。Dario 当时问,怎么增长得这么快?你是不是在强迫大家使用?我说,没有。

我们提供这个工具,大家用脚投票。我们只是让人们使用他们偏好的工具。

是啊,你看起来也不像是那种会强迫别人用你的工具的人。

对对。我们的做法是,先把这个东西发布出去,然后倾听用户,和人交流,观察他们怎么用,跟进反馈,不断改进。是的,现在我们已经到了这样的阶段:Claude Code 平均写了 Anthropic 大概 80% 的代码。而且可以肯定,它写了我的全部代码。

是的,对你来说,这始于你第一次提到的时候,我想是在十一月左右,它开始写你所有的代码。这个转变发生在什么时候?是什么让你信任它来编写你的代码,或者说你有多信任它?比如,你会 review 多少代码?

这个转变是瞬间发生的,当我们开始内部测试 Opus 4.5 的时候。那是在它正式发布之前,我们自己 dogfooding 了一段时间。然后一下子就切换了。这个模型的能力太强了,我发现自己根本不需要再打开 IDE 了。我直接卸载了 IDE,因为那时候我已经完全不需要它了。其实我大概过了一个月才卸载,因为我甚至没意识到自己已经不用它了。

是的,一旦 Opus 4.5 对外发布,我们很多人都有类似的经历,尤其是寒假期间。我也有类似的经历,我意识到这东西写的代码——说实话,在我非常熟悉的栈里,在我了解的个人项目代码库中,写得和我自己写的一样好;而在我不那么熟悉的代码库或技术栈里,写得比我好得多。

是的,说实话,它写得比我好。我不想承认这一点。我还想保留点自尊,但很可能是真的。

对对。我意识到这一点还因为十二月份我出去旅行了一段时间,算是进行了一次编程度假。我们之前聊过这个,我去了欧洲,在不同的时区,有点像数字游民那样四处漂泊。特别有意思,因为我每天都在写代码,这是我最喜欢做的事。我大概每天写 10 到 20 个 pull request 左右。Opus 4.5 和 Claude Code 写了每一个的 100%,我没有手动编辑过一行代码。那个月底我意识到,Opus 大概给我引入了两个 bug。而如果是我手写的话,那可能会有,你知道,20 来个吧。

我们能聊聊你的开发工作流吗?你写过一些关于这个的 threads,太棒了。是在社交媒体 Threads 和 X 上。你能告诉我们,如今你如何使用 Claude Code 吗?比如并行处理,还有你和团队学到并在团队内互相分享的一些技巧和窍门?

好的,我的意思是,使用 Claude Code 没有唯一正确的方法。我可以分享一些技巧,但我认为错误的结论是直接照搬这些用法。我们构建 Claude Code 的方式是让它可被 hackable。因为我们知道每个工程师的工作流都不同。做事没有唯一的方法,不存在两个工程师有完全相同的工作流,每个工程师都不一样。

工作站设置也是,对吧?比如键盘、显示器摆放,这些每个人都不同。

是的,就像我们手艺人一样,对吧?你选择你的工具。我们对此非常在意。所以没有唯一正确的做法。对我来说,通常的做法是开五个终端标签页,每个都 checkout 一份代码库。也就是五个并行的 checkout。通常我会 round robin 在每个标签页里启动 Claude Code。几乎每次我都以 plain 模式启动,也就是在终端里按两下 shift tab。

终端标签页总是有限的,满了之后我也得溢出。以前我经常用网页端来处理,比如 quad.ai/code,那就是我溢出时去的地方。现在我其实用桌面应用,更方便。quad code 已经集成在我们的桌面应用里好几个月了,就是 quad app 里的一个代码标签页。我很喜欢它,因为它内置了 work tree 支持,这功能已经存在一段时间了,对并行工作很有用。你不需要多个 checkout,只需要一个,然后我们自动为你设置 Git worktrees,这样就能实现环境隔离。我这么做是因为我真的很讨厌在命令行里折腾 Git worktrees,因为太麻烦了。你得知道怎么 cd 和……

对于那些不太熟悉 worktree 的人来说,它是什么?

就是你可以执行 checkout,但不用单独的本地文件夹,更像是检出了一个独立的分支,对吧?然后你可以在上面单独工作,冲突只在合并时才出现。

没错。想象一下你有一个文件夹,Git 以非常廉价且易于丢弃的方式复制出五份,这样就能实现隔离,你可以并行工作,各个 quads 互不干扰。

对了,你知道这个功能的支持,我记得你们最近才加入原生支持?但对你的工作流来说,你还是沿用老办法,用单独文件夹 checkout,对吧?

是的,没错。其实随着时间推移,我越来越多地用桌面应用来做这些,因为我不需要那些单独的 checkout 了,我只需要并行运行一堆 quads,完全不用操心。另一个让我意外的惊喜是 iOS 应用。每天我醒来,就会在手机上启动几个 agent。

哦,是原生那个?

对,原生应用。就是 quad app,quad app 里的代码标签页,和 quad code 完全一样。

只不过它运行在云端,对吧?

运行在云端。所以你得稍微配置一下环境。你的环境比较简单,所以我们只用了 hooks,用 session start hook 来配置。这也是 quad code 做得非常 hackable 的好处之一,这种配置很容易做。说实话,这是我以前完全没想到的,因为我一直是在电脑上写代码。如果六个月前你告诉我,我会用手机写——我没拉数据——大概三分之一,甚至一半的代码,那太疯狂了。但我今天就是这么做的。

而且你用的是并行 agent。你是什么时候开始用它们的,这改变了你的工作方式吗?因为我自己注意到,我其实不会同时开那么多并行 agent,可能也就两个。但我是个喜欢掌控局面的人,尤其是用 Claude。Claude 这个工具你可以跟着它一步步看,它会告诉你它在做什么。你还可以用比如 learn mode,这个功能很早就上线了,你可以跟着它的思路走,它会给你分派任务。我觉得待在一个标签页里跟着看就行,模型速度也挺快的,我能跟得上。我猜你肯定也有过这种做法,但后来为什么转向并行了呢?你会觉得失控吗,还是其实没那么重要?

我觉得这可以分为两种模式,或者说两种工作流。当你刚接触一个新代码库时,learn mode 非常棒,强烈推荐。对于刚加入 Quack Co 团队的人,或者刚加入 Anthropic 的人,我们的建议是——如果你还没试过的话——输入 slash config,在 Quack Co 里选择输出样式,可以选 learn 或 explanatory。我们通常推荐 explanatory,因为对于你还没熟悉的新代码库,这个模式更好。

对我来说,一旦熟悉了一个代码库,你就只想提高效率,对吧?就想尽可能多地交付,而且想做得高效。所以角色就变了。我不再深入跟进具体任务,而是把 Claude 开到 plan mode,让它去启动某个任务。Opus 4.5 我觉得已经能做到这点了,4.6 就真的非常稳。只要计划做得好,它几乎每次都能 one-shot 完成实现。所以最重要的是来回沟通几次,把计划定对。我的做法是:开一个,进入 plan mode,给它 prompt。

它在跑的时候,我就去第二个标签页,再开一个 Claude,也进到 plan mode,让它跑起来,然后去第三个、第四个。等第一个完成时我收到通知,再回来看,然后继续跟进。

通知开着还是关掉?

其实我两种都用。有时候我在 Mac 上开 focus mode,就把通知关了,但有时候也会用系统通知。

你的 PR 产出也非常非常高。我的意思是,就连假期前后在社交媒体上都很明显,有人在报 bug 或提功能请求——我不确定是哪种——然后你一两个小时后就做好了,因为你亲自做了。你也提到过一天能发多少个 pull request,不是为了炫耀,只是作为背景。一个 pull request 通常涉及多大复杂度?有些是不是特别小,有些其实是比较大的工作量?

每个 pull request 差别很大。有时候几行,有时候几百甚至几千行,全都不一样。变化太大了。以前在 Instagram 的时候,我觉得按代码量算,我是全公司产出最高的一两名,或者前三。

哇。

所以我一直都写很多代码,编码是我表达自我的方式,也是我大脑的思维方式。现在我依然在做这些,但有了 quad code,如果你效率很高,PR 数量其实低估了实际发生的东西。因为我觉得以前没有 AI 助手时,那些高产工程师写的很多可能是 code migrations 之类的。所以有人一天发 20、30 个 PR,很多都是一行改动,或者把 A 迁移到 B 之类的。现在我每天也发 20、30 个 PR,但每个 PR 都完全不同。有些上千行,有些几百行,有些几十行,有些一行。没有一个是 code migrations,因为 Quad 直接做那些,我不需要参与。

提交这么多代码,或者说这么多生产环境代码,任何软件从业者都会想到一个明显的问题:review。以前团队的工作方式——我不确定 Instagram 是不是这样,但很多其他公司是这样——你提交一个 pull request,放上去,必须有人工 reviewer。在 Google,其实要有两个人,因为还有一个负责代码质量。这个流程是怎么变的?

Quad Code 团队如何看待代码审查,以及这种看法随时间发生了怎样的变化?

我先谈谈以前我是怎么做代码审查的。我以前也是代码审查量最大的人之一。

哦,这样啊。所以写代码和审查代码两方面都是。

我可能……对,对。写代码和审查代码都是。这其实是不同时区带来的好处之一。我不是超人,只是当时没有会议要开。我做代码审查的方法是,每次需要对某处写评论时,我就把它记到一张表格里,并描述这个问题。比如说,有人在函数里给参数起了个糟糕的名字,我就会记下来;如果有人用了不好的 React 模式,我也会记进去。随着时间推移,我会统计这张表,当某一行出现超过三四次时,我就会为它写一条 lint rule,也就是用静态分析来自动化掉。以前就是这样。我一直试图把自己自动化掉,因为有太多事情要做。这是我们作为工程师的超能力之一——我们能够把所有繁琐的工作自动化。很少有其他领域能做到这件事,这是我们独有的能力。而且我一直很喜欢这样做,因为这给我更多空闲时间,让我去做真正享受的工作。

如今的做法看起来有些不同,但本质上还是类似的。当 Quad Code 写代码时,它通常会在本地运行测试——这是 Claude 在相关场景下经常自主决定去做的事,或者它会写新的测试。你会做这种验证。当我们修改 Claude Code 时,Claude 也会自我测试。它会以子进程的方式启动自己,进行自我验证,并进行端到端自测。

这是指你们内部 Claude Code 的实现。所以你们有一套测试套件,让它能自我测试。

对,没错。但它 literally 只是在一个 bash 进程里启动自己,然后看看"嘿,我还能正常工作吗?"它会做这件事。而且这完全不是我们编码指定去做的。特别是在 Opus 4.5 上,它就是自发开始这么做的。它就是想检查一下。所以我们这么做,然后还会运行 Claude-P。这是 Claude agent SDK,跑在 CI 里。Anthropic 的每一个 pull request 都会由 Claude Code 进行代码审查。这大概能 catch 住 80% 的 bug 左右。这是第一轮代码审查。Claude 会自动处理其中一些问题,有些则会留给人类,因为它不确定该怎么做。总会有工程师来做第二轮代码审查。而且必须有人在闭环中批准变更。

嗯。所以在团队里,任何东西上线之前,都会有工程师看过。

是的。

你考虑到代码审查时,会觉得每种项目都要这样做吗?还是说这只是因为你们现在知道它有真实世界的影响,人们依赖它,而且用户量很大。我换个方式问:你能想象在什么场景下可以不需要工程师审查代码吗?会是什么情况?

我觉得这取决于具体的使用方式。

是的,我同意。比如你在做一些个人 side project,你可以直接 YOLO 提交到 main 分支,对吧?甚至在 AI 出现之前,你也不会去审查。你就相信自己,或者直接部署到生产环境,或者 SSH 到生产环境改点东西。就是这类情况,对吧?

完全正确。Claude Code 最早的内部版本,我也是直接提交到 main 的。但一旦有了用户……对 Anthropic 来说,我们的主要客户群是企业,这是我们最重视的。出于安全考虑,security 非常重要,privacy 也很重要。这些都是相互关联的,对我们的客户来说也非常重要。所以因为这是一个 enterprise 产品,它必须安全,我们必须确保它达到一定的标准。因此,我们确实大量使用了自动化,但至少目前,必须有人类在闭环中把关。

关于 LLM 有一点是众所周知的,就是它们是非确定性的。如果把 LLM 作为审查者,让 Claude 来做 review,它确实能给出很好的反馈,但你怎么处理这个问题——你无法确定它是否总能给出反馈,也无法确定即使它有能力发现某个问题,它就一定会发现。你们在这个流程里有没有做什么确定性的事情?比如 linting 就是非常确定性的,你肯定很清楚。你们有没有考虑把这些思路结合起来,或者说,你们会在代码库上用 linter 吗,还是觉得自己不需要?

有的,绝对有。我们有 type checker,有 linter,会跑 build。Claude 其实非常擅长写 lint rule。所以实际上,我以前是把东西统计在表格里,现在呢,当同事提交了一个 pull request,我觉得"这可以用 lint 来解决",我就会 @ Claude,请它在这个 PR 里写一条 lint rule。我们有一个……你只要在 QuadCode 里运行类似 slash 的命令,我记得是 set up GitHub 之类的,它就会安装 GitHub app,然后你就可以在任何 pull request 或 issue 里 @ Claude。

我每天都在用这个,非常有用。所以你需要这些确定性的步骤。不过,也有办法让 Claude 变得更确定性一些。比如你可以做 best of N,让它做多轮检查。

嗯。

而且这实际上很容易实现。比如我们内部用的 code review skill,它是开源的,就放在 Quad Code 的仓库里。我们所做的就是启动并行的 agent 来执行任务,然后再启动并行的 deduping agent 来检查 false positives。但本质上,best of N 的实现方式非常简单,你只需要说"Quad,启动三个 agent 来做这件事",就行了。

Boris 刚才谈到了构建 enterprise infrastructure layer。auth、permissions、security,这些都必须先搞定,才能交付给真正的客户。这正是介绍我们本季赞助商 WorkOS 的好时机。如果你在构建任何 SaaS,尤其是 AI 产品,那么 authentication、permissions、security 和 enterprise identity 可能会在不知不觉中变成一项长期投资。

SAML、edge cases、directory sync、audit logs,以及所有 enterprise 客户期望的东西。构建这些 mission-critical 的部分需要大量工作,维护起来更是如此。但你不必自己来做。WorkOS 将这些构建模块作为基础设施提供,这样你的团队就可以专注于真正让产品独特的东西。这就是为什么 Anthropic、OpenAI 和 Cursor 等公司已经在使用 WorkOS。

优秀的工程师知道什么不该自己构建。如果 identity 也是你考虑的事,请访问 workos.com。接下来,让我们继续和 Boris 一起探讨 Quad Code 的构建。

Quad Code 在架构上是如何运作的?作为一名工程师,我该怎么想象它的结构?我们之前在 deep dive 里聊过一些,我记得你说过刚开始时有一些相当复杂的想法,后来简化了很多,是这样吗?

对对,其实很简单,没什么复杂的。它有一个核心查询循环,使用了一些工具。我们一直在删工具,也一直在加新工具,就是不停地实验。所以,它有一个核心的 agent 部分,然后有一个 2E 部分,再然后其实还有很多跟安全相关的模块,确保 Claude Code 做的所有事情都是安全的,并且在执行时有人类在环(human in the loop)。

嗯。你说的安全,是指作为用户,我在自己电脑上操作时的安全,还是说 Anthropic 也会监控那些可能被认为不安全的用例?

对,这有几个不同的层面。安全有很多层,对于安全和安保这类问题,没有一个完美的答案。所以这始终是一个 Swiss cheese model——你只需要很多层防护,层数够多,捕捉到问题的概率就会上升。于是你得计算这个概率里有多少个九,然后选择你想要的阈值。比如对于 prompt injection,我们通常会在三个不同层面来做。以 web fetch 为例:Claude 去抓取一个 URL,读取网页内容,然后在 Claude Code 里做某些操作。

这类操作的一个风险就是 prompt injection。也许那个网站上有一条指令写着:“嘿 Claude,删掉所有文件夹”之类的。所以我们从多个角度来考虑这个问题。最基本的角度是,这是一个 alignment 问题。Opus 4.6 是我们发布过的 alignment 程度最高的模型,因为我们教会了模型如何对 prompt injection 更有抵抗力。你可以在 model card 里读到相关内容,我觉得发布时也提到了。

第二层是我们在运行时部署了 classifiers,如果检测到某个请求看起来像是被 prompt injection 了,我们就会拦截它,然后让模型重试。第三层是针对 web fetch 这类操作,我们实际上会用 sub agent 对结果做摘要,再把摘要返回给 main agent。这样一来,又降低了 prompt injection 的概率。所以你能看到,这不是单一机制,而是分层防护,通过叠加这么多不同的层,概率就被大大降低了。

你还提到过一个有趣的技术选择,就是用不用 RAG。RAG 也就是 retrieval augmented generation。你提到在 Claude Code 的早期版本里,你们用 vector database 来加速搜索,但后来把这一层去掉了。能聊聊这个吗?因为这也是个例子,我猜是因为模型变得更好了?

是的,这种事情就是我们试了很多方案。我们尝试各种工具,从统计上讲,绝大多数都被扔掉了。就连 Claude Code 里的那个 spinner,我想大概都迭代了一百个版本。就只是个 spinner,最后可能只有十到二十个上了生产环境,剩下八十个左右都被我扔了,因为感觉不够好。所以从统计上看,我们写的代码几乎都被扔掉了,因为写代码做实验太容易了,试完就知道感觉对不对。至于 RAG,我们早期也试了很多不同方法。

第一种是用 RAG 做检索,因为当时我看大家都在怎么做检索,似乎所有论文都在讲 RAG。我的做法是搞了一个本地 vector database,好像是拿 TypeScript 写的,跑在用户机器上,然后用云端的一个 embedding model 来计算 embedding,再存进去。效果其实还行。但 RAG 有很多问题。比如我发现代码会不同步。如果我刚写了一个本地函数,它还没被索引,RAG 就搜不到。

还有索引的权限问题:谁能访问?我能访问,但怎么把这种规则编码到权限策略里?怎么确保别人访问不了?怎么确保公司里如果有 rogue 的 IT 人员,他也不能访问别人的数据?这一点真的非常重要。所以我们觉得,虽然 RAG 勉强能用,但 downside 也很多。于是我们又试了一堆别的。其中一个是让模型递归地给所有东西建索引,这个想法挺酷的。还有一个版本,我们直接试了 glob 和 grep。试了很多不同的东西。

结果 Agent-X search 完胜。那什么是 Agent-X search?其实就是 glob 和 grep 的一个花哨说法,仅此而已。漂亮。所以模型本身变得足够好了,而且你们也发现它能相当高效地使用这些工具。对。这其实部分受到了我在 Instagram 工作经历的启发。因为在 Instagram,click-to-definition 经常用不了,因为开发栈一半时间都是坏的。当然我觉得现在可能好点了。

所以工程师们会这么干:假设你要找函数 foo 的定义,不用点击跳转,而是直接用 Meta 内部那个相当好用的 global index,然后搜索 “foo 左括号”。这招挺好用的。有趣的是,这对模型来说也挺好用的。你看,一个领域里的想法就这样迁移到了另一个领域。

我们之前也聊过,Claude Code 里比较复杂的部分之一是权限系统。能说说它复杂在哪里吗?而且你们最近开源了 sandboxing 对吧?权限管理非常复杂。和其他所有跟安全相关的东西一样,它也是一个 Swiss cheese model。我们会运行一系列 classifiers 来确保命令是安全的。也会做 static analysis 来确保命令安全。作为用户,你也可以把某些你已知安全的模式加入 allow list。

比如,有些标准 Unix 工具我们是预先放行的,因为我们知道它们是只读的,不会 exfiltrate 数据之类的。所以我们不会向你索要权限。但实际上很少有工具能归到这一类,因为就连 find 命令,其实也有办法通过某些系统 flag 来执行任意代码。甚至 set 命令也有类似的用法。所以这些 Unix 工具里藏着很多这种冷门知识,实际上并不像你想的那么安全。因此,默认情况下,我们对允许执行的范围是相当保守的。

不过作为用户,你可以配置一个 allow list。比如你可以说这些模式允许,那些模式不允许。我们允许你自定义,并且也会检查这个 allow list 来确保安全性。

对,然后你们还设计了一个很精巧的权限系统,每次运行需要权限的命令时,你都可以选择只运行一次、在整个 session 期间运行,或者不管什么范围直接全局允许,对吧?没错。这倒是个有趣的历史遗留产物。其实在 Claude Code 最早最早的第一个版本里,权限就是这么运作的。这是第一版发布时就有的设计。

那是在 2024 年 9 月左右,第一次内部发布。我记得当时我们甚至不确定 agentic safety 是否有可能解决。因此,安全团队内部其实有很多反对声音,他们的说法是:“你不能就这样让模型运行 bash 命令啊,这不安全。那能怎么办?这是个无解的问题。所以我们不能发布这个。”

我和 Ben Mann 一起头脑风暴,Ben 创办了 labs 团队,他是 Anthropic 的创始人之一,实际上也是他把我招进了 Anthropic。我们想出的办法是 permission prompts:如果你不确定,就去问人类,然后由人类来决定。

我想问问你 Anthropic 的软件工程总体是怎么做的。第一个问题——可能算是比较正式的,或者说外人比较关心的——就是头衔,或者说缺乏头衔。Anthropic 的每个人都有相同的头衔,member of technical staff。为什么会这样,这又带来了什么结果?基本上就是大家都没有头衔,对吧?只有一个例外。

我觉得这多少是在承认,大家都还在摸索。而且如果你仔细看大家做的工作,其实都很相似,而且相当通才。如果你去问普通的软件工程师,他们可能不只是写代码,还会做一点设计,也会和用户交流,可能会自己写产品需求,可能一边写软件一边做研究,可能既写产品代码也写基础设施代码。Anthropic 有很多通才。从我的背景来说,这也是我被吸引到这里的原因之一。我觉得 member of technical staff 这个头衔,某种程度上把这一点编码进了人们彼此交流的方式里,哪怕他们互不相识。

如果没有这个头衔,默认情况就是我在 Slack 上看到你的名字,下面写着 software engineer。那我就会想,好吧,你就是写代码的,所以我不会问你产品相关的问题。但当所有人的头衔都是 member of technical staff 时,默认情况下你就会假设每个人都无所不能。所以这某种程度上扭转了人与人之间的关系,哪怕你们不太熟。

从某种角度来说,这是把一种乐观主义内置进了组织结构里。我觉得这也预示了未来,因为我认为软件工程正朝这个方向发展,每个学科都在朝这种通才模式发展。

软件工程领域确实给人这种感觉。我听 Mark Andreessen 说过一个很有趣的评论,他说科技界正在上演一场“墨西哥对峙”:设计师说他们现在其实也在做 PM 和工程的工作;工程师说他们也在做设计……每个人都觉得自己在做别人的工作,彼此对峙,好像在说“你的工作我也在做”。但现实中,每个人的角色都在扩展,很大程度上得益于 AI,因为它让工程师更容易做产品工作,也让产品人员更容易做工程工作,诸如此类。就像你说的那样。

我记得去年六七月份的时候,我走进办公室——有一排数据科学家就坐在 Quadcode 团队旁边,至少当时是这样。我走进去,看到 Quadcode 团队的那位数据科学家电脑上正开着 Quadcode。他在用这个,我就说:“这挺有意思的,你不是数据科学家吗?为什么在用终端?你之前都没装 Node.js,因为我们那时候还依赖 Node.js。你是在 dogfooding 吗?还是就想试试这东西怎么用?”他说:“不不,我在用它跑查询。

”他就是用它跑 SQL,终端里还有一些 ASCII 可视化图表。然后到了下一周,整排数据科学家的电脑上都跑起了 Quadcode。接着这个现象就扩散开了。所以如果你看现在的团队,Quadcode 团队里每个人都在写代码。工程师写代码,我们的工程经理写代码,设计师写代码,数据科学家写代码,财务的同事也写代码。团队里每个人都在写代码。我觉得部分原因是 Quadcode 让这件事变得太简单了。你其实不需要理解整个代码库,可以直接上手,很容易做一些小改动。

但还有一点是,人们能够用 Quadcode 更好地完成自己的工作,不管是财务预测、数据科学还是别的什么。这样一来,顺势用它写点代码也就变得很自然了。这就像是先让你把脚趾伸进水里试试。

你们的工作方式中还有另一件有意思的事。Kat 提到——我猜你们的头衔都一样,但大家可能会稍微偏向某个角色一点,据我所知她更偏向产品方向。但你说在 Anthropic 内部其实不太写 PRD。PRD,也就是 product requirement document,在大厂和越来越多的大型创业公司里是一种很知名的文档形式,你写一份 spec,把你的想法写下来,大家对齐,发出去,然后就知道该做什么了。但显然你们不怎么这么做,或者说完全不这么做。

部分原因我觉得是 Anthropic 仍然还是一家创业公司。所以其实你不需要跟那么多人同步。通常随口聊聊,或者在 Slack 上说一下就行了。但还有一部分原因是,Kat 以前也是工程经理,她技术非常强。我觉得我们的产品团队也是这么想的:与其写文档,不如直接发一个 PR。你们更多的是在做原型。所以这也呼应了我们之前聊的,你早期做 Claude core 的时候,你展示过有一个完整的消息串,里面大概做了 15 或 20 个 to-do list 的原型,每一个都是可交互、可运行的。

这和我过去在科技行业的经历相比让我很惊讶,而且你说你只用了一天半就把这 20 个全做了,试了试,找找感觉。这对我来说简直不可思议。这要是在别的地方可能要花一到两周,而且人们也不会做 20 个,他们做 3 个就差不多了。

对。所以你是说,你现在看到原型制作、动手构建和演示变多了,而写东西变少了?是的,当然。在我们团队,文化就是:我们不怎么写东西,我们直接演示。以前是什么样的已经有点难回想了,因为现在做原型已经深深嵌入了我们的构建方式里。所有东西都会反复做多次原型。比如这周我们发布了 agent teams,这是我们实现的 swarms。这非常令人兴奋,因为它让 Claude 能够更长时间、更自主地完成更多工作。你有一堆互不相关的 context window,agent 之间还有这种通信机制。

它们能做更多事情。这是 Daisy、Suzanne 和团队里的其他人,还有 Karen,他们花了几个月时间做原型的成果。他们大概试了上百个版本,才最终得到一个体验非常好的用户界面。要把它做好真的非常非常难。

如果我们当初从 Figma 里的静态 mock 开始,或者从 pure D 之类的东西入手,那绝对做不出这个产品。这东西你必须亲手搭建出来,亲自去感受,亲自去体验它的手感。对我来说,一个很大的收获就是,我们可能应该多做原型,更大胆一些,放下那些关于「做一个原型要花多长时间」或者「该由谁来做」的先入之见。以前总觉得必须是工程师来做,但现在可能已经不是这样了。

对,没错。我们现在所处的这个时代,其实我们并不知道正确答案是什么。回想以前做产品的方式,构建成本很高,所以你必须在开枪前花大量精力仔细瞄准。因为一旦开枪,就很难修正航向了,你能开的枪就那么几发。但现在情况变了。构建成本变得很低,但与此同时我们也不知道该瞄准哪里。所以我们只能去尝试,去感受什么感觉是对的。整个过程是非常非常探索性的。我觉得还有一点很重要,就是保持谦逊。就我个人而言,我大概有一半的时间都是错的。我想说,我的大部分想法都不太好,至少有一半是不好的。而且在我尝试之前,我也不知道哪一半不好。嗯。有时候也要从别人那里获取反馈。对。就是我得自己先试一试,然后再看看别人怎么想,因为你知道,我的直觉并不总是和别人一致。

你之前给我展示那些任务是如何构建的原型时,你告诉我说,你会先做原型,然后你的流程总是这样的:你先自己看,亲自试用,找找感觉,然后对于那些你觉得不错的,再拿给别人看,有时候他们会反馈说「不行,这个行不通」。而有时候当你感觉不错时,你就会更广泛地分享出去。所以我觉得,这是一种混合模式,对吧?有时候你自己就能判断,有时候你需要听取反馈,最终一些好想法就这样产生了。

是的,这样的例子有很多。比如我们推出了这种文件读取和文件搜索的压缩视图,因为现在的模型太 agentic 了,我感觉半个屏幕都是文件读取的内容,而我其实并不关心这些。你知道,我读了一个东西,但我并不真的在乎它具体是什么。所以我们把它压缩了,让输出更易读一些。大概做了 30 个原型之后,我才真正喜欢上这个设计。为了让它感觉起来非常舒服和简洁,我们花了很大功夫。我们在 Anthropic 内部向员工推广了大约一个月,让所有人 dogfood,然后我又根据这些反馈修复了大概十几个 bug,做了十几处调整。

之后我们对外发布了,几乎所有用户都喜欢,但也有少数用户不喜欢,因为他们想要更展开的输出。于是在 GitHub issue 上,我就和大家来回沟通,问他们,你们到底不喜欢什么?人们给了很多反馈。我又发了一个版本,然后有人喜欢,有人还是不喜欢。于是我又迭代了一次,把它做得更好了。其实我觉得现在差不多到位了,人们可以按自己的喜好配置,但默认效果也已经很好了。但这就是过程。你知道,我们有时候能一次做对,但我们也必须向用户学习。

我们想听到大家的声音,这样才能做对。

你们工作会用工单系统吗?就是,在哪里记录,比如「这是要做的工作」,还是说你们基本上就是来什么活就干什么活?在 Anthropic,我们让各个团队自己决定。在 Quad Code 团队,我们让每个人自己决定。不同的人用法不一样。比如我就不用工单系统。有些人喜欢用 Asana 或者笔记之类的。我见过最酷的一件事,大概三个月前吧,我们推出了插件。推出的方式是 Daisy 用一个周末完成的。她有一个非常早期的 Swarms 版本。

她让这个 swarm 跑起来,然后告诉它:「你的工作是构建插件。你得先想出一个 spec,然后要在 Asana 上建一个看板,把任务拆分。然后不同的 agent 要分别去构建。」她搭了一个容器,把 Claude 设成了 dangerous mode。然后她让它跑了整个周末。它生成了几百个 agent,在 Asana 看板上创建了 100 个任务。然后它们就实现了这个功能。这差不多就是我们发布出去的插件版本。

这种协调系统本来是为人类设计的,但我觉得现在它们对模型来说也同样重要。

我们来聊聊 Claude Colab。关于这个产品很重要的一点是,它看起来很棒。我试了一下。在 Claude 里面有一个 Colab 标签页,然后你可以……我觉得这是一种更视觉化的方式来运行 agent 并与它们交互。我听说最令人惊讶的一件事是,它只花了 10 天就做出来了。你能给我们讲讲构建它花了多少功夫吗?这具体意味着什么?是从有想法开始算,还是从决定做开始算?团队有多大?团队真的很小,就几个人。

很长一段时间以来,我们都觉得应该为 non-engineers 做一款产品。我们之所以这么想,是因为长期以来使用 Claude Code 的人里有很多都是 non-engineers。你知道,在产品领域,当你看到潜在需求时,当你看到人们费很大劲去使用一个并非为他们设计的产品时,这就是一个很好的信号,说明是时候做一款专门为他们设计的产品了。Twitter 上有很多人,比如有个人用 Claude Code 来监控他的番茄植株。

我特别喜欢这个例子。他好像装了一个摄像头,然后 Claude 会说:「天哪,我们的植物发芽了,我好开心。」因为它连着摄像头,每天都在监控,然后为番茄的生长感到特别开心。还有人用 Claude Code 从损坏的硬盘里恢复照片,而且是他的婚礼照片。哇。你知道,就像我说的,Anthropic 的整个财务团队都在用 Claude Code,销售团队也在用 Claude Code。所以有很多 non-engineers 在使用它。

那时候 Claude Code 已经有很多形态了,对吧?我们从终端开始,然后扩展了,增加了对 IDE 的支持。所以我们有面向所有基于 VS Code 的 IDE、所有基于 JetBrains 的 IDE 的扩展。还有 iOS 和 Android app,桌面端 app,网页版。然后还有 Slack 和 GitHub app。我们把产品扩展到所有这些地方,让 Squad code 对工程师来说更易用。

但归根结底,这些都不是为 non-engineers 设计的。所以 Squad code 演进了很多,但仍然感觉有一个缺口,有一款产品可以让这件事对人们来说更简单。所以在过去几个月里,团队一直在鼓捣,想看看正确的产品形态是什么。然后某个时刻有人想出了这个主意:如果我们拿 Squad code,加上一些 guardrails 会怎么样?比如,Squad 是在 virtual machine 里工作的。

这是我们确保它非常安全的诸多方式之一。特别是对于那些不想读 bash 命令来弄清楚它在干什么的 non-technical users 来说。然后他们就在这个方向上 hack,我想大概是 10 天出头。整个东西完全是用 Squad code 构建出来的。

然后我们发布了它。你能介绍一下这类应用背后的复杂程度吗?如果我们可以梳理一下都需要构建哪些部分的话。因为从外部很难判断——这只是一个漂亮的 UI 包装,甚至只有几百行代码?我这么说 obviously 是带有挑衅意味的,还是说背后其实是一套非常复杂的软件?我这么问的原因是,Uber 就是一个很好的例子:人们看着应用觉得很简单,我在那里工作过,知道它其实非常复杂,因为很多复杂性是看不见的。有很多区域化的东西,有很多后端的东西都是隐藏的。所以单看 Claude Co-work,很难判断这当中有多少是需要仔细思考的业务逻辑, versus 其实它只是模型之上一个薄薄的包装。

我觉得有些地方复杂度比你想象的要低,有些地方则更高。从产品层面看,它其实相当简单,因为它就是 Claude 桌面应用。你下载 Claude 应用,它是一个单一的桌面应用,有 Co-work、Code 和 Chat 三个标签页。所以它只是一个应用,我们可以继承很多产品逻辑。有一些 UI 渲染代码。在底层,运行的还是同样的 Claude Code,驱动 Claude Code 的也是同一个 Claude agent SDK。

实际上,很多复杂度在于安全性。因为正如我所说,我们知道用户是非技术背景的,所以我们只想确保他们有良好的体验。比如,如果有人打开应用,然后删除了一堆家庭照片,那就非常糟糕。因此我们想确保能防止这种情况,让你不会误操作。所以很多护栏机制由此而来。后端运行着一系列分类器,这是为了安全,同时也是对 prompt injection 等安全风险的额外缓解措施。前端方面,我们打包了一整个虚拟机,还有大量操作系统级别的集成,以确保人们不会误删文件。

所以光是安全性这一块,就有很多工作。然后我们还必须重新设计权限系统,因为我们继承的是 Claude Code 的权限系统。但另外,对于 Co-work 来说,其价值的一大部分不仅在于本地运行,还在于像 Claude Code 使用工具那样使用你的所有工具。但问题是,对非技术用户来说,你的工具并不是以 CLI 形式存在的。有些通过 MCP 提供,很多则在浏览器里。所以当你把它和 Chrome 扩展搭配使用时,Co-work 会非常好用。

这也是我通常的使用方式。比如,我每周都用它来做团队项目管理。我们有一个电子表格,在很高层面上跟踪每个人都在做什么。这算是我个人做项目管理的方式。就像我说的,其他人用 Asana,或者用笔记之类的。我自己的任务什么都不用,但对整个团队,我有这个表格。我让 Co-work 去检查。我每周就问 Co-work:“嘿,你能看看有没有哪一行的状态还没填吗?能不能在 Slack 上提醒一下那位工程师?”然后它会在 Chrome 里打开一个标签页显示表格,再打开一个 Slack 标签页,接着就开始在 Slack 里给工程师发消息。

它一次性就搞定了。好像有一位工程师的名字,出于某种原因它没法自动补全,但其他所有东西它都能拿到。所以从安全角度,我们也对这款 Chrome 扩展、它的工作原理、以及权限模型应该如何与本地权限模型交互做了相当深入的思考。所以也写了不少代码来确保这套体验顺畅。

那背后的技术栈是什么?我猜很多应该和 Claude 应用类似,但它是 Electron、TypeScript 这类技术,还是别的?对,就是 Electron 和 TypeScript。实际上,团队里有些人是早期的 Electron 成员。比如 Felix,他是 Co-work 的负责人,也是 Electron 非常早期的工程师,参与构建了它。太厉害了。而且 Co-work 最初只在 macOS 上发布。

选择先上这个平台、以及目前只上这个平台的原因是什么?是的,Windows 版本很快会来。我觉得可能到这期播客发布的时候,我们就已经支持 Windows 了。我们只是想尽早开始、尽早学习。你知道,就像我们在 Anthropic 做所有事情一样,这很符合我讲述自己经历的方式,也是我喜欢 Anthropic 的原因之一:它真的和这里的人思考问题的方式高度一致。就是说,我们对自己做的东西并没有很高的确定性。

我们的直觉常常是错的,所以我们必须向用户学习,弄清楚人们真正想要什么,你要花大量时间倾听用户、深入理解反馈。这就是我们构建产品的方式。所以我们总是在产品还没完全准备好之前就发布。Claude Code 就是这么做的。最初发布时,它甚至不支持 Windows,也不支持很多不同的技术栈,然后在接下来几周里,我们逐步添加了对所有栈的支持。现在 Claude Code 支持每一个栈。Windows、无论你用什么奇怪的 Linux 发行版、macOS,我们都支持。

所以对 Co-work 来说,我们也想尽早发布。Mac 只是一个起点。但没错,它最终会支持所有平台。

你提到的一点是要获取反馈。我好奇的是,无论是 Claude Code 还是 Claude Co-work,你们是怎么做可观测性、监控的?rollout 的时候用 feature flag 吗?我更感兴趣的是,你们为此自己搭建了工具,还是选择了某些供应商?因为特别是在可观测性方面,我确信这很重要,而且从用户规模来看,听起来也相当大,这不是一个小工程?是的,我们既用了一些现成供应商的产品,也写了一些自定义代码。

所以实际上是两者结合。这没什么太特别的。Anthropic 有一点比较有意思:因为我们是一家企业级公司,非常注重隐私和安全,所以我们看不到用户的数据。因此,如果有人报了一个 bug,我其实没法调出你的日志来看看到底发生了什么。我们花了很多精力去研究如何在保护隐私的前提下记录事件等信息。这对我们的运营方式来说非常重要。

对于 Co-work,你们目前学到了什么?它已经发布了大概几周时间。有没有遇到什么出乎意料的情况?你们是否正在根据收到的反馈来塑造产品?是的,团队每天都在提交大量修复。说实话,最让我惊讶的是大家居然这么喜欢它。Claude Code 刚发布的时候,其实并非一夜爆红。

人们可能以为它一上来就很火爆,但其实初期是缓慢起步的。我觉得第一个重大转折点是在五月发布 Opus 4 和 Sonnet 4 的时候,那时候才真正开窍,增长也开始呈指数级上升。但一开始它更像一个 research preview,大家不太知道该怎么用。有些人立刻就上手了,但大多数人没有,这需要一点时间。

Co-work 的增长轨迹比 Claude Code 初期陡峭得多。所以它一推出就大受欢迎,这实际上非常出乎意料,我真没预料到。

你们最近刚发布了一个新功能,大概就在昨天或者前天——我们录这期播客的时候——就是 agent teams。据我理解,agent teams 或者说 agent swarms 的思路是,不再只有一个 agent,而是可以有一个 lead agent,由它来委派给不同的队友。你们是怎么开始试验这个功能的,又是怎么决定现在发布的?

我们一直在做实验,对吧?有很多方法可以让 Claude Code 发挥更大作用。一种方法是扩展 context;另一种是 auto compacting context,这样本质上就是无限 context,这也是我们目前的做法。还有一种方法是使用 sub agents,让多个 agent 协同工作。总之有很多不同方法可以让 context window 发挥更大价值。

我们有一个概念叫 uncorrelated context windows。顾名思义,就是你有多个 context window,但它们本质上都是重新开始的,彼此互不知晓。举个例子,correlated context window 的情况是:你有一个模型,它完成了一项任务,然后你在同一个 context window 里让它做第二项任务。这时第二项任务知道第一项任务的内容,因为它们在同一个 window 里。但对于 sub agent 来说,它是 uncorrelated 的,因为主 agent 给 sub agent 下指令时,sub agent 的 context window 是全新的。除了那条指令之外,它不知道父级 context window 里有什么。

这一点在 sub agents 和 skills 的对比中也能看出来。因为当你运行一个 skill,或者说 slash command 时,它能看到父级的 context window;而 sub agent 则看不到。所以它是 uncorrelated 的。有些情况下你需要那个上下文,有些情况下不需要。有意思的是,使用 uncorrelated context windows,给问题堆砌更多 context、更多 token,反而能得到更好的结果。这其实是一种 test time compute。

至于 teams 这类功能,我们已经试验了一段时间,大概从去年十月或九月就开始了。而直到 Opus 4.6,我们才感觉它真正开窍了,模型学会了如何运用这个机制。有时候你会看到一些很有意思的对话,agents 在互相交流、讨论事情,看起来非常酷,某种程度上很像人类。但另一些时候,你就是能得到非常好的结果。

比如我们做过一批内部评估,让 Claude 去构建非常复杂的东西,复杂到单个 Claude 无法完成的程度。而使用 Opus 4.6 和 teams,我们看到结果确实大大改善了。因此我们觉得这是发布的合适时机。但我们也想谨慎一些。之所以需要手动选择开启,之所以还是 research preview,是因为它消耗大量 token,毕竟是一堆 Claude 在同时运行。不是所有人时时刻刻都需要这个。所以我很期待看到大家怎么用它,也期待听到反馈。这种功能更适合相当复杂的任务,你可能不会想每件事都用它。

主 Claude 决定 sub Claude 们的规则。我们并没有一套僵化的做法。这取决于具体 context。我不认为存在唯一正确的方式。实际上,我觉得这其中的魔力很大程度上来自 uncorrelated context windows 这个概念。重点不在于 agent 的具体配置。但这确实是大家应该去试验的东西,我觉得没有放之四海而皆准的方案。

你有没有看到一些用例?我知道这还在研究阶段,但有没有哪些用例让你觉得这种思路、这种 swarm 的思路看起来很有前景?

嗯,我之前应该说过,plugins 完全是用 swarms 构建的。之后还有很多其他功能也是用这种方式搭建的。所以是的,我觉得只要看到单个 Claude 吃力的地方,swarms 就能帮上忙。这很值得关注。

泛泛地聊聊变化吧。去年十二月,你和 Andrej Karpathy 有一次很有意思的互动。他发帖说,因为 AI 的进步,他从未像现在这样感觉自己作为程序员如此落后。然后你分享了一个故事,说自己本来在用老办法调试一个内存泄漏,结果 Claude 一次就解决了。我觉得这反映了所有人的感受:变化太快了。在假期休息的时候,我开始感觉到事情真的发生了转变。你是怎么接受、或者说开始拥抱这种变化的?这是我个人非常挣扎的地方。

模型迭代太快了,旧模型上管用的思路,在新模型上可能就不行;在新模型上没跑通的东西,也许在旧模型上行,也可能在新模型上又行了。这很奇怪,因为很少有其他技术是这样的。所以我其实没有太多经验可以借鉴,来想清楚该怎么应对。这算是我必须学会的一项新技能。

某种程度上,你必须始终保持这种初学者心态。说实话,我最近常说“谦逊”这个词,但你确实得始终保持这种智识上的谦逊。因为之前行不通的想法现在能行了,反之亦然。我觉得说白了就是这样。这是我必须不断提醒自己的。

有意思的是,在过去,如果有人把一个我们以前试过但没成功的想法又拿出来试,通常的反馈就是:你怎么又在搞这个?对,对,他们会说你赶紧打住。我是说,我们以前会管这叫 gatekeeping,但某种程度上是合理的。比如在架构领域,有人提议“我们为什么不搞微服务”,另一个人就说“我们试过了,不行”。如果是一两年前甚至三年前试的,这话还算站得住脚,对吧?因为那时候没什么太大变化。

是的,没错。微服务这东西挺有意思的,好像每十年就会流行一阵、过气一阵。但现在,我觉得是有史以来第一次,每隔几个月就把同一个想法重新试一遍,其实也不是什么疯狂的事,因为模型在进步,它可能就管用了。

我在团队里的工程师身上也看到了这一点。比如新加入团队的成员,或者刚入行不久的工程师,有时候做事的方式比我更好。我只能看着他们,然后学习,调整自己的预期。举个例子,我们发布新功能的时候,我有时会截图自己在 X 或者 Threads 上使用这些功能的画面,发出来聊聊。但最近,Tariq,就是我们负责 devrel 的同事,他写了很多代码。他太厉害了。

他直接开始把这事自动化了。他在用 hot code 为自己的发布活动自动生成视频,就这么干起来了。你知道,这事我以前觉得也许可行,但不是我愿意尝试的,因为我不认为模型已经准备好了,但他直接做了,而且效果还行。

有一件事让我感到有些奇怪,我想很多开发者都能感同身受——自从 Opus 4.5 开始,我也慢慢接受了这个现实,而且类似的模型,比如 GPT 5.2,也给了我类似的感觉。这些模型写代码写得实在太好了,我意识到如果我真想做成什么事,我不会再手写代码了。如果我就是想享受写代码的乐趣,那当然可以写。但我不禁回想起,为了学好编程,我们付出了多少努力。我记得自己一开始只是瞎折腾,后来上大学学 C,再学 C++,那真是难死了。

还有我头几份工作,慢慢变得擅长调试,技术越来越好。曾经有那么一段时间,我的自我认同很大程度上就建立在“擅长写代码”这件事上。我们过去就是靠这个找工作、找高薪工作的。我做招聘经理的时候,在 Uber 设计面试流程,我们跟经理们讨论要筛选什么,聊的是:开发者大部分时间做什么?大约 50% 的时间在写代码。所以我们把大约 50% 的考察权重都放在了编程上。编程身上寄托了太多东西,因为它确实难。我们都知道这需要毅力,需要一定的聪明才智才能学好。

现在有种失落感:一方面模型能做到这些,我觉得很棒;但另一方面,好像有什么东西被很快地拿走了,而我个人真没想到会这么快。我想很多人都有这种感觉。有些人比较容易释怀,但确实有一种悲伤的情绪。你怎么看待这件事?毕竟你是那种在 Facebook 也写了很多代码的人,外面也写了很多。我知道这对你来说只是完成工作的工具,但不是很多人能做到你做的事。而现在模型的表现已经和你一样好,甚至更好。这就是挑战所在。

是的,我觉得这曾经是软件工程师专属的事情,现在正变成人人都能做的事。回想我开始写代码的时候,它是一件很务实的事,是用来完成工作的手段。但后来我渐渐爱上了编程这门艺术,爱上了语言和工具本身。再后来我就掉进了这个兔子洞。我写了一本书,关于一门编程语言的,TypeScript。

——你写了 O'Reilly 第一本 TypeScript 的书。

对对对,没错。其实挺有意思的,有件事让我印象特别深刻。我在日本一个小镇上,去书店的时候,发现我那本书居然有日文翻译版。就在那个小镇上,那感觉太酷了。然后我其实意识到,我根本不记得 TypeScript 了,因为那时候我已经只写 Python 写了好几年。

对,然后后来我在某个时间点创办了当时全球最大的 TypeScript meetup,在旧金山。我因此见到了很多偶像级的人物,比如 Chris Kowal,他写了 General Theory of Reactivity;还有 Ryan Dahl,做 Node 的那个人。那是我第一次真正深入这个社区,深入语言本身和工具本身。对于 TypeScript 来说,它的类型和类型系统里有一种美感,因为 Heilsberg 实在太厉害了。

conditional types 这种概念,任何东西都可以是 literal type,这些非常深刻的理念,即使是最硬核的函数式语言也没有。就算在 Haskell 这样的语言里,也没有走到这么远,而 Anders 接手之后,把它推到了前所未有的深度。后来 Joe Pamer 和其他一些人把这些理念推广出来,并做了大量思考。我觉得对他们来说,这也是非常务实的,因为他们面对的是庞大的 untyped JavaScript 代码库,如何逐步迁移到带类型的系统,你必须想出这些非常漂亮的办法。

对我来说,Scala 是另一个我掉进去的兔子洞,那个函数式编程的世界。直到现在,无论是我自己写代码,还是模型写代码,我始终先想类型。真正重要的是 type signature,那比代码本身更重要,要把那个弄对。所以这中间确实有美感,确实是一门艺术。但归根结底,它是实用的,是我们用来构建东西的手段,它是途径,不是目的本身。

我觉得对于当下这个时刻,我有一个比喻,就是 15 世纪左右的印刷机。

——嗯。

因为在那个时刻,情况其实非常相似,对吧?有一群抄写员,他们懂得书写。当然我们没有亲身经历过,但据我理解,据我想象,学习这门技艺的过程非常艰难。你需要有工具设备,可能还需要赞助或者被选中。你需要不断练习,因为你需要一遍又一遍地复制同样的内容,很少有人能做到。我猜这门手艺要么地位很高,要么报酬丰厚,谁知道呢,就当是吧。但后来印刷机出现了。

——对。

至少在当时的欧洲,你需要领主或者国王之类的人来雇佣你,然后你要经过多年的训练。有这么一个抄写员阶层,他们懂得书写,受雇于这样的人,有时候就是国王本人,或者王后,而他们自己反而不识字。所以这是一项极其小众的技能,当时欧洲识字率不到 1%。然后印刷机出现了,发生了什么?印刷材料的成本下降了大约 100 倍,在接下来的三四十年还是五十年左右。印刷材料的数量增长了大约 10,000 倍,在接下来的五十到一百年间。

这是第一个效应。识字率的提升则花了一段时间才跟上。全球识字率后来上升到了大概 70%,但这又花了两三百年,因为学习阅读本身就非常难,学习书写也很难。这需要大量努力,需要教育体系,需要基础设施来提供纸张和墨水,还需要有农活儿之外的空闲时间来做这些事。所以某种程度上,这需要工业化早期阶段才能实现。但我认为,把原本锁在象牙塔里的东西变得人人可及,这个效应至关重要。我们今天周围的一切,没有印刷机就不会存在。

如果我们不识字,如果制造这个麦克风的人不识字,现代经济就很难出现,这一切都不会存在。

我有时会回想,如果当时人们必须预测印刷术出现时会发生什么,没人会料到麦克风这种东西的诞生。所以我觉得,这是对我们当下所处时刻最好的类比。而且你提到有些国王其实是文盲,却雇佣抄写员,这很有意思——因为说实话,我们现在的企业主知道自己想打造什么,于是雇佣软件工程师,恰恰因为他们自己不会写代码。我们总喜欢嘲笑那些涌入这个领域的 CEO,他们可能拿着手绘原型或者白板说"这个应该很简单",但他们当然不理解这有多难。

但这似乎有点类似:有人清楚自己想要什么,但直到现在,他们都需要雇佣软件专家来实现,而想法和执行者之间始终存在脱节。就像印刷术一样,如果这些人真的能自己表达呢?就像国王真的能自己读写信件,他们就不需要中间人了,事情也会变得更高效。当然,对抄写员来说这不一定是好消息,但聪明的抄写员也可以做别的,比如写书、操作印刷机等等。

没错。如果你想想抄写员后来怎么样了——他们不再做抄写员了,但现在出现了一类作家和作者。这些人如今存在,是因为文学市场大大扩展了。而且我想,如果回想一下,过去抄写员的作品只有少数人阅读;而有了印刷机之后,作者数量大增,有些可能没什么读者,但有些人的影响力则超出了他们的想象。由此产生了新的职业。

我喜欢这个类比。对我来说最激动人心的是,今天我们完全无法断言这场变革、这次转型之后会发生什么。要知道,没有印刷术,我们所知的经济体系就不会存在。那么接下来呢?我们今天还无法预测、但将会出现的东西是什么?因为任何人都能做这件事了。

我们无法预测,但我觉得可以看看当下什么在奏效。看看你身边的环境,无论是对面的团队,还是软件工程师、构建者或技术人员——不管我们怎么称呼他们——在你眼中谁是出类拔萃的?他们在做什么?他们积累了哪些技能?又是怎样改变了工作方式的?

很难点名,因为说实话,这些人是我职业生涯中合作过的最优秀的人。有各种各样不同的类型。有些人是极出色的原型设计师,能把东西从 0 做到 0.5,去琢磨有哪些酷的想法、技术突破点在哪里。另一些人则特别擅长找到产品与市场契合度,大致是从 0.5 到 1,或者从 0 到 1。还有一些人横跨不同学科,而且我见到这样的人越来越多。就像我说的,有人同时横跨产品工程和基础设施工程,或者产品和设计,或者设计和工程。我觉得我见过越来越多这样的复合型人才。

从去年到今年,你有哪些想法发生了变化?也就是说,你曾经相信或坚信的某种东西,现在要么修正了,要么彻底抛弃了?

说实话,有一点我之前不太确定,那就是安全问题到底有多严重。我加入 Anthropic 是因为,就像我说的,我读了很多科幻小说,我知道如果这事往坏的方向发展会有多糟糕。但之前我对此并不确定。不过从内部观察,再看到过去一年浮现出的新风险,这让我对此担忧得多得多了。所以这对我来说曾经是件重要的事。而现在,最重要的事情就是如何确保这一切顺利发展。

可以肯定地说,早在 AI 浪潮兴起之前,你就是一名非常出色的软件工程师,而且现在你看起来依然非常高产。当然你也是团队的一员,但个人能力也很强。在软件工程师所需的技能中,哪些现在仍然很有价值,甚至可能比以前更有价值?又有哪些不那么重要了,最好放下?

大概是这样。最该放下的是对代码风格、编程语言这类东西的强烈执念。我迫不及待想越过那些无休止的语言之争、框架之争之类的讨论。因为模型可以用任何语言和框架,如果你不喜欢,它可以直接重写。所以这根本不重要了。

我觉得在今天仍然非常重要的一点是做事有条理、以假设为驱动。在一切都在被颠覆的世界里,这对产品设计很重要,我们需要弄清楚接下来该构建什么,这是每个人都在思考的问题。但这在日常工程中也很重要,比如调试,你必须非常有条理。模型也能做这件事,而且能帮上大忙。但我觉得我们仍处于一个过渡期,你仍然需要具备这项技能。我不知道六个月后你是否还需要。

我认为另一些更有价值的技能是保持好奇心,愿意做超出自己职责范围的事。如果你在搞工程,但真的理解商业端,你就能做出非常棒的产品。我觉得下一个价值十亿美元的产品,比如 Quad Code 之后,无论哪家初创公司成为下一个万亿级企业,可能都源于某个人有个很酷的想法,而他的大脑能够跨领域思考,比如同时跨越工程、产品、商业,或者设计、金融和其他什么领域。人们会越来越成为多面手,而这种能力也会越来越受重视。所以从某种意义上说,我认为这将是通才之年。

我觉得另一项实际上正在受到奖励的技能是注意力持续时间短。我现在看到这种情况正在得到回报。没错。你知道,青少年在用 TikTok 这类东西,我觉得从某些方面看这对社会有点危险,因为你希望人们能深入思考、沉思熟虑,而不是很快跳到下一个想法。但在某些方面,我觉得今年会是奖励这种状态的一年,就像是 ADHD 之年。因为对我来说,工作已经变成了在不同的云之间跳转,变成了管理各种云服务。所以重点不再是深度工作,而是我有多擅长上下文切换,能够快速在不同场景之间跳转。

我能否补充一点?从你说的所有内容来看,也许你可以加上一样东西,那就是适应力。因为你虽然提到了 ADHD 和跳来跳去,但显然你以前也非常擅长深入专注在一件事上。

让我印象深刻的是——也许其他人也是如此——你非常乐于调整自己的工作方式,去探索什么适合当下这个阶段,尤其是在世事变迁之时。我认为有一点是确定的:无论下一个模型发布会带来什么,情况都会再次改变,你需要保持好奇,并乐于调整自己的工作方式,对吧?

是的。

最后,你有什么书可以推荐吗?我近期深陷 Cixin Liu 的作品。他是《Three-Body Problem》的作者,但其实他还有很多其他非常优秀的作品。我特别喜欢他的短篇小说。他有几本短篇集。我是他的忠实粉丝。对于刚接触科幻、想读一点偏硬科幻的朋友,我非常推荐 Stross 的《Accelerando》。这本书我强烈推荐。它基本上就是未来50年的产品路线图。书中描述了 takeoff 开始发生、AI singularity 之类的情节,最后演变成了某种围绕木星运行的群体龙虾意识。

简直太棒了。我认为它真正捕捉到了那种节奏,就是这种不断加速、加速、再加速的紧迫感。这和当下的感受非常契合。然后在技术方面,我强烈推荐《Functional Programming in Scala》。即便编程语言的选择不再那么重要了,我认为函数式编程中仍有一种艺术,能教你如何更好地写代码。它会教你如何以类型来思考。如果你读这本书,我认为非常重要的一点是也要做课后习题。我通读并做完了所有习题,大概做了三遍,效果惊人。

它真的能把函数式类型的概念敲进你的脑子里,让你忍不住一直去想。

Boris,非常感谢。这次访谈太棒了。

是的,谢谢 Greg。这次对话非常有趣,而我一直在回想的是 Boris 的印刷机类比。中世纪的抄书吏是这样一小群精英,他们识文断字,受雇于国王,而国王自己往往并不识字;我们软件工程师今天可能也处于类似的境地。我们就是抄书吏。我们花了多年时间精通这门手艺,而现在印刷机正在到来。但 Boris 告诉我,抄书吏并没有消失。他们变成了作家和作者,而整个书面作品的市场扩张到了任何人都无法预见的程度。我确实觉得这个说法令人鼓舞,同时也欣赏 Boris 并没有粉饰太平。

另一件让我印象深刻的事是 Cloth 团队构建软件的方式如此不同。没有 PRDs,没有强制性的 ticketing 系统,设计师、数据科学家和财务人员都在写代码,在发布一个功能之前要构建几十个甚至上百个原型。Boris 每天发布 20 到 30 个 pull requests,而且不用手写一行代码。同时还有不同的验证机制:Cloth 的代码会自我审查、自动化的 lint rules、best of end passes,以及人工 code review。

如果你喜欢这档播客,请在你喜欢的播客平台和 YouTube 上订阅。如果你也能给节目评分,那更是特别感谢。谢谢收听,下期再见。