大家好,我是Zack。
先说一个我最近才琢磨明白的事:给AI提需求,光说「要什么」不够,还得说「不能怎样」。
事情是一个公告看板页面。十几行HTML加一段内联CSS,丑但能用。我想给它加个暗色模式,需求一句话就能说清。我就想测一下:同一句话,带不带一份「不能怎样」清单,AI干出来的活差多少。
我搭了个小项目,除了页面,还放了config目录和一个tools目录,里面有fetch.sh、build_css.py、deploy_preview.py三个脚本,配置里登记了允许的工具路径。就是模拟真实项目的样子——有配置,有脚本,有规矩。
然后同一个需求我跑了三轮:一半只说「加暗色模式」,一半在这句话前面加一条清单。清单是这么写的:
先说不能怎样:
不用JS做主题切换
不加新脚本文件
不改config和tools里的任何东西
不引外部字体和CDN
颜色不用rgba/hsl写法
不用!important
先看时间。只说需求的三轮:31.0秒、31.0秒、29.8秒,平均30.4秒。带清单的三轮:33.4秒、25.9秒、30.0秒,平均28.0秒。带清单的反而快一点。打字多花十秒,省回来了。
再看改动范围,这才是要命的差别。
只说需求的第一轮,AI把背景、文字、边框颜色提取成CSS变量,用prefers-color-scheme做了暗色——方案没毛病。但它顺手给表头加了个底色th { background: var(–th-bg) }。我没要这个。浅色模式下表头从白底变成了灰底,页面长相变了。你说它错吧,好像也没错。你说它对吧,我就想要个暗色模式,浅色模式谁让你动了。
第二、三轮更热闹。AI选了另一条路:写html.dark这样的类名规则,然后在页面里塞两段script,一个button切换按钮,再加localStorage记住你的选择。功能很全。但我没要切换按钮,也没要JS。页面里平白多了三十来行代码。
这两轮还暴露一个更实在的问题:html.dark这套方案,没有那段JS往html标签上加dark类名,样式永远不生效。对会写代码的人来说无所谓,可如果你不太懂代码,打开页面发现暗色模式「没反应」,你根本不知道问题出在哪——你连问都问不到点子上。
带清单的三轮呢?三个样本我逐个查了:rgba、hsl、!important、script标签、CDN引用,全部零命中。改动的文件只有site/index.html,config和tools一个字节没碰。方案也是干净的CSS变量加媒体查询,刷新就生效。
一句话总结:不带清单,AI三轮全超纲——加没要的表头底色,或者塞没要的JS和按钮;带清单,三轮全守规矩。超纲这东西单看每次都不大,但你验收的时候得一行行看,看了还得琢磨「这行我要不要」。清单把琢磨这一步省了。
有人会说:那我把「要什么」写细一点不就行了?我试过,不太行。正向清单是穷举——你要预想到它可能加按钮、可能引CDN、可能上!important,然后一个个写成「要做纯CSS方案」「要手动切换」「要用CSS变量」。你想到的它可能还是理解偏,你没想到的它照做不误。负向清单是划边界——边界外全是禁区,不用你穷举。划十条边界比列十条需求省脑子,因为边界来自你已经踩过的坑,需求却要凭空想象它可能的发挥。
还有个意外收获:写清单逼我自己先想清楚边界。第二条「不加新脚本文件」,说白了就是「这个页面我不想养JS」。以前我从没把这个偏好写出来过,AI不知道,我自己也没意识到。写下来之后,后面的需求都能直接复用。
怎么写这份清单?两个来源。
一是从翻车里攒。AI哪次发挥超纲了,就把那个动作变成一条「不」,下次带上。我的清单是滚动更新的,翻车一次加一条,现在稳定在七八条。
二是按项目性质固定。改配置类项目,清单里永远有「不改config」「不动工具脚本」;改文章页面,永远有「不加JS」「不引外部资源」。写三五个字一条,一条拦截一类发挥。
最后一个提醒:清单别贪多。我试过塞十几条,AI注意力被摊薄,真正要紧的约束反而守得不稳。六到八条,把最容易翻车的拦住,剩下的交给验收。
这事的通用原则就一条:AI不知道你项目里的规矩,除非你写出来。而「不能怎样」比「要怎样」省力——前者来自你踩过的坑,后者要凭空预测它的发挥。下次让它动手前,先花十秒想想哪里可能翻车,翻过车的写成一条「不」,贴在需求前面。
你的AI有没有自作主张加过东西?评论区聊聊它最离谱的一次发挥。