工具即思想-01 编辑器战争:争的从来不只是界面
工具进化了五次, 程序员被宣布淘汰了五次, 结果每次都是换了个姿势继续加班。
这是一组关于 AI 编程的系列短文,但是也不仅仅局限于AI编程。不想聊模型评测,也不教提示词技巧,聊聊昨天今天和明天、过去现在和将来:工具到底在改变什么,哪些焦虑是真的,哪些是自己吓自己。 工具越来厉害,人应该做什么? 写完一篇发一篇。顺序随意,哪篇先有感觉就先看哪篇。
编辑器战争:争的从来不只是界面
程序员聚在一起,只要超过三个人,十五分钟内必然聊到编辑器。聊法也固定:先客气地问你用什么,再客气地说各有各的好,最后不太客气地暗示对方的选择暴露了某种认知缺陷。
我见过两个成年人因为 tab 还是 space 差点翻脸的。
这事吵了几十年,至今没有停战的迹象。如果真只是口味——甜豆腐脑还是咸豆腐脑——早该消停了。它之所以吵不完,是因为每种编辑器背后藏着一整套对”编程到底是什么”的回答。大家以为自己在吵界面,其实在吵信仰。而信仰这种东西,你懂的,从来不是靠讲道理能解决的。
三种信仰
vi 信仰的核心很朴素:程序就是文本,编程就是精确地操纵文本。几个键位排列组合,能做的事比一排菜单按钮还多。用久了会养成一种很强的局部控制力——遇到复杂修改,脑子先把它拆成几个小动作,每个动作可以组合、可以撤销、可以重复。手指走熟了几乎不经过大脑,像弹钢琴,肌肉自己记得下一个键在哪。
(代价是你第一次打开 vi 的时候,可能连怎么退出都不知道。Stack Overflow 上”How to exit Vim”的浏览量超过两百万。两百万人被困在一个文本编辑器里,这件事本身就很有文学性。)
Emacs 的信仰更野:编辑器本身就应该是可编程的。哪里不顺手,写段 Lisp 改掉;哪里有重复,抽象成函数吞进工作流。世上无不可改之物。这个想法诱人得很,也危险得很——确实有人靠它造出了极其锋利的个人环境,也有人折腾了一下午配置,抬头发现天黑了,代码一行没写。改造工具的快感和完成工作的快感长得太像了,一不留神就把手段当成了目的。(我有个朋友说他的 Emacs 配置文件比他写过的任何项目都长。他说这话的时候,脸上带着一种复杂的骄傲。)
IDE 就务实多了,甚至带点工业气质。它的信仰是:现代软件已经复杂到光靠肉眼盯文本驾驭不了,程序应该被当成一张可以搜索、跳转、批量修改的结构网络来对待。IDE 不太在乎你打字快不快,它在乎你能不能看清全局,在大型系统里做安全改动而不把别的地方炸掉。(我没有在公共场合替我另一半辩护过,但我确实在很多场合跟人安利过 IntelliJ 好用。)
三种工具,三种审美,各自训练出来的程序员擅长的事情也完全不同。
凌晨一点的小修复
到底有多不同,拿一件小事看最清楚。
凌晨一点,手机把你从被窝里拽出来。线上有个小问题——某个接口在特殊条件下返回了错误状态码,还要顺手改一处日志字段名,补一条测试。不大不小,不值得在复盘会上占太多时间。可就是这么一件谁都做过的小事,放进不同的工具里,做起来简直是不同的活。
用 vi 的人睁开眼睛,第一反应是定位:文件在哪?关键分支在第几行?怎么用最少的动作跳过去?整个过程像微创手术——切口要小,手要稳,改完的范围要可控。这位仁兄可能困得要死,但他那几下键盘操作干净利落,甚至带点美感。(前提是他没有在半梦半醒之间按错模式。在 insert mode 里狂按 j 和 k 然后对着一屏乱码发呆的经历,我相信每个 vi 用户都有过。)
打开 IDE 的人想的是另一件事。他先看的是这个符号在系统里还有谁在用,类型对不对,调用链有没有牵连。他跳转定义、查引用、开断点,像在地图上描一条路线——先确认不会走错路,再动手。
等 AI 补全出场,画风就变了。你敲出函数签名和几行注释,模型噗地吐出二十行代码。你从亲手写变成了挑选和修剪——这段行不行?那段跟我的上下文搭不搭?打字速度不重要了,判断速度开始重要了。(说起来,凌晨一点判断力本身就很可疑。可是模型吐出来的代码看着特别像那么回事——越困越觉得它写得好,这大概是某种认知偏差。)
到了 AI agent 这一步,你甚至不一定先碰文件。你先说目标:修这个 bug,别改公共接口,要补测试。然后系统自己去读代码、搜引用、定计划、执行修改,拿不准的地方回来请示你。你从写代码的人,变成了下指令和验收的人。凌晨一点下完指令,理论上可以先去睡了——理论上。
同一个 bug,四种活法。还说是口味问题么。
操作单元换了
四种场景放一起看,变化就很清楚。每换一代工具,编程里最小的”操作单元”就跟着换一次。
vi 的单元是字符和文本对象。IDE 的单元是符号和项目结构。补全工具的单元是候选代码片段。 agent 工具的单元是”一个带约束的行动回合”。
所以”AI 会不会取代程序员”这个问题,问得太粗了。更实在的问题是:AI 目前接管的是哪一层?语法记忆?模板代码?局部编辑?还是问题定义和最终判断?接管到哪一层,事情完全不一样。把这几层搅成一锅粥,然后庄严地宣布”程序员将被取代”或者”程序员永远不会被取代”,都属于正确的废话。(但这种废话在社交媒体上特别受欢迎,因为不管站哪边都能收获一批激动的点赞。)
第四幕
早年的编辑器战争,说到底是三种编程观在长期缠斗。谁也没赢。
AI 的到来把这场战争推进到了第四幕。它不只是多给你几个按钮——它开始碰一个此前默认属于人的东西:行动的主动权。
补全工具已经在悄悄改写这个位置了。你写代码,不再完全是自己生成每一个字符,而是不断面对”要不要接受”这个判断。 agent 工具走得更远:它能搜索、能读取、能列计划、能跑命令、能改文件。到了这一步,争论的核心早就从快捷键和插件,挪到了控制权和信任边界上。
所以工具偏好这件事,是在说你接受哪种对编程的定义。你觉得程序首先是文本,是结构,是概率候选,还是一组可以委托出去的行动?
听着很抽象。可它最终会落在具体的地方——落在你的团队怎么面试新人、怎么审代码、怎么理解”工程能力”这四个字上。
至于我本人,用 vi 写过代码,用 IDE 也写过,最近也跟 agent 工具打交道。每换一种工具都觉得上一种工具太笨了,过两个月回头看又觉得新工具也没聪明到哪去。大约工具都是这样——用的时候觉得它是自己手臂的延伸,放下了才发现手臂还在,只是举东西的姿势变了。
(不过有一件事我可以确认:不管用什么工具,凌晨一点被叫起来修 bug 的痛苦是完全一样的。工具进化了几十年,on call 制度纹丝不动。这大概是软件工程里最伟大的不变量。)
夜雨聆风