《人月神话》视角下,AIGC能否成为软件开发领域的终极解决方案?
摘要:最近阅读了钟敬老师的特别策划系列文章《AI时代程序员生存之道》,里面从《人月神话》的视角来讨论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发现:当时软件开发技术的进步,主要解决的都是非本质困难。
