本文的出发点单纯是不爽拍脑袋的技术决策和AI FOMO的普遍心态,其中情绪化的表达仅代表个人观点。

为什么是CLI

Command Line Interface,以前不懂计算机知识的我把他称为dos系统,大学以后不得不用nix系列以后才搞清楚了terminal,shell,console,tty之类的微妙区别。做了无聊的码农以后更是每天和iterm2打交道,除了编译,tmux那几个命令用的飞起,生怕断网休眠把一跑几十分钟的流程给断了。 而今因为各种code agent的出现,cli又来到了大众的前台。CLI成了ai原生界面的代名词。 好处当然是显而易见的:

  • 所见即所得的文字输入与输出
  • --helpman 解决自定义CLI程序的功能理解问题
  • 所有操作在一个界面内完成而不是调用系统,对信息安全顾虑解决得比较好

Agent呼唤cli,产品(再次)拥抱cli,错过的公司因为落后封口遭到股市惩罚。你看到了G Suite cli,飞书cli,更不要提原本就支持的aws,azure之类。 CLI方便吗,当然方便!是不是所有产品都该做成CLI呢?

产品逻辑的不同

在开发中,我深深感到,CLI和GUI的本质不同,导致如果产品本身的性质不匹配CLI,大干快上只会适得其反。 CLI的设计哲学来自Unix:每个命令是一个纯函数,输入确定,输出确定,可以pipe组合。这个范式的强大之处恰恰是它的约束:无状态、可组合、可脚本化. 首先就是表单交互,如何处理探索式的产品交互? 比如JIRA,每一个属性按钮都可能触发不同的结果,选择project A会产生动态的表单显示,怎么在cli处理这个逻辑呢? 动态表单的问题在于:对象的属性空间取决于其他属性的值。这本质上是一个状态机,而不是一个函数。在cli动态选择当然也是一个办法,只是,cli从无状态变成了有状态,成为了一个重复发明的GUI轮子。用一个命令探索表单,另一个命令执行修改,后者收集所有探索结果后原子性地写入对象。但这个方案在遇到 debug 这类功能时就会失效。debug一个子命令往往需要横跨多个语义层:编辑、调试、输出,它们之间的边界并不清晰,无法简单拆开。然而现代软件开发的对象与功能的边界变得模糊,其结果就是,你或者用20个option和flag创造了一个在GUI上点击一下的体验,或者用一个强硬的--json 将所有信息一次写入,人类不容易理解发生了什么,对agent来说又使用了过多的token来做一个简单的交互。

于此同时,原生的cli产品往往遵循清晰的“动词+对象+选项”,其中最重要的是选项空间的已知性。 你知道ffmpeg 的 -vcodec 只有h264等选项,而不是在操作中不断探索。同时参数是正交的,修改height不会影响width的最终表现。 操作的是原子的,修改对象只会影响相应的对象,简单可预测。相比之下,需要中途分支的操作——“如果资源已存在就更新,否则弹出另一套选项”——就开始向GUI漂移了。

当然git作为最经典的cli案例,本身也有着漏网之鱼,比如git rebase -i ,不得不引入的交互模式。这部分操作就应该给GUI而不是CLI,妄想cli解决所有问题,无疑是狂妄的。

在具体实现中,我们往往会看到:

ID从后台走向CLI

在GUI里,你看到的是"Sprint 5 - April Release",点击选择即可。 CLI里,你需要的是 --sprint 42。 42从哪来?你得先查:

jira sprint list --board 12

然后你发现board的ID也不知道,再查:

jira board list --project MYPROJ

每一个人类可读的标签背后,都藏着一个对用户毫无意义的数字。这些ID本来是数据库的实现细节,GUI把它们藏在下拉菜单里,用户永远不需要知道。CLI把这层遮羞布扯掉了,内部状态直接暴露给了用户。 结果是,真正执行操作的命令只有一行,但为了凑齐参数,你要先跑三四条查询命令。操作的认知成本没有消失,只是被分散到了时间轴上。 对agent来说更是如此——它在做任何实质性操作之前,必须先用多轮工具调用去探索ID空间,token大量消耗在了准备工作上,而不是任务本身。

上下文丢失

GUI里你始终知道自己在哪。左侧边栏显示当前项目,顶部面包屑告诉你路径, 页面上所有的操作都默认作用于当前上下文。这种"你在哪里"的感知是持续的。但在cli本质无状态下,你需要不厌其烦地声明我在project123里。

UI真的无用了吗?

当ai生成ui不断让人惊呼前端/ui开发将第一步被ai取代,claude code,codex等产品的出现同时助长了UI无用论的发展。更夸张的是,既存GUI的产品想要浓缩成CLI成为ai时代的银弹。实际产出不得不让人感叹那些妄想淘汰UI的傲慢。UI不只是数据的漂亮外壳,UI本身就是产品逻辑的载体。动态表单、下拉联动、字段校验,这些不是装饰,是业务规则的可视化。你把UI剥掉,剩下的不是一个干净的API,而是一个失去上下文的数据录入系统。

FOMO是一切的驱动器

FOMO不是什么新鲜事,每一波技术浪潮都会催生一种“不跟上就淘汰”的恐慌: 因为claude code是cli,所以所有生态需要围绕着它建构。SaaS公司们急急忙忙把自家的产品CLI化,跳过产品和前端仔细设计的交互体验,在下一次的产品宣传上打上“AI agent原生产品”。

没有人问,我的产品真的适合吗?如果不做CLI该怎么办呢?

我没有答案。

没人知道银弹在哪里。我也不知道,只是不想在不知道的时候假装知道。