从《人月神话》看AIGC是否是软件开发的银弹
大家好,我是Edison。
最近阅读了钟敬老师的特别策划系列文章《AI时代程序员生存之道》,里面从《人月神话》的视角来讨论AIGC对于辅助软件开发的能力边界 和 程序员的生存之道,特别有意思,我将其核心内容整理了一下分享与你!
《人月神话》中银弹到底是什么意思?

作为一个软件开发从业者,我想大多数都应该听说过《人月神话》(作者:Brooks)这本书,里面的“没有银弹”的观点更是深入人心。不过,这里我们还是再温习一下“没有银弹”是什么意思。“没有银弹”在原书中指“无论在技术还是管理方法上,都看不出任何突破性的进步,能够独自保证在十年内大幅度地提高软件生产率、可靠性和简洁性”。
Brooks在这儿说的大幅度是相对于硬件发展来说的。换句话说,是像摩尔定律那样的硬件能力的指数级增长,而这种发展在软件开发中并没有发生。Brooks用“银弹”来比喻软件开发,是来源于欧洲狼人的传说,它指的是软件开发有时候具有狼人的特点。例如,一个软件项目,看起来需求已经被充分理解了,进度也满足预期,但是可能忽然间变得错误百出,Bug越改越多,进而大大超出工期和成本,就好像一个看起来正常的人,突然就变成了狼一样。
这种现象也造成了当时业界所谓的“软件危机”,而这也是软件工程产生的背景或原因。在狼人的传说中,只有银质的子弹才能打死狼人。
因此,Brooks才将突破性的软件开发技术比喻为“银弹”。
软件开发的本质困难和非本质困难
Brooks将软件开发面临的困难划分为了 本质困难(Essence)和 非本质困难(Accident)。那么,本质 和 非本质 到底是什么意思?
Brooks说这一对术语来源于亚里士多德的哲学,用通俗易懂的话来举个例子吧,例如,人类是胎生的,是有智慧的,这些就是人的本质属性,它们是必然存在的,如果没有这些属性,人类就不是人类了。另一方面,人的年龄、体重、健康状况等则是会发生改变的,比如说疾病,是可以消除的,因此它们是非本质属性。
基于对本质属性和非本质属性的理解,Brooks认为:
(1)即使技术进步了,也不能消除的困难 就是 本质困难,这是软件开发的本质所决定的。
软件开发的本质困难被总结为了5点:复杂性、一致性、可变性、不可见性 以及 社会性。
所谓复杂性,指软件几乎是最复杂的人类产品。一方面是业务需求本身的复杂性,另一方面则是技术实现的复杂性,最终软件系统的复杂性则是两者的叠加。
所谓一致性,指为了软件正常运行,软件开发人员必须和各种人为的不一致性做斗争,这些不一致的产生仅仅是因为不同的人、不同时间、基于不同的理解所造成的。一方面是保持业务概念的一致性,另一方面则是技术实现的一致性。
所谓可变性,指软件常常会面临频繁的需求变化。这一点和建筑盖楼完全不同,盖楼是永恒是主题,而软件是变化是主题。
所谓不可见性,指尽管可以通过一些技术将部分设计内容可视化,但软件内部在本质上是不可见的。也就是说,即使你把电脑拆了,也不可能看到软件的结构。
综述,Brooks认为无论技术怎样发展,这4点困难在软件开发中是不可能完全消除的,因此属于本质困难。
除了以上4点,钟敬老师补充了一个 社会性。
所谓社会性,是指软件开发实际上是一个社会工程,是一种群体行为,涉及到人的组织、沟通、协作 以及 心理问题。过去,这种群体行为还只局限在开发人员和业务人员,而随着数字化转型的发展,IT逐渐变成企业的核心竞争力,这种群体行为就扩展到了整个企业甚至企业之外。然而,这种社会性,并没有随着技术的发展而消失,它也算是一个软件开发的本质困难。
(2)可以通过技术的进步而消除的困难 就是 非本质困难。
软件开发的非本质困难主要是关于开发语言、开发工具、基础设施等方面的困难。
比如,计算机语言从机器语言到汇编语言到高级语言,再到目前流行起来的低代码,它们都是计算机语言的进展,在形式和深度上有所不同,但解决的仍然是非本质困难。又如,云计算的进展,将应用放到云上,开发和运维人员在维护机房、申请设备等繁琐工作上的投入就会大大减轻甚至消失,因此解决的也是非本质困难。但是,虽然这些技术不能解决本质困难,但也不是一无是处,它们在推动着软件生产率平缓地逐年增高,因此Brooks将这些技术称为“铜质子弹”或“铜弹”。
画外音> 从某个角度来看,软件开发的历史,就是代码越来越“低”的历史。C语言比汇编语言“低”,Java/C#比C语言“低”,现在的低代码如Mendix, PowerPlatform 又比 Java/C# “低”。而ChatGPT写程序,则是从另一个层面,使得软件开发的难度更低。
在《人月神话》中Brooks发现:当时软件开发技术的进步,主要解决的都是非本质困难。他说“除非非本质任务占了所有工作的9/10,否则即使全部非本质任务的时间缩减到0,也不会带来生产率数量级上的提高。”
那么,你可能会问,现在都2025年了,AIGC/LLM已经发展的很成熟了,AIGC是否已经可以说是软件开发的“银弹”了?别急,下面我们来看看。
AIGC是软件开发的“银弹”吗?
要论证这个问题,我们需要结合之前的软件开发的本质困难来看。
(1)复杂性从需求的角度来看,目前AI还无法降低需求本身的复杂度。相反,AI软件本身所依赖的技术如机器学习、神经网络等,还增加了技术上的复杂性。因此,AI还无法降低软件的复杂性。
(2)一致性相对于技术上的不一致性,真正难解决的是软件中包含的业务概念的不一致性。这种不一致,要么引起隐含的逻辑错误,要么导致程序复杂,难以维护。目前,我们还看不到AI在这方面的作用。
(3)可变性AI辅助软件开发并不会减少业务需求本身的频繁变化。变化是软件的主题,永恒是建筑的主题。
(4)不可见性其实AI本身就有一个固有问题,那就是AI的“不可解释性”。当ChatGPT或Copilot回答问题时,我们无法找到这种意义上的确凿的因果关系,因此无法对AI的行为作出准确的解释。当 AI 广泛应用于软件后,这种不可解释性会加剧软件的不可见性。
(5)社会性目前AI还是无法代替人与人之间的沟通,因此无法消除社会性。
(6)结果正确性除了以上针对软件开发本质困难的分析以外,AI自身还有一个固有的局限性,即AI产生的内容,既不能保证是正确的,也不能保证是最优的,有时候常常“一本正经的胡说八道”。综上所述,目前的AI还不大可能是“银弹”,但是不代表AI没用,事实上已经在下面多个方面帮助我们更加高效地开发软件了,可以称得上是一枚“铜弹”!
- 帮助开发人员完成重复性和套路性的工作
- 帮助开发人员完成那些了解原理但是忘记了技术细节的代码
- 帮助开发人员提高学习新知识(比如某个JavaScript框架)的速度
- 帮助开发人员快速获取他人的经验(毕竟AI学习了大量他人的代码)
如何对抗软件开发的本质困难?
在软件开发业界的发展历程中,已经有了两个重要的对抗软件开发本质困难的方法论,它们是:敏捷软件开发 和 领域驱动设计。
(1)敏捷软件开发
敏捷软件开发针对的主要是本质困难中的复杂性、可变性和社会性。一方面,通过迭代的方式,让软件能够演进式地“生长”,将软件的复杂性和可变性带来的困难和风险分散在整个软件生命周期中。另一方面,通过强调软件开发过程中“人”的方面,提供一系列方法和技术提高沟通效率,改善人员组织,还强调培养卓越技术的开发人员。
(2)领域驱动设计
领域驱动设计,俗称DDD,它是面向对象方法论的一种优化,针对的主要是本质困难中的复杂性、一致性 和 不可见性。一方面,通过建立领域模型,准确、深刻地反映业务概念。另一方面,围绕领域模型图,业务专家和开发人员逐渐建立统一语言,然后再进行开发,还提供了一系列的概念和方法辅助更加贴近业务概念的开发。
AIGC时代,程序员应该如何发展?
在AIGC时代,程序员应该如何发展,保住自己的饭碗,提升自己的核心竞争力,这是一个值得思考的话题。
要回答这个问题,需要总结下目前AI能做什么 以及 还做不好什么。

从上面的表格中我们可以知道,那些只会完成基础功能,但结构混乱,难以理解和维护代码的初级程序员可能会没有多少生存空间了。
作为想要保住饭碗又持续精进的程序员,需要加强以下的能力:
(1)加强业务需求理解的能力
比如使用DDD方法论,贴近业务,建立领域模型表达业务,和业务用户建立统一语言,然后基于模型驱动开发。
画外音>DDD是技术,也是艺术!DDD解决的就是软件开发的本质问题,通过可视化、抽象化、严格化的方法构建领域模型的艺术,现在还没有被AI所取代。But,未来AI能够掌握这项“艺术”吗?我们都不确定,或许将来某天它能掌握,不过那时候可能失业的就不只是开发人员了!
(2)熟练使用AI工具高效工作 和 快速学习
比如持续实践提示词工程,提高AIGC答案的贴合度。又如善用AI加快自己学习新框架或新技术的效率,完成项目任务。
(3)加强评审和验证AI生成代码的能力
AI生成的代码不一定是正确的,也不一定是最优的,这还是需要开发人员具备评审能力,以及进一步优化代码的能力。而这些能力,其实还是开发人员的手艺活儿,比如面向对象、设计模式、整洁代码、重构等等。
(4)夯实开发技术的基本原理(而不是技术细节)
比如你已经了解了某个JavaScript框架(如VueJS)的基本原理,只是忘记了具体的语法细节,那么就非常适合在AI辅助下开发VueJS的应用程序。但是,如果你一点都不了解其原理,甚至JavaScript也不会,那么即使有AI的帮助,也难以达成目的,容易写出难以理解和维护的“屎山”。
画外音>这也提示我们,将来学习一门新技术的时候,可以将重点放在对原理的理解,而不是花较多时间记忆技术细节。
综上所述,开发人员要有紧迫感,但也不必过于紧张,这里借用毛主席的一句话“战略上藐视敌人,战术上重视敌人”。
一方面不用太紧张,我们需要看到AI的影响是渐进的,我们有时间去掌握。另一方面我们需要现在就开始行动,主动关注AI技术的发展,最好尽快进行尝试,动起来,在路上!
参考内容
钟敬,《AI是银弹么?》
钟敬,《AI时代程序员生存之道》
钟敬,《DDD,是技术也是艺术》
推荐学习
欢迎和我一起学习《手把手教你落地DDD》!


从《人月神话》看AIGC是否是软件开发的银弹的更多相关文章
- 软件项目发展历史<人月神话>这本书好
几乎是计算机软件开发的发展历史 人月神话,增加人手并不一定能提高开发速度. 原因在于,有些任务是无法分解的,存在先后顺序.无法同步进行. 增加人手,增加的是沟通成本,相互牵制.可以分解的任务就 ...
- IT项目管理——《人月神话》读后感
这也许是和候红老师的最后的几节课了吧,侯老师是一个很有思想深度,很关心同学的好老师. 一开学就布置了阅读<人月神话>的作业,说实话,我没有看,以我的速度可能2.3个小时就看完了,但是我觉得 ...
- <<人月神话>>阅读体会(一)
第一次听说人月神话还是在大一上学期的导论课那会儿,那会儿好像就已经确定了自己要学软件,于是就去问王建民老师能不能给我推荐几本软件工程方面的书,我想要提前自己学学,以为老师会给我推荐一些某种语言类的学习 ...
- 《The Mythical Man-Month(人月神话)》读后感(2)
第10章 未雨绸缪 在化学领域中,在实验室可以进行的反应过程,并不能在工厂中一步实现.一个被称为“ 实验性工厂(pilot planet)”的中间步骤是非常必要的,它会为提高产量和在缺乏保护的环境下运 ...
- 《The Mythical Man-Month(人月神话)》读后感(1)
临近考试周,这里我通过平时阅读的<人月神话>十九个章节和知乎.简书等网页中网友们对<人月神话>的读后感,对书中各个章节进行简单的总结,以下均为个人手打观点的思考与整合,仅供大家 ...
- 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?
写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...
- 读书笔记第三周 人月神话 刘鼎乾 PB16070837
读书笔记第三周:人月神话 这本书主要讲述了如何管理一个软件开发团队的问题,其中如何提高团队的效率可以说是本书的重点之一了.感觉这本书地中文版翻译得比较晦涩,很多表达比较模糊,看起来有些吃力,因此下 ...
- 《人月神话》读书笔记 PB16110698 第七周(~4.19)
每逢读书笔记上交作业时刻,班级blog页面上总能看到<人月神话>相关的读书笔记,本次软工课邓老师推荐的第一篇读书笔记也是写的<人月神话>,算是对它“耳濡目染”了.本周,我终于抽 ...
- Java课程寒假之《人月神话》有感之一
一.焦油坑 以前上课的时候,老师讲过早期的程序由于工作量不大,大多只需要几个人完成,随着软件规模的不断扩大,代码量直线上升,仅仅一两个人可能没有办法完成这样的任务,多以开始形成了团队的规模,焦油坑说的 ...
- 《人月神话》读书笔记(2)-week3
为了确保团队中的每个人都能保持系统概念上的完整性,关于项目的书面规格说明是必不可少的.手册要描绘用户可见的一切,但不应支配实现的过程.光有规格说明也是不够的,会议也是必要的.书中提到的周例会会迅捷地给 ...
随机推荐
- PostgreSQL 密码忘了
许久不登, 倒是把默认的 postgres 用户的密码给忘了... 首先关闭 PostgreSQL. 我这是 Windows 上安装的, 所以到服务 (services.msc) 里关闭. 然后修改配 ...
- 线性判别分析(LDA):降维与分类的完美结合
在机器学习领域,线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的算法,它在降维和分类任务中都表现出色. LDA通过寻找特征空间中能够最大化类间方差和最小 ...
- chrony时间同步软件介绍
本文分享自天翼云开发者社区<chrony时间同步软件介绍>,作者:刘****苏 chrony是网络时间协议NTP的通用实现,它可以将系统时钟和`NTP服务器同步.它支持在各种条件下包括间歇 ...
- MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题 问题背景 在停服发版更新时,需对 200GB 大表(约 200 亿行数据)进行快速备份以预防操作失误. 因为曾经出现过有开发写的发 ...
- Java 单元测试简单扫盲
前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...
- hybrid应用自动化
一.hybrid介绍 hybrid是一种混合app,将h5页面嵌入native原生页面. 基于uiautomator+chromedriver.native部分走uiautomator,web部分走c ...
- MySQL清理binlog的正确姿势
本位主要讲述如何正确的清理 MySQL的binlog,里面有哪些坑,注意点有什么. 一. 为什么要清理binlog 如果没有设置MySQL的binlog过期时间或者设置的时间过长, 会 ...
- firebase studio硬刚cursor,送免费云服务可跑23b大模型
谷歌IDX提供免费高配云服务器(16核CPU,64G内存,300G硬盘),无需绑卡,只需一个能正常使用的谷歌账号.这是一个非常强大的开发环境,特别适合运行大型AI模型和开发工作. 一.Google I ...
- k8s-1.18.0版本-kubeadmin部署(提供阿里云镜像)(二)master节点
k8s-1.18.0版本-kubeadmin部署 (提供阿里云镜像) 个人服务器地址:http://101.201.140.7/wp-blog/ 系统开启kube-proxy的ipvs前置条件 从k8 ...
- MySQL 高可用集群搭建部署
MySQL 高可用集群搭建(GTID 模式 + 自动故障转移) 一.环境规划 角色 IP 地址 说明 主库 (Master) 192.168.1.100 运行 MySQL + Keepalived/M ...