当 GUI 让位于 Agent,软件为什么走向“系统”
这篇文章,是对过去一段时间一些零散观察的整理与收束。
软件工程的变化,很少从某一个具体技术点开始显现。
更多时候,是从一些具体的使用体验中,逐渐累积出来的。
当这些变化被放在一起看时,软件的形态,开始呈现出不同的方向。
一、从一句话开始的变化
在实际开发过程中,一种变化已经逐渐显现。
原本需要一步步完成的操作,开始被压缩成一句话。
比如,一个列表页的实现,以前可能需要:
创建页面、编写组件、接入接口、处理状态、联调数据。
整个过程往往分布在多个文件、多个阶段中完成。
而现在,很多时候是从一句描述开始:
“生成一个带筛选条件的列表页,并接入现有接口。”
页面结构、基础逻辑,甚至一部分数据处理,会被一次性生成。
中间的过程,被明显压缩了。
二、当“操作”被压缩之后
这种变化一开始很直接。
从点击界面,变成描述需求。
但在实际使用中,很快会遇到一个问题:
同样一句话,有时可以完成任务,有时却会偏离预期。
你会发现,系统并不是“完全理解了你的意图”,而是在一个模糊范围内做出了推测。
于是,你开始补充信息:
接口结构是什么?
数据字段如何映射?
筛选条件的交互方式是怎样的?
哪些边界情况需要特殊处理?
原本一句话可以完成的事情,逐渐变成一段更长的描述。
三、那些原本“藏在操作里的信息”
这些被不断补充的信息,并不是新出现的。
它们一直存在,只是在过去,很少被显式表达出来。
在传统开发过程中,很多信息并不是通过“描述”传递的,而是通过“操作”逐步体现出来的。
比如:
- 点击某个按钮,其实隐含了状态变化
- 页面跳转,本质上是流程的推进
- 表单填写,承载的是输入结构
这些信息,并不会被一次性说清楚。
而是随着操作的进行,被一点点带出来。
人通过一步步操作,把这些原本分散的信息,逐渐传递给系统。
四、界面 GUI 为什么曾经有效
从这个角度再看,界面并不是软件的本质。
它更像是一种中间层。
用来承接“人如何表达任务”和“系统如何接收信息”之间的差异。
人类很难一次性表达复杂结构。
需要通过步骤来分解任务,通过界面来理解当前状态,通过反馈来调整后续操作。
于是,复杂任务被拆解为操作流程,系统能力被包装成界面元素。
软件以“可操作”的形式存在。
人是执行者。
五、当执行者改变之后
当系统开始参与执行,这种模式开始出现变化。
越来越多的操作,不再需要人逐步完成。
你可以直接表达目标,由系统尝试完成。
这时,原本依赖操作逐步传递的信息,不再有对应的载体。
它们需要在一开始,就被表达出来。
在这个过程中,界面依然存在,但它的作用开始发生变化:
从承载操作,变为提供反馈。
从主入口,变为辅助观察。
六、问题没有消失,只是转移了
当执行者从人变成系统之后,一个新的约束开始显现:
任务需要被更清晰地表达。
自然语言可以描述目标,但在执行过程中,往往不够稳定。
一些原本隐含在操作过程中的信息,开始显式暴露出来。
你不得不去说明:
输入是什么
输出应该是什么
约束条件有哪些
结果如何判断
七、任务开始被结构化表达
当这些信息被不断补充之后,表达开始发生变化。
一开始,你只是试图把需求说得更清楚一些。
但很快会发现,仅仅“更详细”是不够的。
有些信息,如果没有被明确下来,执行结果就会不断偏移。
于是,你开始不自觉地把这些内容固定下来:
任务的边界是什么,哪些情况算完成;
输入是什么,输出应该是什么;
哪些约束必须满足,哪些情况需要特殊处理;
结果如何判断,是不是符合预期。
这些内容,逐渐不再是“补充说明”,而成为表达本身的一部分。
当表达发展到这里,它已经不再只是描述“想做什么”。
而是开始接近一种更稳定的形式。
任务的边界被定义,输入输出被明确,约束条件被补充,验证标准被建立。
这类表达,既不是自然语言,也不是代码,而是介于两者之间的一种形式。
当任务被这样表达之后,一些变化开始变得稳定。
八、从“执行一次”到“持续运行”
当任务可以被这样表达之后,它不再只是一次性的。
它可以被重复执行,被组合使用,被验证结果。
执行本身,也不再是一个孤立的动作,而是开始嵌入到一条更长的链路之中。
一个需求的完成,逐渐演变为:
当这条链路开始稳定存在时,任务就不再是“完成一次就结束”的。
而是在系统中持续流动。
到这里,一个变化开始变得更清晰:
任务不再依赖一次次操作来触发执行。
在过去,软件的运行方式是:
只有当用户进行操作时,系统才会执行。
任务是离散的,执行是被触发的。
但当表达、执行与验证开始连在一起之后,这种状态发生了变化。
任务可以被直接表达,执行可以自动完成,结果可以持续反馈。
原本依赖操作触发的执行,开始变得不再必要。
当操作不再是前提,执行就不再是被触发的。
而是开始持续发生。
任务不再依附于某一次具体操作,而是在系统中持续存在。
它可以被重复执行,被不断修正,并影响后续的结果。
到这里,软件开始接近另一种形态。
它不再只是一个“完成指令的工具”,也不只是一个“可以执行任务的 Agent”,
而是一个:
围绕任务持续运转的系统。
九、软件开始“运行”,而不是被使用
到这里,软件的形态开始发生变化。
在过去,软件需要被使用。
用户通过操作界面,触发功能,完成任务。
任务是被一次次操作触发的,执行是离散的。
而当任务可以被表达,执行可以自动完成,验证可以持续进行时,这种状态开始松动。
执行不再依赖操作触发,任务也不再随着一次执行结束而终止。
软件开始具备另一种状态。
它不再只是等待操作,
而是持续处理任务。
十、这不是一个单点变化
如果回头看这些变化,会发现它们并不是孤立出现的。
从自然语言作为入口,到系统参与执行,再到表达逐渐结构化,以及验证开始自动化。
这些变化往往在不同地方分别出现,但在实际使用中,会逐渐连接在一起。
当表达、执行与验证开始闭合时,软件的运行方式也随之发生改变。
它不再围绕“如何被使用”来组织,**
**而是围绕“如何持续完成任务”来运转。
从这个角度看,最开始的变化——从点击界面,到描述需求——也不再只是界面的变化。
十一、当这些环节开始闭合
在这种运行方式下,
任务不再依赖一次次操作来完成,
而是在系统中持续存在、持续流转。
在这种状态下,人所扮演的角色也随之发生变化。
不再是逐步操作系统的人,
而是:
定义目标的人
补充约束的人
观察结果的人
十二、软件形态的变化
它看起来像是一次交互方式的改变。
但沿着这个变化继续往下,会发现它逐渐影响到:
任务如何被表达,
执行如何发生,
系统如何运转。
界面没有立刻消失。
但围绕界面构建的软件形态,正在发生变化。
十三、软件开始走向“系统”
当执行成本持续下降,表达逐渐结构化,验证开始自动化时,
软件不再只是被使用,
而是开始运行。