我一直很喜欢好用的软件。

GUI 软件里,Raycast、Fork、Tailscale 这类软件我已经用了很久。它们的交互、默认行为和完成度都很舒服,也会反过来影响我理解“好软件”应该是什么样子。

命令行软件里,Neovim、kitty、fzf、ripgrep,以及各类 Unix 风格的小软件,同样非常符合我的品味。它们更强调可组合、可脚本化和低摩擦的日常使用,这也是我一直很喜欢命令行环境的原因。

只是到了某些非常具体的场景,我会产生一些很个人的偏好。比如 Markdown 预览窗口最好从命令行直接打开,壁纸筛选最好能理解一点主观审美,AI 工作台最好贴合我自己的使用环境。这些需求夹在成熟软件之间,通常很难刚好被某个现成软件完整覆盖。继续找下去当然也可以,但现在“自己补一个小软件”的成本变低了。

这里说的软件自由,并不是从软件许可或开源运动谈起,而是落在一种更具体的日常体验上:那些长期停留在脑子里的个人痛点,现在更容易被我写成一个小软件。

这种感觉过去其实一直存在。折腾 Neovim、写 Lua 配置、给 shell 增加 alias、在服务器上 self-hosted 一些服务,都是同一件事的不同侧面。只是很长一段时间里,很多小 idea 最后都停留在脑子里,或者只被写进某个 TODO。它们当然有价值,只是每一个小优化都需要一段完整的时间:想清楚边界、翻文档、写代码、处理异常、再把它接进自己的日常使用里。

而现在,这个成本被 AI 降低了很多。很多原本只能继续放在 TODO 里的偏好,也可以反过来,从自己的使用习惯出发,写成一个足够小的软件。

抽取自己的核心诉求

成熟软件往往需要缝合很多人的需求。

这当然没有问题。一个软件要面向足够多的用户,就必须覆盖更多场景,提供更多配置项,也要兼容更多边界情况。只是落到个人使用时,我常常只会用到其中很小的一部分。剩下的功能也许很重要,但对我当前的需求来说,它们只是存在于软件里的背景噪音。

AI 带来的一个变化,是它可以帮我把真正想要的那一小部分抽出来。

比如我真正需要的,也许只是一个从命令行打开、能预览当前文件、支持 Mermaid 和本地图片的小窗口;也许只是一个能按我的审美描述筛图的程序。把诉求收窄之后,软件也可以变得很薄,只围绕那一个核心动作展开。

这种薄并不代表粗糙。相反,它有时更接近我想要的软件形态:没有账户系统,没有复杂导航,没有为了适配所有人而堆出来的设置页。它只要把我关心的那条路径走顺即可。

补上那些细小空缺

很多日常里的小需求都很具体,小到它们很难被认真立项。

比如 wally,是一个自动壁纸收集软件。它从 Wallhaven 拉取候选图片,再用 LLM 根据我给定的审美描述做筛选,符合条件的留下,不符合的丢到 _review。这个需求如果说给别人听,可能只会得到“手动挑一下也行”的回答。但对自己的桌面环境来说,能把这种主观偏好也写成一个脚本,本身就是很有意思的事情。

wally 还有一点比较特别:它处理的是个人审美偏好。过去用普通软件很难自动化这类判断,因为我喜欢什么样的壁纸,很难只靠分辨率、标签、颜色、关键词这些结构化条件描述清楚。LLM 的多模态能力给了这件事一个新的入口。我可以用自然语言描述自己的偏好,让模型直接看图,再给出是否符合的判断。它当然不会百分百准确,但已经足够把“审美筛选”这种原本很主观的事情接进一个自动流程里。

还有 Limn,一个从命令行启动的轻量 Markdown previewer。它的目标很窄:Linux、Wayland、Hyprland、只读预览、支持 Mermaid 和本地图片、文件变更后自动刷新。它不需要变成完整编辑器,也不需要做文件管理、同步、账号和插件系统。只要能解决“我想从终端快速打开一个 Markdown 预览窗口”这个问题,就已经足够。

类似的项目还有很多。Rikka 是终端里的 AI agent,能在安全边界内执行 shell 命令;Kaleido 则把多个 Pi-backed Agent 汇总到浏览器工作台里。还有一组更底层的项目,已经变成我现在自用网络基础设施的一部分。它们同样是在 AI 协助下写出来的:先有一个能工作的最小版本,再围绕自己的部署环境、观测方式和边界条件一点点调整。

这些项目不完全是同一类。有些是日常软件,有些是学习实验,有些已经接近一套基础设施。但它们的起点都很私人,往往只是“我现在就想把某个生活或使用场景改顺一点”。

过去做这些事情,经常会卡在“值得吗”这个问题上。写一个小程序本身可能只需要一两个晚上,但真正麻烦的是中间那些琐碎环节:API 怎么用、边界情况怎么处理、现有配置怎么接入、出错时怎么排查。对于一个并不紧急的需求来说,这些成本很容易把热情消耗掉。

AI 改变的正是这部分体验。现在一个灵感冒出来时,我可以马上把它丢给 Codex,让它先基于自己的知识库帮我评估这件事:大概可不可行,可能需要哪些组件,哪些部分会比较麻烦,第一版可以收敛到什么程度。然后我再根据自己的真实使用场景继续追问、删改、验证。具体怎么用仍然由我自己决定,AI 主要降低了“从灵感到第一版可运行代码”的阻力。

小规模的个人软件

当然,这里的范围需要收得很清楚:我没有打算重写一个 Neovim,也不会因为 AI 出现就把所有成熟软件都重做一遍。大型软件需要长期积累和严肃工程,我对它们的态度更多是使用、配置、扩展,最多在局部做一点 patch。

我说的更多是小规模的个人软件。它们很难由别人提前做好,因为别人并不知道我到底想怎么用。wally 面向我的壁纸审美,Limn 面向我的 Markdown 预览习惯,Kaleido 面向我自己管理和使用 Agent 的方式。它们更像是围绕我自己的生活和使用习惯长出来的小组件,无需适配所有人,只需要适配我自己。

这类场景恰好很多。程序员的生活里有大量只服务于自己的小软件、小脚本、小配置。它们不需要产品化,也不需要泛化到所有人都能用。只要能准确解决我自己的问题,就已经很有价值。

名字也是偏好的一部分

给自己的软件取名时,我会更偏向带一点意象和趣味的名字。私人项目不需要像成熟产品那样考虑太多识别、传播和解释成本,可以更直接地按自己的偏好来。wallyLimnRikkaKaleido 这些名字,多少都带着一点自己的趣味。

AI 出现之后,取名这件事也变得更有意思了。我可以直接和它讨论某个单词的意象、来源、语感,以及它可能带来的联想。最后名字当然还是我自己选,但这种围绕词语本身展开的讨论,很适合 AI。

这件事看起来很小,但其实也属于“软件自由”的一部分。一个软件如果只是为了自己服务,那它的名字、界面、默认行为、配置格式,甚至错误信息,都可以按自己的喜好来。它不需要讨好所有人,也不需要解释给所有人听。

写在最后

软件自由当然可以指向更大的范围。现在外面关于 AI 编程的讨论已经很多,也确实有不少更大规模的软件在 AI 协助下落地。AI 并不只会生成一次性脚本,也有能力参与更复杂、更长期的项目。

只是落实到我自己的生活里,最直接的幸福感还是来自这些日常点滴。折腾软件本身就是我的爱好。以前更多是在已有软件上慢慢调整,把配置、脚本、插件和默认行为一点点改成自己喜欢的样子,比如 Neovim 就是这样。现在有了 AI,我有机会直接拼出一个自己想要的小软件。

这个过程有点像拼乐高:手边有很多现成的积木,真正有意思的是把它们组合成只属于自己的形状。以前没有 AI,我也会自己写脚本、改配置、做小软件。AI 改变的是启动成本,让更多一闪而过的小灵感有机会进入日常生活。于我而言,这就是 AI 时代里软件自由最具体的幸福感。