[控场AI]
· 10 分钟阅读· 5,298 字

AI编程工具的真相:它只会让你更快写出烂代码

AI编程工具的真相:它只会让你更快写出烂代码

效率的幻觉:AI加速的到底是什么

近期在 Hacker News 上,一篇标题略带戏谑的文章《AI Can Make You Suck Faster Too》(AI 也能让你更快地烂下去)引发了开发者社区的热烈讨论,获得了 55 个点赞和 46 条评论。这个略显刺耳的标题,触及了当下 AI 编程工具浪潮中一个被普遍忽视的核心问题:AI 加速的到底是什么?

很多人默认 AI 编程助手(如 GitHub Copilot、Cursor、Claude Code 等)会让开发者变得更强、更高效。这些工具代表了当前AI编程辅助的三种典型形态:GitHub Copilot 于2021年由GitHub与OpenAI联合推出,基于Codex模型,以IDE内联补全的方式嵌入开发者工作流,目前已拥有超过百万付费用户;Cursor 是一款基于VS Code深度改造的AI原生IDE,通过将大语言模型深度集成到编辑器的每一个交互环节(包括多文件编辑、代码库级别的上下文理解),试图重新定义编程体验;Claude Code 则是Anthropic推出的命令行式AI编程代理,能够自主浏览代码库、执行终端命令、进行多步骤的复杂编程任务。三者分别代表了从"补全建议"到"AI IDE"再到"自主代理"的演进路径,共同构成了一个正在快速扩张的AI辅助编程生态。

值得注意的是,这三种工具在技术架构上的差异深刻影响着用户的交互模式和潜在风险。Copilot基于的Codex模型主要训练数据来自GitHub上的公开代码库,其建议本质上是对大量现有代码模式的统计性重组,而非真正的"理解"。Cursor则采用了RAG(检索增强生成)架构,通过对用户本地代码库建立索引来提供具有项目上下文感知的建议,但这种上下文窗口仍然有限,通常无法覆盖大型项目的完整架构意图。Claude Code作为代理式工具,引入了工具调用(tool use)和多步推理能力,能够自主执行文件读写、终端命令等操作,这赋予了它更大的自主性,但也意味着出错时的影响范围更大、更难以追溯。理解这些架构差异,有助于开发者更精确地评估每种工具的能力边界和风险特征。

但这篇文章提出了一个更为冷峻的观点——如果你本身的工程能力、代码品味和系统设计能力存在缺陷,AI 并不会替你修复这些短板,它只会让你以更快的速度制造出同样糟糕的东西。

hackernews source: AI Can Make You Suck Faster Too

核心观点:AI是放大器而非修正器

这篇文章的核心逻辑非常直白:AI 是一个能力放大器。它放大你的产出速度,但不改变你产出的质量倾向。

这一观点在技术史上有着丰富的先例。电子表格软件的出现并没有消除对财务分析能力的需求,反而让优秀的分析师能够处理更复杂的模型,同时也让缺乏财务素养的人更快地制造出错误的预测。CAD工具没有取代建筑设计的专业判断,而是让好的设计师更高效、让糟糕的设计师更快地产出有结构缺陷的图纸。在软件领域,从汇编到高级语言、从手写代码到框架和库,每一次抽象层级的提升都是一种"加速器",它们都遵循同样的规律:工具降低了执行门槛,但提高了判断力的重要性。

这条历史脉络值得更深入的审视。软件工程中"抽象层级提升"的历史可以追溯到1950年代:从机器码到汇编语言,程序员不再需要记忆二进制指令;从汇编到C语言,内存管理变得更加直观;从C到Python/Java,垃圾回收和丰富的标准库进一步降低了执行门槛。每一次跃迁都引发了类似的担忧——1960年代Dijkstra批评GOTO语句时,许多程序员认为结构化编程会降低效率;1990年代Java引入垃圾回收时,C/C++社区担忧开发者会丧失对内存管理的理解。事实证明,这些担忧既有合理之处也有过虑之嫌:抽象确实让更多人能够编程,但每一层抽象都创造了一种新的"泄漏"风险——Joel Spolsky所谓的"抽象泄漏定律"(Law of Leaky Abstractions)指出,所有非平凡的抽象在某种程度上都是有漏洞的。AI编程工具代表了一种前所未有的抽象跃迁:它不是将底层操作封装为更高级的API,而是试图将"编程意图"直接映射为"实现代码",跳过了中间的设计推理过程,这使得抽象泄漏的后果更加难以预测,因此判断力与执行力之间的"剪刀差"也被拉得更大。

不懂的人,AI也帮不了你判断

当一个经验丰富的工程师使用 AI 编程工具时,他能够快速识别 AI 生成代码中的问题——不合理的抽象、隐藏的性能陷阱、错误的边界处理。他把 AI 当作一个高速的初稿生成器,然后用自己的判断力去筛选和修正。

但对于一个缺乏基础功底的开发者来说,情况截然不同。他无法判断 AI 给出的方案是否合理,无法识别其中的技术债务,甚至无法察觉那些看似能运行、实则暗藏隐患的代码。结果就是:AI 让他更快地生成了大量自己都无法评估的代码,问题被指数级地放大和累积。

写代码的速度不等于工程价值

软件工程的本质从来不是「写代码的速度」,而是「做出正确决策的能力」。评论区中不少开发者对此深表认同。一个高频出现的观点是:代码的编写只占软件生命周期成本的一小部分,真正昂贵的是维护、调试和理解。

如果 AI 只是帮你更快地写出难以维护的代码,那么它实际上是在把成本从「现在」转移到「未来」,并且往往连本带利。

为什么这个问题值得警惕

「感觉在进步」的生产力错觉

最危险的地方在于,AI 编程助手会给使用者带来一种强烈的「生产力提升」的错觉。屏幕上快速出现的代码、迅速关闭的任务、看似高效的工作流——这些都会带来即时的满足感。

但这种满足感可能是虚假的。真正的能力增长来自于刻意练习和深度思考:手动解决一个棘手的 bug、独立设计一个系统架构、反复权衡不同方案的取舍。刻意练习(Deliberate Practice)是心理学家Anders Ericsson提出的专业能力发展理论,其核心要素包括:在舒适区边缘进行有针对性的练习、获得即时反馈、以及对错误进行深度分析和修正。该理论强调,专业技能的增长不是简单重复的产物,而是来自于对困难任务的主动攻克。在软件工程领域,这意味着独立调试一个复杂的并发问题、从零设计一个可扩展的系统架构、或者在多种技术方案之间进行深度的取舍分析——这些痛苦但极具成长价值的过程,正是锻造工程判断力的熔炉。

当 AI 接管了这些「困难但有价值」的思考过程时,初学者失去的恰恰是最宝贵的成长机会。在认知科学中,这被称为"必要难度"(desirable difficulties)的缺失——这一概念由认知心理学家Robert Bjork在1994年提出,揭示了一个反直觉的现象:在学习过程中增加某些特定类型的困难(如间隔练习、交错练习、生成效应),虽然会降低短期表现,却能显著增强长期记忆和知识迁移能力。与之密切相关的还有"流畅性错觉"(fluency illusion)——当信息获取过于容易时,学习者会高估自己的掌握程度。AI编程工具恰好同时触发了这两个认知陷阱:它消除了编程中的"必要难度"(开发者不再需要从空白编辑器开始构建解决方案),同时制造了强烈的"流畅性错觉"(大量快速产出的代码给人以精通的假象)。神经科学研究也表明,主动解决问题与被动接受解决方案激活的大脑区域不同——前者涉及前额叶皮层的深度参与,后者主要激活的是较浅层的识别和评估回路。这意味着长期依赖AI生成代码可能从神经可塑性层面影响开发者解决新问题的能力。开发者虽然完成了任务,却跳过了能力形成的关键路径,长期来看会严重阻碍深层技能的内化。

AI生成代码的技术债务隐性积累

讨论中还有开发者指出,AI 生成的代码往往在局部看起来很「干净」,但在整体架构层面缺乏一致性和连贯性。当一个团队大量依赖 AI 辅助开发且缺乏严格审查时,代码库会逐渐演变成一个由无数「局部最优」拼凑而成的怪物——每一部分单独看都还行,组合在一起却难以维护。

技术债务(Technical Debt)这一概念最早由Ward Cunningham在1992年提出,用金融隐喻来描述软件开发中为了短期速度而牺牲长期代码质量所产生的隐性成本。就像金融债务会产生利息一样,技术债务也会随着时间推移不断增加维护成本。Martin Fowler进一步将技术债务细分为四个象限:鲁莽-故意("我们没时间做设计")、审慎-故意("我们必须先发布,之后再重构")、鲁莽-无意("什么是分层架构?")、审慎-无意("现在我们知道应该怎么做了")。传统的技术债务通常是开发者在时间压力下有意识做出的权衡,团队对其存在和位置有一定感知。

但AI生成代码所引入的技术债务具有一种新的特殊性:它往往是无意识的、分散的、且难以定位的,大多落在"鲁莽-无意"象限——开发者甚至不知道债务的存在。由于AI模型缺乏对整个代码库架构演进方向的理解,它倾向于为每个局部问题提供独立的"最佳"解决方案,而这些方案之间可能在设计模式、错误处理策略、依赖管理等层面存在不一致,形成一种"弥散性技术债务"。SonarQube、CodeClimate等静态分析工具可以检测单文件层面的代码异味,但对于AI生成代码造成的架构层面不一致性(如同一个项目中混用多种状态管理模式、不一致的错误传播策略、或重复但略有差异的工具函数),现有工具的检测能力十分有限。一些前沿团队开始探索"架构适应度函数"(Architecture Fitness Functions)的方法——通过自动化测试来持续验证系统架构是否符合预定的设计原则——但这本身就要求团队对目标架构有清晰的认知和明确的表达,而这恰恰是AI无法代劳的判断力工作。

这种技术债务的累积方式尤其隐蔽:它不会在某一天突然爆发,而是在每次需求变更、每次功能迭代时不断增加摩擦成本,直到整个项目的开发效率跌回甚至低于不使用 AI 时的水平。

AI编程工具的正确打开方式

这篇文章及其讨论并非在全盘否定 AI 工具的价值,而是在呼吁一种更清醒的使用姿态。

把AI当作杠杆而非拐杖

对于有能力的工程师,AI 是一根强大的杠杆——它能把你的判断力和经验放大数倍。你依然是那个做决策的人,AI 只是加速执行。

而对于初学者,把 AI 当作「拐杖」则是危险的。更健康的方式是把它当作一个可以随时提问的老师,用它来理解概念、探索不同实现方案,但始终保持自己动手和独立思考的习惯。用 AI 学习,而不是用 AI 替代学习。

代码审查永远不能省

无论使用者水平如何,对 AI 生成代码的严格审查都是不可妥协的底线。你需要真正读懂每一行代码,理解它为什么这样写,以及它在什么情况下会出问题。如果你无法审查它,你就不应该提交它。

代码审查作为软件工程实践,最早可追溯到1970年代Michael Fagan在IBM推广的正式代码检查(Fagan Inspection)。现代代码审查已从正式的会议制检查演变为基于Pull Request的异步协作模式,其核心价值不仅在于发现缺陷,更在于知识传播、代码风格统一和团队工程文化的维护。Google在其工程实践中将代码审查制度化到了极致,其内部研究显示代码审查不仅能发现约15%的缺陷,更重要的是它承担着"工程文化传承"的功能——初级工程师通过审查反馈学习代码规范、设计模式和系统思维。

在AI辅助编程的时代,代码审查的角色正在发生微妙但重要的变化:审查者不仅要评估代码的正确性和可维护性,还需要具备识别"AI风格代码"的能力——比如过度工程化的抽象、对不必要依赖的引入、或者看似正确但缺乏对边界条件深度考虑的实现。微软Research在2023年发表的一项研究表明,开发者审查AI生成代码时的注意力模式与审查人类编写代码时存在显著差异——他们更容易进入"浏览模式"而非"分析模式",因为AI代码的表面质量通常较高,这反而降低了审查者发现深层问题的概率。一些团队已经开始在审查流程中明确标注哪些代码是AI生成的,以便审查者调整审查策略和注意力分配,甚至引入"红队审查"机制,指定专人以对抗性思维审查AI生成的关键代码段。

这不仅是对代码质量的负责,也是保持自身工程能力不退化的关键手段。

能力才是根本

《AI Can Make You Suck Faster Too》这个标题的智慧在于,它用一种幽默但深刻的方式提醒我们:AI 不是能力的替代品,而是能力的乘数。

乘数作用于正数,得到更大的正数;作用于负数,则得到更大的负数。工具的先进程度从来不能弥补根基的薄弱。在这个 AI 编程工具日益普及的时代,真正稀缺且不会贬值的,依然是扎实的工程基础、良好的代码品味和清晰的系统思维。

与其焦虑于「AI 会不会取代我」,不如先问自己一个更实际的问题:当 AI 把我的产出速度提高十倍时,我提高的到底是价值,还是垃圾?

分享:

相关推荐