当 Claude Opus 4.5 发布时,整个开发者社区为之沸腾 ——AGI 似乎近在咫尺,模型在编码、代理和计算机使用方面的能力被宣称为 "世界最佳"。然而,在实际工程实践中,一个关键的技术差异逐渐显现:Claude 在组装现有代码块方面表现出色,但在创建新抽象时仍然力不从心。这一差异不仅定义了当前 LLM 的技术边界,也重新定义了工程师在 AI 时代的工作价值。
组装能力的突破:从 Sentry 调试到 AWS 迁移
Claude Opus 4.5 在组装现有抽象方面的能力确实令人印象深刻。在最近的实际测试中,Claude 展示了两个典型案例:
Sentry 调试循环的自主解决:当开发者尝试为 FastAPI 应用配置 Sentry 监控时,遇到了一个棘手问题 ——Sentry 自动为普通端点设置事务追踪,但对返回 StreamingResponse 的端点却无法自动配置。在没有明确调试日志的情况下,开发者让 Claude 编写 Playwright 测试脚本,通过 MCP 连接 Sentry,并持续尝试不同方案。经过 90 分钟的自主调试循环,Claude 最终发现问题根源并手动添加了事务追踪代码。
AWS ECS 迁移的一站式完成:从 Modal 迁移到 AWS ECS 通常需要开发者深入学习 AWS 术语和配置细节,这个过程可能耗费数天时间。然而,当给予 Claude Terraform 配置权限和 AWS CLI 访问后,它在 3 小时内完成了 Dockerfile 编写、容器镜像推送、权限配置和 ECS 服务部署,所有操作一次成功。
这两个案例的共同点是:Claude 都在组装现有抽象。Sentry 提供了完善的 API 和文档,Terraform 和 AWS CLI 提供了清晰的云资源抽象接口。Claude 能够理解这些接口的规范,按照既定模式组合它们,解决具体问题。
创建能力的缺失:React 重构中的失败案例
然而,当需要创建新抽象时,Claude 的表现截然不同。在一个 React 代码重构场景中,开发者遇到了一个典型的数据查找问题:
// 现有数据结构
keyIdPairs: [(key, id)] // 键值对列表
idToData: Map<id, data> // ID到数据的映射
// 组件A有key,需要查找对应的data
// 组件B有id,可以直接查找data
Claude 提出的解决方案是线性查找:
id = keyIdPairs.find(pair => pair.key == key).id
data = idToData.get(id)
这个方案在技术上是正确的,但在工程上是糟糕的。开发者知道key和id来自同一个上游数据源,正确的解决方案应该是让上游同时传递key和id,使组件 A 能够直接进行 O (1) 的映射查找,而不是 O (n) 的线性扫描。
问题的核心在于:Claude 能够看到局部的数据转换需求,但无法创建跨组件的数据流抽象。它无法识别出 "这个查找应该在数据源头解决,而不是在消费端重复计算" 这一架构洞察。
技术本质:LLM 在抽象生成与组合上的差异
Martin Fowler 在《LLMs bring new nature of abstraction》中指出,LLM 引入的是一种非确定性抽象。与从汇编语言到高级语言的确定性抽象提升不同,LLM 让我们在提升抽象层级的同时,也进入了非确定性的领域。
这种非确定性在抽象组合和抽象创建上表现出不同的特性:
抽象组合的非确定性优势:当 LLM 组合现有抽象时,非确定性成为优势。它可以从大量可能的组合方式中选择最优解,考虑边界条件和错误处理。在 Sentry 调试案例中,Claude 尝试了多种配置组合,最终找到了正确方案。
抽象创建的非确定性劣势:但当需要创建新抽象时,非确定性成为障碍。好的抽象需要意图性—— 对问题本质的深刻理解,对未来变化的预见,对代码美学的追求。Claude 缺乏这种 "灵魂",它没有创造美丽事物的渴望,只是根据统计模式生成看似合理的代码。
技术上的限制可以归结为:LLM 在概念图上的切割能力不足。正如 Grant Slatton 所比喻的,LLM 不擅长在概念图上做出干净的切割。它们能够识别和组合现有的概念节点,但难以创建新的、边界清晰的概念分区。
工程实践:设计适合 LLM 的抽象接口
基于这一技术差异,现代工程实践需要重新思考如何设计系统抽象:
1. 模块化接口设计原则
为 LLM 设计接口时,应遵循 "乐高积木" 原则:
- 原子性:每个接口完成单一明确的功能
- 组合性:接口之间可以轻松组合,形成工作流
- 自描述性:接口的输入输出和副作用清晰文档化
- 错误边界:接口有明确的错误处理约定
2. 抽象质量评估指标
评估现有抽象是否适合 LLM 使用时,可以考虑以下指标:
- 概念密度:每个抽象封装了多少业务逻辑
- 接口复杂度:API 的认知负荷
- 组合路径数:与其他抽象的可能组合方式
- 错误模式可预测性:失败情况的处理模式
3. LLM 辅助的抽象重构策略
当面对混乱代码库时,可以采用渐进式重构策略:
- 识别现有模式:让 LLM 分析代码中的重复模式
- 提取候选抽象:基于模式提取潜在的抽象接口
- 人工审查设计:工程师审查和优化抽象设计
- 逐步替换实现:在 LLM 辅助下逐步替换旧实现
监控与评估框架
为了有效利用 LLM 的组装能力,同时规避其创建能力的不足,需要建立相应的监控评估框架:
性能监控指标
- 抽象组装成功率:LLM 正确组合现有抽象的比例
- 抽象创建失败率:LLM 尝试创建新抽象时的失败比例
- 代码质量变化:引入 LLM 生成代码后的代码质量指标变化
风险评估参数
- 抽象依赖度:系统对特定抽象接口的依赖程度
- 概念边界清晰度:抽象之间的边界是否明确
- 重构成本预估:替换不良抽象所需的工程投入
未来展望:LLM 作为工程助手的边界与价值
Claude 在组装与创建能力上的差异,实际上重新定义了工程师在 AI 时代的工作价值。工程师不再是代码的 "写手",而是抽象的 "设计师" 和系统的 "架构师"。
短期边界(1-2 年)
- 组装自动化:LLM 将完全自动化现有抽象的组装工作
- 创建辅助:LLM 将成为抽象创建的辅助工具,但决策权仍在工程师
- 代码质量守护:LLM 将帮助维护代码质量,但无法主动提升架构质量
中期演进(3-5 年)
- 抽象模式识别:LLM 将能够识别潜在的抽象模式
- 设计建议生成:基于代码分析生成抽象设计建议
- 重构自动化:在明确指导下自动化部分重构工作
长期愿景(5 年以上)
- 意图理解:LLM 可能发展出对工程 "意图" 的理解能力
- 创造性抽象:在充分领域知识基础上创建有价值的抽象
- 架构演进:参与系统的架构演进决策
可落地的工程参数
基于当前技术限制,以下是具体的工程实践参数:
1. LLM 任务分配阈值
- 组装任务:复杂度评分≤7(10 分制)的任务可完全委托给 LLM
- 创建任务:任何涉及新抽象创建的任务都需要人工审查
- 混合任务:组装占比≥70% 的任务可优先使用 LLM
2. 代码审查检查清单
- 是否引入了新的抽象概念?
- 新抽象的边界是否清晰?
- 是否有更简单的现有抽象组合方案?
- 抽象的设计是否符合领域模型?
3. 抽象质量评分卡
- 概念清晰度(0-10 分):抽象的概念是否单一明确
- 接口简洁度(0-10 分):API 设计是否简洁易用
- 组合灵活性(0-10 分):与其他抽象的组合能力
- 错误处理完整性(0-10 分):错误情况的处理是否完善
结论:重新定义工程价值
Claude 在代码块组装与创建能力上的技术差异,揭示了一个更深层的真相:在 AI 时代,抽象设计能力成为工程师的核心竞争力。LLM 能够自动化重复性的组装工作,但无法替代人类在抽象创造、架构设计和系统演进中的独特价值。
这一差异不是缺陷,而是机会。它迫使工程师从代码实现的细节中解放出来,专注于更高层次的价值创造:设计更好的抽象,构建更优雅的系统,解决更复杂的问题。当 Claude 成为我们的 "乐高组装助手" 时,我们得以成为真正的 "系统架构师"。
最终,技术的进步不是要取代人类,而是要放大人类的独特能力。Claude 在组装与创建能力上的差异,正是这种放大的开始 —— 它承担了繁琐的组装工作,让我们能够专注于真正需要创造力和洞察力的抽象设计。
资料来源:
- Claude is not a senior engineer (yet) - 详细分析了 Claude 在组装与创建能力上的实际案例
- LLMs bring new nature of abstraction - Martin Fowler 关于 LLM 抽象本质的技术分析