一次成型的幻觉
每个经历过过去几十年炒作列车的程序员都知道,真相埋藏在"编程已死"和"AI是骗局"之间的某个地方。AI在某些场景中可以编写完美的生产就绪代码,而在其他场景中则完全失败。
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
Linus Torvalds最近澄清了他对AI编程工具的立场,并强调了对它们的使用。同时,他也阐明了对"反LLM"立场的看法,一些内核开发者也持有类似观点。
"AI是一种工具,就像我们使用的其他工具一样。而且它显然是一种有用的工具。" — Linus Torvalds(2026年7月14日);来源:lore.kernel.org
Linus澄清说,LLM将长期存在,并将继续用于内核开发。与此同时,OpenClaw的作者Peter Steinberger引发了一场辩论,讨论智能代理网络是否应该围绕图而非循环来组织。除此之外,所有这些"我一次就搞定了"的帖子开始让人感觉像是一种光学错觉。那么,你们是不是都提示错了,还是其中很多结果只是虚构的故事?让我们揭开一些最大胆的声明的神秘面纱,看看经验丰富的开发者现在实际上是如何使用AI的。
你可能注意到,许多经验丰富的程序员对AI带来的机会非常谨慎,同时却将最新工具作为生产软件的日常驱动。这不是双重标准,而是一个更加微妙的现实。目前"AI狂热者"和"反AI人士"之间的两极分化是过度营销炒作的结果,而非对技术的冷静评估。
对任何人来说,Linus Torvalds并不是坐在地下室里用Claude Code在C89中进行vibecoding开发Linux内核,同时不断大喊"不要犯错!"。将内核模块从ISO C11移植到Rust是负责任的做法,而非不负责任。这是在妖魔化AI和"一次搞定内核"之间的平衡方法。
1、一次搞定智能代理农场
当人们说他们"一次搞定"时,指的是用一个提示就创建了一个软件。但这真的可能吗?如果可能的话,是怎么做到的?答案是"是的",但这取决于你提示什么以及在哪里提示。Nerf枪的扳手和美国总统的大红按钮之间是有区别的。这也很大程度上取决于你想用什么工具"一次搞定"什么。

像kiro-flock或OpenClaw多代理路由这样的系统设置使用多个代理来解决复杂任务。这些智能代理农场可以规划、分析和执行更大解决方案的创建和维护。以前的方法让代理处于持续的反馈循环中,相互迭代结果并相互通信。
在kiro-flock架构中,没有中央编排器,代理之间也没有直接通信。相反,它依赖于无定形计算和仿生学的原理。代理的行为类似于发育中的生物体中的细胞或蚁群。
Peter Steinberger关于人们是否仍在使用循环或已转向图的挑衅性问题指向了另一种方法。代理使用图而非持续循环来识别哪个代理编排什么任务或信息给其他代理。这类似于图神经网络(GNN)在其他场景中所做的,但适应了代理间通信。
自主代理农场的全部目的是尽可能自主。用户应该能够向农场发出请求,农场就应当满足该请求。当由经验丰富的专业人士正确设置时,这些系统已经能够自主创建更大的应用程序。但这样做的成本不应被低估。连续7天运行80个自主的Claude Fable 5代理轻松就能让你拿到23,000美元的账单,同时如果设置或提示不正确,还存在严重错误的风险。"一次搞定"智能代理农场不是Tom、Dick和Harry应该随意做的事情。
2、程序员的一次成型现实
经验丰富的程序员知道,在今天的现实中,不可能只花50美元就一次搞定GTA6。尽管有Meshy AI、Unreal MCP和Visual Studio Code中的GitHub Copilot等工具,但许多任务仍然需要大量的人类监督和指导。像3D角色和物体绑定这样的任务在很大程度上仍然是实验性的,质量参差不齐。它们仍然需要数小时的人工劳动才能达到像样的结果。
我最近花了30多美元让Claude Fable 5识别我用C++和Unreal Engine 5.8构建的赛车游戏中物理问题的根本原因。Claude查阅了Unreal的Chaos Vehicle Movement Component源代码,找到了我的代码遇到瓶颈的地方。如果Claude不存在,我就得自己花几个小时翻阅Unreal Engine的代码。Claude在这里是一个巨大的时间节省者,但我必须将它指向问题并提供调试日志中的所有参数。这完全不是自主的。但毫无疑问,它确实是一个有用的工具。

任务越复杂,智能编码就越需要人类干预、指导和监督。游戏开发目前是AI主要作为有用工具的学科之一,智能用例还很少。一次搞定GTA6,即使有无限预算,仍然是虚构世界的梦想。
3、智能自主依赖于知识
无论你将代理用作有用的助手、通过提示编程,还是让它们完全自主编写代码,这都取决于用例。底层技术的文档越好,你的提示越好,代理就能做越多的自主工作。当我最近分析新的欧洲社交网络W Social时,代码完全由Claude Sonnet编写。甚至不是Opus、Fable或Gemini Pro。任务如此简单且纯粹是体力活,花时间手写或使用任何昂贵的最新前沿模型都是疯狂的。

当然,我必须指导模型使用Go而不是Python,一如既往。但除了严格clarifying技术栈之外,即使是最简单的模型也写出了完全没问题的代码。存在一些小的架构和设计缺陷,但对于这些用例来说并不重要。其中一个是bbbolt存储桶中相当不寻常的数据结构。
// handleMessage parses a raw Jetstream message and updates the UserBase:
// - identity events whose handle ends with USER_HANDLE_SUFFIX add/classify
// the DID as a person; identity events for already-tracked DIDs whose
// handle doesn't match are classified as an organisation.
// - post (commit) events from an already-tracked but not-yet-classified
// DID trigger a Bluesky API lookup (com.atproto.repo.describeRepo) to
// resolve the handle and classify the user as a person or organisation.
// This is needed because the PDS has users whose handle doesn't carry
// USER_HANDLE_SUFFIX, so identity events alone aren't enough.
// - any event authored by a tracked DID is stored in the UserBase.
func (nl *NetworkListener) handleMessage(ctx context.Context, raw []byte) {
var event jetstreamEvent
if err := json.Unmarshal(raw, &event); err != nil {
log.Println("NetworkListener: failed to parse jetstream message:", err)
return
}
if event.Kind == "identity" && event.Identity != nil {
did := event.Identity.DID
profile := UserProfile{DID: did, Handle: event.Identity.Handle}
if strings.HasSuffix(event.Identity.Handle, USER_HANDLE_SUFFIX) {
nl.UserBase.AddUserDID(did)
nl.UserBase.ClassifyUser(profile, true)
} else if nl.UserBase.HasUser(did) {
nl.UserBase.ClassifyUser(profile, false)
}
}
if event.DID == "" || !nl.UserBase.HasUser(event.DID) {
return
}
if event.Kind == "commit" && !nl.UserBase.IsClassified(event.DID) {
// Classification happens asynchronously (it requires Bluesky API
// calls), so buffer this message rather than dropping it: once
// classification completes, flushPending will store/forward it (or
// discard it, if the DID turns out to be an organisation).
nl.bufferPendingMessage(event.DID, event.TimeUS, json.RawMessage(raw))
go nl.classifyUserFromPDS(ctx, event.DID)
return
}
// only store and process messages from persons (not organisations)
// to avoid spam from organisations
if !nl.UserBase.IsPerson(event.DID) {
return
}
nl.UserBase.StoreMessage(event.DID, event.TimeUS, json.RawMessage(raw))
if nl.OnMessage != nil {
nl.OnMessage(event.DID, json.RawMessage(raw))
}
}
几次额外的迭代和提示本可以清理数据结构的混乱。但它完美地服务于应用程序的目的。提供的质量是否足以满足用例,判断权仍在开发者手中。对编写的代码的法律责任也是如此。我仍然会审查生成的代码,仅仅因为我对它承担全部法律责任,而不是机器。这也有助于我从LLM所做的工作中学习并提高我的编程技能。
代理编写你想要的应用程序的能力很大程度上取决于它们能获取多少信息。我故意将Claude和Gemini推下悬崖,看看它们的冲击有多大。为经典MacOS 7编写复杂软件正在变得更好。但它们仍然在挣扎。同样的情况也适用于IBM大型机上的经典COBOL。只是没有足够的公开文档化代码。但你真的需要经常这样做吗?
4、忽略vibecoding歇斯底里
我喜欢vibecoding所有我不喜欢做的事情。ETL管道、文件转换、数据提取、分析、复杂SQL查询,基本上所有我需要几天才能完成的事情,尽管实际编码工作只需要几个小时。AI确实很有帮助,可以做所有通常导致我拖延的事情。但关于vibecoding的歇斯底里在两极分化中都被夸大了。盲目vibecoding一个安全的身份平台和手写Python代码解压zip文件来处理其中的CSV文件一样荒谬。

你无法vibecoding下一个Facebook,因为代理只会克隆当前的Facebook,而不会发明任何足够新颖的东西让人们想要加入它。对于你可能想要构建的那些新东西,你可能需要大力推动代理。未知的新事物不一定是代理会推荐做的事情。然后,还有外部依赖。代理需要一个功能完整的运行时环境,包含所有参数、配置和依赖项。"想象任何东西然后提示它"忽略了现实中经常存在的约束。
别误会。当有人需要非常基础的东西时,我只是涂抹一些vibecoding的草稿。但这么多vibecoding草稿是JavaScript的原因,仅仅因为这是工具最擅长的,因此通常是它们的首选。它们为工具选择了合适的工作(它们),而不是为工作选择了合适的工具(语言)。我不再计算有多少次我需要指导代理使用云中无服务器函数的扇出架构来避免超过执行限制。当你让代理为你做事时,你需要了解你的东西。
经验丰富的程序员知道这些约束以及如何缓解它们。从未接触过编译器的没有经验的vibecoder则不知道。这就是你作为程序员使用AI工具时的全部区别。
5、结束语
经验丰富的程序员知道何时以及何时不委托给工具。他们也知道,夸大的营销承诺和技术演示仅仅是炒作列车的乘客公告,因此每个人都知道它正在到达下一站。经验丰富的程序员依赖自己的经验,而不是夸大的营销或精心制作的技术演示。

每个经历过过去几十年炒作列车的程序员都知道,真相埋藏在"编程已死"和"AI是骗局"之间的某个地方。AI在某些场景中可以编写完美的生产就绪代码,而在其他场景中则完全失败。伟大的软件不会自动成为伟大的产品。如果你想专业地使用AI工具来构建软件产品,一种细致的方法和对他们是什么的平衡现实看法会让你到达那里。
原文链接: The One-Shot Illusion, And How Experienced Programmers Actually Build with AI
汇智网翻译整理,转载请标明出处