编辑 | 云昭
出品 | 51CTO技术栈(微信号:blog51cto)
“首先要承认,编程Agent确实会‘作妖’!”
今天一早,AI大佬吴恩达针对目前火热的编程Agent产品发表了自己的观点。
虽然这个赛道很热,但吴恩达丝毫没有掩饰自己内部团队的真实使用体验。
一个代理在工作目录中执行了 rm *.py,直接删除了整个项目的所有代码(幸好我们有 GitHub 备份)。
最气人的是,当我们追问时,代理还道歉并承认“这是一个极其愚蠢的错误”。虽然这让我们心里稍微好受点,但损失已经造成!
而这也仅仅只是大佬戳出编程Agent的四宗罪之一。
图片
然而,大佬的目的并不是给编程agent泼冷水,而是要想办法让这些Agent更靠谱一些。
“我依旧喜欢它。为了让它们更可靠,我发现合理确定测试的优先级非常关键。”
吴恩达分享了自己“测试驱动开发”的一些经验。比如:自己很少为前端代码写大量测试,而是一旦发现bug就让代理去修复;而对于后端代码则不然,需要设置严格的测试,以便能更早发现问题,从而节省大量棘手的调试时间。与此同时,吴重点强调了深层组件测试的重要性:
尤其要注意那些作为“基石”构建层层抽象的软件组件。
这也是,Meta的口号从早期的“快速迭代,打破常规”改成了“在稳定的基础设施上快速前进”的原因。
以下是吴恩达发表的帖子全文,enjoy:
1.AI Coding时代,TDD重要性日益提升
亲爱的朋友们,
在 AI 辅助编程的时代,自动化软件测试的重要性日益提升。Agentic 编程系统(代理式编程系统)能够加快开发速度,但也存在不稳定性。Agentic 测试,即让 AI 来编写测试并用这些测试去校验代码,正在发挥作用。特别是对那些你打算在其上继续构建的基础软件组件进行自动化测试,往往能带来更稳定的基础设施,并减少后续调试工作。
像 测试驱动开发(TDD) 这样的软件测试方法学非常重要。TDD 的流程是:先为正确性写出严格的测试,然后再通过写代码去满足这些测试条件,从而推进开发。这是一种找出 bug 的有效方法。但编写测试本身可能耗费大量精力。(我个人从未采用 TDD,原因就在于此。)而 AI 在写测试方面的能力相当不错,所以 agentic 测试的关注度正在不断上升。
2.编程Agent确实会“作妖”
首先,要承认的是:编程代理确实会“作妖”!
我的团队经常使用它们,我们遇到过:
- 大量由编程代理引入的 bug,其中一些是微妙的基础设施 bug,人类要花上数周才能发现。
- 在生产系统中被引入的安全漏洞:某个代理为了简化开发,把密码重置功能做得过于容易。
- 奖励黑客行为:代理修改了测试代码,使得通过测试变得更容易。
- 一个代理在工作目录中执行了 rm *.py,直接删除了整个项目的所有代码(幸好我们有 GitHub 备份)。
在最后这个例子中,当我们追问时,代理还道歉并承认“这是一个极其愚蠢的错误”。虽然这让我们心里稍微好受点,但损失已经造成!
3.合理安排测试优先级:尤其是警惕那些深层组件
尽管如此,我依然喜欢编程代理,并且看到它们显著提高了生产力。为了让它们更可靠,我发现合理确定测试的优先级非常关键。
我很少为前端代码写大量测试(或让代理写)。如果前端有 bug,通常容易看出来,也不会造成持久损害。比如,网页信息显示的 bug 一般能立刻被发现,然后告诉代理让它反复迭代修复。
更进阶的办法:用 MCP 让代理集成 Playwright 之类的工具,自动截图,从而自主发现问题并调试。
相比之下,后端 bug 更隐蔽、更难找。我见过那种非常细微的基础设施 bug——例如在某些极端情况下会导致数据库记录损坏——需要很长时间才能定位。如果能对后端代码设置严格的测试,往往能更早发现问题,从而节省大量棘手的调试时间。
尤其要注意那些作为“基石”构建层层抽象的软件组件:
- 组件本身的 bug 会传递,导致下游出现难以追踪的 bug。
- 深藏在软件栈底层的 bug,可能要等到数周甚至数月后才会浮现,那时你早已忘了当时写这段代码的背景,定位和修复会异常艰难。
这就是为什么深层组件的测试尤为关键。Meta 曾提出口号“在稳定的基础设施上快速前进”(取代了早期的“快速迭代,打破常规”),这句话今天依然适用。Agentic 测试能帮你确保基础设施稳固,方便自己和他人在其上继续构建。
keep testing!
Andrew