
前两天清理 Mac 空间,顺手翻了下 ~/workspace/toy/ 这个文件夹。
里面整整齐齐躺了二十多个工程:x-thread-archiver、cf-d1-notion-sync、pdf-invoice-renamer、vcard-to-sqlite……
每个点进去看一眼,commit 历史整洁规范,全都是 Claude Code 或者 Cursor 跑出来的。单测全绿,甚至还煞有介事地配了 GitHub Actions 工作流和 Dockerfile。
但我甚至想不起里面有一半项目当初是拿来干嘛的。
五分钟生成的工具,死在第一张真实发票上
就拿那个 pdf-invoice-renamer 来说吧。起因只是我某天报销发票,觉得一个个重命名文件太麻烦。
放在两年前,我大概会叹口气,老老实实肉眼核对两眼文件名手动改掉。因为我知道自己搓个工具得装 Poppler、调 Python 的 pdfplumber,还要处理不同税控盘导出来的奇葩版式,折腾一整晚都不一定能跑通。
但上个月那天晚上,我脑子一热,直接在终端里敲了一句需求。
Claude Code 反应飞快,不到五分钟就用 Rust 搓了个 CLI,还自带多线程提取。跑起来那一瞬间,单测通过,终端里刷出格式化好的文件名。我甚至产生了一种“我今晚顺手就能把它打包发个 Product Hunt”的迷之自信。
第二天我真拿真实发票去跑,问题立刻炸开。某张带双层文本的电子发票直接把正则表达式打崩了,终端里抛出一整屏的 UTF-8 解码乱码。
这时候如果是我自己一行行敲出来的代码,我大概会顺藤摸瓜去改 parser。但我看着那两百行由 Agent 一口气吐出来的 Rust 代码,脑子里第一反应居然是:算了,反正这个月的发票已经报销完了,先不管了吧。
这个项目从此烂在本地磁盘里,再也没被打开过。

曾经烦人的工程阻力,其实是理智的刹车片
以前写代码时那种“浑身难受的阻力”,在某种程度上其实救过我很多次。
光是 pnpm create 之后配一遍 tsconfig.json、调 vite.config.ts 里的路径别名、被 ESLint 各种红线卡住,就能把一个人一时兴起的冲动磨掉大半。那会儿觉得这套环境配置地狱烦得要命,但它确实像个沉重的物理刹车片——在你为了一个只用五分钟的伪需求打算浪费整个周末的时候,一脚把你给踹醒。
因为实现成本摆在那里,你会下意识掂量:这个东西真的非做不可吗?如果答案是否定的,大部分烂点子在配置完依赖前就会死掉。
现在倒好,大模型把这副刹车片彻底拔掉了。
生产越是廉价,验证和维护就越昂贵
做东西的边际成本一旦被压到接近零,脑子里蹦出任何一个半生不熟的念头,你都能在喝口水的工夫让 Agent 敲出一个全栈工程。
但系统工程的守恒定律并没有消失:你省下了敲键盘的体力,换来的却是桌面上永远关不掉的终端标签页、几十个跑了一半的 feature 分支,还有一堆连你自己都懒得读第二遍的黑盒代码。
代码写得太顺手,会让人产生一种掌控全局的错觉。你以为自己在创造生产力工具,实际上只是以极高的并发度向磁盘里倾倒一次性的数字垃圾。
一旦遇到真实业务里的边界异常,没有人愿意接盘那些连自己都未曾深思过的实现。
给冲动设一个 48 小时的物理冷冻期
上周我把 ~/workspace/toy/ 整个目录彻底删除了。
顺便给自己立了一条硬规矩:以后脑子里再冒出什么“顺手写个小工具”的点子,哪怕手再痒,也坚决不准立刻开终端。
拿一张便签纸把需求写下来,贴在显示器边框上,老老实实放满两天。
两天后要是发票还得报销、流程还卡在喉咙里、工具非用不可,再开电脑让 Agent 动手也不迟。

那张显示器边框上贴过的七八个点子,到现在一个都没活过四十八小时。
写代码时那点让人烦躁的阻力,从来不是效率瓶颈;它是在你动手制造更多数字垃圾之前,替你踩下的最后一脚刹车。