随着OpenAI推出的全新对话式通用人工智能工具——ChatGPT火爆出圈,人工智能再次受到工业界、学术界的广泛关注,并被认为向通用人工智能迈出了坚实的一步。
ChatGPT在众多行业和领域有着广泛的应用潜力,甚至会颠覆很多领域和行业,特别是在软件开发领域中,它必然会引起软件开发模式、方式和实践发生巨大的变化,为此,笔者经过调研、实验和思考之后,提出了“软件工程3.0”。
用软件版本号的方式,如用1.0、2.0、3.0分别定义第一代、第二代、第三代软件工程,符合软件工程的规则,而且简洁明了。为了定义“软件工程3.0”,让我们先定义“软件工程1.0”和“软件工程2.0”。
01
软件工程1.0
“软件工程1.0”,即第一代软件工程,自然是受建筑工程、水利工程等影响的传统软件工程,它的诞生可以追溯到1968年。当20世纪五六十年代软件出现危机时,小弗雷德里克·布鲁克斯(Frederick P. Brooks,Jr.)在《人月神话》一书中描述了如下场景:软件开发被喻为众多史前巨兽在焦油坑中痛苦挣扎却无力摆脱,它们挣扎得越猛烈,焦油纠缠得越紧,如图1所示。
图1 《人月神话》原著封面
“软件危机”迫使人们去寻找产生危机的内在原因,进而找出消除危机的解决方案。面对“软件危机”,人们调查研究了软件开发的实际情况,逐步认识到工程化的方法对软件系统的开发和维护的必要性。
为了克服这一危机,大家走到一起,共同探讨,以获得问题的解决途径。于是,在1968年NATO(North Atlantic Treaty Organization,北大西洋公约组织)的计算机科学家在联邦德国召开国际会议讨论软件危机问题,正式提出了“软件工程”(Software Engineering)这一术语,从此一门新的工程学科诞生了,并得以不断发展,逐渐成熟起来。
传统软件工程主要是向土木工程和工业工程学习,吸收其百年实践积累下来的方法和经验,以及沉淀下来的思想。
软件工程1.0体现了以下特征。
(1)产品化:只是交付符合质量标准的组件、构件和系统,没有认识到软件的柔性和数字化特性,把软件当作传统工业的产品,由此产生“软件工厂”这样的思想。
(2)结构化:受传统建筑工程的影响,重视框架和结构的设计,表现为以架构设计为中心进行结构化分析、结构化设计、结构化编程等。
(3)过程决定结果:流程质量决定产品质量,一环扣一环,相信良好的过程产生良好的产品,关注过程胜过关注人,非常关注过程评估和过程改进,CMMI(Capability Maturity Model Integration,能力成熟度模型集成)就是其典型代表。
(4)重视质量管理:引入传统的质量管理体系,包括以顾客为中心的全面质量管理和缺陷预防。
(5)阶段性明确:需求评审通过才能开始设计;设计评审通过才能开始实施(编程),编程结束再进行测试等,瀑布模型是其典型代表模型。
(6)责任明确:角色定义清晰,分工细致。
(7)文档规范化:强调规范的文档,定义了大量的文档模板。
(8)计划性强:具有完整的计划并严格控制变更。
(9)注重项目管理:围绕项目开展管理工作,包括风险预防、里程碑控制、关键路径法等。
02
软件工程2.0
在2008年笔者写的《软件工程导论》一书中,相对于传统软件工程,定义了现代软件工程,那时,笔者没能预见到人工智能今天的巨大力量。
15年后,笔者将受互联网、开源软件运动、敏捷/DevOps开发模式的影响,最终形成的建立在SaaS(Software as a Service,软件即服务)、云之上的软件工程定义为“软件工程2.0”。
没有互联网,就没有云和SaaS,我们就不能将软件部署在自己的数据中心,那么持续交付(Continuous Delivery,CD)就没有意义,因为我们无法做到将包装盒形式的软件产品持续交付到客户手中,敏捷、DevOps也就难以实施,虽然可以在内部实现持续集成(Continuous Integration,CI),但其价值会大大降低。
之后的开源软件运动让我们首先认识到“软件过程”和“软件管理”并非非常重要,至少不是第一要素,因为第一要素还是人;其次是软件架构,简单且能解耦,如采用SOA(Service-Oriented Architecture,面向服务的架构)、微服务架构来解耦,更具可扩展性;再者是代码的可读性、可测试性,使代码具有可维护性,而流程和管理虽然具有价值,但作用不大。
随着市场变化越来越快,不确定性增强、市场竞争更加激烈,客户或用户始终希望我们能够按时交付高质量的产品,同时还希望软件有灵活性,能够具有随需应变的能力,也能够通过及时、必要的修改来满足业务的新需求。
除了考虑开源软件运动、市场因素,软件还是一种知识型产品,软件开发活动是智力活动,需要很高的创造性,并依赖每个开发人员的创造力、主动性等。所有这些都引导人们对软件工程进行新的思考并不断认识软件工程,从而在2001年17位软件开发轻量型流派掌门人联合签署了《敏捷软件开发宣言》,如图2所示。
图2 敏捷联盟官网的《敏捷软件开发宣言》截图
之后逐渐形成了敏捷/DevOps开发模式、精益软件开发模式等,即软件工程进入2.0时代。
软件工程2.0的特征可以简单概括为下列几点。
(1)SaaS:软件更多的是以一种服务存在。
(2)强调价值交付:只做对用户有价值的事情,加速价值流的流动。
(3)以人为本:个体与协作胜于流程和工具,充分发挥个人和团队的创造性与潜力;拥抱变化,敏捷开发或轻量级过程,加速迭代,以不变应万变。
(4)自我管理的团队:像一家初创公司一样运营,具有主动性并能够承担风险,具有自治能力,能自主建立目标和制订计划,不断反思,持续改进。
(5)持续性:阶段性不明确,持续构建、持续集成、持续测试、持续交付,以时间换空间,消除市场风险。
(6)开发、测试和运维的融合:强调测试与开发融合,开发与运维融合,推崇全栈工程师等。
(7)真正把用户放在第一位:用户、产品经理尽可能参与团队开发过程,注重用户体验,千人千面。
(8)知识管理:将软件工程纳入知识管理的范畴,强调将项目的计划、估算等工作授权给从事具体工作的开发人员,如任务安排不再由管理者下达任务,而由开发人员自主选择适合自己的任务。
(9)更有乐趣:“史诗故事”、用户故事、站会等让软件开发工作更有趣、更健康。
03
软件工程3.0
在技术突破和创新方法的推动下,软件工程发展得越来越快,而最近的突破就是GPT-4等人工智能(AI)语言大模型的出现。GPT-4的诞生,大家都很震惊,尤其惊讶于从GPT-3到GPT-4的进化速度。
GPT-4是一种基于RLHF(Reinforcement Learning from Human Feedback,人类反馈的强化学习)和多模态的语言大模型,比其前身GPT-3.5有显著的改进。GPT-4具有强大的识图能力,文字输入限制提升至2.5万字,问题回答的准确性显著提高。
因此,GPT-4能够执行一系列复杂的任务,如代码生成、错误检测、软件设计等。正如,谷歌工程主管在文章《程序员的职业生涯将在3年内被AIGC终结》中的观点:“ChatGPT和GitHub Copilot预示着编程终结的开始”“这个领域将发生根本性的变化”“当程序员开始被淘汰时,只有两个角色可以保留:产品经理和代码评审人员”,这篇文章是在GPT-4发布前写的,而真正的GPT-4要强大很多,对软件开发的影响会更为显著。
考虑到软件工程的发展速度,在不久的将来,甚至从今天开始,AI就开始逐渐接手一些软件开发的工作。
随着将GPT-4+(指GPT-4及其未来升级的版本)融入软件开发生命周期中,开发人员的使命将会发生变化,因为GPT-4+重新定义了开发人员构建、维护和改进软件应用程序的方式。之后的软件开发会依赖这种全新的语言交流方式(类似于ChatGPT),让这类工具理解开发人员交代的任务,自主完成软件开发,如理解需求、自动生成UI、自动生成产品代码、自动生成测试脚本等。
此后,开发团队的主要任务不再是写代码、执行测试,而是训练模型、参数调优、围绕业务主题提问或给出提示。因此,我们说GPT-4将开启“软件工程3.0”新时代,2023年是软件工程3.0的元年,软件工程3个时代的划分如图3所示。
图3 软件工程3个时代的划分
先看看GPT-4自己是如何说的,如图4所示。但笔者经过简单的实验,认为它能做的事比它说的要多。
下面展示目前GPT-4在软件开发领域所能做的一些工作,顺着这条思路我们想象一下软件工程3.0是怎样的一番景象:一些大厂之前有好几万名开发人员,未来可能只有几千人;借助其强大的私有云平台,软件开发效能可以真正实现十倍增长,降本增效不再是公司的核心问题(因为已经得到了彻底解决)。
图4 GPT-4在软件工程上的能力
1)软件需求获取、分析与定义
GPT-4在需求获取、需求挖掘、需求分析和需求定义的各个环节,都能扮演比较重要的角色,可以基于用户评论数据挖掘软件需求和应用场景,帮助我们完成需求建模或做出决策,最终生成需求文档,如图5所示。虽然GPT-4不能完全解决需求工程中所有的问题,但能帮助我们节省60%以上的工作量。
图5 GPT-4在需求分析上的能力
GPT-4可以基于简单的描述帮我们完成基本功能分析,如图6所示。
图6 GPT-4基于描述进行基本功能分析
进一步,GPT-4也可以基于需求生成验收标准,如图7所示。
图7 GPT-4基于需求生成验收标准
还能根据需求验收标准生成BDD(Behavior-Driven Development,行为驱动开发)标准的GWT(Given-When-Then)格式的需求,如图8所示。
图8 基于需求验收标准生成BDD标准的GWT格式的需求
2)软件设计与体系结构
GPT-4通过提供建议、识别设计模式、分析和优化软件体系结构,以及分享最佳实践和框架方面的知识,为软件开发人员(如架构师)提供有价值的帮助,从而帮助他们做出明智的决策、选择最佳的体系结构并制定健壮的解决方案,即创建可伸缩、可维护和高效的软件解决方案,以满足软件的特定需求。此外,GPT-4可以促进不同设计选项的评估和比较,确保开发人员选择最合适的演化路径。具体地说,GPT-4在软件架构设计上可以通过以下几种方式帮助软件开发人员。
(1)提供建议:根据需求和约束等自然语言输入对软件架构提供建议,这些建议可以帮助开发人员针对待开发软件架构做出明智的决策。
(2)识别设计模式:根据自然语言输入识别软件架构中的常见设计模式,帮助开发人员识别潜在的问题并改进软件的整体设计。
(3)分析和优化软件架构:通过分析软件架构并根据自然语言输入提出优化建议,帮助开发人员改进其软件的性能、可伸缩性和可维护性等。
(4)知识共享:提供有关软件体系结构的最佳实践、模式和框架的信息,帮助开发人员跟上软件体系结构的最新趋势,提高在该领域的整体水平。
随着多模态技术的发展,大模型GPT-4可以直接读入设计草图,或帮助我们理解图形用户界面、解答关于UI设计的问题,并提供设计建议,帮助我们做出更好的设计。
3)代码生成和优化
在编程上,大模型更擅长代码生成、代码补全、代码评审、代码优化等工作。由于开源代码的数据量大、质量高(毕竟要符合代码语法和代码规范),因此模型生成内容的质量自然很高,符合“高质量输入、高质量输出”的标准。
GPT-4能根据自然语言输入的需求及其上下文生成代码,而且可以用不同的编程语言生成相应的代码段、API(Application Programming Interface,应用程序接口),甚至整个软件模块。它可以帮助开发人员轻松创建复杂的应用程序,甚至还可以帮助他们按敏捷开发模式推崇的TDD(Test-Driven Development,测试驱动开发)方式完成代码的实现,并支持快速原型化和概念验证开发。这样可以极大地减少人工编码所花费的时间和精力。
4)测试用例和测试代码等生成
作为一种人工智能语言模型,GPT可以基于自然语言输入生成测试用例,这些测试用例涵盖了基于所接收到的自然语言输入的广泛场景,甚至可以帮助识别需要测试的边缘情况和潜在的边界条件,以确保软件能充分地满足需求。虽然它不能保证能生成所有可能的测试用例,但大量的实验表明这方面的效果不错,可以详见在“软件质量报道”公众号上发表的文章《又一次被震惊:从生成和细化需求到应用各种方法设计测试用例》,文章中展示了GPT-4可以基于需求生成测试用例,并通过提示让GPT-4不断补充或完善测试用例,而且还可以让GPT-4基于不同的设计方法(如等价类划分、边界值分析、决策表、因果图、正交试验法等)生成测试用例。例如,利用正交试验法,列出因子、水平数,选择一个L9(32)正交表,生成8条测试用例。虽然GPT-4不能画因果图,但能正确地运用这种方法生成有效的测试用例,如下所示。
因果图方法是一种测试设计技术,通过分析输入条件和输出结果之间的因果关系来设计测试用例。以下是使用因果图方法为文章发布功能设计的测试用例。
1. 确定输入条件(因子):
1)标题:有效/无效(超过长度限制)
2)摘要:有效/无效(超过长度限制)
3)正文:有效/无效(超过长度限制)
4)标签:有效/无效(超过长度限制)
5)封面图片:有效/无效(非图片格式或超过大小限制)
2. 确定输出结果:
1)发布成功提示信息
2)发布失败提示信息
3)生成的文章详情
3. 分析输入条件与输出结果之间的因果关系,并设计测试用例如下。
测试用例1:正确的标题和正文
● 输入:有效标题,有效正文
● 输出:发布成功提示信息,生成的文章详情
测试用例2:标题超过长度限制
● 输入:无效标题(超过长度限制),有效正文
● 输出:发布失败提示信息
测试用例3:正文超过长度限制
● 输入:有效标题,无效正文(超过长度限制)
● 输出:发布失败提示信息
测试用例4:有效摘要
● 输入:有效标题,有效正文,有效摘要
● 输出:发布成功提示信息,生成的文章详情包含摘要
测试用例5:摘要超过长度限制
● 输入:有效标题,有效正文,无效摘要(超过长度限制)
● 输出:发布失败提示信息
测试用例6:有效标签
● 输入:有效标题,有效正文,有效标签
● 输出:发布成功提示信息,生成的文章详情包含标签
测试用例7:标签超过长度限制
● 输入:有效标题,有效正文,无效标签(超过长度限制)
● 输出:发布失败提示信息
测试用例8:有效封面图片
● 输入:有效标题,有效正文,有效封面图片
● 输出:发布成功提示信息,生成的文章详情包含封面图片
测试用例9:无效封面图片
● 输入:有效标题,有效正文,无效封面图片(非图片格式或超过大小限制)
● 输出:发布失败提示信息
通过基于因果图方法设计的这些测试用例,我们可以全面地测试文章发布功能。如果您还有其他需求,请随时告诉我。
生成测试脚本也是GPT-4的强项,在SauceLabs的文章“ChatGPT for Automated Testing: From Conversation to Code”(《自动化测试使用ChatGPT:从对话到代码》)所介绍的实验中,可以让GPT-4生成谷歌站点测试的脚本。
虽然提示中没有明确说明要在网站上测试什么,但ChatGPT仍然生成了一个脚本来测试谷歌网站的主要功能之一——“搜索功能”,甚至正确识别出谷歌搜索栏的名称“q”。进一步,这个实验指示ChatGPT可以为元素定位器使用页面对象模型和类变量,还可以生成与某工具平台(如Sauce Labs)兼容的测试脚本。
最后,ChatGPT可以消除测试脚本中的硬编码(如URL、用户名“username”和密码“password”),从场景特性文件中获取变量,即参数化脚本(数据驱动脚本),使脚本更容易被维护,如图9所示。
将测试脚本从一个平台迁移到另一个平台也是大模型的强项,如同翻译,例如GPT-4比较轻松地完成测试脚本从Cypress 迁移到 Playwright。
图9 ChatGPT写出参数化(数据驱动)的测试脚本
5)错误检测和解决
GPT-4在代码分析和理解方面的能力使其成为检测和解决软件应用程序错误非常有价值的工具。通过仔细检查代码片段和理解上下文,GPT-4可以识别错误并给出最佳解决方案,甚至可以为现有问题生成补丁。这种功能极大地加快了调试过程,并确保软件产品更加可靠和安全。此外,GPT-4可以与持续集成和持续部署(CI/CD)流水线集成,以增强自动化测试并促进持续地交付软件,如图10所示。
图10 CI/CD集成GPT-4能力的截图
6)协作和知识共享
在当今快节奏和相互关联的开发环境中,协作和知识共享比以往任何时候都更加重要。GPT-4通过在团队讨论、头脑风暴会议和代码审查期间提供实时帮助,能形成会议纪要和总结,能理清楚逻辑和发现问题,并提供有价值的见解和建议的替代方法,甚至能从其庞大的知识库中提供相关示例。这种人工智能驱动的协作提高了团队生产力,培养了团队持续学习的文化,并为创新铺平了道路。
04
总结
GPT-4+支持更智能、更高效和协作的开发方法,给软件工程领域带来了革命性的变化。
在进入软件工程3.0后,软件开发的范式也发生了很大的变化。
软件开发的新范式是模型驱动开发、模型驱动运维,在DevOps两环前面,加一个环形成三环联动,如图11所示,其中机器学习(Machine Learning,ML)中的要素有模型(Model)、数据(Data),而研发经过计划(Plan)、创建(Create)、验证(Verify)、打包(Package)、发布(Release)等环节进入运维,运维有两个关键环节:配置(Configure)和监控(Monitor)。
图11 软件工程3.0开发范式示意图
由此我们可以看到,在软件工程3.0时代,软件即模型(Software as a Model,SaaM),这个模型不同于过去软件工程1.0 或软件工程2.0时代所谈到的抽象模型[(如UML中的模型、OMG(Object Management Group,对象管理组织)]所提的模型驱动架构(Model Driven Architecture,MDA)中的模型,而是深度神经网络模型、大型语言模型(Large Language Model,LLM)或其他人工通用智能(Artificial General Intelligence,AGI)模型,可以直接给人类提供服务的模型。大型企业一般会选择训练、精调自己领域的AI大模型,中小企业一般会调用专业公司提供的大模型服务接口。
在基于MaaS的软件工程3.0时代,软件以这类AI大模型的形态为用户提供各种各样的服务,而且未来会成为一种常态。
在软件工程3.0时代,新一代的软件开发平台开始能够理解需求、设计、代码等,软件开发从过去的信息化时代进入真正的数字化时代,这也是一种有重要意义的进步;人机自然对话成为可能,可以告诉新一代软件开发平台我们想要生成的内容,即人工智能生成内容(Artificial Intelligence Generated Content,AIGC),如软件需求定义文档、需求或用户故事的验收标准、代码、测试用例、测试脚本等,软件开发进入AIGC时代,软件开发过程就是人与计算机自然交互的过程。
在软件工程3.0时代,业务数据和开发过程数据的质量非常重要,可以基于这些数据进行精调,以优化大模型。软件工程3.0在新范式下,有如下两条实践路径。
(1)垂直路径:针对特定领域进行模型的训练或精调,并给出具体的提示文本(序列)集,以帮助企业快速发布符合市场的产品、获取用户、收集反馈并持续改进。
(2)水平路径:将生成式AI功能引入通用的开发云平台中,实现全新的或重构已有的开发工作流、开发IDE(Integrated Development Environment,集成开发环境)、测试框架与工具、运维工具。
开发人员不仅会致力于提示工程(Prompt Engineering)、服务于大模型和大数据平台,包括模型创建、训练、调优、使用等,而且他们的工作方式也将发生变化,对他们的要求更多体现在对业务的深度理解、系统性思维、逻辑思维等方面。
虽然软件工程2.0已经开始面向CI/CD,但还存在许多障碍,而在软件工程3.0时代,得益于设计、代码、测试脚本等的生成,可以真正实现持续交付,即及时响应客户需求,交付客户所需的功能特性。
表2-1是对软件工程1.0、软件工程2.0和软件工程3.0的总结。
表2-1 三代软件工程的比较
最后,通过“软件工程3.0宣言”作为对软件工程的未来展望。
软件工程3.0宣言:
人机交互智能 胜于 开发人员个体能力
“业务和开发过程”数据 胜于 流程和工具
可产生代码的模型 胜于 程序代码
提出好的问题 胜于 解决问题
笔者相信,通过GPT-4+的力量,能够解决很多安全、法律、伦理等方面的问题和应对面临的挑战,软件工程的未来特别值得期待。