ChatGPT是传说中的银弹吗?
原创- 2023-03-30 08:57:00
- 1569
著名的布鲁克斯大师在1986年的时候提出了著名的论断:在未来的十年内,无论是在技术上还是管理方法上,都看不出有任何突破性的进步,能够保证在十年内大幅度地提高软件的生产率、可靠性和简洁性。
这位老先生可是不得了,曾任IBM系统部主任,主持开发过OS/360等大型电脑用的操作系统。我们普通程序员写的软件和老先生比起来就是小儿科。布鲁克斯老先生提出了著名的没有银弹和人月神话论点,对软件开发做了深入的剖析。因其卓越的贡献,1999年获得图灵奖。
那么布鲁克斯的观点在37年后的今天还能成立吗?我们来看看他的主要观点。布鲁克斯认为软件研发中有根本困难和次要困难。什么是根本困难呢,就是软件研发中固有的、不会消失的问题,共有四种类型的问题:复杂度、一致性、可变性和不可见性。布鲁克斯大师认为这些问题是固有的,不会随着实现方式的不同而消失。为什么这么讲呢?布鲁克斯认为软件开发过程中最困难的部分是在于描述、设计和测试概念上的结构,而不是对这个结构进行实现以及对实现度的验证部分。大师还进一步阐述,即使消除了在将概念结构(设计)转换为表达(实现)的过程中出现的所有次要困难,软件开发仍然很困难。
我尝试来解释下大师的观点。大师认为软件开发过程中最难的是对要开发的软件或者系统结构上的设计和描述,而不是实现和测试验证的过程。GPT我理解可以增强实现和测试的过程,相当于是消除了一部分实现过程中的次要困难。按照这样的观点来看的话,软件研发过程中的根本困难还是没有消除。我们来进一步分析下这四种根本困难:
首先来看复杂度。
布鲁克斯列举了引起复杂度的一些原因:
- 比如组件交互的增长、状态数量的增长要比代码行快得多。
- 软件没有两个部分是相同的。
- 状态大量产生。复杂度随规模指数增长。
- 缺少对整个领域、流程或系统的掌握。
- 由于复杂度是软件的根本特性,无法将其像其他学科那样进行抽象。
- 还会引入技术和管理问题,进而会导致更多不可靠的问题。
复杂度会带来两个后果,技术和管理上。技术上团队成员因为复杂度会导致沟通变得非常的困难,理解程序也会异常困难。管理上也带来很多挑战,比如人员会不断的调整,知识如何进行传承。功能复杂还会带来可用性和可维护性的问题。
再来看软件开发中的一致性问题。
一致性产生的原因是因为必须要与现存的系统进行对接。所有新软件都必须遵循过去的做法,因为改变人是很困难的事情。谁让你是新发布的软件呢,新来的家伙要守规矩。软件还需要和操作系统、硬件环境进行适配。大多数情况下,软件系统必须与现有系统进行对接。即使对一个新系统而言,保证接口适配系统的其他部分也会更容易一些。不可能因为新上系统就将原来的所有系统都推翻。
第三个根本困难是可变性。
可变性就是必须对不断变化的现实世界、新增的功能以及硬件。有很多的源头会引起变化,比如新的应用程序、用户、机器、标准、法律等等。软件必须具备可变性,但可变性会增加软件的复杂度。和硬件相比,虽然软件变更看上去会更容易,但这也带来了用户对软件可变性不切合实际的期望,也就是说人们严重低估了软件变更的难度。由于软件易于变更,所以软件会经常改动,会导致偏离最初的设计。
第四个根本困难就是软件的不可见性。
无法一次性的看到系统的所有方面,流程图、时序图等工具比较难以理解,每个人对软件的理解也都可能不同,导致沟通变得困难。软件不以空间的形体特征存在,无法使用现成的几何方式表达。而且软件结构往往是复杂而且隐蔽的。
我们来看一下使用GPT来辅助软件开发,会改变软件开发过程中的这些根本困难吗?结论应该是比较明确的,就是即使使用GPT来辅助开发,软件开发过程中的根本困难还是无法消除的。软件的复杂度、一致性、可变性和不可见性不会因为使用GPT就会消失。
那么GPT的价值在哪里呢?我认为GPT减轻了软件开发过程中的一部分次要困难,比如需求描述的整理、片段性代码的生成、测试用例的生成等。在特定的场景下面,通过精心维护的提示语可以快速的拿到一些结果。但我们需要警惕的是,引入GPT会引起新的复杂度和不可控因素。比如如何写出精确的提示语,如何应对需求变动带来的代码的动荡,如何驾驭GPT生成的代码等等。后面再陆续写文章和大家分享。