当软件变成「用完即扔」的口香糖
AI Coding

当软件变成「用完即扔」的口香糖

M
Manuel | 主持人: Kevin
2026年3月18日YouTube
返回首页

金句精选

现在用别人的软件,感觉就像在嚼别人嚼过的口香糖——我宁愿直接生成一个新的

当代码生成成本趋近于零,软件从「可复用资产」变成了「一次性消耗品」

代码和真实世界之间有一个清晰的分界线——代码永远不知道它的意图是如何被执行的

软件本来就是魔法,现在只是变得更魔法了

当软件真的可以「用完即扔」时,我们需要的不是更多的框架和工具,而是重新定义什么是「足够简单」的抽象

2026年3月的一个周四下午,Manuel在Latent Space社区的视频通话中演示了一个看似简单的功能:他在聊天框里输入「给我做个迪斯科风格的Hello World应用,加很多小组件」,不到10秒,屏幕上就出现了一个带着闪烁按钮和炫彩文字的互动界面。

这不是又一个低代码平台的演示。Manuel展示的,是一个更激进的想法——当GPT-4o-mini这样的小模型就能在几秒内生成可用的应用代码时,软件本身还值得「复用」吗?

「现在用别人的软件,感觉就像在嚼别人嚼过的口香糖,」Manuel说,「我宁愿直接生成一个新的。」

这个比喻背后,是软件开发正在经历的范式转变。当代码生成成本趋近于零,软件从「可复用资产」变成了「一次性消耗品」。Manuel把这些随时生成、用完即扔的程序称为「卡片」——借鉴1980年代HyperCard的概念,每张卡片是一个轻量级的交互界面,解决一个具体问题,不需要安装、不需要维护,用完就可以丢弃。

但这个想法要真正落地,有一个核心难题:如何让用户安全地运行这些AI生成的代码?

意图的边界

Manuel的答案是一套他称为「Intent架构」的设计。核心思路很简单:生成的代码不能直接执行任何系统操作,只能「表达意图」。

在他的演示中,每张卡片的代码都运行在一个隔离的JavaScript虚拟机里。这个VM只暴露三个对象给代码:一个UI DSL(用于构建界面)、一个数据对象(用于查询状态)、一个dispatch函数(用于表达意图)。代码唯一能做的,就是返回一个JSON对象,描述它「想要」做什么。

比如当用户点击「开始舞会」按钮时,卡片代码会返回这样的JSON:

{
  "type": "system.command.notify",
  "payload": { "message": "Dance party started!" }
}

这个JSON不会被直接执行。它会被传递给一个「Intent Bridge」——一个运行在VM外部的解释器。这个解释器决定如何响应这个意图:在浏览器里显示一个通知?在手机上推送消息?还是让桌上的LED矩阵显示这段文字?

「这就是边界,」Manuel解释,「代码和真实世界之间有一个清晰的分界线。代码永远不知道它的意图是如何被执行的。」

这个边界带来的不只是安全性。因为代码和执行环境解耦,同一段代码可以在完全不同的设备上运行。Manuel展示了一段控制LED矩阵的代码——它运行在一个只有16KB内存的微控制器上,使用的是同样的QuickJS虚拟机,只是暴露的primitive不同:一个every()函数(用于定时执行)和一个turnOnLed()函数(用于控制灯光)。

「我可以对LLM说『给超级碗做个灯光动画』,它就生成了整个灯光秀的代码,」Manuel说,「在一个只有300MHz处理器的设备上。」

从复杂到简单

Manuel的整套系统基于四个基础primitive:

  1. 描述自己:每个「app」(Manuel说这个词不准确,但暂时没找到更好的)都能通过反射机制描述自己提供什么方法、接受什么参数
  2. 生成代码:LLM根据用户需求和app的描述,生成连接它们的代码
  3. 运行代码:代码在隔离的VM中执行,可能在浏览器、服务器、边缘设备上
  4. 表达意图:代码通过events和methods两种方式与外界交互,但永远只能表达意图,不能直接执行

这个架构的精妙之处在于:每一层都可以被instrument(插桩)、可以被替换、可以被mock。

当LLM生成一个新卡片时,Manuel的系统会自动生成mock数据和测试场景,在沙箱里运行15个测试用例。「代码以为它在查询真实的SQLite数据库,其实只是在读取mock数据,」他说,「但这足以验证逻辑是否正确。」

更重要的是,这个架构让「什么是代码」的定义变得模糊。Manuel提到,如果只是想设置屏幕背景色为绿色,完全不需要JavaScript这样的图灵完备语言。只需要三个关键词:greenredblue。对一个0.6B参数的小模型来说,这样的限制反而让任务变得简单。

「当你往智能恒温器里写入一个温度阈值,你是在修改固件吗?」Manuel问,「对我来说是的。因为这个数值会改变设备执行的代码逻辑。」

这种思维方式的转变,让Manuel开始重新思考操作系统的本质。如果未来的OS唯一的primitive就是「生成并运行代码」,会是什么样子?他设想了一个场景:你买了一台打印机,没有驱动程序。你说「我想用这台打印机打印照片」,操作系统回答「我不认识这个设备,但它有USB接口,让我逆向工程一下,写个驱动,集成到你的照片软件里,然后帮你打印。」

「对于现在的技术水平,一个周末就能做到这件事,」Manuel说。

未解的问题

Manuel承认,他还在摸索这套系统的「语言」。整个项目在两周内迭代了无数次,他一边重构一边思考:什么是合适的抽象?什么是好的命名?Intent这个词准确吗?App这个词合适吗?

演示过程中,有些功能因为重构而临时损坏。他原本想展示如何把音乐播放器和MP3收音机通过五行JavaScript连接起来——「mp3Radio.getPlaylist().forEach(song => spotifyPlayer.render(song))」——但没来得及接通。他也承认,当UI DSL变得复杂时,即使是Claude Opus也会遇到困难。

「很多工程工作是在处理现实,」他说,「用户会prompt一些不工作的东西、超出模型能力的东西、会在修复时弄坏其他东西。如何让这些体验流畅,还需要解决。」

但他演示的核心理念已经清晰:当代码生成成本趋近于零,软件工程的重心从「写代码」转向「设计边界」。好的API不再是可复用性最强的,而是最容易生成、最容易验证、最容易约束的。

在Latent Space社区的这次分享结束时,观众评价Manuel是个「wizard」(魔法师)。Manuel笑着回应:「软件本来就是魔法,现在只是变得更魔法了。」

或许,当软件真的可以「用完即扔」时,我们需要的不是更多的框架和工具,而是重新定义什么是「足够简单」的抽象。在Manuel的15美元硬件设备上跑着的QuickJS虚拟机,比任何宏大的架构图都更接近这个答案。