引言:编程的个人启蒙与Claude Code的诞生
Alex: 我回想起自己刚开始学习编程的时候,那时我还是个坐在中学数学课后排的孩子,手里拿着我的TI-83 Plus计算器。 Alex: 我们用BASIC语言编程,因为我很快意识到我实际上可以把数学考试的答案编进计算器里。 Alex: 大家好,我是Alex,Anthropic的Claude关系负责人。 Alex: 今天我们将讨论Claude Code和软件工程的未来,我的同事Boris也加入了我们。
Boris: 我是Boris,Anthropic的技术人员,也是Claude Code的创建者。
编程领域的快速演进:从IDE到智能代理
Alex: 过去12个月发生了许多事情,尤其是在编程领域,一切都发展得非常快。 Alex: 对于那些可能没有每天关注新闻,甚至没有紧跟最新进展的人(我自己有时也跟不上),您能帮我们回顾一下发生了什么,以及我们目前处于什么状况吗?
Boris: 是的,一年前的编程与现在完全不同。 Boris: 一年前,如果你想写代码,你会有一个IDE (Integrated Development Environment: 集成开发环境),IDE里会有某种自动补全功能,然后还有一个聊天应用,你可能会来回复制粘贴代码。 Boris: 那就是当时的AI (Artificial Intelligence: 人工智能) 在编程领域的最新技术水平。 Boris: 大约在一年前,我们开始看到智能编程 (Agentic Coding: 一种利用人工智能代理自动完成或辅助编程任务的方法) 作为人们在编程中认真使用的工具出现。 Boris: 它成为了工作流程的一部分,不再是噱头或原型;它实际上是开发过程中内部循环的一部分。 Boris: 我认为这是过去一年变化最大的地方,现在你编程时会使用一个智能代理,不再直接在IDE中操作文本。 Boris: 这不仅仅是关于Tab键自动补全,而是关于模型为你编写代码。 Boris: 我们开始看到这种转变,从直接操作文本转变为让模型为你进行文本操作。 Boris: 我认为,展望未来,这正是我们所处的轨迹,并将持续发展。
Alex: 我明白了,所以我们已经从所有操作都在网页应用中进行,你需要复制粘贴代码并进行非常具体的编辑,转变为更加“放手”的方式,告诉智能代理你想要它做什么,然后信任它去进行大量的编辑,有时甚至能独立创建整个应用程序。
Boris: 是的,没错。 Boris: 这在一年前是无法实现的,原因有几个:人们尝试让AI编程很长时间,并以各种方式自动化越来越多的编程任务。 Boris: 我认为它之所以没有真正奏效,可能有几个原因:一是模型本身不够好,二是辅助系统 (Harness: 指围绕AI模型构建的、用于提升其功能和用户交互的外部框架或工具),也就是模型之上的东西,不够好。 Boris: 当我们去年底首次推出Claude Code的最初版本时,它仍然使用的是Sonnet 3.5。 Boris: 这甚至不是3.6,也不是我们现在称之为“升级版Sonnet 3.5”的东西。
Alex: 是的,升级版Sonnet。
Boris: 是的,甚至不是这个版本。 Boris: 但它多少还是有点用处,你知道吗? Boris: 我大概用它完成了10%的代码工作。 Boris: 但即便如此,我记得我们推出它时,把它交给了核心团队。 Boris: 当时团队里只有我以及其他几个人。 Boris: 我记得有一天早上走进办公室,在去我办公桌的路上,看到有几位工程师坐在那里;其中一位是Robert,还有另外几位工程师。 Boris: 我走进去,第一次看到他们的屏幕上运行着Claude Code。 Boris: 我前一天才把这个工具给他们,他们就已经开始使用了。 Boris: 这真是太不可思议了。 Boris: 当时模型表现不佳,辅助系统也做得不好。 Boris: 但即使在那个早期版本中,它已经有点作用了。 Boris: 我认为在过去一年中,模型在智能编程方面有了很大的提升,这体现在3.7、现在的4.0和Opus 4.1版本上。 Boris: 辅助系统也变得更好了。 Boris: 当然,这个辅助系统就是Claude Code,因为你与模型交互的方式,你不能直接使用模型:你必须使用一个辅助系统。 Boris: 这有点像,你知道,如果你骑马,你需要某种马鞍。 Boris: 而马鞍在骑马时会产生巨大的影响。 Boris: 我不是骑马的人。
Alex: 我喜欢这个比喻。 Alex: 我的意思是,Claude就像是马,而你作为工程师,试图让它朝某个方向前进,并引导它,你需要某种支架(scaffolding)来正确地操控它。 Alex: 在这种情况下,为了达成共识,这里的辅助系统(harness)指的是我们提供给它的所有工具,以及我们如何处理模型的上下文(context)等一切。
Boris: 没错,没错,它就是Claude Code的全部。 Boris: 模型是API (Application Programming Interface: 应用程序编程接口) 背后的东西,而Claude Code则是系统提示 (System Prompt: 用于引导AI模型行为和输出的初始指令)、上下文管理 (Context Management: AI模型处理和维持相关信息以进行连贯对话或任务的能力)、工具、插入MCP服务器、设置、权限等所有这些功能。 Boris: 所有这些都与模型交互。 Boris: 模型会看到所有上下文,所有这些东西的输出,这对其性能产生了巨大的影响。 Boris: 我认为在过去一年中,我们学会了如何精确地为模型构建。 Boris: 模型不仅与Claude Code共同进化,也与所有这些使用Anthropic模型来构建智能编程工具的不同产品共同进化。
模型与产品的共同进化:有机学习与实际经验
Alex: 也许我们应该多谈谈这一点。 Alex: 当你说“共同进化”时,是因为我们在训练中刻意为之,还是模型在产品功能本身变得更好时,也以某种方式变得更好了?
Boris: 老实说,这非常有机。 Boris: 在Anthropic,每个人都使用Claude Code,这包括研究人员。 Boris: 所以每天构建模型的人都在使用模型来完成他们的工作。 Boris: 我认为作为其中的一部分,你会看到模型遇到的这些自然限制。 Boris: 举个例子,模型可能在进行某些类型的编辑时表现很差。 Boris: 有时你使用Claude Code,会看到“未能替换字符串,未能替换字符串”这样的提示。 Boris: 这是一种模型能力,如果我们从中学习,就可以改进它。 Boris: 另一个例子,可能更高层次一点,就是如果你让模型运行大约30分钟,使用3.5版本时,它可能只能保持一小段时间的正常运行,也许一分钟左右。 Boris: 而随着新模型的出现,模型可以自主运行的时间变得越来越长。 Boris: 我认为这确实是基于经验的,因为你使用模型,你会看到作为人类,你需要在哪里进行纠正和引导。 Boris: 然后我们从中学习,并可以将其整合到模型中,更好地教它自己完成这些任务。
Alex: 当您评估一个新模型时,您是否有某种“感觉检查”测试集? Alex: 或者如果我们要推出一个新功能来改进辅助系统,您个人如何评估性能是否有所提升?
Boris: 我只是做我当天的工作。
Alex: 有趣。
Boris: 是的。 Boris: 我的完美一天就是一整天都在编码。 Boris: 无论模型是什么,无论我们正在测试什么新东西,我都会用它来编码,看看效果如何。 Boris: 我没有做任何特定的事情。
Alex: 对,您就是看看它在您的日常工作中实际表现如何?
Boris: 是的,没错,没错。 Boris: 在日常工作中,你做各种各样的事情。 Boris: 比如,你编写新代码,你可能在修复bug,你可能在阅读Slack消息或GitHub issue来回复反馈。 Boris: 我认为模型越来越能够完成越来越多的这些任务。 Boris: 所以,实际上,如果你总是只用模型做一件事,你可能会错过一些新的功能,比如通过MCP拉取上下文,比如阅读你的Slack消息。 Boris: 或者,你知道,自动调试东西,因为你可以自动拉取Sentry日志。
Alex: 是的,所以在某种意义上,最好的评估就是最像真实生活的评估。 Alex: 在这种情况下,仅仅使用它就能获得最好的结果。
Boris: 在构建Claude Code时,我们非常努力地构建了产品评估。 Boris: 是的。 Boris: 你知道,就像有一个基准;比如,当我们改变系统提示或类似的东西时,模型是否变得更好了? Boris: 我们确实有少量这样的评估,但老实说,构建评估实在太难了。 Boris: 到目前为止,最大的信号就是“感觉”。 Boris: 比如,它感觉更智能了吗? Boris: 因为它使用的任务范围太广了。
Alex: 是的,这实际上是我经常从开发者那里听到的一个问题,他们希望得到更多关于我们如何进行提示测试和迭代的指导。 Alex: 我知道对于不同的产品,我们尝试创建了各种评估,但对于Claude Code来说,它确实是一种紧密的反馈循环,它几乎比任何硬编码的评估集都能给我们更即时的信号。
Boris: 我想知道人们是否想从AI那里听到一个更好的答案。 Boris: 但是的,伙计,这都是凭感觉。 Boris: 我认为在这一点上,你知道,模型在像SWE-bench (Software Engineering Benchmark: 软件工程基准测试) 这样的评估上表现得非常好。 Boris: 我们只是在努力寻找这些更难的评估。 Boris: 现在还有像T-bench这样的,它饱和度稍微低一点。 Boris: 但我认为要找到能够捕捉软件工程所有复杂性的合成评估确实非常困难。
Alex: 对,对。 Alex: 您认为我们内部在建立这种反馈循环方面有什么独特之处吗? Alex: 因为我感觉Claude Code拥有我所见过的任何产品中最好的内部测试 (Dogfooding: 公司员工使用自己开发的产品来发现问题和改进功能) 周期。
独特的内部反馈循环:积极响应用户需求
Boris: 最初,我以我对待其他任何产品的方式来构建它,那就是倾听用户,并尽可能简化倾听用户的过程。 Boris: 我认为其中一部分是,当我们构建Claude Code时,Slack上只有一个反馈频道。 Boris: 任何时候有人有反馈,我都会引导他们到那里,就说:“是的,在那里发布。” Boris: 我觉得人们有时会有点犹豫。 Boris: 因为有时当你提供反馈时,你期望没有人会听,它就像进入了一个黑洞,一个虚空。 Boris: 我认为我们做得非常正确的一件事是,从一开始,每当有人提供反馈时,我都会尽可能快地修复它。 Boris: 有时我会在办公室里花两三个小时,尽可能多地处理和修复bug,然后每次都回复并告诉人们问题已解决。 Boris: 这鼓励他们继续提供反馈。 Boris: 直到今天,Claude Code内部的反馈频道仍然像消防水带一样,源源不断。
Alex: 哦,完全是这样。 Alex: 我记得,在那些早期,直到现在也是,我会在那里发帖,然后您会立即用表情符号回应。 Alex: 或者您会要求更多的澄清和问题,这让你感觉:“哦,好吧,我的反馈被听到了。” Alex: 然后你实际上会受到激励,将来发布更多反馈。
Boris: 是的,因为,老实说,我不知道我在做什么。 Boris: 就像没有人真正知道他们在AI领域在做什么一样。 Boris: 我们在构建它的过程中不断发现新事物。 Boris: 最好的指标就是用户想要什么。 Boris: 所以你必须倾听。
Claude Code的当前状态与未来展望:扩展性与高层目标
Alex: 好的,稍微换个话题,Claude Code作为一款产品目前的状况如何? Alex: 最新的功能是什么? Alex: 您对什么感到兴奋? Alex: 您现在看到人们用它做些什么?
Boris: Claude Code从一开始就被设计成尽可能简单和可扩展。 Boris: 我认为可扩展性是我们一直在大力发展的东西,这也是我非常兴奋的地方。 Boris: 最初,扩展Claude Code的方式是添加CLAUDE.md (特定配置文件: Claude Code用于获取额外上下文信息的配置文件)。 Boris: 那是最初的扩展点。 Boris: CLAUDE.md,你知道,就像一个文件。 Boris: 你可以把它放在根目录,也可以放在子目录。 Boris: 你可以把它放在不同的地方。 Boris: 它只是为Claude Code提供额外的上下文,并且它会随着你的代码仓库一起。 Boris: 你经常把它提交到你的代码库中。 Boris: 所以它提供了一些关于代码的额外信息。 Boris: 但随着时间的推移,我们增加了更多的扩展点。 Boris: 所以现在有了一个非常复杂的设置系统和权限系统。 Boris: 现在还有Dixon构建的钩子 (Hooks: 允许开发者在特定事件发生时插入自定义代码的功能)。 Boris: Dixon是我们团队的一名工程师,他看到了所有这些不同的用户需求,他们说:“我想用这种方式扩展它。我想接入这个,接入那个。” Boris: 所以他构建了一个非常广泛的钩子系统。 Boris: MCP服务器显然是一个非常棒的扩展点。 Boris: 现在还有斜杠命令 (Slash Commands: 在命令行或聊天界面中,以斜杠开头的快捷命令) 和子代理 (Subagents: 在主代理框架下执行特定任务的辅助智能代理)。 Boris: 用户定义的斜杠命令是我们投入了大量精力的地方。 Boris: 这个想法是它只是一个工作流程:它就像一个Markdown文件。 Boris: 你把它放在你的代码中,它是一个可以大量重复使用的东西。 Boris: 举个例子,我有一个用于进行Git提交 (Git Commit: 版本控制系统Git中,记录代码更改的操作) 的斜杠命令。 Boris: 我在里面有一些说明:如何写一个好的Git提交。 Boris: 我预先允许了Git提交的Bash命令 (Bash Command: 在Bash shell中执行的命令),所以我不必每次都接受它,模型可以直接执行。 Boris: 所以我认为斜杠命令非常有趣,而智能代理是斜杠命令的一种不同视角。 Boris: 它就像一个斜杠命令,但它有一个分支的上下文窗口。 Boris: 所以你可以把智能代理和斜杠命令看作是同一事物的两个方面。 Boris: 这也非常令人兴奋。 Boris: 这只是扩展Claude Code的另一种方式。 Boris: 所以当我展望未来时,我认为很多都围绕着如何更多地扩展Claude Code? Boris: 如何让其他人更容易地在其之上进行构建? Boris: 如何让SDK (Software Development Kit: 软件开发工具包) 对人们更有用? Boris: 所以如果你想构建一个编程代理,它对代码有用,但你也可以用它做其他事情。 Boris: 比如,任何你需要代理的任务,你都可以使用SDK来完成。 Boris: 我认为这些是我最兴奋的事情。 Boris: 显然,所有这些都受益于我们正在做的其他工作,以使模型更加自主,使其工作时间更长,使其更好地遵循指令,使其更好地记住事物。 Boris: 所以它在各个方面都受益。
Alex: 那么,在未来六到十二个月内,我使用Claude Code或其任何形式的工作会是什么样子? Alex: 我是整天都在审查PRs (Pull Requests: 拉取请求,软件开发中用于合并代码更改的机制),还是日常工作会有什么变化?
Boris: 是的,我认为将会是更多亲身编码的混合。 Boris: 我不认为这会消失。 Boris: 不过,它的样子可能会有所不同。 Boris: 所以,今天的亲身编码可能是直接操作文本,但未来可能是在使用Claude为你操作文本。 Boris: 然后我认为会有另一部分,可能是较少直接编码,Claude会主动做一些事情,甚至可能Claude已经审查过了。 Boris: 而你的工作是决定这是否是你想要的更改。 Boris: 我认为也许在未来的12或24个月内,我们将开始看到Claude更多地关注目标,更多地关注它需要完成的这些更高层次的事情,而不是具体的任务。 Boris: 就像作为一名工程师,我思考我下个月想做什么。 Boris: 然后我会进行小的改动来朝着这个目标努力。 Boris: 也许Claude也会经历同样的过程。
Alex: 没错,某种程度上来说,就是不断提升这种抽象层次,从让Claude对文件进行单个修改,到让Claude对整个PR进行修改,再到让Claude思考构建一个应用程序或其他任何目标。
Boris: 是的。
Alex: 好的。 Alex: 这很有趣。 Alex: 如果我是一名工程师,听到这些,似乎在很短的时间内会有很多变化,尤其是我的角色和我应该做的事情。 Alex: 您对那些希望为这个世界做好准备并适应它的人有什么建议? Alex: 关于他们应该学习什么或应该发展什么技能。
适应新世界:从“黑客精神”到创意先行
Boris: 我回想起自己刚开始学习编程的时候,我还是个坐在中学数学课后排的孩子,手里拿着我的TI-83 Plus计算器。 Boris: 那是个透明的灰色计算器,你可以看到里面的电路。 Boris: 我们用BASIC语言编程,因为我很快意识到我实际上可以把数学考试的答案编进计算器里。 Boris: 这样你就能考得更好的分数。 Boris: 这种能够“黑客”的本能感觉,以及“我能做出一个程序”的想法,我只需要在计算器上编写代码,然后快速重启并使用它:这种反馈循环非常棒。 Boris: 它让我能够构建以前从未能构建的东西。 Boris: 而且上手非常容易。 Boris: 我思考那个世界与智能编程出现之前的世界的区别,那时技术栈变得越来越复杂。 Boris: 你知道,如果我想制作一个JavaScript网站,我必须学习React,也许还有Next.js,然后是三个不同的构建系统和一个部署系统。 Boris: 这实在是太复杂了。 Boris: 我认为智能代理一个非常酷的地方是它们正在改变这一点。 Boris: 所以有了编程代理,入门变得非常容易。 Boris: 如果你有一个想法,你就可以直接把它实现出来。 Boris: 现在更多的是关于想法,而不是细节,因为就像Claude Code一样,你可以一遍又一遍地重写代码。 Boris: Claude Code本身,我们也在不断重写。 Boris: 我认为这正是编程代理所能实现的功能。 Boris: 代码本身不再是珍贵的。 Boris: 当然,编写代码仍然是一门艺术,有时我们仍然会手工编写代码。 Boris: 团队里的一位工程师Lena,她就提到周末有时仍然会手工编写C++,只是因为好玩。 Boris: 对于一个程序员来说,这确实是一件非常快乐的事情。 Boris: 但我认为,未来会越来越关注你创造的东西,而不是创造过程本身。 Boris: 我认为对于今天学习编程的人,我的建议是,你仍然需要学习这门手艺。 Boris: 所以你仍然需要学习编程,学习语言,学习编译器、运行时,如何构建网络应用,如何构建程序,系统设计。 Boris: 你仍然需要了解所有这些东西,但也要开始变得更有创意。 Boris: 如果你有一个创业想法或产品想法,现在你就可以实现它,这是以前做不到的。 Boris: 我们还不完全理解这意味着什么,但因此即将释放的潜力是巨大的。
Alex: 是的,我喜欢这个。 Alex: 我认为这也是一个很好的建议。 Alex: 想法突然之间就能在几分钟内付诸行动;而以前,它可能永远停留在你的待办事项中。
Claude Code使用最佳实践:先问问题,再分级编码
Alex: 在我们结束之前,我想问您,作为Claude Code的创建者,您使用Claude Code的最佳实践是什么? Alex: 有没有什么技巧或窍门?
Boris: 是的,我认为我推荐的最重要的一点,好吧,也许是两个技巧。 Boris: 首先,我建议如果你是Claude Code的新用户,以前从未使用过它,不要用它来编写代码。
Alex: 是的,请解释一下。
Boris: 你必须阻止自己。 Boris: 暂时不要用它来编写代码。 Boris: 首先要做的是,用它来询问关于代码库的问题。 Boris: 所以你可以问,比如说,如果我想添加一个新的日志记录器,我该怎么做? Boris: 然后让Claude Code探索代码库并为你找出答案。 Boris: 或者问,为什么这个函数是这样设计的? Boris: Claude Code可以进入并查看Git历史记录,然后为你回答这些问题。 Boris: 所以我认为,向Claude Code询问关于代码库的问题,暂时不要编写代码。 Boris: 然后,一旦你习惯了这种方式使用Claude Code,并适应了让代理为你进行研究的这种想法,再开始用它来编写代码。 Boris: 第二点是,当你使用Claude Code编写代码时,思考你想做什么样的工作,以及任务的规模有多大? Boris: 对于非常简单的任务,我心里大致分为三个类别:简单、中等和困难。 Boris: 简单任务是Claude可以一次性完成的,比如一个提示,它就能做得差不多。 Boris: 现在我直接去GitHub,在issue上@Claude,让Claude为我编写PR。 Boris: 我就是这样处理简单任务的,因为这样可以解放我的终端。 Boris: 我不必把时间花在这上面。 Boris: 对于中等任务,我会在终端中启动它,并进入计划模式。 Boris: 所以只需Shift + Tab进入计划模式,我会先与Claude一起确定一个计划。 Boris: 然后一旦我对计划感到满意,我就会进入自动接受模式,让它去实现。 Boris: 而对于非常困难的任务,我仍然是主导者,Claude更多的是一个工具。 Boris: 我会与它结对编程。 Boris: 但真正掌握主导权的是我,而不是Claude。 Boris: 所以我可能会用Claude做一些基于代码的研究,也许会原型化一些想法,也许我只是凭感觉编写一些选项代码,以了解系统的边界以及什么能很好地工作。 Boris: 但我仍然会主要自己实现。 Boris: 也许Claude会编写单元测试 (Unit Tests: 软件开发中,对程序最小可测试单元进行验证的测试),但大部分编码工作仍然是我来完成。 Boris: 所以我认为这将是第二个建议,就是思考你正在做什么任务,以及使用Claude Code的最佳方式是什么。
Alex: 这些都是很棒的建议。 Alex: 真的非常感谢您的时间,Boris。 Alex: 这太棒了。谢谢您。
Boris: 是的,谢谢,Alex。