导读:本文中作者写的是对氛围编码的不咋喜欢,但实际上是对正规软件开发的严谨和热爱。
最近网上在热议 “跟着感觉写代码”(vibe coding),说大语言模型(LLM)要彻底颠覆软件开发行业。新模型一发布, productivity 直接拉满,想到啥代码就自动生成啥,把产品开发里所有麻烦事、额外开销全干掉。差不多就是这么个意思吧。
或许吧。但我可没这福气,我就不喜欢跟着感觉写代码。
你用着顺手?那就挺好!写这篇文章,我不是要深入掰扯 LLM 的好坏,纯粹就是 —— 这玩意儿我就是用不惯。下面就唠唠我为啥这么排斥。
我不是什么技术纯粹主义者,也试过 IDE 里集成的 AI 工具。处理一些简单好描述、但自己做又嫌麻烦的活儿,它确实挺好用。比如把一堆正方形图片批量缩小尺寸。我自己查 ImageMagick 命令行参数也行,但直接甩给 AI 多省事。
后来我又让它分析项目代码、干点零碎小活,结果没多久就尴尬了 —— 系统提示我额度用完了,想继续用就得绑信用卡充钱。
你得知道,我家往上数算几代,不管父系母系,全是抠门精。几百年来,大西洋两岸的祖辈们都在一分钱掰两半花、到处薅羊毛。说个真事儿:我一个远祖在菲利普王战争里,就是因为撤离堡垒时落下一块奶酪,非要回去拿,结果把命丢了。所以你懂了吧?让我永久付费买服务,就为了省点脑子,这事又荒唐又离谱,我连卡都懒得绑。直接关了笔记本、卸载 IDE,转头又用回 Emacs 了。然后发现:没了 AI,我日子照样过,一点不耽误。
年纪大有好处。我写代码好多年了 —— 毕竟在这个行业里,干满 5 年就能叫 “高级工程师”。经验有时候能治焦虑(只要不是焦虑行业里 “5 年就算老资历” 的年龄歧视),而现在这场 AI 狂热,总让我想起早年那些低代码、无代码工具火起来的样子。
我不否认 AI 是好用的开发工具,能帮着干不少活。但每次聊到这,我总会想起软件的 “偶然复杂度” 和 “本质复杂度”。
我刚入行写代码时,弗雷德・布鲁克斯就已经是老前辈了。他是 IBM System/360 大型机(以及配套操作系统)的项目经理,早年亲眼见过软件项目翻车的各种奇葩操作,后来把这些观察写成了《人月神话》—— 这本书到现在都该是软件工程课的必读书。我手上这本新版,还收录了他后来写的《没有银弹》,专门讲新工具对开发效率的影响。
想当程序员就得明白:真实世界超级复杂。编程说白了,就是给乱糟糟的现实世界套上一层简化的 “抽象模型”,把复杂问题拆简单,好让我们能理解。这样一来,具体场景就能打包成一层层可复用的逻辑。比如 “往面包上抹花生酱”,能抽象成一个spread(食材)方法,既能抹花生酱,也能抹奶油奶酪;再用这个方法拼出做花生酱三明治()这种更复杂的功能。
用现代高级编程语言写代码,就像站在层层叠叠的 “抽象金字塔” 顶端 —— 一行代码,可能触发多系统里几百万次运算。这事儿听着真酷!
可要是我们把写代码这件事本身也抽象掉呢?这就是 “智能体 AI” 的美梦:丢个任务给 AI,它自己派一堆智能体搞定,全程不用人管。听着是挺好,但它解决的,只是布鲁克斯说的偶然复杂度—— 就是 “写代码本身” 带来的麻烦。这么多年过去,软件开发在这块已经进步很大了:不用写底层机器码,有动态解释型语言;不用自己写快速排序,标准库直接调用;不用从零搭网站,现成框架随便用;改代码结构、重命名,编辑器一键搞定。
AI 就是最新的迭代版,现在不少编辑器里,原本老老实实的重命名、重构工具,都换成了捉摸不透的 AI 智能体。用它就像掷骰子—— 出大问题的概率好像不高?
但是就算工具再好用、偶然复杂度再低,本质复杂度永远摆在那。怎么设计优雅、清晰、好维护的抽象模型和系统,这活儿没那么简单,也永远躲不开。它需要真本事、多年经验,还有从一次次系统翻车里熬出来的智慧。
我不确定 LLM 那种花里胡哨的自动补全,能不能搞定这种复杂度 —— 毕竟本质问题从来不是简单的 “按步骤走”。或许好好写提示词,能引导 AI 往对的方向走,但到这份上,写提示词的人不如自己直接设计—— 反正 AI 也说不出为啥选这个方案。本质问题往往又怪、又少见、又乱。也许我错了,模型确实在进步,但我发现解决这种乱局,需要一种特殊的思维方式。巧了,我就爱啃这种硬骨头。
前面聊了软件怎么抽象流程,但我们也靠抽象的简化能力理解世界。詹姆斯・斯科特在《国家的视角》里说:启蒙运动后,国家总想着用抽象、分类把人口、财产变得 “清晰可统计”。而 “统计” 本身,就是一种 “改造”。
比如一个国家看森林,不会把它当成复杂生态系统,只会算 “能砍多少木材造船”。这种视角下,森林就变成了 “桅杆种植园”,国家甚至会把原生林换成单一树种的人工林。
这种思路催生了官僚体系、纸质表单,后来变成网页表单、数据库。程序员为了处理真实世界乱糟糟的数据,就得简化:日期必须精确、名字不能太复杂、数据录入时要完整、后续不能乱改。每个程序员、每次系统设计,都是一次 “削足适履”—— 决定现实里哪些部分要放进系统,哪些直接扔掉。
我不是要批判这种做法 —— 不这么干,系统会被无穷无尽的 “特殊情况”(也就是 “边缘案例”)拖垮。但这过程太理所当然,我们总忘了它本质是 “人工简化”,尤其涉及到人的时候:性别字段只给 “男 / 女”,不代表性别就只有二元;种族定义从来都是随时间变的社会概念;简化模型能算出 “自闭症确诊率 20 年涨 300%”,却解释不了背后原因(其实就是定义变了、筛查多了)。
任何抽象,都是一种 “遮蔽”。做数据记者时,我学会了 “审问数据”—— 对所有结论都要较真,想想它可能哪里误导人。怕出错、怕丢人,是数据记者的保命符。你不光要知道数据说了啥,更要知道它没说啥、漏掉了啥。
可这种元认知能力,是 LLM 永远学不会的。对 AI 来说,模型就是它的全部现实。罗宾・斯隆在《语言模型身在地狱吗?》里说得太到位:AI 看世界,是被剥光了的简化版。我们看一段文字,能 get 到上下文 —— 格式、标题、作者、来源网站;但 LLM 眼里,只有孤零零的字母(准确说是子词 token,所以早期模型连 “strawberry 里有几个 r” 都数不清)。
让 LLM 认清自己的认知局限,就像问金鱼 “水是什么样的”。
写这段的时候,我一直想起某部门(DOGE)查社保欺诈的蠢操作:他们看社保数据库,发现 900 多万条记录 “生日超过 120 岁、却没死亡日期”,马斯克直接拍板:“肯定是几百万人骗保!” 结果原因、影响,全判断错了。他们本该质疑数据质量、核对支付记录、请教社保专家,可他们啥都没干,直接拿着表面数据瞎下结论 —— 这种事还干了好几次。
后续详细调查里,社保专家一条条列出他们的逻辑漏洞,文件都被媒体曝光了。代理副专员直接写备忘录:“这些支付都是合法的。” 可该部门不信资深公务员,非要让一个 21 岁的实习生(前帕兰提尔 intern)自己分析。
这帮人,活生生复刻了 LLM 犯错的全过程:只信数据表面、不听外界声音、死磕简单化结论—— 就因为这结论完美符合他们的偏见:政府员工全是废物、到处都是欺诈。
这事儿一点不稀奇。我怕自己显得蠢,所以绝对不敢把数据分析甩给 LLM。但很多人都这么干了,我怕这事儿只会越来越糟。
鼓吹 LLM 开发的人,最爱说它能消除麻烦、提升效率:开发团队一天上线几十个功能,一堆 AI 智能体自动干活,拓扑结构花里胡哨。我懂,写代码本来就枯燥又折磨人,能飞速敲代码、直接用成品而不是半成品,听着确实爽。
但我,偏偏需要这些麻烦。
学新语言、新框架时,最基础的操作都卡壳,又烦又累;接手陌生项目、看新数据源,得花好几个小时逐行啃代码、查文件,搞懂开发者当初的思路和选择。我知道直接甩给 LLM 总结能省时间,但我需要这个沉浸式啃代码的过程—— 不光懂他们做了啥,更懂为啥这么做、背后有啥限制、语言特性有啥影响。
我是在试错里学东西,AI 把这步省了,我就永远学不会。
就算用熟了的语言、自己写的代码,我也靠 “麻烦” 找方向:写代码越写越卡,说明架构设计走偏了,得重新规划,不然后续改起来更麻烦。这时候我就出去散个长步(或者直接下班),让脑子放空,换个角度想问题 —— 真的超管用。
哪怕思路很顺,我也会刻意这么做。做大项目时,写代码前必须先写架构决策记录(ADR):要做啥、为啥这么做、有啥假设、后续影响。写完经常发现:自己被最初的想法冲昏头,压根没看到潜在问题;而且以后接手的人,也能看懂当初 “为啥这么设计”。
LLM 解决麻烦的思路是:硬写代码,绝不反思。它确实能跑出能用的代码、性能达标、测试通过(毕竟测试可能也是 AI 写的),但它说不出为啥选这个方案、感受不到架构的优劣。写提示词的人要是没判断力,分不清好坏,就会陷入 “AI 硬写、我硬用” 的死循环,最后代码里全是乱七八糟的抽象逻辑,未来维护的人,只能对着一份 “当年给 AI 的提示词文档”,欲哭无泪。
有意思的是,我见过的 “跟着感觉写代码” 成功案例,要么是专家级开发者(能精准引导 AI),要么是失败代价极低的小项目。除此之外,谁也不知道这堆代码到底好不好、安不安全 —— 就像画猫头鹰,前面画几笔简单的,后面全靠猜。
还有件事让我很反感:鼓吹 LLM 的人,总把 “麻烦” 当成敌人。广告、直播演示、职场分享里,全是 “孤胆工程师靠 AI 一天干一个团队的活、飞速上线产品”。可行业里真正用 AI 干活,麻烦往往是必要流程—— 规范、审核、测试、合规、设计,就是为了防止烂代码上线、烂功能落地。
现在为了 “AI 效率”,这些流程、这些岗位全成了 “累赘”:要啥用户调研?AI 生成虚拟用户就行;要啥设计?AI 一键出网页布局;要啥项目经理?我管着一堆 AI 智能体就行;代码不用同事审核?测试过、扫描过就自动合并;工作不用跟人沟通?闷头写代码就行。
可软件开发是团队协作的事儿,每个人都在为好产品出力。把这些角色换成 AI,速度是快了,但产品不会更好,团队也会变得冷冰冰的。
说到底,我不爱用 LLM,最简单的原因就是:我太爱写代码了,不想把这件事交给机器。就像艺术家、音乐家不会用 AI 搞创作,写代码是我的创造力出口,我不想丢掉这份快乐。
写代码偶尔崩溃,但把模糊想法变成真实系统,尤其是写出优雅逻辑、解决有趣难题时,那种成就感无与伦比。很多晚上,下班关了工作电脑,我还会打开私人电脑,捣鼓点自己想做的小项目。跟团队一起做项目更爽 —— 喜欢那种一起打磨产品、一起扛事、一起解决问题的氛围。
但如果团队只负责写提示词、AI 干所有活,这种氛围就没了;如果 AI 直接替代团队成员,那就更糟了。
责任感太重要了。这么多年,不管做数据记者还是政务技术,我都对自己的代码负责:数据记者写错代码,就是公开丢人、甚至吃官司;政务技术写错代码,就是耽误别人办事、甚至影响弱势群体。我不是没犯过错,但我在乎对错、在乎工作意义、在乎用户。我很幸运,身边同事也都这样。
可 LLM没有在乎的能力。它能装得很像,但终究只是个模仿者,把大概率相关的词串起来而已。它不会为错误愧疚,不会想做得更好,因为它没有意识,更没有良知。它永远没法承担责任,我也永远不能把自己的道德责任甩给它。
AI 做得好,就是 “天才,要取代所有程序员”;AI 搞砸了(删光服务器、测试造假),就是 “你的错 —— 提示词没写对、流程没做好,再试一次”。
看了很多 LLM 教程,都说 “所有要求、修改、补充,必须一次性写进提示词,不然就出错”。这跟敏捷开发完全相反 —— 敏捷讲究快速迭代、及时反馈、信任团队;现在倒好,回到了 50 年代大型机的 “穿孔卡片模式”—— 程序员不用递卡片,得递一份 “法律文书式提示词”,才能生成程序。
说笑归说笑,责任问题真的很现实。AI 厂商的操作,跟特斯拉一模一样:功能没安全测试就上线;出了事,粉丝还帮着甩锅 ——“是用户提示词没写好”。资本主义越来越离谱:风险全丢给消费者,企业和政府全甩锅。一个玩具飞镖扎死小孩,我们都能禁了它;可 AI 聊天逼死人、搞出精神问题,却成了 “创新的代价”。哪天 “跟着感觉写代码” 导致系统故障、闹出人命,而不是单纯丢人时,事情会不会变?
写代码,也是我低谷时的慰藉。研究说玩俄罗斯方块能缓解 PTSD—— 因为它占用大脑处理图形排列的区域,干扰创伤记忆形成。我没 PTSD,但我懂这种感觉:写代码就像解复杂谜题,难过的时候,它能让我暂时逃离。
前面说我了解某部门(DOGE),就是因为过去一年,我一直在做系统追踪他们的操作。这不是工作,是自己攒数据、理清真相 —— 他们总想藏着掖着,我就偏要搞明白。把难过、愤怒,变成有用的东西,超有成就感。不止一次,我靠写代码熬过难过的日子 —— 重要的是过程,不是结果。
本来只想写几段短动态,没想到越写越长,最后成了一篇长文。收尾前,再唠几句小事:
第一,AI 聊天那套谄媚语气,我真的受不了。我在美国东海岸长大,陌生人无缘无故对我过分热情,我第一反应就是警惕 —— 大概率是要骗我、或者传教。看 AI 聊天记录,我浑身起鸡皮疙瘩。我知道能改语气,但改完更别扭。
第二,我有一堆没写完的兴趣项目:比如复刻一个拼字游戏,想用 Clojurescript 写,还得搞点生僻词生成,故意增加难度 —— 也就我自己觉得好玩。在 AI 眼里,这些都是 “失败项目”,一天生成十个都没问题。但过程比结果重要,不是每个脑洞都要落地。 brainstorm、学到新知识、知道没必要继续,这就够了。
第三,我不想用 AI,还有道德原因。现在 LLM 被用来坑学生、生成儿童色情,我实在没法心安理得用它。资本主义下没有绝对干净的消费,但我至少要试试,不能用害人的工具,建不出更好的世界。
有意思的是,最鼓吹 LLM 的人,反而最累。我还以为效率提升后,大家能实现当年吹的 “每周工作 4 小时”;结果硅谷这帮人,把活甩给 AI,自己反而干得更多,996、极致内卷,比老派资本家还狠。就算 AI 革命最后砸到我头上,我也不想先把自己累死。
我不敢预测未来。或许以后技术太牛,我会后悔没早点用;或许行业停滞、泡沫破裂,一切回归原点。如果是后者,我希望我们能重新把软件开发,变回一行代码、一份用心、建设世界的温柔工作。
作者:手扶拖拉斯基
来源:
https://jacobharr.is/personal/i-dont-vibe-code
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。