【文字稿】第17篇 AI辅助编程——效率提升了,质量下降了
愚人小屋
2026年05月20日 21:30
收录于文集
共26篇

《唯物开发辩证法》——用一家虚拟公司的十二年技术演进,穿透技术表面,理解决策背后的因果关系。本文是系列第20篇(第四阶段第4篇)。

摘要:AI不是来抢你饭碗的,是来逼你升级的。


第一段:场景还原

2024年,星衡莜选引入GitHub Copilot。

老徐在技术年会上宣布:"所有开发人员将获得Copilot许可证。AI辅助编程是未来——它能帮我们写代码、写测试、写文档。预计开发效率提升30%。"

三个月后,数据出来了。

开发效率确实提升了30%——每个开发人员每周完成的Story Points从20提升到26。但代码质量下降了——Bug率从5%提升到8%(基数:团队每月交付约4000个Story Points,按每个Story Point平均对应1个功能点,5%的Bug率意味着每月约200个Bug。8%意味着约320个Bug——每月多出约120个Bug。)。测试团队的工作量增加了50%——需要修复AI生成的Bug。

最严重的一次:AI生成的代码中有一个隐蔽的SQL注入漏洞。代码审查没有发现——因为审查者也用了AI辅助审查,AI说"代码没问题"。漏洞上线后,被白帽子发现——幸好是白帽子,不是黑客。

老张找到老徐:"AI辅助编程有问题。效率提升了,质量下降了。"


第二段:需求解剖

开发人员的需要:提高效率。写代码是重复性劳动——CRUD接口、单元测试、配置文件。AI可以自动生成这些代码——开发人员只需要写业务逻辑。

测试人员的需要:控制质量。AI生成的代码有"幻觉"——生成的代码可能包含不存在的API、安全漏洞、性能问题。测试人员需要花更多时间修复AI生成的Bug。

业务的需要:快速上线。开发效率提升30%意味着新功能更快上线——业务欢迎。但Bug率提升意味着系统稳定性下降——业务担忧。

付费意愿解剖:Copilot许可证费用——每人每月19美元,4000人×19×12=91.2万美元/年。开发效率提升30%——相当于增加了1200人的开发能力(4000×30%)。如果招聘1200人,年薪60万×1200=7.2亿/年。Copilot的成本是招聘的1/80。显然值得。但Bug率提升的代价——每个Bug的修复成本约5000元(开发+测试+部署),Bug率提升3%意味着每月多出约120个Bug,月修复成本60万,年720万。Copilot的净收益——7.2亿(节省的人力)- 91.2万(许可证)- 720万(Bug修复)= 7.04亿/年。仍然值得。


第三段:验证设计

老张设计了一个对照实验:

实验组:10个开发人员使用Copilot。对照组:10个开发人员不使用Copilot。任务:实现一个"用户优惠券"功能——包括CRUD接口、单元测试、集成测试。

实验结果:

  • 实验组完成时间:3天。对照组完成时间:5天。效率提升40%。

  • 实验组代码行数:1500行。对照组代码行数:1200行。AI生成的代码更冗长。

  • 实验组Bug数:5个。对照组Bug数:2个。AI生成的Bug更多。

  • 实验组代码审查时间:2小时。对照组代码审查时间:1小时。AI生成的代码需要更仔细的审查。

实验组的一个典型Bug:AI生成了一个"查询用户优惠券"的SQL——SELECT * FROM coupons WHERE user_id = ? AND status = 'active'。但优惠券表有软删除字段is_deleted,AI没有加AND is_deleted = 0。结果查询出了已删除的优惠券——用户看到了过期的优惠券。


第四段:判断逻辑

判断:AI辅助编程继续使用,但必须加强代码审查和测试。

AI的优势:生成样板代码(CRUD、测试、配置)——效率极高。AI的劣势:理解业务上下文——AI不知道优惠券表有软删除字段,不知道"active"状态需要配合is_deleted使用。AI在"写新代码"时高效(生成样板代码),在"修改现有代码"时低效(缺乏上下文理解)。

老徐的决策:AI辅助编程继续使用。但强制要求——AI生成的代码必须有单元测试(覆盖率>80%),Code Review标准提高(审查者必须理解每一行AI生成的代码),引入静态代码分析工具(SonarQube)自动检测AI生成的常见Bug。


第五段:架构取舍

业务架构:不变。

应用架构:开发流程增加——AI代码生成→单元测试(强制)→静态代码分析(SonarQube)→Code Review(人工)→合并。

数据架构:代码质量数据存储到数据仓库——分析AI生成代码的Bug率、Bug类型、修复成本。

技术架构:GitHub Copilot + SonarQube + JUnit + Mockito。


第六段:实现穿透

技术解剖:AI辅助编程的原理——LLM如何生成代码?

LLM(大语言模型)是基于海量代码训练的——GitHub上的开源代码、Stack Overflow的问答、技术文档。LLM学习的是"代码的模式"——给定一个上下文(注释、函数签名、已有代码),预测下一个Token(代码片段)。

AI的"幻觉":LLM生成的代码可能包含——不存在的API(LLM"编造"了一个不存在的函数名)、安全漏洞(LLM没有意识到SQL注入风险)、性能问题(LLM生成了N+1查询)。因为LLM不理解"业务上下文"——它不知道优惠券表有软删除字段,不知道"active"状态需要配合is_deleted使用。

为什么LLM会遗漏is_deleted?——底层原理。 LLM的代码生成基于自回归Token预测——给定上下文(注释、函数签名、已有代码),模型计算"下一个最可能的Token",逐个Token生成代码。这个预测基于训练数据中的统计模式,而非对代码语义的理解。当星衡莜选的代码库使用is_deleted软删除约定时,LLM无法"知道"这个约定——因为is_deleted是项目特定的命名约定,不是训练数据中的通用模式(训练数据中大多数SELECT不带is_deleted)。更根本的限制是上下文窗口——Copilot的上下文窗口约8000 Token(约6000个中文字符或3000行代码),无法加载整个代码库来学习项目约定。LLM只能看到当前文件+少量相邻文件——如果is_deleted的约定定义在另一个模块的BaseEntity中,LLM根本看不到。这就是AI在"修改现有代码"时低效的根本原因:项目特定的约定不在训练数据中,也不在有限的上下文窗口中。

AI在"写新代码"时高效——生成CRUD接口、单元测试、配置文件。这些是"模式化"的代码——LLM在海量训练数据中见过无数次。AI在"修改现有代码"时低效——需要理解现有代码的业务逻辑、数据模型、依赖关系。LLM的上下文窗口有限——不能一次加载整个代码库。

【可视化】

AI不是否定"编程",是否定"手工编写每一行代码"的方式。 编程的本质是"将人的意图转化为机器可执行的指令"。AI改变了"转化"的方式——从"手工编写每一行代码"变成"描述意图,AI生成代码,人审查和修改"。编程没有消失,编程的形式变了。

劳动对象:自然语言描述→代码。开发人员用自然语言描述意图("写一个查询用户优惠券的接口"),AI生成代码。

劳动资料:LLM(GitHub Copilot)+ IDE(VS Code)+ 静态分析工具(SonarQube)。

劳动者:开发人员从"写代码的人"变成"审查代码的人"。技能要求变了——编码速度的重要性下降,代码审查能力、系统设计能力、业务理解能力的重要性上升。


第七段:数据反馈

加强审查和测试后数据:Bug率从8%降到4%——低于使用AI之前的5%。开发效率提升从30%降到20%——因为增加了审查和测试的时间。净效果——效率提升20%,Bug率下降1%。

数据说明了什么?——Bug率降到4%不是因为"AI生成的代码变好了",是因为"审查和测试变严格了"。如果之前就用同样严格的审查和测试,Bug率可能本来就是4%。AI辅助编程的净收益是效率提升20%——Bug率的变化是审查和测试严格程度的变化,不是AI代码质量的变化。老徐在复盘时说:"我们之前对人工代码的审查太松了。AI逼我们加强了审查——这是AI的意外收益。"


第八段:矛盾转化

AI辅助编程解决了"编码效率"的矛盾,但创造了"代码质量"的矛盾。矛盾的主要方面从"编码速度"转移到"审查和测试能力"。未来的瓶颈不是"AI能生成多快的代码",是"人能多快审查和测试AI生成的代码"。


第九段:消亡分析

AI辅助编程不会"消亡"。它会持续进化——从"生成代码"到"理解业务上下文",从"辅助编码"到"辅助设计"。但它的角色会变化——从"写代码的工具"变成"软件工程全生命周期的助手"——需求分析、架构设计、测试、运维。


第十段:能力沉淀

【金句】

心法(判断力):AI不是替代工程师,是否定"手工编写每一行代码"的方式。工程师的核心能力从"编码速度"转移到——代码审查能力(识别AI生成的Bug)、系统设计能力(AI不会设计系统)、业务理解能力(AI不理解业务上下文)、矛盾分析能力(AI不会判断"该不该做")。AI时代,什么能力会贬值?——编码速度。什么能力会升值?——判断力、分析力、审查力。

内功(分析框架):AI辅助编程的矛盾分析——①效率 vs 质量(AI提升编码效率,但降低代码质量),②写新代码 vs 改现有代码(AI在前者高效,在后者低效),③模式化代码 vs 业务逻辑(AI在前者高效,在后者低效)。矛盾的主要方面在转移——从"编码速度"转移到"审查和测试能力"。

招式(操作方法):AI辅助编程的实施步骤——①引入AI编程工具(Copilot),②强制单元测试(AI生成的代码覆盖率>80%),③引入静态代码分析(SonarQube自动检测常见Bug),④提高Code Review标准(审查者必须理解每一行AI生成的代码),⑤监控Bug率和开发效率,调整流程。

AI时代心法:AI时代最大的焦虑是"我会不会被AI替代"。答案是——如果你只会"写代码"(编码),你会被替代。如果你会"判断该不该写"(分析),你不会被替代。如果你会"审查AI写的代码"(审查),你不会被替代。如果你会"设计系统"(架构),你不会被替代。如果你会"理解用户需要什么"(需求分析),你不会被替代。AI替代的是"手工编写每一行代码"的方式,不是"软件工程"本身。软件工程的核心——理解人的需要,分析矛盾,做出判断——这些是AI无法替代的。


历史注脚:本篇的技术决策参考了GitHub Copilot实践。星衡莜选是虚构的,但决策背后的历史逻辑是真实的。详见 ../../制作要求/参考资料.md 第八节。