软件工程进展读论文报告
论文:Macro-level software evolution: a case study of a large software compilation (宏观层面的软件演化:举例研究一个大型软件的编译)于2008年11月29号发表于实证软件工程。
论文的背景和动机:
软件演化(Software Evolution)一般研究的是由相互合作的团队开发的单个的软件产品。但是越来越多的软件系统包含了大量了不同的应用和运行库。很多这些应用和运行库是由不同的团队面向不同的目的开发的。这种大型软件系统是如何演化的呢?他们有些什么特性特点呢。但要研究这样的大型软件系统需要有这个系统所涉及的所有应用和库在各个时间点的源代码。这并非一件易事。因此才鲜有研究文献涉及该类型的系统。
这些年,很多大型自由软件系统取得了巨大成功,例如Fedora Linux, Debian GNU/Linux, FreeBSD, OpenBSD。这些大型自由软件集成成百上千独立应用和库,并且几乎所有自由件的授权都充许自由得到相应的源代码。这为我们研究大型软件系统的演化提供了必要条件。
构成大型软件系统的各个工程是独立开发的(某些软件系统把这些独立开发的工程称之为包),但从整个软件系统的视角来看,它们之间却存在复杂的依存关系,甚至在某些情况下会是冲突关系。因此,单个的研究某特定工程的演化与在整个软件系统中研究软件的演化是不同的。
论文旨在通过分析一个大型自由软件系统的演化来揭示大型自由软件系统的一般规律以至私有大型软件的某些规律和特点。
论文中实证研究的定义、规划、执行与分析:
Debian GNU/Linux是一个非常流行的大型软件系统。它包括了各种大大小小的应用和库,其中一些演化的非常迅速,其中一些又长期没有变化,不断有新的包加入该系统又不断有过时的包被抛弃。仅管这些包是相互独立开发并自我演化,但在Debian系统中,它们之前有着非常复杂的关系。这个复杂关系随着Debian系统的演化而变得更加复杂,使之越来越难以维护。
[定义]
这篇论文,即以Debian软件系统为例,主要考察了九年以来Deiban系统中包的总数,包的大小,开发语言,包之间的相互依赖性等多个指标,在宏观上研究整个Debian软件系统的演化。最终得出一些大型自由软件的特点,分析这些特点能指导单独的软件研发使之能更好的集成进大型系统中。
[规划和执行]
Debian组织成一个个包(package),一般地讲每个包对应于一个应用或一个库,少数情况下对应于文档或其它。包分两种,一种是包含运行的二进制文件的包,另一个是源文件包。源代码包在构建以后通常生成一个或多个二进制包。Debian为每一个发行版本维护了一系列配置文件,这些配置文件设定了每个发行版所需要的运行环境,包含了哪些包。而每个包的配置文件也约定了它所依赖的其它包的关系。
这份报告研究了Debian从2.0到4.0的所有稳定发行版号,即2.0,2.1,2.2,3.0,3.1,4.0。对于每一个待考察的版本,配置文件被事先写好的脚本分析,把分析到的数据存入数据库中。然后,每一个源码包被自动获取,源代码行数被SLOC工具分析得出;源代码所使用的编程语言也用SLOC工具识别到。而包与包之间的依赖性亦可由Debian发行版的配置文件中记录的Depends,Pre-Depends,Suggests,Recommends字段得到。这些信息被分析出来以后,包与包之间的依赖关系由一个有向图描述出来。有向图中的结点表示一个包,连接结点的边表示包与包之间的依赖关系。每个待研究的Debian发行版都会生成一个这样的IDG(Inter-Dependency Graph),通过运用有向图的算法可以得到很多研究关心的数据,比如最流行的包(The most popular package)。
[分析]
发行版总大小 结果显示每隔两年,发行版的大小(统计发行版的所有源代码行数)就会增加一倍。截止2007年的Debian 4.0,已经共有4亿行代码和1万个包。如此大的规模会为未来的继续发展带来不小的麻烦,在最新的发行版中已经可以看到超大规模的几数级增长已经给某些时间点带来了延迟。
包的大小 而包的平均大小指标在九年内几乎维持不变。因为软件系统的总代码量迅速增长而平均包大小不变,这意味着越来越多的包被增加到系统中。Debian .4.0的包数目是Debian 2.0的包数目的10倍。为了应对包的不断增多,Debian系统需要迅速增加包维护者以及每个维护者需要应对的包数目。包数目的迅速增长也是一个非常棘手的问题,特别影响了包维护者的相互配合。
包的维护 Debian维护者的任务之一就是跟踪新版本的软件包,给它们重新打包,更新相应的包描述。一但一个新版本的包发布了,包的名字就会相应变化。因此可以通过分析发行版的包的名称确定软件包有没有被维护过。
分析数据后显示Debian 2.0的1096个包里面有721个可以在4.0中找到。这意味着Debian2.0中只有30%的包在九年后的Debian 4.0中被移除。再之,Debian 3.1的10106个包中,而在4.0中仍然存在的有7300个,这个比例也大概是30%。
对于没有改变过的包。Debian 4.0中有132个包与Debian 2.0中毫无改变。换言之,Debian 2.0中不少于15%的包在九年后仍然没有任何改变在Debian 4.0中。
必须指出的是未改变的包所包含的文件数目并不能反应所有的未改变的文件数目。后者的数字应该高一些:有相当多的文件在Debian的各个发行版之间没有改变,即使它们所属的包的名字变化了。
开发语言 统计数据显示Debian各个发行版中最多使用的开发语言仍然是C语言,并且较之于第二名优势明显。但对于C语言,在第Debian 2.0中,C占了77%的份额;到了Debian 4.0,C语言的份额下降到了51%。而对于C++,则是从2.0时占6%的市场份额上升到了4.0时的19%。总体上看,C语言的重要性一直在相对减弱,而C++和其它一些开发语言都保持了一定增长的趋势。必须说明的一点时,仅管C语言的份额在下降,但从C语言代码绝的绝对数量上看仍然在快速增加。
Shell语一直处在第三的位置,因为这种语言在几乎每个包中都有。从大量的小尺寸包到重量级的包,Shell无所不在。
另一个值得关注的必然是Java。在Debian 3.0时,Java编写的应用仅仅占到0.5%。到了Debian 3.1发布时,这个数字飞速上升到1.7%,到了Debian 4.0時,增加到了3.1%,稳定地占据了第四的位置。Java的快速增长得益于几个大型应用使用Java语言进行开发,比如:Eclipse和Azureus。实际上,Java还是被低估了。因为授权许可证的问题,包含大量Java代码的Sun JDK和Sun JRE没有统计在内,而其它语言则至少包含了一个常用的开发环境。
就代码量而言,一些比较生僻冷门的语言也占据了比较明显的份额。这是因为虽然这些生僻语言仅仅出现在少量包中,但这些开发包的尺寸却很大。比如,Ada语言在Debian 3.0中有57万行代码,其中的43万行都来自于Ada的编译器,开发库和开发工具。
通过观察开发语言的使用率趋势,可以估算出有多少开发者比较熟悉某种开发语言。同时,不同语言的不断演化也反映出自由软件在开发语言层面的变化。
...