你有没有注意到,过去几年软件工程领域的讨论发生了转变?几年前,我们还在争论制表符与空格、面向对象编程与函数式编程,或者哪个框架将主导下一个十年。如今,对话已经截然不同。我们开始问这样的问题:应该让 AI 来写这段代码吗?我能信任这个拉取请求(Pull Request)吗?或者我是否还需要亲自编写代码?

在过去两年里,软件开发的速度变化超过了此前 20 年的总和。如今,几乎每位专业开发者都能访问 AI 工具,它们能在几秒钟内生成数百行代码。曾经需要几天才能完成的功能,现在可以在一个下午进行原型设计。样板代码几乎消失殆尽,文档可以自动生成,只需一条提示词就能建议单元测试。

当组织试图完全理解这些进步如何影响软件工程的未来时,最新的工程研究和行业内的开发者对话揭示了一些非常有趣的现象。没有人真正担心 AI 会编写代码,他们真正担忧的是后续会发生什么。因为编写代码从来不是软件工程中最困难或最痛苦的部分,最难的部分始终是构建解决业务问题的正确方案,并确保软件能实现预期的商业成果。

毕竟,AI 的价值不在于它生成了多少代码,而在于该软件是否为使用它的个人和组织创造了有意义的成果。让我们退一步思考一下我们过去如何定义代码质量。如果我几年前问这个问题,大多数开发者会回答可读性、可维护性、可靠性和效率等。我们会就模块化、命名约定、代码异味以及对设计原则的遵守进行无休止的讨论。

那么在 AI 时代,这些是否已经过时?绝对没有。那些东西依然重要。好的代码仍然应该易于理解、易于测试和易于维护。但今天发生变化的是质量评估的重心发生了转移。试想一下,如今写出良好的代码并不难实现。最重要的问题变成了这是否从一开始就是正确的解决方案。这是一个巨大的转变,而且是一个更难回答的问题。

给 AI 一个定义明确的问题,它通常能在几秒钟内生成清晰且可运行的代码。AI 做得不够好的地方在于评估竞争性的架构方法,它不像人类那样理解长期的业务背景或预见运营复杂性,甚至无法识别何时最简单的方案并非最佳方案。换句话说,实现质量正变得更容易,而决策质量则变得更难或成为差异化因素。

这正是当今软件工程正在发生的最大转变之一。这并不意味着人类 expertise 变得不那么重要,在许多方面它变得更加重要了。AI 可以加速实现过程,但开发者仍需对权衡、治理、安全性、可靠性和代码的可维护性负责。工程师的角色正在向更高层级转移,从主要编写代码转变为确保围绕该代码做出正确的决策。

让我们通过一个例子来理解这一点。想象一下,你的产品团队要求你构建一个通知功能。AI 编码助手可能会生成 API 端点,然后提出数据库模式、创建队列消费者和前端集成接口,几乎瞬间完成。从编码的角度来看,这相当令人印象深刻。但如果将此交给经验丰富的工程师,他们会以完全不同的角度思考。

他们会有这样的问题:这应该是事件驱动的吗?通知是同步还是异步的?如果下游服务不可用会发生什么?重试机制如何工作?这会影响延迟吗?当用户从 10,000 人扩展到 1,000 万人时会发生什么?他们还会提出一些与业务相关的问题,例如:这是否解决了客户的正确问题?我们是在优化速度、成本、可靠性还是用户体验?我们将如何衡量此功能是否真正成功?

这正是代码相关问题与工程决策之间的区别。这些决定对软件质量的影响远大于变量名是否符合团队的风格指南,这也引出了我们今天注意到的一个重要转变。多年来,我们一直一次审查一个文件的软件质量。有人打开拉取请求(Pull Request),他们查看更改的文件,可能留下一些评论,然后批准并合并。

但现代软件不再存在于单个文件中。每一个更改都会影响 API、基础设施、事件流、数据契约、云资源、监控、安全策略以及数十个下游服务。一个变更很可能会在整个分布式系统中产生连锁反应。因此,质量越来越需要在系统层面进行评估。

这意味着我们不再问“这个函数是否正确”,而是问“这一更改对整个平台会有什么影响”。AI 可以生成代码,但仍然是工程师需要理解系统。现在让我们谈谈在 AI 辅助世界中变得极其重要的另一个关键主题:测试。几十年来,测试一直被视为最佳实践,如今它正成为质量的主要证明。

如果 AI 编写了一个功能,我们如何知道它是正确的?代码看起来优雅,拉取请求可能很大,注释也可能写得非常好。但只有在验证其行为后,代码才能被标记为正确。全面的单元测试、集成测试、契约测试、安全验证、性能测试、运行时监控和可观测性对于确保高质量代码至关重要。

我们正从因为是人类编写而信任代码,转变为因为我们验证了其行为而信任软件。这是一个微妙但深刻的变化,信心来自于通过测试获得的证据,而不是来自可靠的作者身份。这也改变了工程组织对标准的思考方式。过去,标准通常以文档的形式存在:解释命名约定的维基页面、安全检查表、每个人都承诺会阅读的编码标准文档等,这些就是标准的定义。

但众所周知,大多数这类文件几乎立即就会过时。在 AI 辅助的工作流程中,标准不能仅仅存在于文档中,它们必须存在于开发过程本身之中。

安全需求应自动执行,架构护栏应编码进模板和工具中。测试期望应成为每个拉取请求的一部分,静态分析应持续运行,策略应是可执行的而非仅具愿景。这些自动化护栏不仅提升了规范性,更帮助组织安全地规模化采用人工智能技术,通过确保安全性、合规性以及工程标准在各团队间的一致执行。治理由此融入工作流而非事后补救,目标不是提醒开发者遵循标准,而是让正确路径成为他们最容易遵守的路径。

当期望直接编码进工作流时,人工智能变得更为高效,因为它在既定边界内运作,而非依赖隐性的团队知识。关于代码质量最大的误解之一,是认为它是在发布前才做的事情。人们谈论进行最终代码审查、获取质量保证签字、对照发布清单检查,然后将代码推送到生产环境。这曾经更多地充当一个检查点的作用。

这种模式在软件每年发布几次的时代是合理的,但如今团队持续部署,人工智能进一步加速了这一节奏。质量不能再是一个检查点,而必须成为一种持续的实践。每次提交都应触发验证,每个拉取请求应运行自动化测试,每次部署都应产生可观测的信号。

而每个生产系统都应在运营中生成反馈,帮助工程师改进下一次迭代。因此,质量并非软件交付的最后一步,而是贯穿整个周期,从规划开始,一直延伸到部署和运营。那么这给软件工程师带来了什么?有人担心人工智能会取代程序员,但这并非正确的问题视角。

更有意思的问题是:随着人工智能变得更强,什么会变得更加有价值?答案是判断力。未来十年脱颖而出的工程师未必是编码速度最快的,而是那些能提出更好问题、理解系统而非孤立组件的人。他们能在编写代码前识别权衡取舍,设计弹性架构,并知道何时信任人工智能、何时挑战它。

人工智能正迅速成为生成解决方案的专家,而我们的责任是决定这些方案是否正确。这或许是最令人兴奋的部分:软件工程从来不只是写代码,而是解决问题。人工智能并未改变这一使命,只是提高了我们解决问题的思考深度。因此,未来的代码质量不在于写出更整洁的代码,而在于做出更好的工程决策、交付更佳的业务成果。

并确保技术解决其本应解决的问题。在人工智能时代,这可能成为任何开发者所能拥有的最有价值的技能。