

如今,这个梦想似乎已经触手可及——AI 可以秒级生成代码、修复漏洞、甚至识别出人类肉眼难察的缺陷。
于是,一个顺理成章的追问出现了:既然 AI 已经能在代码层面降维打击人类,那它能不能顺势把整个软件工程也彻底取代了?或者说,已经取代了?
这是一场人类与自己一手打造的 AI 之间漫长而深刻的博弈。在过去几十年里,我们目睹了人类在曾经引以为傲的领地里接连退守:从西洋跳棋、国际象棋,到被誉为“人类智慧最后堡垒”的围棋;从困扰生物学半个世纪的 AlphaFold,到几秒跑通测试的 AI 编程助手,语言翻译 ……“人比 AI 强” 这个荣誉连续丢失。
有很多人对 AI 的能力非常乐观,也有人保持谨慎的态度。 俗话说,”悲观者大多数是对的,乐观者总有最后胜利的 -- 看我们讨论的时间尺度是多长了。” 在盲目追捧或过度焦虑之前,我们有必要剥离表象,重新理清那些被混淆的概念、底层原理与逻辑推理。 例如,最近一篇文章的核心论点是:
“把简单、重复的事交给 AI,复杂的事还是需要人去规划和分解 —— 这个观点是错的。AI 已经能处理复杂任务。“
AI 已经真的非常强大了,在代码方面强过人类程序员。
朱少民,公众号:软件工程3.0时代一个关于AI的流行观点,其实是错误的
粗一看的确觉得很有道理! 毕竟,AI 可以很快地写代码,AI 分析大规模代码也是真的给力。文中举出的 AlphaFold 的突破大家也都知道。
但作为软件工程师,读到后面总觉得哪里不对。这篇文章把我们在实践中日常面对的 “软件维护”、“生态演化”、“团队协作”这些事,说得太简单了。 工程师碰到有分歧的地方,不用比谁的嗓门大, 我们理清思路,我们分几个层次和轮次把各种问题聊清楚。
第一轮:AI 能分析几万行代码,远超人类
AI 全能派观点:
“AI 可以在几分钟内分析几万行代码,理解整个系统的架构、识别逻辑漏洞、生成重构方案。这已经不是‘简单任务’了,所以 AI 完全能处理复杂系统。”
AI 务实派观点:
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 “什么才是好的”。
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 内核
50 个 AI Agent 各自扫描代码库,互不沟通,提交了 200 多个"优化"PR(代码合并请求): Agent A 发现某个函数圈复杂度过高,拆成了 10 个小函数 Agent B 认为某个数据结构应该换成哈希表以提升理论效率 Agent C 发现一段"死代码"并删除——但它不知道,那是某家硬件厂商为了兼容特定老旧设备而刻意保留的空函数
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 的"最优解"互相矛盾时,谁说了算?
本轮小结:围棋与 AlphaFold 的突破证明了 AI 对固定目标函数系统的征服力;而软件生态属于目标函数动态漂移的复杂/Complex 系统。这不是“量变到质变的时间问题”,而是“问题范畴的本质不同”。即使 AI 在信息层面读到了完整上下文,它依然缺少一个可计算的奖励函数来做决策。
第三轮:AIGC 画画、短视频也是开放任务,软件开发难在哪里?
AI 全能派的观点:AI 画画、生成短视频也是开放性的创作任务,没有固定规则,AI 同样在短时间内超越人类。所以 AI 是可以很好地处理开放演化问题的, 软件开发同理可证。
AI 务实派的回应:
这一轮的思辨很有迷惑性,因为它模糊了 “创作(Generation)” 与 “维护(Maintenance)” 的数学本质。前两轮分别揭示了信息层面和评价层面的障碍,而第三轮要揭示的是最深一层的演化层面的障碍——即使信息完整、评价标准清晰,历史本身也会通过“状态累加”持续产生新的约束。
我们将创作类任务与软件维护类任务放在两个核心维度下对比:
关于“状态累加”的通俗解释:
画一幅新画,不用管几百年前的画家用了什么颜料、什么笔触——你从一张白纸开始,画完就结束。 但维护软件不是从白纸开始。你面对的是几十万用户用了十年的老代码,他们的业务流程、自动化脚本、第三方工具全都“挂”在你今天要改的接口上。你每写一行新代码,都必须确保它既不破坏昨天留下的功能,又为明天的需求留出余地——历史不是背景板,而是你必须穿越的迷宫。 在这个迷宫里,每一步决策都会被永久记录下来,成为未来决策的新约束。你今天删掉的一个小函数,可能是别人公司整个 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“识别漏洞”的能力越强,它在缺乏上下文时“建议修复”的冲动就越危险。真正的工程智慧不在于“找出所有漏洞”,而在于判断哪些漏洞必须修、哪些漏洞只能共存、哪些漏洞已经被用户当作 Feature。这个判断,AI 做不了。
在“软件级”和“企业级”工作中,AI 的能力边界明显
总结:三轮讨论的事实和逻辑盲区:
这三层瓶颈的任意一层未突破,AI 都无法独立主导软件工程。而这三层都涉及“人的世界”,不是算力能解决的。
写在最后
在人类与 AI 的博弈中,承认“AI 无法替代人类做复杂规划”,绝不意味着否定 AI 的工程价值,更不是人类自大式地抱残守缺。相反,AI 正在重塑编程的形态。它以惊人的效率承接了语法构建、单元测试生成、样板代码编写等大量的“程序级”任务,把人类工程师从重复的体力劳动中解放出来。现在,工程师的独特价值反而更清楚了:
理解用户生态中那些未被文档化的隐性契约 在技术纯洁性与商业现实之间做出合理的妥协与权衡 在没有明确奖励函数(Reward Function)的 Complex 系统中,承担风险并做出“足够好”的决策
这场博弈的终局,不是人类完全被剥夺,而是人类终于可以退守到最核心的阵地——那些涉及上下文感知、生态意识、商业博弈与责任担当的地方。在 AI 越来越强大的时代,这些能力不仅不会贬值,反而会变得无比稀缺。
哎,程序里面的 bug 是人类写进去的,AI 也是人类训练出来的,说到底,还是人类厉害啊,你说呢? 现在我的 MacOS 不断拷问 AI,导致内存不够了,AI 如何处理这个比写代码简单多了的任务呢?

夜雨聆风