引言
近十多年来,复杂网络理论研究逐渐得到深入和推广,其应用非常广泛,涉及社会学、生物、计算机等领域。在软件工程领域,软件系统尤其是大型软件系统规模的持续增长引发系统复杂性的质变,许多大型软件系统在内部结构、外部交互、演化方式等维度上表现出新特性。从结构方面,由于规模变大,从局部度量系统内部结构复杂性变得越来越困难,网络思想有助于从全局的角度解决这一问题。根据软件系统内部实体(如包,类、方法、组件等)间的依赖关系,将软件系统抽象为一个网络,即软件网络。从参与者角度而言,软件系统的开发不再是单个精英团队或专家所能完成,而是依靠大众开发,利用群体智慧才能达到目标,是一个典型的“社会-技术”交融系统。技术层面分析主要是对已有软件采用逆向工程方法抽象其组织结构,构建软件网络;社会层面分析主要是根据社区群体交互采用社会网络分析方法,挖掘群体行为。复杂网络与软件工程的交叉研究,已引起了众多学者的关注与认可,如李兵等基于软件网络的拓扑结构度量开源软件系统的复杂性,提高软件设计质量;Bhattachary等根据软件网络中节点的重要性进行缺陷预测,为测试人员提供检测优先顺序;鉴于软件拓扑结构的多粒度性,潘伟丰等分别从软件包、类和方法3个粒度研究了开源软件系统的演化特性。
软件网络的研究结合了复杂网络和软件工程理论,它以软件系统的结构特征为切入点,将复杂网络的理论应用到软件工程领域。持续演化是计算机软件的固有特性,了解和发现软件演化规律,有助于提高软件产品质量,降低软件开发和维护成本。针对软件演化问题,Lehman提出8个典型的定律,涉及软件的规模、质量、复杂度、生产率与开发过程等。目前,随着软件的网络化趋势越来越明显,软件与网络的关系更加密不可分,用网络的观点来分析软件演化,为软件工程实践提供了新的视角。然而,软件开发是一个社会性(“人”)和技术性(“软件”)汇聚的过程,很多已有研究只是从技术层面出发,探索了软件系统技术维度的复杂性与应用。在软件生命周期中,从需求获取、到系统的设计与开发,以及后期维护等阶段都离不开人的参与,即软件系统的社会属性。软件的结构决定功能,而Conway定律指出系统的最终设计结构等同于设计系统的组织成员之间的交互结构。因此,一个软件系统既是一个技术依赖的制品,也涉及一个社会交互的群体,其网络模型可抽象为一个社会-技术网络。
软件系统在不断适应环境和需求变化的过程中持续演化,软件演化作为一种技术,主要关心对软件进行修改的方法;作为一种现象,主要关心谁驱动的演化以及演化效果如何。基于社会-技术网络模型,本文尝试从软件演化分析角度探讨社会-技术网络中的协同演化问题,弥补已有研究工作只从单一网络层面审视软件的演化过程。本文采用类依赖关系描述软件网络,任务参与关系描述开发者网络,基于复杂网络度量研究与验证开源软件系统版本演化过程中存在的规律。本文的主要工作为:构建开源软件系统的社会-技术网络模型,统计开源软件系统中软件网络与开发者网络的网络规模、平均度、最短路径、聚类系数、社区结构网络度量指标等;依次对比分析两类网络在10个软件版本中网络指标的演化趋势,发掘它们演化规律的一致性与差异。
1 相关工作
Valverde等首次将复杂网络方法引入软件结构分析中,将软件系统的类图用无向网络来表示,分析软件网络中的复杂网络特性(如“小世界”和“无标度”),认为软件开发中局部优化过程可能是导致软件网络呈现这些特性的原因。Valverde等还考虑了类之间的有向性,构建有向网络对系统结构进行研究,发现除了以上特性外,软件网络同时具有层次性和模块性。随后,一些研究者从不同方面(开发语言、项目规模、分析粒度等)再次验证了软件网络的诸多特性并成功应用于工程实践。在软件生命周期中,软件处在一个不断变化的环境(新需求、新应用环境、性能改进等)中,为适应环境软件系统必须不断演化。Jenkins等对软件包之间的关系进行建模,分析一系列版本中软件架构图的结构稳定性。Wang等获取了Linux kernel模块233个版本的类调用网络,研究软件网络的演化特性。李兵等将复杂网络与演化算法相结合,提出一种新的软件网络演化模型,发现该方法能够很好地刻画实际软件系统复杂网络特性的涌现过程。潘伟丰等更是从包、类和方法3个粒度分析了软件网络中节点度、聚类系数、最短路径等指标的演化特性。Businge等研究了Eclipse系统及相关插件的演化规律,发现结果基本满足Lehman的8项目演化定律。
软件开发团队的演化对软件质量也会带来很大影响,研究开发者网络的演化有助于更好地理解团队成员在参与开发过程中的改变。Ngamkajornwiwat等使用社会网络分析方法研究了KOffice项目开发者社区的演化。Hong等讨论分析了开发者合作网络中幂律分布、模块性和社区大小等属性的演化。Datta等在IBM提供的Jazz平台上,将开发者合作网络的平均最短路径、聚集系数、巨型组件大小和平均度等指标与科学家合作网络进行时间序列的演化对比。Kumar等研究了贡献者数、社区大小、聚类系数等6个指标的演化。此外,Cataldo等、Lim等、Sharma等应用社会网络分析方法分别分析了分布式项目、合作网络与涉众投入关系、项目测试阶段团队的演化。
以上研究工作存在一个主要的不足:局限于单个网络层面分析软件系统中的演化问题,忽略了软件系统的社会-技术一致性,以及开发者合作网络与软件网络之间的相互影响。软件是由人开发的,现实中,由于人员的动态调整,尤其是核心成员的变动,可能使得原有的设计方案受到影响,最后导致软件结构发生变化。针对此类情况,仅从软件网络或开发者网络的演化分析并不能全面反应实际软件系统的演化问题。
2 研究方法
本文的研究主要分为3部分,首先利用我们团队开发的聚焦爬虫工具从Sourcforge.net网站爬取开源项目Vuze的邮件列表信息,并结合使用TortoiseSVN工具导出该项目的版本日志信息;根据网上提供的项目版本信息,使用Dependencyfinder工具解析源代码构建软件网络,再根据所获取的项目历史信息构建开发者网络;基于所得的软件网络与开发者网络,进行协同演化分析。
1) 数据获取。我们的工作需要具备获取项目源代码和修改日志相关信息的权限,所以选取开源软件为实
验对象。开源软件Vuze(原名Azureus)是一款知名的采用BitTorrent协议的P2P文件共享客户端软件,可用于查找/下载种子文件。该软件项目的开发信息都公开部署在开源平台Sourceforge.net上,任何感兴趣的开发者都可以为项目提供个人的贡献。通常一个成功的开源软件在其生命周期中都会有一系列版本,本文选取从版本4.3.1.0开始的10个连续版本作为演化分析对象,为便于描述,我们将版本V4310标记为1,依此类推版本V4502标记为10。
针对每个目标版本,我们先编译源代码并将编译后的压缩文件.zip导入dependencyFinder中,得到.xml解析文件;然后利用自行开发的工具分析.xml解析文件,获取类之间的依赖关系并保存为.net网络格式;最后利用网络可视化工具Gephi即可呈现对应的软件网络。另外,我们根据对应版本的提交时间,有选择地爬取项目的邮件列表信息与提交日志。我们先对开发者信息进行去重,例如Paul Gardner与P.Gardner实际上是指同一个开发者;以往在对邮件列表信息处理时,会发现同一个开发者使用多个邮箱进行交互的情况,而本次处理过程中并未发现此类情况。最后我们把在同一个线程出现和修改了同一个类文件的开发者间视为有一条合作连边,构建无向非加权开发者网络。
2) 网络模型。软件网络模型:根据选取的粒度不同,常用的软件网络有包级软件网络、类级软件网络和方法级软件网络。考虑到包级粒度过于粗糙而方法级粒度一定程度上太细会加重数据处理负担,本文所使用的网络是基于类之间依赖关系的软件网络(Software Dependency Network,简称SDN),定义为:Gc=(Vc,Ec),其中Vc为节点集,即为开源软件中所有的类和接口;Ec为节点对之间的边集,即为对象之间的关联关系。在CDN中,4种情况下类A与类B之间被视为存在关联关系:类A与类B之间有继承关系;类A与接口B之间有实现关系;类A中有类B的变量;类A中的方法调用了类B对象。在软件实现中,类之间的依赖关系是有向的,而考虑到开发者合作的相互性,我们的软件网络为无向非加权网络,即类A与类B之间只有存在以上4种关系中的至少一种便有eab=1,否则eab=0。关于软件网络的详细介绍,推荐感兴趣的读者参考我们之前的工作。
开发者网络模型:开源软件社区中的开发者大部分是来自世界各地的志愿者,他们加入一个开源软件的开发主要是为了增加开发经验和体检虚拟团队合作的乐趣,通过知识共享、信息交互体现群体智慧在软件开发过程中的作用。开发者可以通过各种交互渠道,如邮件列表、版本控制工具CVS/SVN/Git、Bug库和论坛等,来实现交互。在构建开发者合作网络(Developer Collaboration Network,简称DCN)过程中,用Gd=(Vd,Ed)表示一个开发者网络,其中Vd代表参与项目的开发者,Ed为开发者之间的合作,即若开发者C 与开发者D 参与了同一任务(包括bug修复,功能改进)则被视为存在一条合作连边ecd=1,否则ecd=0。本文没有考虑两个开发者间的合作次数。
3 演化分析
3.1 节点与边的协同演化
网络的节点数与边数直接反映了一个网络的规模,一个开源软件系统的软件网络节点代表系统中类的个数,而边代表类之间的依赖关系,功能越多类越多,边越多系统越复杂。因此,软件网络规模的变化能够体现软件系统内部结构复杂性的变化。与软件网络相对应,开源社区开发者合作网络中节点代表参与的社区开发者,开源社区中的开发者可自由选择感兴趣的项目,因此节点规模间接反映项目的受欢迎程度;开发者间的合作紧密程度可通过网络的连边进行体现,边越多表示开发者间合作越紧密,加权网络中边的权重还可表示合作的频率。已有研究关注开发者潜在合作同行的推荐,以缓解合作的稀疏性。
为分析两类网络节点与边的演化情况,分别给出了它们在10个版本中的变化趋势,其中横轴表示每个版本对应的版本序列号(1-10),纵轴表示对应的指标值。显示SDN网络与DCN网络的节点数均随时间不断增多,只是增长趋势有所不同。SDN网络中节点与边的增长在一定周期内幅度很小,之后存在一个大的增加,随后又保持相对稳定,如版本1-3,4-7,8-10这3个阶段增长幅度很少,可能的解释是这些阶段主要负责系统的维护工作,无新的功能添加;而3-4,7-8之间却有一个大幅度的增长,分别增加了90和98个类文件,说明在这两个阶段版本间有新的功能添加。SDN网络规模的演化也表明大致3-4个版本周期后会有一次大的更新。
虽然同样呈增长趋势,但DCN网络与SDN网络的演化趋势明显存在差异。首先,开发者数量线性增长更明显,不存在周期性增长的现象,其中一个主要原因可能与开源社区的零散、自由的'松耦合合作方式有关,感兴趣的开发者任何时刻都可以参与项目提供贡献,这种自愿性使得项目成员随时间一直增长,经历10个版本,开发者数由原来的38人增加到144人。其次,DCN 网络中边的增长幅度相对更缓慢,说明合作并不紧密;在版本6-9期间,网络的合作仅增加了18。需要注意的是,DCN网络中开发者既可以自由加入,同样可以随时离开,所以这里的增长都是相对前一个时间段而言。
实验结果表明:DCN网络与SDN网络的规模随时间均满足持续增长规律,只是SDN网络节点与边的增长趋势表现出一定的周期性,而DCN网络的线性增长趋势更明显,但节点与边增长不同步。
4 讨论
很明显,DCN网络与SDN网络的规模差别甚大,他们的演化方式也不同。一个成型的软件系统在维护过程中仅需修改少量的模块,而开发人员变化可能更大。开源社区中开发者往往分布在世界各地,不受时间、地域和文化等因素的约束,任何有能力的个人都可以提供问题的解决方案,甚至一些开发者只是在某一个版本中做出贡献,在以后的版本中都不加参与。这种“低门槛”正是为什么DCN网络节点呈明显的线性增长的一个主要原因。软件系统的每个版本并不会一直有新的功能添加,有些版本只是修改上一版本中存在的缺陷问题,这种修复工作一般不会导致网络规模的明显变化。另外,SDN网络规模与DCN网络规模并不成正比,表明开发团队的壮大并不会直接影响系统内部结构的复杂性。
平均度〈k〉可反映一个网络中节点的平均连接程度,在软件工程实践中,SDN网络〈k〉有助于项目负责人根据需要对新建与维护的工作量进行成本预测,DCN网络〈k〉可为评估项目完成时间与团队协调代价提供参考;加上SDN网络与DCN网络最短路径均小于6,聚类系数较大且随时间还有不同程度的增大,说明在STN网络中,尽管SDN网络与DCN网络的一些指标增长并不同步,但随着时间的变化,两类网络中节点的直接或间接的关联关系会越来越明显。根据开发者的开发历史信息与DCN网络的“小世界”特性,一个修改任务可以很快分配到具备完成任务能力的人手中。
随着需求的变动与运行环境的改变,软件系统的结构会相应变动,而模块度的波动是最直观的体现。SDN网络模块度的演化可用于软件重构,例如两个版本间的模块度大幅度下降意味着存在重构点。相对于SDN网络,DCN网络的抱团现象不明显且波动较大,说明社区开发者更多的是小范围的局部合作,整体上合作比较稀疏。众所周知,这种合作不利于知识的传播,所以可根据DCN网络中模块度的变化对社区成员合作进行协调,提供更多的交互渠道,建立开发者推荐和激励方法。
通过对比STN网络中DCN网络与SDN网络在一些指标上的演化,我们得到了一些有趣的发现,但本文也存在一些不足之处:首先,10个版本的时间跨度并不相等,我们仅以网上提供的提交时间为划分基准,虽然在数据处理过程中不可避免会引入一些偏差,但实验结果表明,这些小的偏差并没有影响最终的演化分析,所以,文中的发现具有一定的代表性。其次,开发者的历史信息只考虑了邮件列表和提交日期,针对开发者间的合作,我们假设参与同一个任务的开发者间存在合作,且构建的DCN网络为无权网络,无法呈现他们之间的合作次数。虽然DCN网络的定义比较狭隘,但很多已有研究工作采用了这种基于“共事”关系构建DCN网络的方法,并证实了这种DCN网络的有效性。
5 总结与展望
随软件版本的更新,软件网络与开发者合作网络的规模不断增大,软件网络以3-4个版本为周期有规律地增长,而开发者合作网络呈明显的线性增长;两类网络的平均度均满足近似线性增长,但整体上增长并不一致;它们均有“小世界”特性,且最短路径都表现为阶段性下降,但开发者间局部合作更明显;它们的社区结构都不断地变化,且整体上模块度呈下降趋势,但开发者合作网络的变化更大。总之,我们的工作发现开源软件系统的社会-技术网络模型中两类网络既有共性又有差异,一定程度上既相互促进又相互影响。
我们的下一步工作将主要关注两个方面:引入更多的版本,考虑不同语言(除Java之外)、不同规模的软件系统作为研究对象,进一步验证并丰富我们的结论;软件网络中类之间的依赖实际是有向带权重的,开发者合作网络中合作的次数也会对结果产生一定影响,因此,考虑边的方向与权重,能使结论更贴近现实和更具一般性。
【开源软件系统中社会技术网络的协同演化探析论文】相关文章:
开源软件声明范本10-25
软件技术专业论文致谢(通用8篇)04-20
软件系统维护服务合同04-25
《离骚》中“泽”字注释的探析11-11
管理软件系统买卖合同05-28
软件系统维护服务合同范本04-24
软件管理系统买卖合同(6篇)04-02
软件技术委托开发合同09-25
物业管理自考工作的探析论文09-23