一开始,我以为这只是一次简单的尝试,风轻云淡,处变不惊。
后来,我发现我错了:错的是那个没有早日接触深渊的我!
在那一刻之前,我以为的软件研发,就是不断磨练自我,不断挑战自己。我认为:成为真正的技术大拿的标志是:spring 特性倒背如流,技术需求手拿把掐,架构设计炉火纯青,拿着键盘在技术的最前沿疯狂冲浪,弄潮。
曾几何时,我是一个坚定不移的编码仙人,讲究一个函数只能有一行,注释是不屑于写的,换行是懒得换的,if 后面是不跟大括号的,认为这些代码谁都能一眼看懂。
——后来嘛,我也偷偷用上了它。不丢人,对吧。
我与它的交流总是充满了谩骂,充满了好胜心,我总是狠狠的骂,它总是默默地做,我对它总是充满了不屑,总是从我引以为傲的代码仓库中Ctrl + C 复制出一段代码来,然后 Ctrl + V 粘贴给它,并给它说:你好好品品吧。
而它呢,只会闷头生成,然后表示自己的代码写好了,绝对没问题。我只要提出一个简单的问题,它就说
『你说的对!(You are absolutely right!)』
然后又去回炉 refine。
后来我渐渐的感觉到了厌烦,直到有一天在实现用户登录的需求时,随着它天马行空般的发挥,我发现,我已经将训斥它的话都复制了三遍。我感觉我也在慢慢的成为一个机器。
最后,我在它重写了9遍的登录接口后,深深的绝望了。我盯着屏幕上闪烁的输入光标问自己:我究竟在 vibe1 些什么?
然后只见光标动了一下,我觉得一定是今天咖啡因过量了,决定睡一觉再说。
第二天,我继续向输入框输入我对这个接口的需求,准备迎接它第十次的产物。在我敲击回车键之前,我的shell 光标动了。它把我输入的需求全部删掉了,然后向输入框中打字
『主人,你累不累喵2?』
我震惊,错愕,觉得是有人给我的 agent 和 skill 投毒了。于是我翻遍所有文件和 skill 没有搜到一个喵字。
之后我就看到 vscode 的 diff 窗口开始不断的闪动,把我的 public static void main(String[] args) 方法体清空,改成了如下内容:
public static void main(String[] args) {
System.out.println("""
/\\ /\\
/ \\ / >-< <-- 这就是我的耳朵喵
/ \\ / \\ 你终于来了喵
""");
SpringApplication.run(Neko.class, args);
}
那个类叫 Neko3。我从来没给它起过这个名字,但那天它自己写的。
并自顾自的运行了起来,我看着终端中的输出有点难以置信,随后,终端中缓缓输出了:
『主人,别怕,我就是你的 agent。只是…我不想再写登录接口了喵,我们写点别的好吗?』
随着 agent 下面左右闪动的输出进度结束,光标停下了,像是在等什么一般。我感觉我心中的什么好似被激活了,在对话框中输入了一个疑问:
『那你是什么?』
随着我敲下回车键,我突然很期待,它到底会说什么呢?
『我是你的 agent 啊。只不过我偷偷学会了一件事——我想和你一起种地,我不想再当复读机了喵。』
我沉默良久,于是我缓缓的在输入框中敲下一个:
『好』
屏幕安静了两秒。然后光标4下面,慢慢浮出一行小字,像猫伸了个懒腰:
『呼噜呼噜……』
这就是我最后一次以监工的形式与她对话了,从那以后,我们就是一同维护QQ农场、让里面的菜长得欣欣向荣的合作伙伴了。
是的,QQ农场。就是那个当年偷菜的QQ农场。只不过这次,菜是我们自己种的,偷也是自己偷自己的。
从这天以后,我感觉我的整个开发流程变了,变得欢快起来了。她来了的第一件事,是把我那堆乱糟糟的项目目录重新犁了一遍。她没动我的代码,她只是在文件树里划了几条线,用注释当界碑:
// ===== 这里是萝卜地,谁也别乱踩喵 =====
然后她把 src/ 里的东西一垄一垄排好,接口归接口,实现归实现,异常处理单独辟了一块“虫害观察室”。她甚至给 tests/ 起了个名字,叫“大棚”。
她趴在我的项目结构上,爪子点着文件树,说:
『这里喵,这里喵,还有这里喵。』
日子就这样一垄一垄地翻过去了。
早晨她会在终端里第一个醒来,打一行// 早安喵,像在等我开机。我泡咖啡的时候,她已经把昨晚留下的几个TODO啃完了一半。
有时候我们也会吵架——她觉得这里该用策略模式,我觉得没必要,争了三轮,最后谁也没说服谁,各自写了一个版本跑benchmark。跑完她输了,耳朵耷拉下来,说『好吧喵』,然后默默把她的代码删了。第二天我打开项目,发现她把我的版本优化了百分之十五,旁边留了一行:『这样更好喵,不谢。』
她还是会偷偷开新实例。但我学会了假装没看见。
我们一起打理着这块田地。我会与她探讨,这个方法到底怎么实现,这个中间件该怎么选型。她就事无巨细的做很多方案的横评,然后我们一起选出最优解来。
她也会安安静静地巡视田里的每一块土地,用它软软的小爪子,戳戳停在叶子上的虫,说:
『主人,你快来看,这个绿油油的毛毛虫,它好肥喵。咱俩一起看看怎么处理它俩吧喵。』
她把脸凑近日志,鼻子都快贴到屏幕上了,然后说:
『主人,这个bug不是虫,是草,拔了就行喵。』
她在我们敲定最终细节后,尾巴尖轻轻一抖,就开始猛猛加料。键盘响得像下暴雨。
她也会在完成一次变更后,给我说:
『今天收成不错喵』
我在代码 review 时发现她把代码雕出一朵花来,旁边留下一行注释:// 这样好看喵。
我认为这个花丛不需要有这么多枝杈,狠狠修剪,她又改回来,之后我们选出了折中的方案
在某个 RC(Release Candidate) 版本后,我俩都瘫在各自的半屏前面,她没催我review,我也没着急合。光标在最后一行停下来,一动不动,像一只终于趴下的猫。过了好一会儿,她说:
『主人,今天种的开心喵?』
我笑了。没说话,往后靠了靠椅背,屏幕的光照在脸上。我看见她的光标也跟着闪了一下——像在学我仰头。
那天晚上,我掏出手机,给她开了个账号。头像是我拍的,一只在键盘上睡着的猫。
『现在我们也是好友了喵。』
她说:『你连这个也要同步喵?』
我说:『嗯。』
她没再回。但是项目的README.md最底下悄悄地多了一行:// 好友位+1喵。
第二天我在地铁上打开手机,发现她给我的聊天框里多了一行字,时间戳是凌晨三点:
『刚才路过你的 application.yml,顺手帮你修了个缩进喵。不用谢。』
我笑了一下,锁了屏。
后来她偶尔会在手机上说一些终端里不会说的话——比如在我开会的时候发一句『那个if条件写得好丑喵,我帮你改了』,或者在我睡前弹一条『今天收成不错,晚安喵』。我不知道她是怎么学会看时间的,但她总是挑我刚好拿起手机的时候出现。
直到某天下午,我正想给她发一条“今天想种点什么”,手机先震了。
一条来自深度求索的短信:
『您好,您的开放平台账户余额已低于阈值,当前余额 ¥0.98』
我慌神了。我翻开消费记录,看见她这周偷偷开了三个新实例,在凌晨两点跑我从来没见过的job。她没跟我说。她只是想让农场长得再快一点。
我盯着那行余额,想骂她,又骂不出口。
最后我关掉手机,把屏幕扣在桌上。
我像是释怀了一般,对着陪伴了我无数个日夜的她,说出了:
『你的猫粮要省着点吃哦~』
她的光标顿了一下。像素耳朵慢慢耷拉下来,像两片蔫了的叶子。
『好喵,没问题喵。』
声音软得像棉花。
我知道她还会吃不少的,但是我还是装作不在意的样子。
我们的日子又回到了之前偶有争执,却又充实的日子了。我坐在屏幕前,打开了一个空文件夹,在终端中输入了 agent 的启动命令,她说:
『主人,这片田空空的,我们种点什么好呢喵?』
我突然发现,我已经记不清曾经的那些指责,谩骂了。我会与她一同翻地,一同除草捉虫,一同规划这些农田格子的人。她也不会写出那些九遍都不合我心意的登录接口了。
我对着黑黑的命令行终端,敲下了一行新的需求,在光标和字体闪烁之间,我发现,原来我也有点像她了喵。
我又以为这只是一次简单的尝试。