软件开发与演化: 大语言模型打开的空间和带来的挑战

软件、软件开发与演化

软件是人类制造的最复杂制品,软件开发和演化是人类针对所解决问题的创造性思维活动。科学家探索世界、工程师改造世界、计算机科学家和软件工程师是创造世界的。具体来讲,软件是人类大脑思维活动的体现。认识和理解人的思维活动是非常困难的,因为软件是人类大脑逻辑思维活动的体现,所以认识与理解人的思维活动非常困难,理解软件系统也非常困难,这是最基本的观点,也是核心观点。

软件的创造过程与制造过程合二为一,所以软件系统开发出来之前没有参考样品,而且带来很多问题,比如软件系统是难以估算成本的,所以投资软件具有相当大的风险和不确定性。

人是软件开发与演化的主体,而软件开发与演化是把现实世界复杂的问题模型转换为计算模型。目标是追求高效、高质量、低成本,而解决的核心问题是如何使得软件系统满足需求,摆脱缺陷。这两个问题和人密切相关,人是软件需求产生、认识、确认的主体,需求是人类在认识复杂世界的基础上形成的主观意图,经常不断变化。从软件工程师角度说,经常面对按照错误的需求开发出正确软件的困局。

另外一个方面,人在软件开发演化中会犯错,因为人对复杂事物的认识不是一蹴而就,需要经历循环反复、不断探索的过程,所以软件系统的缺陷是难以避免的。软件可信保障成本很高,其实大家都知道,任何人和机构都不能确保软件质量。通俗说大家都知道,软件产品是没有三包的。曾经软件质量是以正确性为目标的,强调软件系统的绝对正确性,要形成客观认识。但那个时候软件系统是运行在封闭静态环境中的系统,可以看成是个数学系统。希望基于这种数学证明基础之上对软件正确性形成客观认识。基本条件是软件需求由形式化规约描述,形成人对软件系统的确认关系,但是实际上现实中做不到,是一个理想。所以现在软件质量是以可信性为目标,退了一步,强调相对可信,主观认识,这是因为软件系统是在开放动态环境下不断演化的系统。

没有办法把它看成数学系统,由于复杂性和规模不断地增大,数学证明这种需要投入巨大的成本,现实中没法投入,也做不到。所以后退一步是强调可信性,可信性是基于认识与理解、获取客观证据基础之上形成主观认识,人为判断这个软件可以运行或不可运行。前提条件是软件需求是自然语言来描述,形成人类与软件系统的一种信用关系。

再看软件开发与演化任务,人类在现实世界中所承担的任务分为两大类:一类是预测性任务,通常不需要承担风险责任,没有可信保障需求。另外一类是是决策性任务,要完成决策性任务,通常是需要承担相应的风险责任,有可信保障需求。比方天气预报就是典型的预测性任务。人在软件开发与演化中完成的是决策性任务,需要对任务完成正确与否作出可信性判断,需要对软件系统是否满足需求、摆脱缺陷作出可信性判断,承担相应的风险增长,在此基础上构成一定的可信保障。

具体来说,软件开发与演化过程是把自然语言的需求转换成为满足需求的程序代码,这是一个创造性过程,也是一个决策性过程。所以动作难度很大,而且人力成本很高,需要经过一系列的工作才能最终达到的目标。在这个过程里面,主要设计两种语言:一种是自然语言,一种是程序语言。正是因为软件开发与演化是创造性的过程,是决策性任务,非常困难,所以就想办法通过开发研制各种各样的软件工具给人提供帮助和支持,提高软件开发与演化各个阶段的自动化程度,从而希望形成一种人机协同的软件开发与演化环境。但在现有软件工具有两方面的弱点:

一方面现有软件工具很少考虑按照自然语言需求直接生成程序代码,这是因为将自然语言描述需求转换为满足需求的程序代码,这是不可判定的计算问题。现有的软件工具难以突破自然交互障碍,缺乏自然语言接口与人交互,所以人机协同的工作空间、有效性和灵活性受到了大量的限制。这两个薄弱环节其实在大语言模型出来以后,应该来说都有了比较大的突破。

软件系统是通过算法解决问题的,而算法是求解问题需要遵循的被清楚指定简单指令的集合。现实世界中能用计算机解决的问题和不能用计算机解决的问题,分别称为可判定计算问题与不可判定计算问题。而这两类问题的分类基本条件或基本依据,是否存在解决问题的算法,当然算法解决问题需要消耗资源,所以有算法复杂性,有易解问题和难解问题。

现在讨论的算法都是基于逻辑设计的算法,也就是说求解问题需要遵循清楚指令的简单指令集合,算法每一步都有内在的解释,理论上算法的正确性是可证明的,也就是可以证明算法的输出结果是满足需求公约的。

神经网络模型的出现和大量的使用,现在又有了另外一类算法,称之为是预测性算法。这个预测性是算法是基于概率与统计原理以及训练数据形成的数学模型。典型的特征是输出结果是预测性结果,可以输出预测性判断、预测性的内容生成。既然是预测性结果,就像天气预报是不负责任的,不一定满足数据公约,输出结果缺失可信性判断。相比于前面的基于逻辑设计的算法,具有内在不可解释、易受数据扰动、输出结果不一定满足需求规约、缺失可信性判断。

这些算法打开了解决问题的新空间,给软件可信保障带来挑战,预测性算法基于给定数据进行预测,基于预测结果解决实际问题,可以使用预测性任务,但直接用于决策存在的问题会存在风险。所以,预测性算法打开了解决问题的新空间,但是给软件可信保障带来挑战。

大语言模型就是这样的产物,大语言模型本身是神经网络模型,同时由于采用大量的语料进行训练,突破了工程化的训练技术,所以使得可以高效地利用互联网和图书资料中所积累的海量文本进行训练。因而汇聚丰富知识的基础上形成了强大自然语言生成能力,简单说可以针对自然语言提问,生成预测性的回答。同时还通过一系列的技术创新,使得它的能力进一步增强。

这样一个自然语言问答的工具,在训练的时候也采用了大量程序语言的语料,所以通过类似自然语言的处理方式采用大量程序语言相关语料进行训练,所以也积累了丰富的软件开发与演化知识。因而,它也可以通过自然语言与软件开发与人工交互,通过给给的软件开发与演化任务生成预测性内容,所生成的预测性内容折戟软件开发与演化各个阶段。因而给软件开发和演化人员完成相应任务提供一定程度的帮助。所以把大语言模型又称之为是基于自然语言交互的软件工具。大语言模型一方面是基于自然语言的人机交互的特征,再就是针对软件开发与演化的预测性内容生成,这两大特征使它成为人机协同软件开发与演化工具。但是所生成的预测性内容是缺失可信性判断,需要人工分析理解和确认,这使得这样一种工具也带来了巨大的挑战。

 

大模型打开了解决问题的新空间、带来了新挑战

大语言模型打开了解决问题的新空间,带来了新挑战。而带来的挑战就是软件开发与演化人员如何基于大模型生成的预测性内容进行开发和演化高质量的软件系统。

大模型模型支持从自然语言需求生成预测性代码,将自然语言的语言描述的需求转换为满足需求的程序代码是不可判定的计算问题,大模型所生成的是不一定满足需求的预测性代码,其实是放弃了可信约束条件生成预测性代码。软件开发和演化的过程可以简单分为从无到有,从有到对,大模型解决了从无到有,但是留下的问题是从有到对的问题。也就是说可信性保障的问题,如何基于大模型的预测性代码得到满足需求的程序。

简单对比一下人工编程和基于大模型的人机协同编程。人工编程是程序员编写代码和文档,同时自身也对代码和文档分析和理解进行了过程,所以程序员编写完代码之后,对代码的理解是相当深刻的。然后在此基础上程序员再完成其他可信保障的活动。基于大模型的人机协同编程,首先是编程人员引导大模型生成预测性代码,然后大模型需要分析理解预测性代码、修改和确认代码,如果这一步缺失,或者说做得不好,其实无法支撑编码这样决策性任务的完成。再是编程人员完成其他相关可信保障的活动。

现在要做到基于大模型的人机协同编程,希望人机协同编程的可信度要和人工编程可信度一样,在这个基础上,人机协同编程的效率要大于等于人工编程的效率。这里打了两个问号,要实现这两个问号,既然大模型生成是预测性代码,需要进行人工分析理解和确认。而人工分析理解和确认意味着编程人员要理解代码,其实在软件工程领域,有一句行话:宁可自己写代码,也不愿意读别人的代码。说明编程人员理解代码的难度通常高于写代码的难度,这也说明软件是人类制造最复杂的制品。比如说让大模型写一个讲稿,其实花5分钟读一下就知道可用不可用。但是如果让大模型生成一段预测性代码,花5分钟是绝对不可能的,除非是高手。还有一个问题是,大模型从无到有生成预测性代码,关键问题是要解决人性所致的程序员松懈、偷懒和犯错,可能不认真分析预测性代码,直接提交,这都是有可能的。

所以说大模型如同专业相机,大模型是傻瓜相机还是专业相机?首先是自然语言交互能力使得大模型成为傻瓜相机,人人都可以使用,这是从使用角度,大模型是傻瓜相机。

但是大模型的预测性内容生成对于软件开发演化来讲是专业相机,也就是说因为预测性的生成内容缺乏可信判断,需要人工分析和理解,修改和确认。从解决问题的角度看,大模型是专业相机。正是因为大模型是专业相机,你就需要有驾驭专业相机的专业能力,所以驾驭大模型需要具备更强专业能力,需要对大模型生成预测性内容进行判断的能力,目前来讲,解决这样需要更强的能力的问题有两个视角:一个是从企业应对视角来讲,专业能力达不到要求要禁止使用大模型。但并不意味着要把专业能力达不到要求都开了,没有初级程序员哪来高级程序员,因为人要判断代码是不是符合要求,判断代码是否符合要求的能力比写代码的能力还要高,而不具备写代码的能力,肯定不具备判断代码是否符合要求的能力。所以从这个角度讲,要保留人工编程流程和初级程序员的岗位。现在很多媒体说初级程序员要下岗,人工变成被大模型替代,其实不是这个概念。

从个人应对的视角,要不断夯实专业基础,全面提升专业能力。其实企业要裁掉没有专业能力提升空间的人。整个软件开发与演化是人类针对所解决问题的创新性思维活动。从自然语言需求到满足需求的程序代码是有可信保障需求的决策性任务。大语言模型打开自然语言到程序代码的空间,因为可以生成预测性内容,可以实现从无到有,但是又缺失可信性判断,对从有到对的过程,带来了可信保障难题与挑战。

而解决问题、应对挑战的途径,一方面从技术角度讲,希望不断地通过各种各样的办法降低可信性判断的复杂性。另外一方面最重要的是全面提升专业能力驾驭大模型。