用 AI 做网站的人几乎都会经历同一条曲线。
第一天:一个下午做出一个像模像样的页面,非常兴奋。
第三天:加了几个功能,改了几轮配色,还行,就是慢了点。
第二周:想改一个按钮的位置,改完发现手机上的菜单坏了。修好菜单,页脚又错位了。你开始害怕改动。
这条曲线太普遍了,值得说清楚它为什么发生。
问题不在代码质量
先排除一个误解:AI 写的单段代码通常质量不差,命名清楚,也有注释。逐行看没什么可挑的。
问题出在累积。
你每次提一个新要求,AI 在现有代码上加一段。它看到的是”当前代码 + 这次的要求”,它给出的是能满足这次要求的最短路径。这个行为本身是对的。
但一个软件的结构,是靠不断有人做减法维持的:这两段其实是一回事,合并;这个变量到处传,提出来;这段逻辑放错了地方,挪走。这些操作没有一个是”新要求”驱动的,你不会主动提,AI 也就不会主动做。
于是代码只增不减。到第五次修改的时候,同一个功能可能有三处实现,改动一处另外两处还在起作用——这就是”改一个地方另一个地方坏了”的机制。
最典型的三种累积
样式的层层覆盖。要改一个间距,AI 加一条新规则盖住旧的。再改,再加一条盖住上一条。三轮之后,一个元素的最终样式由五条规则叠加决定,谁生效取决于优先级顺序。这时候你想改它,最快的办法是再加一条——于是问题继续长大。
我们自己就撞过一次:一个配置文件里,通用规则和特定规则都命中了同一批文件,两条规则的值被拼在了一起。结果是前面那条生效,后面那条形同虚设。表现出来是”设了缓存策略但没起作用”,而且不报错,测不出来,只有逐条读响应头才能发现。
重复的判断逻辑。“如果是英文页面就这样显示”这个判断,可能在模板里写一遍、在样式里写一遍、在脚本里再写一遍。三处的判断条件如果不完全一致,就会出现”大部分情况正常,某个页面不对”。这类问题极难查,因为它不稳定复现。
被遗忘的关联。你加了一个新模板,但缓存的失效清单里没加它。于是改了模板,线上不变。你以为没生效,重新改一遍,还是不变。
这个我们上周刚犯:新增的模板文件没有进监视列表,改完部署,线上纹丝不动,排查了一会儿才想到是缓存没清。这类问题的共同特征是——它不表现为错误,表现为”我改了但没反应”。
有经验的人在这里做什么
不是”写更好的代码”,是定期做减法,以及知道哪些地方必须成对修改。
每隔几轮就停下来合并一次。不加新功能,只把重复的合并掉、把盖来盖去的规则理平。这件事 AI 完全能做,但你必须明确要求它做——”把这些样式规则合并成一套,不要改变最终效果”。它不会自己提。
建立”成对修改”的清单。加模板要同步改缓存清单,加页面要同步改站点地图和预热清单,加语言要同步改路由和 hreflang。这些关联关系写下来,放在代码注释里或者文档里。靠记是记不住的,尤其是隔了两个月回来改。
让”改了没反应”这件事能被查出来。发布之后自动请求关键页面,检查内容里有没有你刚改的东西。这比人工打开看可靠——人会看漏,也会因为浏览器缓存看到旧的。
把结构决策留给人。“这个功能应该放在哪一层”、”这两个东西是不是同一个概念”,这类问题 AI 给的答案往往局部合理、整体别扭。它缺的不是能力,是对这个项目将来会往哪长的判断。
什么时候该重写而不是继续改
有一个信号很准:当你开始因为怕改坏而不敢改的时候。
这个心理状态说明结构已经复杂到你无法预测改动的后果了。继续在上面加东西,只会让这个状态更严重。
这时候重写通常比继续修便宜。而且用 AI 重写的成本已经很低了——把现有页面截图,把功能列成清单,让 AI 从干净的结构重做一遍,往往半天就能完成,比在旧代码里排查两天要划算。
关键是重写时要带上你这段时间学到的东西:哪些功能其实没人用(去掉),哪些地方总是要改(做成可配置),哪些判断散在多处(收到一处)。这些认知是第一次做的时候不可能有的,也是重写真正的价值所在。
这对找人做网站意味着什么
如果你要外包,有个问题值得问:这套代码三个月后我想加个功能,是加得上去,还是要重做?
这个问题问不出标准答案,但对方的回答方式能说明很多。会认真回答”取决于加什么,这类改动容易、那类改动要动结构”的人,通常是真的想过这件事的。
我们自己的做法是把结构决策和文档留在代码里——每一段不明显的处理旁边都写清楚为什么这么做、当时的替代方案是什么。这不是为了好看,是为了三个月后回来的人(可能是我们自己)不用重新推理一遍。
交付的项目源码归客户,包括这些注释和文档。你随时可以拿给别人接手,这也是我们愿意把结构讲清楚的原因——反正你带得走。