软件已死,软件万岁
静态软件是录音,动态软件是现场演出
静态软件是一段录音。你按下播放键,你得到的永远是当初录下来的东西。音符相同,顺序相同,每次都一样。那次演奏发生在某个开发机上,从此它就只会重复同一段旋律。
动态软件是一场现场交响乐。乐谱在,乐器在,乐手在。但今晚这个房间里发生什么,取决于指挥、乐手,和此刻这个当下。模型是指挥,工具是乐器,控制流是演出本身——不是录音。
这就是为什么人们用过一个好的Agent之后,往往说不清楚它哪里不一样,却又感觉就是不一样。他们这辈子跟按钮打交道,现在突然置身于一场现场演出。软件在回应他此刻的他,带着判断力,带着临场感。它在倾听。它在调整。它以一种软件从未有过的方式,活着。
录音是完美的。现场演出不是。但我们还是愿意花钱去听现场,正是因为那个房间里会发生一些不一样的事。演出本身,才是意义所在。
动态软件打碎的那些假设
软件一旦活过来,所有建立在静态软件之上的假设就全部失效了。
确定性消失了。相同输入不再意味着相同输出。模型会考虑上下文、记忆、过往经验。同样的软件,周二下午的行为可能跟周一早上不一样。视觉时代已经在路上了——图表、仪表盘、整个页面都将按需生成。与其强行给非确定性的软件套上确定性的枷锁,不如放开手,享受这个过程。
状态和时间的逻辑变了。静态程序不需要记太多东西。动态软件里,状态是上下文——过往会话的记忆,哪些方式奏效的历史,对领域知识的积累。数据库不再只是存储,而是软件运行所依赖的上下文本身。
会话成了一等公民。静态API端点天生是无状态的,每次请求相互独立。动态软件恰恰相反。一个会话是跨越几分钟、几天、有时甚至几周的连续上下文。用户回来,Agent接着上次的进度继续。
时间的尺度变了。静态软件毫秒级返回,顶多秒级。动态软件要推理,要调用工具,要等工具返回,然后再推理。一个请求有时要跑好几分钟。流式传输变成默认,HTTP那套请求/响应模型开始吃力。
软件必须审视自身。静态软件,你读代码就知道它干什么。动态软件不行。控制流是一个模型,模型是不透明的。唯一知道软件做了什么的方式,就是把它做的每件事都记录下来——每一步推理、每一次工具调用、每一次检索。链路追踪从调试工具,变成了理解你自己软件的唯一手段。
新的范式需要新的运行时
静态软件有一套成熟的运行时。你写Django或Express,部署到托管平台,HTTP、会话、扩缩容、故障恢复都不用操心。基础设施问题已经解决,平台帮你兜底。
动态软件没有对等的东西。你写完一个Agent,然后要在它周围搭六个月的基础设施,手动填每一个坑。这些坑只有在规模化运行Agent之后才会冒出来——SSE加WebSocket、流式加后台执行、重启后能续上的会话、真正能查询的存储、要等管理员签字而不只是用户确认的审批门、每个资源每个工具的细粒度RBAC、支持Slack、Telegram、WhatsApp的接入方式。
这就是为什么80%的Agent跑不起来——最后一公里,痛苦的工程量压在那儿。
上一次这个量级的转变,是从桌面软件到Web软件。Web软件需要自己的运行时、自己的协议、自己的基础设施、自己的开发工具。我们花了二十年把这些东西建起来。
动态软件来了。一切从零开始。它需要自己的运行时、自己的协议、自己的基础设施、自己的开发工具。
接下来的十年
静态软件花了五十年才走向成熟。操作系统、数据库、Web服务器、部署平台、可观测性栈、身份认证系统……我们常常忘记这些东西有多新。Heroku是2007年,Kubernetes是2014年,Vercel是2015年。我们如今视为理所当然的基础设施,比大多数在用它的开发者入行还晚。
动态软件,现在是第一年。
谁来造运行时、协议、开发工具、平台,谁就在定义下一个软件时代。前面的路很长,工作量巨大。但这也是过去十五年里做过的最有意思的事。
作者:AICoder
2026-05-02
夜雨聆风