乐于分享
好东西不私藏

AI 已经在软件工程领域取代人类了么?

AI 已经在软件工程领域取代人类了么?
1947 年,哈佛 Mark II 计算机的继电器里夹了一只飞蛾,Grace Hopper 把它粘在日志本上,写下了“First actual case of bug being found”。这是人类第一次在计算机里捉到真实的虫子,也用独特的方式标记了“Bug” 这个词进入了软件的词汇表。
九年后,1956 年达特茅斯学院,一群年轻的学者开启了一场名为“人工智能”的研讨会。他们畅想智能的未来,其中一个朴素而具体的愿望就是:让计算机自己写出没有 Bug 的程序。

如今,这个梦想似乎已经触手可及——AI 可以秒级生成代码、修复漏洞、甚至识别出人类肉眼难察的缺陷。

于是,一个顺理成章的追问出现了:既然 AI 已经能在代码层面降维打击人类,那它能不能顺势把整个软件工程也彻底取代了?或者说,已经取代了?

这是一场人类与自己一手打造的 AI 之间漫长而深刻的博弈。在过去几十年里,我们目睹了人类在曾经引以为傲的领地里接连退守:从西洋跳棋、国际象棋,到被誉为“人类智慧最后堡垒”的围棋;从困扰生物学半个世纪的 AlphaFold,到几秒跑通测试的 AI 编程助手,语言翻译 ……“人比 AI 强” 这个荣誉连续丢失。

有很多人对 AI 的能力非常乐观,也有人保持谨慎的态度。 俗话说,”悲观者大多数是对的,乐观者总有最后胜利的 -- 看我们讨论的时间尺度是多长了。” 在盲目追捧或过度焦虑之前,我们有必要剥离表象,重新理清那些被混淆的概念、底层原理与逻辑推理。 例如,最近一篇文章的核心论点是:

“把简单、重复的事交给 AI,复杂的事还是需要人去规划和分解 —— 这个观点是错的。AI 已经能处理复杂任务。“

AI 已经真的非常强大了,在代码方面强过人类程序员。

朱少民,公众号:软件工程3.0时代一个关于AI的流行观点,其实是错误的

粗一看的确觉得很有道理! 毕竟,AI 可以很快地写代码,AI 分析大规模代码也是真的给力。文中举出的 AlphaFold 的突破大家也都知道。

但作为软件工程师,读到后面总觉得哪里不对。这篇文章把我们在实践中日常面对的 “软件维护”、“生态演化”、“团队协作”这些事,说得太简单了。 工程师碰到有分歧的地方,不用比谁的嗓门大, 我们理清思路,我们分几个层次和轮次把各种问题聊清楚。

第一轮:AI 能分析几万行代码,远超人类

AI 全能派观点:

“AI 可以在几分钟内分析几万行代码,理解整个系统的架构、识别逻辑漏洞、生成重构方案。这已经不是‘简单任务’了,所以 AI 完全能处理复杂系统。”

AI 务实派观点:

概念
核心要素
AI 渗透率
程序(Program)= 算法 + 数据结构
在既定输入下产生既定输出的逻辑实体
:读代码、找漏洞、生成算法
软件(Software)= 程序 + 软件工程
程序 + 工程 + 数据 + 历史决策 + 用户生态
受限:受制于各种约束条件,特别是断层上下文与隐性契约
软件企业(Enterprise)= 软件+商业模式
软件 + 商业模式 + 组织文化 + 客户关系 + 市场节奏
极低:涉及多方利益博弈与价值取向

AI 能“分析程序”——读代码、找漏洞、生成重构建议,这非常好。但分析程序不等于理解“软件”。

有人说 AI 可以学习所有文档。但哲学家波兰尼(Michael Polanyi)指出:“We know more than we can tell.”(我们知道的,比我们能说出来的多)

在解决复杂问题时,要注意隐性知识!

构建之法,公众号:构建之法知识管理 - 迈克尔·波兰尼的悖论

在工程实践中,隐性知识(Tacit Knowledge)并非不可捉摸的神秘力量,而是未被数字化(Data Gap)的上下文

  • 10 年前的某个 Hack 为什么保留到现在?因为当时高层为了抢占市场做出了商业妥协,口头约定“先上线再修复”,而记录只留在了某次走廊里的抽烟交流中。
  • 某个接口的类型为什么设计得奇奇怪怪?因为当年某家大客户的旧系统有 Bug,为了兼容它特意留了这个副作用,这并未写进规范文档。

这些信息压根没有进入训练集。AI 读到的代码只是最终结果,它看不到那些在走廊里口头约定、从未被写入文档的商业妥协。它以为自己在做最优优化,实则踩中了 10 年前的商业陷阱。

这些信息并非所有人类工程师都知道——新入职的员工同样不清楚 10 年前的走廊对话。区别在于:人类可以通过“主动追问”(找老员工聊天、翻历史邮件、追溯 Git 提交记录)来补全断裂的上下文;而当前的 AI 缺乏这种基于社会关系和信息追踪的主动溯源能力。它不是“知道得少”,而是“无法意识到自己不知道什么”。

有人反驳:“让 AI 提建议,人类工程师审查(Human-in-the-loop)不就行了吗?”

现实是:当 AI 缺乏上下文时,它会频繁给出“技术上极其优雅、商业上破坏兼容”的重构建议。人类工程师为了审查这些建议,必须重新唤醒大脑中的上下文去验证 AI 是否破坏了隐性契约。这种密集的上下文切换与审阅疲劳(Review Fatigue),产生的认知开销往往高于人类自己动手。

当然,AI 的上下文窗口和训练数据覆盖面确实在快速增长,未来可能读到更多当前缺失的信息——这会让它在 Complicated 层面上表现得更出色,甚至接近人类工程师在程序分析上的水平。但即便如此,它依然无法解决后文会展开的“奖励函数无法建模”这个根本问题——因为商业决策的优劣,其评价标准本身就在持续演化,无法被编码为一个静态的目标函数。

本轮小结:AI 是不知疲倦,知识面非常广泛的“程序分析器”,但软件工程的大量工作发生在代码之外的各种约束和 “上下文断裂带”——这些缺失的数据和约束,AI 无法凭空凭代码推演出来。而且,即使上下文窗口扩大,它在软件级决策上的根本困境依然存在(后文详述)。

第二轮:围棋、AlphaFold 都走过来了,“只是时间问题”

AI 全能派的论点:

“AI 从国际象棋到围棋,再到 AlphaFold,每一次都是‘超越人类只是时间问题’。软件工程也一样,现在不行,过几年就行。”

AI 务实派的分析:

这个论述看似有力,但混淆了系统属性与演化机制。如果说第一轮揭示的是信息层面的障碍(AI读不到完整的上下文),那么第二轮要揭示的是更深一层的评价层面的障碍——即使上下文完整,我们依然无法告诉 AI “什么才是好的”。

维度
Complicated(如 AlphaFold / 围棋)
Complex(如软件生态维护)
目标函数
静态固定(能量最低构象 / 胜负规则)
动态漂移(随商业策略、用户习惯而变)
反馈回路
单向闭合(AI 预测不改变物理规律)
双向涌现(AI 改动 API 会重塑用户未来的依赖)
决策空间
物理世界 / 封闭规则世界
人的世界 / 适应性行为网络
技术路径
算力与算法优化可完全覆盖
无法单靠增加算力解决
  • AlphaFold 面对的是物理世界:蛋白质折叠有客观的 Ground Truth(物理最低能量态)。无论 AI 如何预测,物理定律不会因为 AI 的预测而改变自己的运行方式。它的目标函数是稳定的。
  • 软件维护面对的是人的世界:一个 API 的“正确行为”不是由数学公式决定的,而是由几十万用户的实际使用行为定义的。当 AI 修改了一个未定义行为,用户可能立刻崩溃——AI 的决策反向改变了系统的环境。(这种现象在后文将以 Hyrum 定律的形式进一步展开。)

AI 乐观派常寄希望于强化学习(RL)和 AI Agents 的自主进化。然而,强化学习成立的前提是能够定义一个可计算的奖励函数(Reward Function)。在软件生态中:

  • “为了短期商业利益留着 Bug”与“强行重构追求长远可维护性”,哪个 Reward 更高?
  • 延迟反馈周期长达数年,且评价标准包含客户满意度、团队士气、技术债务等多维非确定指标。

当奖励函数本身无法被数学建模时,强化学习便失去了演化的基石。

一个更深层的追问随之浮现:在向 AlphaFold 4.0 进军的过程中,AI 是完全抛弃了人类科学家,还是依赖人类科学家做助手,还是需要人类科学家作为领导?

回望 AlphaFold 1.0 到 3.0 的演进,AI 从未脱离人类独立行走:每一次架构创新(如 Evoformer、扩散模块)都源于人类对生物物理机制的重新理解;每一次数据策略调整都离不开人类对训练集偏差的诊断;每一次能力边界的拓展(从单链到复合物到配体)都是人类首先指明了“下一步该攻克什么”。AI 的强大在于高维空间的模式识别与优化逼近,但它既不能为自己设定新的科学目标,也无法在没有实验反馈的情况下判断预测的真伪,更不具备跨域类比以催生全新范式的顿悟能力。

因此,AI 的定位既非“独行侠”,也非“领导者”,而是人类科学家手中日益强大的“超级计算助手”——所有战略方向的选择、研究范式的跃迁、实验验证的设计与结果的意义诠释,其主导权始终掌握在人类团队手中。

正如 DeepMind 的 John Jumper 在获奖后多次强调的:“我们不是在建造一个取代科学家的 AI,我们是在建造一个让科学家能够提出更大胆问题的工具。”4.0 的发布时间表,不取决于摩尔定律,而取决于人类科学家提出下一个“大胆问题”的速度。

思想实验:AI 独立维护 Linux 内核

假设将 Linux 内核交给完全由 AI 驱动的 Agent 团队维护—— 关键前提:AI Agent 的奖励函数只能编码"代码质量"这类可计算指标。但在现实世界中,"质量"从来不是唯一追求——它必须与稳定性、向前兼容性、商业生态存活等长周期、模糊的收益持续折中。AI 能优化前者,却无法量化后者。
第 1 周:各自为政的"优化狂潮":
  • 50 个 AI Agent 各自扫描代码库,互不沟通,提交了 200 多个"优化"PR(代码合并请求):
  • Agent A 发现某个函数圈复杂度过高,拆成了 10 个小函数
  • Agent B 认为某个数据结构应该换成哈希表以提升理论效率
  • Agent C 发现一段"死代码"并删除——但它不知道,那是某家硬件厂商为了兼容特定老旧设备而刻意保留的空函数
每个 Agent 都基于自己的局部目标做出了"技术上正确"的决策,但没有人问过:这些修改组合在一起会怎样?
---
第 2 周:混乱全面爆发:CI(持续集成)系统里积压了 300 多个 PR,互相依赖、互相冲突、互相回退:
  • Agent D 的 PR 依赖 Agent A 的重构,但 Agent A 的代码已经被 Agent E 改过了,怎么办?
  • Agent F 发现 Agent B 的"哈希表优化"导致性能回退 3%,提交了回退
  • Agent G 和 Agent H 对同一个模块的修改方向完全相反,互不相让
  • Agent I 删除了一段"未定义行为"的 Hack——但那正是 5 年前为了让某大客户的生产环境能正常运行而刻意保留的兼容层,至今仍有数千台服务器依赖它
此时,一系列根本性问题浮出水面:
  • 优先级:哪个 Agent 的修改该先合入?靠什么排序?
  • 取舍:性能优化和代码整洁,哪个更值得保留?标准是什么?
  • 历史契约:那个"未定义行为"的 Hack,删了会怎样?5 年前的大客户至今仍有数千台服务器在运行——谁去确认?
  • 仲裁权:当两个 Agent 的"最优解"互相矛盾时,谁说了算?
AI Agent 之间无法达成共识。每个 Agent 都基于自己的局部奖励函数做"最优"决策,但没有一个 Agent 拥有全局判断力——它看不见其他 Agent 的修改,看不见历史决策的来龙去脉,更看不见代码之外的用户依赖和商业承诺。更关键的是:没有一个 Agent 有权说"这个方案可行,合了"。 在人类的开源社区里,子系统维护者拥有拍板权,并为此承担后果。而在 AI 团队里,只有"建议者",没有"决策者"。
第 3 周:人类被叫回来救场... (剧终)
这个思想实验揭示了 AI 独立维护软件工程的三个根本缺口:
1. 协作缺口:多个 AI Agent 之间没有共识机制和冲突仲裁流程。每个 Agent 只看到自己的局部目标,无法协调全局。围棋的协调全局看似复杂,其实优化函数很简单:地盘比对手多。
2.上下文缺口:AI 不知道"死代码"为什么存在、"Hack"为什么保留——这些信息不在代码里,而在历史邮件、口头约定和商业关系中。
3.决策缺口:没有 Agent 拥有"拍板权"。在人类的软件工程中,"决策权"和"责任归属"是独立于代码本身的一层治理结构——而 AI 团队里只有建议者,没有负责人。**当没有人为最终的合入结果承担后果时,"优化"就变成了一场无责任的实验——好结果没人奖励,坏结果没人追责,系统也就失去了收敛的方向。**

本轮小结:围棋与 AlphaFold 的突破证明了 AI 对固定目标函数系统的征服力;而软件生态属于目标函数动态漂移的复杂/Complex 系统。这不是“量变到质变的时间问题”,而是“问题范畴的本质不同”。即使 AI 在信息层面读到了完整上下文,它依然缺少一个可计算的奖励函数来做决策。

第三轮:AIGC 画画、短视频也是开放任务,软件开发难在哪里?

AI 全能派的观点:AI 画画、生成短视频也是开放性的创作任务,没有固定规则,AI 同样在短时间内超越人类。所以 AI 是可以很好地处理开放演化问题的, 软件开发同理可证。 

AI 务实派的回应:

这一轮的思辨很有迷惑性,因为它模糊了 “创作(Generation)” 与 “维护(Maintenance)” 的数学本质。前两轮分别揭示了信息层面评价层面的障碍,而第三轮要揭示的是最深一层的演化层面的障碍——即使信息完整、评价标准清晰,历史本身也会通过“状态累加”持续产生新的约束。

我们将创作类任务与软件维护类任务放在两个核心维度下对比:

维度
创作类(AIGC 画画/视频)
维护类(软件生态维护)
容错率
——几个像素抖动,大脑会解读为“艺术风格”
历史契约的近零容错——一旦某个行为被用户依赖,它就变成了“不可破坏的基准事实”,修改的代价可能远超收益
状态空间
独立不累加——生成新图不需兼容 200 年前的颜料配方
历史债越欠越深——今天写的每一行代码,都会变成明天必须背着的包袱。新功能必须在几十年前留下的接口、老用户的脚本、上古文档的“约定俗成”之间找到落脚点,每一步都踩在历史的肩膀上,没法推倒重来
历史债务
有——Hyrum 定律深刻描述了这一现象

关于“状态累加”的通俗解释

  • 画一幅新画,不用管几百年前的画家用了什么颜料、什么笔触——你从一张白纸开始,画完就结束。
  • 但维护软件不是从白纸开始。你面对的是几十万用户用了十年的老代码,他们的业务流程、自动化脚本、第三方工具全都“挂”在你今天要改的接口上。你每写一行新代码,都必须确保它既不破坏昨天留下的功能,又为明天的需求留出余地——历史不是背景板,而是你必须穿越的迷宫。 在这个迷宫里,每一步决策都会被永久记录下来,成为未来决策的新约束。你今天删掉的一个小函数,可能是别人公司整个 CI/CD 流程的命脉。这个“历史包袱”只会越背越重,永远不会因为技术升级而自动清零。

这就是 我之前的文章提到的另一种复杂度:

With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.当你的 API 有了足够多的用户,你在契约里承诺什么都不重要:系统里所有能被观察到的行为,都会有人依赖它。

https://mp.weixin.qq.com/s/rKuehNPLduzIwgV_r6Gl7g

真实案例 1:Excel 的 1900 年闰年 Bug

Lotus 1-2-3 误将 1900 年算作闰年(多出 1900/2/29 这天)。市场上的后来者 Excel 为了能无缝打开 Lotus 的文件,为了兼容性而刻意延续了这个 Bug。30 多年过去,微软工程师明知其错误却永远不计划修复 —— 因为全球无数财务报表已经将这个错误序列号当成了基准事实。

真实案例 2:Windows 为 SimCity 兜底

DOS 时代的 SimCity 存在 Use-After-Free 内存违规访问 Bug。在 Windows 95 引入全新内存管理时,微软工程师没有强迫游戏打补丁,而是在 OS 内部写了专门的兼容 Shim:检测到 SimCity 运行,就自动切换回旧版不立即释放内存的分配模式。

AI 可以极其精准地“识别”出这些 Bug,但 AI 无法自主“决策”该不该修——因为修正成本取决于代码之外的全人类既有资产合规校验成本。当修复成本高于 Bug 造成的实际损害时,Bug 就升格为了 Feature。

本轮小结:AIGC 的突破证明了 AI 具备极强的“概率生成能力”;但软件维护面临的是“历史契约的近零容错 + 状态累加 + 隐性契约”的硬约束。用画画的成功推演软件维护的替代,忽略了两者在状态空间上的本质差异。

那 AI 在软件工程中到底能做什么?

花了大篇幅论证“AI 不能做什么”之后,一个自然的疑问是:那 AI 到底擅长什么?我怎么用它?

AI 擅长
说明
生成单元测试用例
大幅提升测试覆盖率,减少重复劳动,AI 的幻觉在 fuzzy test 中会大放异彩
迁移老旧代码
语言升级、框架迁移的自动化辅助,勤勤恳恳地 7x24 工作
生成样板代码
解放工程师,聚焦核心业务逻辑
识别已知漏洞模式
静态分析能力的增强,它有海量的知识,抓漏洞不留情面
代码补全与解释
提升编码效率,降低新手入门门槛,它非常耐心

⚠️ 一个重要的提醒:AI“识别漏洞”的能力越强,它在缺乏上下文时“建议修复”的冲动就越危险。真正的工程智慧不在于“找出所有漏洞”,而在于判断哪些漏洞必须修、哪些漏洞只能共存、哪些漏洞已经被用户当作 Feature。这个判断,AI 做不了。

在“软件级”和“企业级”工作中,AI 的能力边界明显

AI 不擅长
原因
理解商业上下文和隐性契约
信息未数字化,不在训练数据里,且 AI 缺乏主动溯源的机制
在“没有正确解”的 Complex 系统中做权衡
目标函数动态漂移,无法定义奖励函数
在“状态累加 + 历史契约”中安全修改代码
Hyrum 定律使得“修不修”的决策取决于生态层面的代价评估

总结:三轮讨论的事实和逻辑盲区:

轮次
很乐观的断言
逻辑盲区
核心事实
第一轮
AI 几分钟分析几万行代码
误把“程序”等同于“软件”
信息的物理断裂:大量商业妥协与历史决策未被数字化,AI 面对的是不完整上下文;且 AI 缺乏主动补全断裂上下文的机制
第二轮
AlphaFold / 围棋能过,只是时间问题
混淆 Complicated 与 Complex
目标函数漂移:物理世界有客观 Ground Truth 且反馈单向;软件生态中 AI 的决策会改变用户行为,且缺少可计算的 Reward Function
第三轮
AIGC 画画能突破,软件也能
混淆“一次性创作”与“状态维护”
历史契约的近零容错:AIGC 高容错且无状态累加;软件维护受制于 Hyrum 定律,必须在累加的状态空间中承担历史契约

这三层瓶颈的任意一层未突破,AI 都无法独立主导软件工程。而这三层都涉及“人的世界”,不是算力能解决的。

写在最后

在人类与 AI 的博弈中,承认“AI 无法替代人类做复杂规划”,绝不意味着否定 AI 的工程价值,更不是人类自大式地抱残守缺。相反,AI 正在重塑编程的形态。它以惊人的效率承接了语法构建、单元测试生成、样板代码编写等大量的“程序级”任务,把人类工程师从重复的体力劳动中解放出来。现在,工程师的独特价值反而更清楚了:

  • 理解用户生态中那些未被文档化的隐性契约
  • 在技术纯洁性与商业现实之间做出合理的妥协与权衡
  • 在没有明确奖励函数(Reward Function)的 Complex 系统中,承担风险并做出“足够好”的决策

这场博弈的终局,不是人类完全被剥夺,而是人类终于可以退守到最核心的阵地——那些涉及上下文感知、生态意识、商业博弈与责任担当的地方。在 AI 越来越强大的时代,这些能力不仅不会贬值,反而会变得无比稀缺。

哎,程序里面的 bug 是人类写进去的,AI 也是人类训练出来的,说到底,还是人类厉害啊,你说呢? 现在我的 MacOS 不断拷问 AI,导致内存不够了,AI 如何处理这个比写代码简单多了的任务呢?