最近流行一个词叫 “vibe coding”——意思是不写代码,只跟 AI “聊一聊”,让它把整个程序生成出来,人类只负责验收。听起来很爽,像极了那种”我说一句,世界就成型”的造物主体验。可我越用越觉得,这条路对一个真正想做点事的人来说,是有陷阱的。
AI 为什么总爱”过度工程”?
要理解 ChatGPT 为什么写出三十行,得先理解它脑子里装的是什么。它读过的几千万行代码,绝大多数来自 GitHub 上认真维护的开源项目、Stack Overflow 上的最佳实践问答、各种企业级框架的源码。在那些语境里,代码不是写给自己看的——是写给同事看的,写给三年后的自己看的,写给可能在凌晨三点被 PagerDuty 叫醒的运维工程师看的。所以”防御性编程”是默认值: 输入一定不可信、边界一定会被踩、异常一定会发生。
于是当你说”帮我打乱一下日期”,它脑子里自动跑的剧本是: 万一日期格式不对怎么办?万一列表是空的怎么办?万一调用者把字符串当成 datetime 传进来怎么办?要不要写个单元测试?要不要把随机种子也参数化以便复现?——它不是在炫技,它是真的以为你在搭一个会被很多人用的工具。
但你不是。你只是想给四节课换个顺序。
三行代码背后,其实是”知道哪三行”
这里有个很容易被忽略的层次差: 能让 AI 写出三十行的人很多,能识别出”其实三行就够”的人很少。后者需要你心里有一张地图——你得知道 Python 的标准库里有个 random 模块,模块里有个 shuffle 函数,这个函数会原地修改列表。这些不是什么高深的知识,但你必须见过它、用过它,才能在那一瞬间反应过来: 哦,这事不需要造轮子。
这就是为什么我坚持认为,即便在 AI 满地走的今天,亲手学一点 Python 基础仍然是值得的。不是为了写出多么了不起的程序,而是为了拥有判断力——判断 AI 给你的东西是”正好”,还是”过度”,还是”根本跑偏了”。
我自己常用的一个心法是这样: 拿到一个小需求,先问问自己,Python 的标准库或者某个一行就能 import 的包,有没有现成的解决方案?如果有,那基本上一行 import + 一行核心逻辑 + 一行 print(或者保存),就能交差。比如随机抽样用 random.sample,日期生成用列表推导式,文件批量改名用 pathlib,小规模数据处理用 pandas 的链式调用。这套思路用熟了,你会发现日常生活里 80% 的”自动化小事”,真的就是三五行的活。
Vibe coding 的真正风险
回到 vibe coding。我不反对它——事实上我自己也经常用 Claude 或者 GPT 写大段代码,尤其是涉及不熟悉的库的时候。但我反对的是”只 vibe 不 code”:完全不理解 AI 写了什么,只看跑通了就提交,跑不通就再让 AI 改。
这种模式的危险在于,你永远停留在”调用魔法”的层级,而魔法是会失灵的。它失灵的时候——而它一定会失灵——你没有任何手段去诊断、去修补。三十行代码里如果有一行 bug,你连定位都做不到,只能把整段重新喂给 AI 说”它不工作”,然后听天由命。而如果你懂那三行的本质,你就知道 random.shuffle 是原地操作不返回值,你就知道为什么 print(random.shuffle(dates)) 会输出 None——这些都是教科书第三页的内容,但它们救命。
更深一层的代价是: 你失去了”用编程的方式思考问题”这个能力。编程的本质不是写代码,是把一个模糊的需求拆解成一系列明确的、可执行的小步骤。这个拆解能力,是写 PROTAC 实验方案、规划骆驼免疫流程、设计筛选 cascade 的时候,同样在用的能力。你不一定要写出多漂亮的代码,但你最好理解”把大问题切成小问题”是怎么一回事。
给自己留一扇门
所以我的建议——既是给读者的,也是给我自己的——是: 学一点点 Python 就好,不用学到能去字节面试的程度。学到你能看懂 AI 给你的代码、能改两个参数、能在 random.shuffle 和 random.sample 之间做个判断,就够了。这点投入,大概是周末两三个下午的事,但它给你的回报是终身的。
你不会变成程序员,但你会变成一个”能跟 AI 平视对话”的人。它给你三十行,你能微笑着说:谢谢,我只要三行。下次,请用最精简的方式实现。
——它会乖乖照办的。
结尾的小提示: 下次让 AI 写小工具时,可以试试这句咒语:“请忽略异常处理、注释和 docstring,用最精简的几行代码实现这个逻辑。” 你会发现,它其实一直知道怎么写干净代码,只是没人告诉它你不需要那身西装。