深度评测 Claude Code 在真实项目中的表现和局限,581 条讨论反映社区极高关注。是 AI 编程工具的高质量测评。
这只是短短几周,要说这已经过去了,真是不可思议。
Claude Code 大大改变了我在规模化编写和维护代码的方式。我编写代码的质量水准没有降低,但我感觉获得了一种全新的表达自由,这种感受很难完全用言语表达出来。
Claude Code 让我不必亲手编写每一行代码,尽管我仍然对所有发布到 Puzzmo 的东西负全责,但能够瞬间创建整个场景,而不是一行一行、一个字一个字地编写,这种能力令人难以置信地强大。
我相信 Claude Code 代表了编程的"摄影术发明期"。当一个单一的概念可以直接呈现,你用代码审查和编辑技能将其塑造成你想要的东西时,手工绘画就不再那么吸引人了。
如果这种想法让你感到不安,欢迎来到 2020 年代中期,没什么是稳定的,变化是唯一的常数。抱歉。我没有制造文化变迁,但我认为 LLM 已经造成了社会伤害,将来会造成更糟的伤害 —— 但这个精灵已经完全脱离了瓶子,它将从根本上改变我们对编程的理解。
这篇文章是在我使用 Claude 一周后写的"关于用 Claude 编程"的延伸。如果你认为我过度沉迷于 AI,你可以在那篇文章的开头看到我对 LLM 的细致观点。
话虽如此,这确实是变革性的,我想尝试从过去 6 周在 Puzzmo 工程团队的活动中给你一些视角,来展示我一直在看到什么。
我曾在许多项目中与人合作过,花费数周的全职时间来完成某种日常任务:"将这个 JS 代码库转换为 TypeScript"、"升级到 Swift X"、"切换到 monorepo"——这些都是需要大量变基的精细迁移。
以下是自从获得 Claude Code 访问权限以来我独自完成的事项列表:
这些项目都不是我作为 Puzzmo 今年的"bizdev"人员每天需要做的"实际工作"。这些完全是我在处理其他工作时独立做的副项目。
为了清楚起见——这对我来说令人震惊 ——— 在过去 6 周里,我仍在从事 Claude Code 之前已有的现有路线图工作时,我独自完成了所有这些事情。大部分时间是在后台进行的(然后对一些较大的项目进行一天的抛光)。我也没有从平时的工作时间增加到 16 小时左右。
这些是多年来积累的"技术债"/"技术创新"待做清单!在短短一个半月内完成。
如果你理解自己在做什么,处理和建设通常属于"技术债"范畴的广泛任务的能力就不需要被视为债务,你可以在处理其他工作时顺便做。
"从日程中抽出时间"现在便宜得令人难以置信,开始工作和取得重大进展是你可以在进入会议前准备的事情,然后在之后决定这是否是正确的。令人难以置信。
我一直在努力形成的一个习惯是,在我完全否定一个想法之前先给它一个机会。例如,从我在 Puzzmo 第一天起,我就在等待为前端制定测试策略,因为我希望能够雇人完全拥有"puzzmo.com",其中一部分是弄清楚如何在我们发展时不做那么多回归测试。
为前端制定测试策略并不简单,我见过很多真正的坏测试套件,过度测试和变得脆弱,工程师不喜欢与之共事。网络、react、context 的范围、dom、工具中的不稳定性的混合只会导致答案,你在寻找最不坏的解决方案,这是你自己使用过并且对维护感到满意的。
我想知道我是否需要等待其他人,所以我不是简单地"添加测试套件"—— 我选择让 Claude Code 在我过去两周对前端进行的每个拉取请求中编写测试。
然后,看到测试后,我删除了它们。这为我的流程增加了额外的 5 分钟,但每次都让我深入了解其他项目处理问题的不同方式。经过数周的这样做,我准备好开始系统地查看那个问题。
为每个拉取请求编写测试然后删除它的想法只是浪费太多时间了,我根本无法接受。
或者最近 Slack 上的一个例子,我在后台用半天时间试图为我们 CMS 工具中的 CRUD 资源创建抽象:
它有效吗?不。值得探索吗?当然。
Anthropic 有关于如何使用工作树的信息 —— 我想为更简单的方法辩护。两个克隆,不同的 VS Code 配置文件。
这意味着你可以独立地在每个中工作,并且仍然可以通过使用不同的主题直观地识别工作区中的差异:
我最好的论点很简单:每个克隆代表一个你一次可以处理的单一拉取请求。如果你正在编写拉取请求并与他人合作,这仍然非常重要。我这样做是为了让我们的开发服务器关闭任何使用你想要的端口的进程,在两个克隆之间跳转是微不足道的,因为 Claude Code 在你查看构建之前的工作中会很简单。
自 Puzzmo 创建以来,创建游戏的过程是:
这个过程需要数周才能编写任何生产代码,如果有的话。按照我们目前的吞吐量,我们大约每季度发布一个达到我们想要的抛光水准的游戏。
在后 Claude Code 的世界中,这个模型可以大大简化,这是我们正在探索的一个领域。我创建了一个新的 Puzzmo monorepo(现在有三个了:"app"、"games"和这个新的"prototypes"),它模拟了游戏仓库的基础设施但对被运送的代码类型的期望大不相同。有了这个仓库,游戏设计师可以在几小时内从一个想法到在 puzzmo.com 上为管理员运行的东西,你编写代码,然后进入我们的管理 CMS 并单击几个按钮,完成。
从"这对团队有好处"到"我们应该向公众提供"需要我和 Saman 进行一些实际工作,但与我们当前的生产流程相比,这完全是不同的努力水平。
我们使用这种技术发布了 Missing Link,这似乎是一个热门。这…… 实际上对我们来说有点问题。我很高兴我们有一个游戏设计师的代码在 Puzzmo 上进行时间限制的实验,但我不同意这变成与其他游戏一起的 Puzzmo 规范。
允许游戏设计师制作原型的灵活性正是使其不适合编写长期生产代码的原因。这让我们有几个选择:
所有这些都有权衡,什么是正确的想法并不明显。这个问题是新的,因为在 Claude Code 之前,将原型代码与 Puzzmo 的系统集成不值得努力 —— 现在这对团队中的任何人来说都是微不足道的,完全可以实现。我们可以真正交付我们推出的"实验性"游戏的想法,这意味着我们必须更加谨慎地考虑推出太多人希望我们保留的游戏的风险。
我在每周分流所有提出的 GitHub issue 时一直在试验的一件事是在我们作为工程师小组讨论我们认为的内容时,要求 Claude Code GitHub action 尝试一个拉取请求:
或者我自己在问题中提供足够背景的一个:
由于我是负责将该拉取请求投入生产的人,这是已经准备好的前几步,对于较小的东西,我发现一旦仓库建立良好,这现在是一个可靠的一次性尝试。
我认为值得在这里指出,我们从我个人明确有多强大的工具的那一刻起就向团队中的每个人提供了 Claude Code。
我会说从我们的团队来看,使用并发现最多价值的人都是既有产品、技术技能和代理权感的人,他们认为自己可以尝试一些东西。
其中一个人说 Claude Code 让他们免除了在编程中不断第一步的焦虑。
Justin Searls 做了一个有趣的文章,他描述了一个完整广度开发人员的想法,他论证:
在几个月前,最好的开发人员拉小提琴。今天,他们指挥交响乐。
我认为这是正确的,在 Puzzmo 团队中,那些技能组合自我驱动的、运行自己的垂直部分并感觉他们有自由探索和推动这些边界的人正在做真正酷的工作。它超越了任何明确的工作角色边界,它变成了在比以前更大/更快的规模上进行协作创意的乐趣。
所以我会加倍说 Justin 的文章中的一切都呼应了 Puzzmo 工程团队内部发生的事情,他的文章真的值得仔细思考。
我们使用 monorepos。我很幸运在一年前花时间将每个项目转移到两个主要环境中。这最初是为了反映工程团队的工作过程而做的。我的目标是使从数据库 schema 变化到前端组件在单个拉取请求中成为可能。monorepo 非常适合与 LLM 一起工作,因为它可以读取代表我们 schema 的文件,可以读取定义公共 GraphQL API 的 sdl 文件,读取每个屏幕的请求并弄清楚你在尝试做什么。拥有一个包含如此多背景信息的地方意味着我作为 Claude Code 的用户不需要告诉它那类东西,像"向用户模型中的数据库添加一个 xyz 字段并使其显示在这个屏幕中"这样模糊的消息是 Claude Code 可以做的。
我的技术选择是十年前做的。我在 2018 年给出的一次会议讲话的视频仍然是我向人们介绍 Puzzmo 代码库和这些技术选择背后心态的方式。React、Relay、GraphQL、TypeScript 和(现在)StyleX 是无聊且非常明确的技术。所有这些系统中都有编译步骤,这意味着一切都必须在本地可用并正确运行,这使得学习有一点曲线,但通常当你得到它时 —— 你知道你得到了它。对于我们的管理工具,它甚至更无聊/成熟,我仍然在使用 Bootstrap!对于 LLM,这些技术在其训练集中非常扎根,Claude Code 知道做一些事情,比如"运行 Relay 编译器"(当我第一次看到 Claude Code 做到这一点时,我知道我要经历一个疯狂的旅程),这为验证它所做的变化正在工作提供了增量方式。
这不是新工作。我们每天做的大多数东西都是相当正常的、朴素的 CRUD 风格应用。
这些代码库既不大也不老。没有什么比 2021 年更早,虽然我保持更新,但我尽量拥有长期的支持/向后兼容性。
我们的业务就是这些模型的测试套件/基准。例如,在 6 月 28 日,发布前两天,GLM-4.5 出现了。提供了一种在你的电脑上本地运行大约 80% 一样好的 Claude Code 的方法。他们如何衡量那 80%?这是他们使用的基准表:
Puzzmo 的日常工作在他们的测试基础设施中占了 ~(39/52)% 的比例!
我本以为在过去 6 周内拉取请求、提交和合并的代码行数会看到相当大的变化。但我不认为这是对的:
这是一个 3 个月的图表,有一个月是 Claude Code 后的。我只是要求它制作一个脚本来从我硬盘上的仓库生成 CSV。
话虽如此,我认为任何内部人士都会感觉到 Puzzmo 内部的变化速度确实已经增加(至少在我贡献的领域中),但这些数字在现实中并没有真的改变。
最近有一篇论文(来自 Claude Code 前的日子)说开发人员高估了 AI 的影响,也许我就是这样。
不过没有这种感觉。你看到顶部的那个列表吗?我觉得我不断地打破我通常的时间估计到几乎不可能为我衡量一项任务需要多长时间。
虽然最初令人陶醉,但习惯于 Claude Code 的使用只是在一段时间后变成平凡的正常工具使用。你不需要花时间担心 Sonnet 或 Opus,或抓住每个 Claude Code 竞争对手,比如 Gemini CLI、Qwen Code 或其他一些很酷的模型。在我的 100 美元每月的账户中,我除了 Claude Code 与它所做的一切外什么都没有使用,我做得非常好。我听说过很多关于当 Claude Code 卡住时询问 Gemini 的好事,但我发现如果 Claude Code 卡住了,我没有尽到好工作框架我们的工作,重新审视值得时间。
我从未设置过 MCP 服务器,我发现进行语音聊天超级尴尬并且没有使用它,我不关注 Twitter 上的"蓝勾子"人,他们有一些"*.ai"简介。那些人可以做他们的事,但我很高兴不参与。
将来会有一个时刻使考虑其他生态系统工具有意义,但对我来说,Claude Code 前后的区别非常巨大,以至于它和其他的任何增量(在某些方面会更好,在其他方面会更差)对于如此小的增量收益来说不值得麻烦。
在本地运行某些东西很诱人,但像 Claude Code 这样的网络版本总是会领先一步,只要我不需要考虑使用限制(是的,我知道),那么我们就处于良好的状态。
就像使用手机一样,你可以被 Claude Code 可以随时运行的概念所消耗,你应该让它随时运行。实际上是在你的终端(或手机?!)中"刷屏"而不是其他。
值得记住的是,任何工具可以随时使用,但你是驱动它的人,你的精力/能力来做出知情决定不是无限的。
我一直在尝试列出我可以接受的一切:
{
"permissions": {
"allow": [
"Bash(grep:*)",
"Bash(yarn run *)",
"Bash(yarn lint:*)",
"Bash(yarn workspace:*)",
"Bash(find:*)",
"Bash(mkdir:*)",
"Bash(rg:*)",
"Bash(ls:*)",
"mcp__ide__getDiagnostics",
"Bash(awk:*)",
"Bash(yarn build)",
"Bash(yarn why:*)",
"Bash(yarn info:*)",
"Edit(*)"
],
"deny": ["Bash(npx prisma migrate dev:*)", "Bash(git checkout:*)", "Bash(git add:*)"],
"defaultMode": "acceptEdits"
}
}
但这仍然不足以不断地感觉我被问到我不需要确认的事情。所以我运行 claude --dangerously-skip-permissions 即 claude yolo。发生在我身上最糟的事情是在坏的 Prisma 迁移期间让我的开发数据库被擦除,Claude Code 决定它应该做出提交,然后做一个拉取请求。
我对后两者的理论是,如果一个人被期望读它,一个人应该写它。我可以接受:
[作者描述或单行行]
---
[代码生成的 PR 模板]
但我不在生产中乱搞。
我与想要仍然自己做大量繁重工作的职业生涯早期的人谈过的一件事是考虑写他们的工作,然后将他们的结果与 Claude Code 请求的相同的结果进行比较。
并行构建是有你的蛋糕并吃掉它的一种方式。你仍在学习和成长,但你的结果可以通过看到 Claude Code 中的训练数据聚合也决定如何做来改进。Claude Code 可能对生态系统有更深入的理解,并可能在当前代码库中读取更多源代码以及了解你仍未学习的抽象。
IMO 把它当作一个你可以向其学习的竞争对手对待要比放弃并接受你不需要知道东西了,或把你的头埋在沙子里并假设这种变化不会以某种方式影响你要健康得多。
在我整个编程生涯中,像所有人一样,我主要被限制于侧项目和一次性的能力,因为我仍然希望有生活。我选择投入自己做大规模开源贡献来让我对我投入到这门技艺中的时间量感到良好。
具体来说,这意味着花时间在像 CocoaPods、Danger、Jest、GraphQL 这样的项目上是我代替制作有趣项目来探索一项技术或修复较小细节所做的事情。
现在不同了。我只能尝试并决定我是否喜欢结果。在一小时的 Claude Code 探索中,我觉得我可以做大约一个周末的探索。
例如,这篇博文。当我在思考它时,我想,"能够以内联方式显示 Claude Code 对话会很好",然后随后,"将 Adium 主题恢复为它会很有趣"。所以。我开始了。
所以,我列出了我在寻找的大致想法。开始时对其进行了相当好的描述,带着狗去了一个小时长的散步,回来时得到了一个合理的 CLI 近似,这对我来说手工编写需要几个小时。
这不是很多代码,但它是很多研究,我如何重新创建 Adium 主题 HTML,你如何理解 claude code 的消息格式,你如何处理保持资源本地化以进行预览。
单击以显示与 Claude 的聊天
有了足够的工作来正确地混合这些想法,我进行了抛光传递。
我已经抛光和部署了足够的 npm 模块(174?!),所以再次,完全在我不用想太多就能做的技能范围内。相反,我把这个项目当作一个有趣的侧工作,同时观看 Apex Legends。
如果你阅读聊天,你会看到我花了一些时间弄清楚如何过滤一些东西,如何以特定的方式显示消息,但这是系统性的看管和代码,我真的不在乎。
单击以显示与 Claude 的聊天
像这样的功能是一个完整的周末项目,对我来说大约需要 10-12 小时才能做到正确和感觉可交付。相反,大部分工作发生在我不在的时候,然后抛光是零散的。也许整个事情花了 ~2 小时的我的思考时间?这太疯狂了。
如果你想看到其余的对话以获得我发布这篇博文的地步,这些是:
按时间顺序从上面 2 个继续:3、4、5、6
如果你安装 Adium 然后运行 npx claude-code-to-adium,你现在可以使用它,它会带你通过一个向导,最后会得到一个充满 html/css/images 的自包含子文件夹。
我将尝试从我在 19 个单独的 repo/项目中开始以来进行的 147 次对话中精心挑选一些。我的目标是广泛的目标,并给出我对一侧的看法。
这是一个聊天,我对我想要的东西有一般的概念,但我知道我实际上不知道关于 postgres 索引以及它如何影响大量删除的答案。
所以首先我问一个通用问题,它使用我的 prisma 定义文件来确定当前在数据库中设置了什么。
我们迭代了一个脚本...