首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

寻找软件开发的“银弹”

在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,这些应用促进了经济和社会的发展,也提高了工作效率和生活效率。

━━━━

随着计算机能力不断提升以及现实问题日益多元化,人们需要的软件越来越复杂,而现有的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题,在所需时间内编写有用且高效的计算机程序变得异常困难,这就是所谓的软件危机。为应对软件危机,软件工程应运而生,它涉及软件需求分析、软件架构设计、软件编码实现、软件质量保证以及软件演化维护。

曾获1999年图灵奖的弗雷德里克•P•布鲁克斯在其经典著作――《人月神话》中曾针对软件需要解决的问题越来越复杂的现象,给出了“软件开发没有银弹”的预言,这个预言目前仍然是软件开发不可逾越之“墙”。

自20世纪末起,出现了开源软件等基于互联网的软件开发实践,展现出在软件开发质量和效率上的实力和成就,很多开源软件在市场占有率上超越了同类商业软件,对全球软件产业的格局产生了重大影响。

开源软件,从字面上说,是指开放源代码的软件;但从另一层面来说,它并不是简单的源代码开放,而是代码创作者在遵循相关开源协议的基础上,将自己的源代码全部或部分向世界公开,允许用户进行自主学习、报错、修改等活动,以共同提高软件的质量。开源软件在开发模式上表现出无偿贡献、用户创新、充分共享、自由协同、持续演化的新特征,它强调通过激发开发者个体的创造性,对开发者个体智能进行有效地汇聚和融合,以及对软件制品的增量迭代和不断演化,来提高软件的质量和开发效率。有别于传统的“集中式层级结构”方式,开源软件呈现的是多样化分布式组织方式,如Linux内核开源项目形成松散式层级结构的组织方式;Apache Web服务器开源项目则采用基于委员会投票的民主式组织方式,众多开源实践展示了它们在互联网环境下的显著优势。这种软件开发新模式为寻找“软件开发的银弹”提供了一个全新的视角。

━━━━

从本质来说,研究软件开发的方法是为了应对不断提升的软件问题的复杂性,而开源软件的开发模式给出了这样一种新途径,即将复杂问题求解任务交给广大开发者自主选择完成,然后支持开发者通过连续版本控制进行有效集成,满足特定场景的问题求解。这种模式可以归结为通过“人在回路”的方式来应对问题的复杂性。那么何为“人在回路”呢?答案具体表现为:利用“人”的智力应对问题求解的复杂性(人尽其才);通过“人”去选择确定的特例化场景需求降低问题求解的复杂度(各取所需);接收“人”对问题求解需求的不断迭代,并通过持续集成满足不断增长的需求(持续支持)。当然,软件开发的另一个维度是质量保证,“人在回路”的方式下如何确保软件产品的可信性,也是一个挑战性问题。

由北京大学金芝教授牵头承担的国家973计划项目“基于开源生态的网构化软件开发原理和方法”就是希望沿着这样一种思路进行探索,通过建立开发、运维和质量相互渗透的软件全生命周期支撑,寻找应对软件开发问题复杂性增长的新途径。

━━━━

智能互联:互联网环境下

基于群体智能的软件开发

群体智能通常指一个群体中的个体通过交互,在宏观上展现出远超个体能力的智能行为。形象地说,群体智能可以产生1+1>2的行为。实际上,在自然界和人类社会中都可以看到群体智能现象,包括蜂群筑巢、鱼群避敌、市场经济乃至人类文明等。从哲学视角来看,群体智能是一种由量变产生质变的现象;从复杂系统视角来看,群体智能则是一种涌现或自组织现象。

互联网的出现为人类群体智能的发展提供了新的技术支撑,人群的聚集不再受到地域或时间的限制,更大规模的松散人类个体可以通过互联网进行方便灵活的显式或隐式交互。实际上,互联网的发展已经促成群体智能在多个领域的成功实践和应用,比如我们常见的维基百科、reCAPTCHA、Foldit等。维基百科通过大规模用户参与和持续协同,不断提高词条的规模和质量。研究表明,对科学领域的词条,维基百科与大英百科全书具有几乎相同的准确性。reCAPTCHA项目利用用户登录过程中输入的验证码信息,以很低的成本实现对传统印刷品的数字化。在生物学领域,研究人员通过游戏软件Foldit,让5.7万名玩家通过游戏参与到蛋白质折叠的科研活动中。互联网群体智能包含3个基本成分:群体(开放的大规模人类群体)、交互(个体间的直接或间接交互)、融合(个体行为的汇聚或融合)。它标志着互联网在“将计算机互联”和“将物品互联”之上,逐步展现出其“将智能互联”的一面。

软件是复杂的知识/逻辑制品,其规模和复杂性仍在不断增长,能否把群体智能用于软件生产成为值得探索的问题。传统软件开发实践中的开发活动不具有规模可扩展性,对复杂的软件开发任务,简单地增加开发者的数量会导致开发者之间沟通成本的增加。而很多基于互联网的软件开发项目都拥有成千上万的软件开发者,他们协同开发出高质量且持续演化的复杂软件,具有规模可扩展性。目前,基于互联网的软件开发分为3类:开源软件开发、众包软件开发、应用程序商店。开源软件开发将软件源代码对外开放,支持其在互联网上自由传播,以声誉、兴趣、理想为激励,吸引开发者参与到软件开发中。众包软件开发利用互联网,将软件开发的任务或技术问题公开发布,以金钱为激励,吸引个体执行任务、解决问题。应用程序商店则基于互联网、针对特定软件运行平台的软件交易环境,利用市场机制引导软件的生产与销售。

然而,目前互联网软件开发实践还处于群体智能应用的初级阶段。开源软件开发远未达到其所追求的完全分布式的社会化软件开发,大多数成功的开源软件项目依赖于小规模的精英群体所设计的顶层架构,并对版本发布进行严格规划和控制,关注点也往往集中于对源码的管理和汇聚上,对需求、设计等制品的支持不足。众包软件开发竞争多、协同少,只有完成质量好的开发者或开发者团队能够获得金钱回报,其他参与者没有回报,人力资源浪费严重,众包任务的完成时间呈“长尾分布”,未完成任务受到的关注度持续下降,使得很多任务不会被完成或需要很长时间才能完成。应用程序商店仅适合较小规模的软件,不适用于大规模复杂软件的开发。

针对这一现状,项目团队将基于互联网的群体智能定位为由信息的“自由探索” “自动融合”和“主动反馈”3个活动形成的回路,即每个个体自由提供其认为与当前问题的解决方案相关的信息片段,此为自由探索;软件算法对来自不同个体的信息片段进行自动的融合,此为自动融合;基于当前的融合结果,软件算法对个体进行个性化和主动式的反馈,激发他们提供新的方案,此为主动反馈。

以上3个回路是基于演化的问题求解、大规模群体协同的演化以及人机协同的大规模群体协同形成,在此基础上项目团队设计了一个基于互联网群体智能的软件开发框架。在框架中,特定的软件开发问题被发布给一个大规模的软件开发者群体,群体中的个体自由提交对该问题的解决方案或解决方案片段,通过信息自动融合将片段信息融合为较具整体性的信息结构。如果融合结果形成具有足够质量的解,则输出该融合结果,问题求解过程结束;否则,根据当前融合结果对个体提供个性化和主动式的反馈。个体在收到反馈后再次更新自己提交的信息片段,然后进行新一轮的信息自动融合与主动反馈。

在此过程中,项目团队面临诸多核心技术问题,包括如何结构化或形式化地表示个体提交的信息,使软件算法能够对信息片段进行自动融合;如何对大量个体提交的信息片段进行有效和高效的融合,形成更有序、更有整体性的融合结果;如何基于信息融合的结果对不同个体进行个性化的信息反馈,以激发其提供更有价值的信息。项目团队采用通用的图(graph)结构作为不同类型软件开发制品的基本表示形式,对基于图的信息融合与反馈进行了深入研究,提出了基于熵和演化算法的增量式图融合技术以及基于协同式过滤的图信息反馈技术,并在群体需求获取、群体软件建模、程序融合以及群体编程等问题上对上述框架与技术进行了初步验证性实践。

━━━━

成长型软件:汇聚社区群智

在基于互联网群体智能的软件开发活动中,软件的持续演化是智能汇聚的重要实现形式,也是群智生态社区及其软件制品共同成长的必经之路。群体软件开发中的智能汇聚包括制品驱动和演化驱动两个形式,前者是指多个开发者在某种激励机制下显式或隐式地合作,共同完成某个软件制品;后者是指个体通过复用和改进既有的(通常是他人创造的)软件制品,从而把自己的智能叠加在既有制品所包含的智能之上。这里的软件复用和改进过程中通常也会考虑软件的使用者对原有制品应用情况的反馈和建议,从而同时也实现了对社区中使用者的智慧的汇聚。基于互联网群体智能的软件开发需要充分利用这两种智能汇聚形式。此外,几乎所有已成功的基于互联网的开源软件生态系统,如Linux、Mozilla、Apache等的实践都表明,软件制品不断演化生长的过程就是社区群智不断汇聚的过程,也是社区不断成长的过程。

针对于此,项目团队探索出一种可成长的软件形态,其成长性体现在三元融合的架构模型、自主适应的运行机理、持续演化的生命周期。

从架构模型上看,可成长软件考虑用户(人)、环境(物)和系统(机)三者的互动,以及三元融合下应用系统的抽象。可成长软件架构中,有“可表征的用户”,也就是用户应用价值导向的运行时需求模型;有“可感知的环境”,基于先验元级模型和规约实现对动态和多变环境的建模和理解;还有“可演化的系统”,实现具有在线适应和演化能力的系统。

从运行机理上看,可成长软件的运行态表现为一个迭代式的闭环适应圈,包括“感知环境-适应决策-在线重构-正常运行”4个基本环节。在感知方面,可成长软件能主动感知环境、资源和用户需求的变化,以知晓“何时演化”;在决策方面,可成长软件能进行应用目标和场景数据导向的适应决策,以确定“演化什么”;在实施方面,可成长软件能实现高效、安全的运行时系统调整和更新,以回答“如何演化”。由此,这三者形成自主适应的可成长软件的运行机理。

从生命周期上看,可成长软件处于一个双维度的持续演化过程之中。一方面基于环境的反馈进行(在弹性范围内的)自主适应优化,另一方面基于开发者和使用者的驱动进行(在弹性范围外的)过程演进优化。从生态方面看,可成长软件需要具备一个开放的网络软件开发和运行生态环境;从动力方面看,可成长软件需要做到开发者、使用者反馈和主动感知并举;从演进方面看,可成长软件需要能无缝、透明地对软件持续改进和优化。这三者支持下可形成持续演化的可成长软件的生命周期。

━━━━

主客观融合:软件

全生命周期可信保障

对基于开源群智开发的成长式软件系统而言,其可信性、安全性、可生存性等质量需求日益突出。一方面,在开源生态下,软件实体和构件、代码片段、文档等的不可信将被放大至开源生态软件系统的不可信。另一方面,这种软件系统的可信性,不仅需要考虑软件自身的代码级质量,同时还需要关注软件构造与演进的历史的可信性,以及软件开发人员和软件使用过程可信性。

目前,学术界与工业界已经从“主要关注客观证据、软件实体的正确性和质量”转变到“关注主客观融合、环境感知自适应演进式的质量保证”。主要表现在,从仅以功能正确性和软件执行效率为重点,到更为强调用户体验为中心的质量关注,包括能耗、隐私、可信、易用性、社交性等非传统质量属性的转变;从软件自身正确性与可靠性为重点,到更为强调主客观融合的可信性的转变;从面向单个构件、细粒度代码的可信,到更为强调软件系统的整体可信和动态变化环境下的适应性的转变。

针对观念和理念的转变,项目团队提出了主客观融合的网构化软件全生命周期可信性保证的研究策略。在客观方面,对软件制品进行可信性检测、评估与改进。采集软件开发、运维和使用的数据,进行分析与挖掘,利用网构化软件的分析与测试技术、运行时监控及风险分析技术、基于用户反馈的使用质量评估技术,有效地发现隐含的软件缺陷,并在此基础上研究提出缺陷自动修改技术,进行软件质量改进。

在主观方面,对软件的开发个体和开源社区的可信度进行评估与保障。“人”的因素是软件可信保障必不可缺的主观要素,即软件的可信性保障既需要考虑参与者的可信,又可以借助参与者的活动来评估和度量软件制品的可信性。从人的个体角度,设计开发个体的属性维度,根据开发行为、社交行为和开发成果等数据,进行自动画像,为开发任务推荐可信的开发个体。从人的群体角度,设计开源社区的健康状态指标,根据社区的仓库数据、缺陷数据与社交数据,采用数据分析与挖掘技术进行健康度的评估,发现影响社区健康度的要素。

软件可信性保证技术的主观和客观两方面是融合的。客观的软件制品分析与测试结果是开发个体和社区的可信评估的重要依据,同时软件使用质量必须分析与挖掘主观的用户反馈,软件众包测试依赖于大众的协同测试。

基于以上主客观融合的策略,项目团队利用开源生态系统的形成及演化规律,在网构化软件模型和理论的指导下,以可信度为主要目标,针对开源生态下的网构化软件,建立了主客观融合的网构化软件全生命周期可信性保证技术体系。

项目团队提出的质量保障是一个系统工程,需要从软件制品、开发个体、开源社区3个维度进行。

在可信的软件制品层面,用开源生态下的软件代码的分析与测试、基于运行日志的软件监控、基于用户反馈的使用质量评估、缺陷自动定位与修复等关键技术,从开发、运维和使用3个阶段对软件最终成果——代码进行可信评估,尽可能地发现隐含的缺陷,并进行自动修复,保证软件是可信的。

在可信的开发个体层面,利用软件工程师的能力兴趣与诚信度,同时通过智能开发推荐系统采集软件工程师的开发行为、社交行为和开发成果等数据并进行分析与挖掘,建立人员画像;然后根据画像,进行开发任务的智能推荐,保证开发个体是可信的。

在可信的开源社区层面,采取长期贡献者的社区环境因素挖掘、商业公司参与的影响分析等技术手段,采集开源社区的仓库数据、缺陷数据与社交数据,进行健康度分析与评估,保障社区健康可信发展。

致谢:感谢国家973计划“基于开源生态的网构化软件开发原理和方法”(项目编号:2015CB352200)的支持。

本文刊登于IEEE Spectrum中文版《科技纵览》2019年5月刊。

专家简介

金芝:北京大学教授。

张伟:北京大学副教授。

马晓星:南京大学教授。

陈雨亭:上海交通大学教授。

>>>本文为原创,转载请回复。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190827A0FHGC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券