70%问题:关于AI辅助编码的硬核真相
原文地址
Translate by ChatGPT o3-mini
在过去几年里,我深入参与了AI辅助开发,我注意到了一个有趣的模式。尽管工程师们报告说他们在AI的帮助下变得更为高效,但我们日常使用的软件似乎并没有明显变得更好。这是怎么回事?
我想我知道原因,而答案揭示了关于软件开发的一些基本真相,我们需要面对。让我分享一下我所学到的。
开发者如何实际使用AI
我观察到团队在使用AI进行开发时,呈现出两种截然不同的模式。我们可以称之为“自 bootstrap 模式”和“迭代模式”。两者都在帮助工程师(甚至是非技术用户)缩短从创意到执行(或最小化可行产品,MVP)的距离。
自 Bootstrap 模式:从零到 MVP
像 Bolt、v0 和 screenshot-to-code AI 这样的工具正在革新我们如何启动新项目。这些团队通常:
- 从设计或粗略的概念开始
- 使用AI生成完整的初始代码库
- 在数小时或数天内得到一个可用的原型,而不是几周
- 重点关注快速验证和迭代
结果可能令人印象深刻。最近我看到一个独立开发者使用 Bolt 将 Figma 设计转化为一个工作的网页应用,几乎没有花费多少时间。它还不是生产级别的,但足够用来收集非常初步的用户反馈。
迭代模式:日常开发
第二种模式使用像 Cursor、Cline、Copilot 和 WindSurf 这样的工具来进行日常开发工作流。这种方式虽然看起来不那么炫酷,但可能具有更大的变革潜力。这些开发者正在:
- 使用AI进行代码补全和建议
- 利用AI进行复杂的重构任务
- 生成测试和文档
- 将AI作为“配对程序员”来解决问题
但这里有个问题:尽管这两种方法都可以显著加速开发,但它们也带来了那些并不显而易见的隐性成本。
“AI速度”的隐性成本
当你看一个资深工程师使用像Cursor或Copilot这样的AI工具时,感觉就像魔法一样。他们能在几分钟内搭建整个功能,包括测试和文档。但仔细看,你会注意到一些关键的事情:他们不仅仅是在接受AI的建议。他们在不断地:
- 将生成的代码重构成更小、更专注的模块
- 添加AI遗漏的边界情况处理
- 强化类型定义和接口
- 质疑架构决策
- 添加全面的错误处理
换句话说,他们正在应用多年来的工程智慧来塑造并约束AI的输出。AI加速了他们的实施过程,但他们的专业知识确保了代码的可维护性。
初级工程师往往忽视这些关键步骤,他们更容易接受AI的输出,导致我所谓的“纸牌屋代码”——看起来完整,但在现实世界的压力下会崩溃。
知识悖论
我发现的最具反直觉的事情是:AI工具帮助经验丰富的开发者远远超过初学者。这看起来有些不对劲——难道AI不应该使编码变得民主化吗?
实际上,AI就像是你团队中的一个非常勤奋的初级开发者。他们能迅速写出代码,但需要持续的监督和修正。你知道得越多,就能更好地引导他们。
这就创造了我所谓的“知识悖论”:
- 资深开发者使用AI来加速他们已经知道如何做的事情
- 初级开发者试图通过AI来学习该做什么
- 结果差异巨大
我看到资深工程师用AI来:
- 快速原型化他们已经理解的创意
- 生成基本的实现,然后进行优化
- 探索已知问题的替代解决方案
- 自动化日常编码任务
而初级开发者通常会:
- 接受不正确或过时的解决方案
- 错过关键的安全性和性能考虑
- 在调试AI生成的代码时遇到困难
- 构建他们并不完全理解的脆弱系统
70%问题:AI的学习曲线悖论
最近有一条推文完美地捕捉了我在现场观察到的现象:非工程师使用AI进行编码时,会遇到令人沮丧的壁垒。他们可以在意想不到的时间内完成70%的工作,但最后的30%则成为一种递减回报的体验。
这个“70%问题”揭示了当前AI辅助开发的一个重要真相。最初的进展感觉像魔法——你可以描述你想要的,AI工具如v0或Bolt会生成一个看起来令人印象深刻的工作原型。但接下来,现实就来了。
倒退两步的模式
接下来通常会发生一个可预测的模式:
- 你试图修复一个小bug
- AI建议一个看起来合理的更改
- 这个修复导致了其他问题
- 你请求AI修复新的问题
- 这又会产生更多的问题
- 一遍又一遍地重复这个循环
对于非工程师来说,这个过程尤其痛苦,因为他们缺乏理解实际发生了什么的思维模型。当经验丰富的开发者遇到bug时,他们可以通过多年的模式识别来推测潜在原因和解决方案。没有这个背景,你实际上是在与你不完全理解的代码玩打地鼠游戏。
继续的学习悖论
这里有一个更深层次的问题:使AI编码工具对于非工程师更具可接近性的特性——它们能够代替你处理复杂性——实际上可能会妨碍学习。当代码只是“出现”而你并不理解背后的原理时:
- 你不会培养调试技能
- 你错过了学习基本模式
- 你无法推理架构决策
- 你很难维护和发展代码
这就产生了一种依赖性,你需要不断回到AI去修复问题,而不是培养自己处理问题的专业能力。
知识差距
我见过的最成功的非工程师使用AI编码工具采用了一种混合方式:
- 使用AI进行快速原型化
- 花时间了解生成的代码是如何工作的
- 在使用AI的同时学习基本的编程概念
- 逐步建立知识基础
- 将AI作为学习工具,而不仅仅是代码生成器
但这需要耐心和奉献——正好与许多人使用AI工具时希望实现的目标相反。
对未来的影响
这个“70%问题”表明,当前的AI编码工具最好看作是:
- 经验丰富的开发者的原型加速器
- 对那些致力于理解开发过程的人的学习工具
- 快速验证创意的MVP生成器
但它们还不是许多人所希望的编码民主化解决方案。最后的30%——使软件生产就绪、可维护且强大的部分——仍然需要真正的工程知识。
好消息是?随着工具的改进,这个差距可能会缩小。但现在,最务实的方法是将AI用于加速学习,而不是完全取代它。
实际有效的模式
在观察了几十个团队后,我发现以下几种方式一直有效:
“AI初稿”模式
- 让AI生成基本的实现
- 手动审查并重构以增强模块化
- 添加全面的错误处理
- 编写详细的测试
- 记录关键决策
“不断对话”模式
- 为每个独立任务启动新的AI对话
- 保持上下文专注且简洁
- 经常审查并提交更改
- 保持紧密的反馈循环
“信任但验证”模式
- 使用AI进行初始代码生成
- 对所有关键路径进行人工审查
- 自动测试边界情况
- 定期进行安全审计
展望未来:AI的真正承诺?
尽管存在这些挑战,我对AI在软件开发中的作用仍然持乐观态度。关键是理解它真正擅长的领域:
- 加速已知的事情
- 探索可能的解决方案
- 自动化日常任务
这对你意味着什么?
如果你刚刚开始接触AI辅助开发,我的建议是:
- 从小处做起
- 使用AI进行孤立、定义明确的任务
- 审查每一行生成的代码
- 逐步构建更大的功能
- 保持模块化
- 将一切拆分成小而专注的文件
- 维护清晰的组件间接口
- 记录模块边界
- 信任你的经验
- 使用AI加速,而不是替代你的判断
- 对生成的代码提出疑问
- 维护你的工程标准
代理软件工程的崛起
随着我们迈向2025年,AI辅助开发的格局正在发生戏剧性的变化。虽然当前的工具已经改变了我们的原型制作和迭代方式,但我相信我们正站在一个更大变革的边缘:代理软件工程的崛起。
什么是“代理”?
“代理”不再只是响应命令,而是这些系统可以规划、执行并在逐步增加自主性的基础上迭代解决方案。
如果你有兴趣了解更多关于代理的信息,包括我对Cursor/Cline/v0/Bolt的看法,你可能会对我最近的JSNation演讲感兴趣。
我们已经看到了这一进化的早期迹象:
从回应者到协作者
目前的工具大多在等待我们的命令。但看看像Anthropic的Claude中的计算机使用功能,或者Cline能自动启动浏览器并运行测试的能力。这些不仅仅是华丽的自动补全——它们实际上理解任务并主动解决问题。
考虑调试:这些代理不仅仅是建议修复,它们可以:
- 主动识别潜在问题
- 启动并运行测试套件
- 检查UI元素并捕获截图
- 提出并实施修复
- 验证解决方案是否有效(这可能非常重要)
多模态的未来
下一代工具可能不仅仅与代码合作——它们可能无缝集成:
- 视觉理解(UI截图、模型、图表)
- 口头语言对话
- 环境互动(浏览器、终端、API)
这种多模态能力意味着它们能够像人类一样全面理解和处理软件,而不仅仅停留在代码层面。
自主但受引导
我从与这些工具的合作中得到的一个关键见解是,未来并不是AI取代开发者——而是AI成为一个越来越有能力的协作者,它能够主动采取行动,同时仍然尊重人类的引导和专业知识。
2025年最有效的团队可能是那些学会了:
- 为他们的AI代理设定明确的边界和指南
- 建立强大的架构模式,让代理能够在其中工作
- 在人类和AI能力之间创造有效的反馈循环
- 在利用AI的自主性时,保持人类监督
英语优先的开发环境
正如Andrej Karpathy所说:
“英语正在成为最炙手可热的编程语言。”
这标志着我们与开发工具互动方式的根本转变。能够清晰地思考并精准地用自然语言表达,正变得和传统编码技能一样重要。
这种向代理开发转变将要求我们进化我们的技能:
- 更强的系统设计和架构思维
- 更好的需求规格和沟通能力
- 更多的质量保证和验证关注
- 增强的人类与AI能力之间的合作
软件作为工艺的回归?
虽然AI使得构建软件比以往任何时候都更加迅速,但我们面临着失去某些关键东西的风险——创造真正精致的、消费者级体验的艺术。
演示质量陷阱
这已经成了一种模式:团队利用AI快速构建令人印象深刻的演示。快乐路径运行得很顺利。投资者和社交网络都感到惊讶。但当真正的用户开始点击时?这就是事情崩溃的时刻。
我亲眼见过这样的情况:
- 对普通用户来说毫无意义的错误消息
- 崩溃应用的边界情况
- 从未清理过的混乱UI状态
- 完全忽视可访问性
- 在较慢设备上的性能问题
这些不仅仅是P2级错误——它们是区分“用户勉强接受的软件”和“用户热爱的软件”的差异。
失去的精细打磨艺术
创造真正自助的
软件——那种用户永远不需要联系客服的软件——需要一种不同的心态:
- 对错误消息进行过度关注
- 在慢连接下进行测试
- 优雅地处理每个边界情况
- 使功能易于发现
- 与真实的、通常是非技术的用户一起进行测试
这种注重细节的能力(也许)无法通过AI生成。它来自同理心、经验,以及对工艺的深刻关怀。
个人软件的复兴
我相信,我们将见证个人软件开发的复兴。随着市场被AI生成的MVP充斥,能够脱颖而出的产品将是那些由开发者构建的,这些开发者:
- 为他们的工艺感到自豪
- 关心细节
- 专注于完整的用户体验
- 为边界情况进行构建
- 创建真正的自助体验
讽刺的是?AI工具实际上可能促成这一复兴。通过处理日常的编码任务,它们解放了开发者,让他们专注于最重要的事情——创造真正服务和让用户愉悦的软件。
最后结论
AI并没有让我们的软件变得更好,因为软件的质量(也许)从来不是由编码速度决定的。软件开发的难点——理解需求、设计可维护的系统、处理边界情况、确保安全性和性能——仍然需要人类的判断。
AI的确能让我们更快地进行迭代和实验,通过更迅速的探索可能导致更好的解决方案。但只有在我们保持工程纪律并把AI当作工具而非替代良好软件实践的情况下才能实现这一点。记住:目标不是写更多的代码,更快地写代码。而是构建更好的软件。明智地使用AI,我们可以做到这一点。但最终仍然是我们决定“更好”是什么意思,并知道如何实现它。