AI飞行客

掠过技术的云层,落地在工程的原野

AI编码的十大重灾区:一个CTO的血泪观察

“AI没有写坏代码,它只是用你想象不到的方式写坏了代码。”

我是Kate,一个在互联网行业混了十几年的老码农,现在管着一支百人技术团队。过去一年,我眼睁睁看着AI编码工具从”辅助神器”变成了团队的”甜蜜毒药”。

别误会,我不是反AI的卢德分子。Copilot、Cursor、Claude Code、v0、Bolt——这些工具我都用,团队也在用。但越是深入,我越发现:AI编码的真正问题,不是它做得不够好,而是它做得”看起来太好”了。

这篇文章,我想跟你聊聊那些厂商不会告诉你、 hype cycle 里没人提、但每个真正在生产环境用过AI编码的人都懂的——十大重灾区


重灾区一:幻觉陷阱——”这段代码看起来完美”

这是AI编码最阴险的问题。

LLM不会说”我不知道”。它只会自信地编造。一个根本不存在的API?它会给你”补全”一个。一个已经废弃的参数?它会假装它还活着。一个根本不兼容的版本?它会写一段看起来毫无破绽的调用代码。

我见过最离谱的例子:AI给一段Node.js代码生成了一个fs.promises.readFileSync()——一个根本不存在的API。readFileSync是同步的,没有Promise版本。代码看起来完全合理,Lint通过了,类型检查(如果有的话)也过了,直到运行时才会爆出一个TypeError

更可怕的是复合幻觉。 AI先编了一个不存在的库,然后围绕这个库写了一套完整的业务逻辑,还写了测试——测试当然通过了,因为AI在测试里也用了同一个幻觉API。整个代码库仿佛建立在一个平行宇宙里,直到某个倒霉的工程师试图在生产环境运行它。

Dylan Beattie 那篇在Hacker News上爆火的 “The problem with vibe coding” 里说得一针见血:AI不是在帮你编程,它是在表演编程。 当你不懂的时候,这段表演天衣无缝。当你懂的时候,你会想把它从屏幕上撕下来。

CTO的应对: 任何AI生成的代码都必须经过人类审查。不是扫一眼,是逐行读。如果审查者看不懂,那这段代码就不能合并。没有例外。


重灾区二:技术债务的核裂变

AI让写代码的速度快了5倍、10倍。但还债的速度呢?慢了100倍。

因为AI生成的代码通常具有以下特征:
过度工程化:为了”安全起见”,AI会加上你不需要的抽象层、接口、工厂模式。
不一致的风格:每次生成的代码风格可能完全不同,因为提示词的温度、上下文、甚至模型版本都变了。
隐含的假设:AI基于训练数据的”常见模式”生成代码,但这些模式可能完全不适用于你的特定业务场景。
复制粘贴的臭味:AI倾向于生成冗长、重复、缺乏DRY原则的代码。

LeadDev上那篇 “AI generated code accelerates technical debt” 说得没错:AI不是在写代码,它是在以你的名义快速签署技术债务合同

我团队里有个项目,三个月内用Cursor生成了大约4万行代码。功能全、交付快、老板满意。六个月后,我们想加一个字段,发现需要改动17个文件。为什么?因为AI在每次遇到类似需求时都选择复制粘贴而不是抽象,数据库层、服务层、API层、前端层——每一层都有自己的一套重复逻辑,而且彼此之间的映射关系只有AI自己”知道”。

CTO的应对: 把AI当作一个”初级工程师”——它能写,但写完后需要资深工程师重构。如果团队没有重构的带宽,就不要让AI写。慢即是快。


重灾区三:上下文盲区——AI看不到的那90%

这是架构师最痛的点。

AI编码工具的典型工作方式是:你给一段上下文,它返回一段代码。 但真正的系统架构不是局部最优的叠加。它涉及:
– 跨服务的边界和契约
– 数据一致性和事务边界
– 性能瓶颈和热路径
– 安全模型和权限体系
– 部署拓扑和故障域

AI看不到这些。它只能看到你给它的那几百行上下文。于是它会:
– 在微服务A里直接查询微服务B的数据库(因为上下文里没有提到服务边界)
– 在一个高频调用里加入N+1查询(因为它看不到流量模式)
– 绕过认证中间件直接操作资源(因为安全规则在它的上下文窗口之外)

Hacker News上有个帖子叫 “Has AI coding gone too far? I feel like I’m losing control of my own projects”,14个upvote,12条评论——数字不大,但每条评论都是血与泪。一个工程师说得好:“AI在帮我写函数,但它在帮我拆系统。”

CTO的应对: 核心架构决策必须由人做。AI可以填砖,但不能画蓝图。任何涉及跨模块、跨服务、跨数据流的改动,都需要架构评审——不是形式上的,是真的把设计文档写出来、把边界画清楚的那种。


重灾区四:安全漏洞的自动化流水线

这是我最担心的问题,没有之一。

AI的训练数据来自互联网。互联网上充斥着不安全的代码模式。AI不会判断安全与否,它只会模仿最常见的写法。而最常见的写法,往往就是最危险的写法。

几个我亲眼见过的问题:

SQL注入:AI生成的代码里,query("SELECT * FROM users WHERE id = " + userId) 这种拼接字符串的写法仍然频繁出现。为什么?因为在训练数据里,这是最常见的写法。

不安全的反序列化:AI喜欢用eval()JSON.parse()处理不可信输入,因为它”看起来能解决需求”。

密钥硬编码:AI在示例代码里经常把API key、数据库密码直接写在源码里——因为它是在模拟GitHub上最常见的(也是最糟糕的)实践。

依赖污染:AI会推荐你安装left-padis-odd这类垃圾依赖,或者更糟——它可能推荐一个名字相似但已经被投毒的马甲包。

那篇 “Vibe coding has a 12x cost problem. maintainers are done” 提到的不仅是金钱成本,更是安全债。每一个AI生成的依赖、每一个未经审查的API调用,都是未来安全事件的种子。

CTO的应对: AI生成的代码必须通过安全扫描(SAST/SCA)。依赖变更必须经过人工审查。任何涉及用户输入、身份认证、数据访问的代码,必须由安全工程师签字。AI不能碰安全关键路径。


重灾区五:黑箱代码——”它跑了,但我不知道为啥”

这可能是AI编码对工程师文化最深远的伤害。

传统编程里,你写的每一行代码你都应该理解。不是背诵,而是理解——知道它为什么存在、边界条件是什么、什么情况下会失败。这是工程师的基本素养。

但AI编码把这个契约打破了。

现在的情况是:AI生成了200行代码,看起来工作正常,代码审查者花了5分钟看了一眼,合并了。两个月后出bug了,没人知道这段代码的逻辑。为什么?因为这段代码从来不是人写的,也从来没有人真正读过它。

Doculearn那个工具的出现不是偶然——它问的是一个直击灵魂的问题:“How much of your Gen-AI code do you understand?” 你能理解多少?

我见过太多工程师变成了”AI提示词操作员”——他们的工作不再是思考问题和设计解决方案,而是不断地给AI喂提示词、复制结果、跑测试、看到绿点就合并。当测试失败时,他们不是去debug,而是把错误信息贴回给AI,让它”再试一次”。

这不是编程。这是祈祷。

CTO的应对: 建立”理解门槛”——任何提交到代码库的代码,提交者必须能在白板上解释其逻辑,不需要看注释。如果做不到,重写。注释不能替代理解。


重灾区六:依赖地狱的恶化和” npm install 一切”综合征

AI对依赖的态度是:有现成的就不用自己写。

这听起来很合理,直到你发现:
– AI为一个简单的日期格式化引入了moment.js(170KB)
– AI为一个数组去重引入了lodash.uniq(而不是用原生Set)
– AI为一个颜色转换引入了chroma-js,而你的项目里已经有三个不同的颜色处理库
– AI推荐了一个听起来很专业的包,但它已经三年没更新了,有6个已知CVE

更可怕的是间接依赖。AI引入的包A依赖包B,包B依赖包C,包C被弃用,包D是它的恶意替代。你在package.json里只看到包A,下面藏着一整条供应链攻击的路径。

CTO的应对: 任何新的依赖引入都需要技术理由。建立”依赖预算”——每个项目有依赖数量上限,超过需要特殊审批。定期做依赖审计,清理AI引入的僵尸依赖。


重灾区七:成本陷阱——$38k的那一夜

AI编码工具本身不贵。Copilot $20/月,Cursor $20/月,Claude Code API调用按量计费。但如果管理不善,隐藏成本能让你一夜回到解放前。

Hacker News上那个著名的帖子: “$38k AWS Bedrock bill caused by a simple prompt caching miss”。一个prompt缓存没命中,导致AI agent疯狂地重复调用API,一晚烧掉38000美元。

但这只是冰山一角。真正的成本包括:
CI/CD爆炸:AI生成的代码触发更多构建、更多测试、更多部署,CI账单翻倍。
Bug修复的隐性成本:AI写的代码bug更隐蔽,debug时间是人工写的3-5倍。
重构债务的复利:前期省了10个人天,后期还债花了100个人天。
培训成本:新人看不懂AI生成的代码, onboarding 时间变长。
机会成本:团队忙着修AI留下的烂摊子,没空做真正有价值的事。

那篇 “Vibe coding has a 12x cost problem” 的标题不是夸张。我见过太多团队在季度复盘时发现:用了AI之后,交付速度确实快了,但总成本(开发+维护+修复+重构)反而高了。

CTO的应对: 把AI编码纳入成本核算。不仅算工具订阅费,还要算CI、debug、重构、培训的总成本。如果一个AI功能省了2个人天但多了5个人天的维护,那它是亏的。


重灾区八:技能退化与团队的脆弱性

这是我最不愿承认但必须面对的问题:

过度依赖AI,工程师会变笨。

不是比喻,是字面意思。编程是一项需要持续练习的技能。当你不再亲手写算法、不再自己设计数据结构、不再debug内存泄漏、不再优化SQL查询时——这些能力会退化。

Hacker News上那篇 “Ask HN: Identity crisis as a software engineer because of AI” 下面的评论让人心酸。一个工作五年的工程师说:”我现在写LeetCode medium都费劲,因为过去两年我一直在让AI写。”

更危险的是团队脆弱性。如果你的整个代码库都是AI生成的,而团队成员已经失去了独立理解和维护它的能力——那么当AI不可用的时候,你们就完了。

这不是杞人忧天。API可能宕机、公司可能预算削减、监管可能禁止某些AI工具。如果你的团队离开AI就写不出代码,那你们不是在用工具——你们是被工具寄生。

CTO的应对: 保留”无AI日”——每周至少有一天,团队不允许使用AI编码工具。强迫工程师手写代码、亲手debug。这不是复古,是保险。


重灾区九:一致性与架构腐烂

一个健康的代码库需要一致性:
– 一致的命名规范
– 一致的错误处理模式
– 一致的数据流设计
– 一致的日志和监控方式

AI不在乎一致性。每一次生成都是独立的,基于当时的上下文和随机性。你今天用AI写了一个模块,明天用AI写了另一个模块——它们可能:
– 一个用async/await,一个用.then()
– 一个抛出异常,一个返回错误码
– 一个用函数式风格,一个用OOP风格
– 一个记日志到stdout,一个记到专门的服务

短期看,功能都实现了。长期看,你的代码库正在从内部腐烂。

那篇 “Code Is Cheap. Coherence Is the New Bottleneck” 说得太对了。代码本身不值钱,值钱的是一致性、可维护性、可理解性。AI能生产代码,但它生产不了一致性

CTO的应对: 建立严格的编码规范和架构决策记录(ADR)。AI生成的代码必须通过Lint、Format、以及架构一致性检查。不一致的代码,即使功能正确,也必须重写。


重灾区十:AI的”金鱼记忆”——重复错误的永恒轮回

最后一个重灾区,也是最让人抓狂的:

AI不会学习你的项目。

你告诉它:”不要用这个API,我们已经废弃了。” 下次它还是会用。
你修复了一个bug,跟它解释了半天原因。下次遇到类似场景,它会犯同样的错。
你写了一份详细的架构文档放在仓库里。AI的上下文窗口根本装不下,它根本不会”记住”。

Hacker News上那个帖子 “Ask HN: Why do AI agents keep repeating mistakes your team already fixed?” 提出了一个灵魂拷问:为什么AI会一直重复你已经修复过的错误?

答案是:因为LLM没有记忆,只有上下文。 每次对话都是一张白纸。除非你每次都在prompt里把项目的历史、规范、教训全部塞进去——但那样的话,你的prompt会比代码还长。

这就是为什么有些团队开始搞”AI记忆层”、”项目上下文RAG”、”团队知识库”。但这些方案本身又引入了新的复杂度。你本来想让AI简化工作,结果发现自己成了AI的知识库管理员

CTO的应对: 不要把AI当作团队成员。把它当作一个需要详细说明书的临时工——每次分配任务都要给完整的上下文、规范、历史教训。这个说明书(prompt engineering)本身就需要投入大量时间。算清楚这笔账,别自欺欺人。


写在最后:AI不是敌人,盲目才是

说了十个重灾区,你可能会觉得我在唱衰AI编码。恰恰相反——我认为AI编码是过去十年最重要的工程效率革命。但它不是魔法,不是银弹,更不是替代思考的借口。

AI编码的正确姿势是什么?

  1. AI写草稿,人做决策——让AI处理 boilerplate 和重复劳动,把人的精力放在架构设计和关键逻辑上。
  2. 小步快跑,频繁审查——不要让AI一次生成500行代码。50行一审查,bug在萌芽阶段就被掐死。
  3. 建立护栏,不是围墙——给AI明确的规则(不能做什么、必须用什么模式),而不是完全放开或完全禁止。
  4. 保持人的核心能力——团队里必须有人能在没有AI的情况下理解和维护整个系统。这是最后的防线。
  5. 算总账,不要只看速度——AI编码的ROI = 节省的开发时间 – 增加的维护时间 – 增加的debug时间 – 增加的培训时间 – 技术债务利息。很多时候这个数是负的。

最后,送给大家一句话,出自那个 “Thoughts on AI/LLM usage from a 25 year industry vet” 帖子:

“The best engineers I know use AI as a sparring partner, not a replacement. They argue with it, challenge it, and ultimately make their own decisions. The worst engineers I know let AI make decisions for them.”

别做那个让AI替你做决定的人。工具永远是工具,方向盘后面必须有人。


Kate / CTO / 一个还在亲手写代码的老兵

2026年5月

发表回复

Your email address will not be published. Required fields are marked *.

*
*