摘要

随着下一代测序数据的日常使用,进化生物学正在转变为一门计算科学。因此,研究人员不得不依赖越来越多越来越复杂的软件。该领域所有广泛使用的核心工具在功能数量、代码行数以及软件复杂性方面都有了显著增长。一个很少受到关注的主题是广泛使用的核心分析工具的软件工程质量。软件开发人员似乎很少评估他们代码的质量,这可能会对最终用户产生潜在的负面影响。为此,我们从进化生物学的更广泛领域评估了16个高度引用和计算密集型工具的代码质量,这些工具主要是用C/C++编写的(例如,MrBayes、MAFFT、SweepFinder等)和JAVA(BEAST),这些工具在当前数据分析管道中经常使用。因为我们分析的工具的软件工程质量相当不令人满意,所以我们提供了一份最佳实践列表,以提高现有工具的质量,并列出了可用于从头开始开发可靠、高质量科学软件的技术。最后,我们还讨论了期刊和科学政策,更重要的是,为了提高软件工程质量以及确保支持开发新软件和维护现有软件,需要解决的资金问题。我们的目的是提高社区对软件工程质量问题的认识,并强调科学软件开发资金的严重缺乏。

介绍

随着下一代测序数据(NGS)的成熟和常规使用,进化生物学正在成为一门越来越定量和计算的学科,这一点无可争议(参见Barone等人。2017). 因此,定量和计算技能越来越成为该学科的基础。

该领域也正在转变为计算科学,因为它越来越依赖集群计算机和超级计算机(例如。,Misof等人。2014Jarvis等人。2014). 这是几十年前天体物理学或流体动力学等其他学科的过渡。我们认为,实现这一过渡缺乏资金。

上述趋势的共同点是,研究人员不得不依赖越来越多的日益复杂的核心软件组件。在软件复杂性方面,我们指的是所有广泛使用的工具在功能数量和代码行(LoC)方面都有了显著增长。例如,Bayes先生(Ronquist等人。2012)2005年约49000 LoC,2014年约94000 LoC。系统发育推断软件现在支持更大的一组模型(例如替换模型)、硬件平台(例如GPU、集群等)和并行类型(例如细粒度、粗粒度、混合方法)。

此外,软件复杂性也可以通过当前分析管道中的核心组件计数来量化。例如,在“桑格时代”,一旦序列可用,分析管道就相当简单。对于系统发育研究,它包括以下步骤:对齐 → 推断树 → 可视化树。对于NGS数据和庞大的系统发育数据集,例如昆虫转录组(Misof等人。2014)或鸟类基因组进化(Jarvis等人。2014)项目中,数据分析管道已变得更长、更复杂。它们还需要用户在越来越多的生物信息学领域的专业知识(例如,正畸分配、读取组装、数据集组装、数据组划分、发散时间估计等)。此外,这些管道需要大量的助手脚本来转换格式、部分自动化工作流以及连接组件。Helper脚本通常使用诸如perl之类的语言编写,perl是一种由于缺少类型而极易出现编码错误的语言,而python使用动态类型,因此也不能进行全面的类型检查。术语“类型化”是指传递给函数并由函数返回的变量的数据类型(例如,整数或浮点)。在没有严格类型的情况下,可以使用浮点值作为参数来调用需要整数参数的函数,并表现出未定义或意外的行为。因此,具有更严格类型控制的编程语言可以减少出错的可能性。

我们主要关注的是,如果每个代码(此后,我们使用代码作为软件的同义词)或脚本组件在这样的管道中使用可能会出现“buggy”P(P),管道中存在bug的概率随着组件数量的增加而急剧增加。这里,我们指的是不会导致容易检测和修复的崩溃的错误,而是产生错误结果的错误。在ExaML中(Kozlov等人。2015)例如,在对经验数据进行大规模推断的同时,我们在特定设置下检测到分支长度缩放和bootstrap复制生成中的两个主要错误。因此,如果检测得太晚,错误,尤其是大规模数据分析项目早期管道阶段(例如NGS组装)的错误,可能会对下游分析产生巨大影响,例如系统发育推断或年代测定,因为它们都必须重复。Wilson等人。(2017)就科学计算的良好实践以及科学工作流程的设计和管理提供了有价值的一般性建议。鉴于我们的领域需要与现有的计算科学竞争稀缺的超级计算或云资源,重复大规模的系统发育分析可能会导致计算工作的大量浪费。当前的大规模系统发育分析项目可能需要在超级计算机上运行1000万到7000万个处理器小时。

我们在本文中的目标是(1)评估当前工具的软件工程质量,无论其准确性或算法质量如何,(2)提出潜在的解决方案,包括软件分析工具,以提高进化生物学软件的质量。我们希望强调,我们部署的质量度量仅代表评估软件工程质量的一个可能选项。此外,糟糕的软件工程质量并不会自动导致软件不正确,但这是一个重要的联系存在(例如。,Briand等人。1999,2000;Casalnuovo等人。2015). 请注意,我们的软件工程质量标准与上述论文不同。然而,他们在一定程度上受到了这些因素的激励。

生物信息学中关于软件工程质量的相关工作很少。库马尔和达德利(2007)从最终用户的角度,从可用性和技术要求方面讨论生物信息学软件工程质量。Rother等人。(2012)描述一个用于开发生物信息学软件的软件工程工具箱,该工具箱审查了作者自己的代码和项目中的开发实践。虽然与我们的工作相比,本文中提出的策略处于更高的抽象级别,但对于规划和管理新的软件项目来说,这些策略是有用的。Leprevost等人。(2014)也讨论了生物信息学软件开发的一些最佳实践,但在相当一般的环境中,没有提供关于如何提高质量的具体建议。Wilson等人。(2014)提供科学软件开发的通用最佳实践列表,并列出由于错误软件导致的几次引人注目的论文撤回的示例。

关于软件验证和测试,Giannoulato等人。(2014)描述所谓变形测试方法的应用(Chen等人。1998)BWA、Bowtie和Bowtie2短文制图员。另请参见Chen等人。(2009)用于变质测试在生物信息学软件中的另一个应用。变形测试只能应用于单个工具或用于相同目的的一组工具。最后,Kamali等人。(2015)概述不同的测试技术,并讨论其对生物信息学软件的适用性。我们故意不把重点放在评估结果质量上,因为这大大限制了我们可以评估的工具的范围(例如,只有系统发育工具),而且我们选择的大多数工具都经过了良好的测试。然而,完全依赖模拟数据的测试需要谨慎对待,因为无法保证数据模拟工具的正确实施。

为了评估软件工程质量,我们下载并仔细检查了一组常用的标准16,这些标准和引用的代码通常是进化生物学中数据分析的基础。除了BEAST(用JAVA编写)之外,尽管出现了诸如R之类的语言,但我们主要关注用C/C++编写的软件,因为这是我们测试的高度流行和计算密集型工具的主要编程语言。我们主要关注计算密集型工具,因为如果需要重复分析,这些工具中的错误意味着大量的计算资源浪费(例如CPU时间授权)。为了进行比较,我们还分析了我们研究所开发的天体物理学代码,因为天体物理学是一门更成熟的计算科学学科。根据软件分析结果,我们提供了最佳实践的个人和主观列表,并讨论了一些需要解决的科学政策问题,以提高软件工程质量,更好地支持科学软件开发。

我们绝对无意批评我们评估的代码的任何作者和开发人员,因为他们都对该领域做出了重大贡献。生物信息学主要研究人员的职业生涯通常基于他们开发的一种或多种广泛使用的工具。尽管他们知道如何正确编写软件,但随着他们变得更高级并管理更大的研究小组,用于维护和偶尔重新设计工具的时间越来越少。此外,他们大多不愿意将此任务委托给研究生或博士后研究人员,因为他们应该从事更有趣的项目,而不仅仅是重新设计广泛使用的软件。

鉴于大多数进化生物学软件都是在GNU GPL许可下发布的,用户和评论家应该记住GNU GPL许可证中的以下引述:“版权所有人和/或其他方“按原样”提供程序,无任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。程序质量和性能的全部风险由您承担。如果程序证明如果有缺陷,您将承担所有必要的维修、修理或纠正费用。”

因此,我们的目标是强调用户应该意识到软件不完善的事实,并在选择数据分析工具时考虑软件工程质量。此外,由于当今生物学越来越依赖软件,存在着大量的资金、可持续性和维护问题需要解决。

软件和分析方法

软件

我们从以下领域选择了被高度引用的开源工具:系统发育推断、种群遗传学、多序列比对、发散时间估计、多物种合并、序列模拟和从头组装。请注意,来自所有这些领域的工具都可以用于进化生物学数据分析管道。我们没有修改我们的RAxML源代码,使其与其他工具相比具有优势。

表1列出了我们在每个域中评估的代码。

表1。

每个应用程序域评估的软件包,包括版本号。

软件版本号
系统发育学PAML公司(杨2007)4.8
物理层建模语言(Guindon等人。2010)20141009
贝叶斯先生(Ronquist等人。2012)3.2.4-svn(r926)
RAxML公司(Stamatakis 2014年)8.2.11
群体遗传学微软(哈德逊2002)2014年9月8日
扫描查找器(尼尔森等人。2005)2015年2月23日
顺序。对齐MAFFT公司(2013年加藤和斯坦德利)7.205
T-Coffee咖啡(Notredame等人。2000)20141026_23: 18
恶作剧(Löytynoja和Goldman 2005)140603
分段次数野兽(德拉蒙德和兰博2007)1.8.0
FDPPDIV公司(Heath等人。2014)1.3
多个-Sp.聚结英国石油与天然气公司(Yang和Rannala,2010年)3
顺序。模拟Seq-Gen公司(兰伯特和格拉斯1997)1.3.3
INDELible(索引)(Fletcher和Yang 2009)1.0.3
从头组装SOAP协议(Li等人。2009)240兰特
深渊(Simpson等人。2009)1.5.2
天体物理学小工具-2(斯普林格尔2005)2.0.7
软件版本号
系统发育学PAML公司(杨2007)4.8
物理层建模语言(Guindon等人。2010)20141009
贝叶斯先生(Ronquist等人。2012)3.2.4-svn(r926)
RAxML公司(Stamatakis 2014年)8.2.11
群体遗传学微软(哈德逊2002)2014年9月8日
扫描查找器(尼尔森等人。2005)2015年2月23日
顺序。对齐MAFFT公司(2013年加藤和斯坦德利)7.205
T-Coffee咖啡(Notredame等人。2000)20141026_23: 18
恶作剧(Löytynoja和Goldman 2005)140603
分段次数野兽(Drummond和Rambaut 2007)1.8.0
FDPPDIV公司(Heath等人。2014)1.3
多功能-Sp.聚结英国石油与天然气公司(Yang和Rannala,2010年)3
顺序。模拟Seq-Gen公司(兰伯特和格拉斯1997)1.3.3
INDELible(索引)(Fletcher和Yang 2009)1.0.3
从头组装肥皂(Li等人。2009)240兰特
深渊(Simpson等人。2009)1.5.2
天体物理学小工具-2(斯普林格尔2005)2.0.7

注释。-由于MS和SweepFinder没有版本号,我们显示下载日期。

表1。

每个应用程序域评估的软件包,包括版本号。

软件版本号
系统发育学PAML公司(杨2007)4.8
物理层建模语言(Guindon等人。2010)20141009
贝叶斯先生(Ronquist等人。2012)3.2.4-svn(r926)
RAxML公司(Stamatakis 2014年)8.2.11
群体遗传学微软(哈德逊2002)2014年9月8日
扫描查找器(Nielsen等人。2005)2015年2月23日
顺序。对齐MAFFT公司(2013年加藤和斯坦德利)7.205
T-Coffee咖啡(Notredame等人。2000)20141026_23: 18
恶作剧(Löytynoja和Goldman 2005)140603
分段次数野兽(Drummond和Rambaut 2007)1.8.0
FDPPDIV公司(Heath等人。2014)1.3
多个-Sp.聚结英国石油与天然气公司(Yang和Rannala 2010)3
顺序。模拟Seq-Gen公司(兰伯特和格拉斯1997)1.3.3
INDELible(索引)(Fletcher和Yang 2009)1.0.3
从头组装SOAP协议(Li等人。2009)240兰特
深渊(Simpson等人。2009)1.5.2
天体物理学小工具-2(斯普林格尔2005)2.0.7
软件版本号
系统发育遗传学PAML公司(杨2007)4.8
物理层建模语言(Guindon等人。2010)20141009
贝叶斯先生(Ronquist等人。2012)3.2.4-svn(r926)
RAxML公司(Stamatakis 2014年)8.2.11
群体遗传学微软(哈德逊2002)2014年9月8日
扫描查找器(尼尔森等人。2005)2015年2月23日
顺序。对齐MAFFT公司(2013年加藤和斯坦德利)7.205
T-Coffee咖啡(Notredame等人。2000)20141026_23: 18
恶作剧(Löytynoja和Goldman 2005)140603
分段次数野兽(Drummond和Rambaut 2007)1.8.0
FDPPDIV公司(Heath等人。2014)1.3
多个-Sp.聚结英国石油与天然气公司(Yang和Rannala,2010年)3
顺序。模拟Seq-Gen公司(漫步者与草地1997)1.3.3
INDELible(索引)(Fletcher和Yang 2009)1.0.3
从头组装SOAP协议(Li等人。2009)240兰特
深渊(Simpson等人。2009)1.5.2
天体物理学小工具-2(斯普林格尔2005)2.0.7

注释.-由于MS和SweepFinder没有版本号,我们显示下载日期。

代码分析标准

由于我们分析了相当多的代码,我们不得不部署相当简单和直接的技术来分析它们。这种方法通常被称为经验软件工程和度量方法。在更广泛的软件工程领域(例如。,http://www.esem-conferences.org/; 最后一次访问时间为2018年2月11日)。该领域的研究人员也越来越多地在github上浏览开源代码,以获取有关软件的定量数据。或者,我们可以更深入地分析一两个工具,但我们的目标是获得该领域软件工程质量的总体概述。

最初,我们使用标准GNU编译器(gcc/g++)和Apple的clang编译器编译所有代码。我们在两个C/C++编译器中启用了所有合理的警告标志,并在JAVA中启用了用于分析BEAST的类似标志(请参阅补充材料,补充材料在线查看详细信息)。我们主观上将GNU编译器警告分为潜在危险的主要警告和危险性较小但仍应修复的次要警告(请参阅补充材料,补充材料在线查询我们的分类标准)。我们对编译器警告进行计数和分类,因为我们假设代码产生的警告越多,其行为越可能出乎意料。然而,这并不会自动导致这些代码计算的结果不正确,因为不产生警告的代码可能会产生不正确的结果。

此外,我们使用valgrind执行代码(http://valgrind.org/; 最后一次访问时间为2018年2月11日),这是一个检测潜在内存泄漏、非法内存访问、内存块丢失等的工具。我们将结果分为三类:使用valgrind运行代码时“干净”未生成任何警告,在无效RAM(Random Access memory)地址进行读或写访问时“无效”,或者在分配的内存未再次正确释放时出现“泄漏”。当访问无效或未初始化RAM位置的值时,内存错误或错误使用内存可作为崩溃或未指定/未定义行为概率的指示器。

此后,我们使用grep文本搜索工具来识别与用于分配内存块的C malloc()例程相关的典型编程错误n个RAM中的字节。通常,此函数是用太小而无法表示的整数数据类型调用的n个分配大块内存。在我们的分析中,我们区分了三个malloc()使用错误:“NoCast”(即缺少类型转换)、“MisCast”和“WrongCast”。对于C++中的新[]运算符,我们使用了类似的分类。这些错误类型的示例(例如MrBayes和ms)在补充材料,补充材料在线。虽然对于较小的数据集,这种不正确的使用不会产生任何影响,但在强大的多核服务器上部署用于分析NGS数据集的程序时,很可能会失败,这些服务器现在通常配备128或256GB RAM。事实上,我们自己的ExaML也经历过这样的崩溃(Kozlov等人。2015)代码以及MrBayes。

我们认为另一个重要的代码特性是使用所谓的断言(例如,C中的assert()函数,请参见补充材料,补充材料在线获取经典assert()示例)。我们通过计算每1000个LoC的断言数量来评估断言的使用。断言包含有关变量的逻辑子句,当程序执行断言调用时,这些变量必须为true,否则程序将失败。断言的使用与代码正确性相关。在理论计算机科学中,存在一个正式的框架,即所谓的霍尔逻辑(霍尔1969),用于证明程序的正确性。它的工作原理是在代码的适当位置插入断言(关于变量状态的布尔语句),并证明它们永远不会失败。虽然证明我们在这里使用霍尔逻辑仔细研究的复杂科学代码的正确性是不可行的,但在程序中频繁使用断言代码质量的指示符。断言也有助于记录和调试代码,因为很容易识别出失败的部分。最近一项使用github中大量C/C++代码的软件工程研究表明具有断言在协作开发项目中有明显更少的缺陷(Casalnuovo等人。2015)这在生物信息学中也很常见。

为了粗略估计代码复杂性,我们还使用cloc计算了每个程序中的LoC(https://github.com/AlDanial/cloc; 上次访问时间为2018年2月11日),该命令不包括注释和空行。对于一些程序,我们还生成了直方图,以说明过去几年的代码增长情况(请参见补充材料,补充材料在线)。当然,LoC度量并不能直接反映代码的复杂性,但可以作为一个粗略的代理。

评估代码复杂性的一个更详细的标准是代码重复的程度,即源文件中存在多少相同代码的副本。一般来说,代码复制是一种糟糕的编程实践。如果在重复代码的一个副本中检测到并修复了错误,则需要修复所有重复代码中的错误。大多数情况下,这些副本没有正确记录,可能很难找到。因此,具有高度代码重复的软件更难维护,因此也更有可能包含错误。例如,一项大规模的软件工程研究(Juergens等人。2009)商业和开源软件发现(1)对代码克隆的不一致更改非常频繁,(2)导致大量错误。

总的来说,之所以选择了上述标准(1),是因为它们很容易应用于大量不同的代码,并且(2)存在链接(例如。,Briand等人。1999,2000;Casalnuovo等人。2015;Juergens等人。2009)在质量和错误程序行为的概率之间,即崩溃或计算错误结果。

还有一些更精细的方法用于分析和改进代码质量,例如pmccabe工具,它可以评估函数复杂性。

软件分析结果

中提供了对所有代码的详细分析,包括适当的源代码示例补充材料,补充材料在线。

我们在中总结了标准测试的结果表2对于单个PAML组件和中表3用于所有其他程序,包括PAML核心代码。Simian工具获得的结果(http://www.harukizaemon.com/simian/; 上次访问时间为2018年2月11日),报告了代码重复程度表4.

表2。

PAML组件。

PAML组件LoC(自有)LoC(总计)W少校。小调W。Clang W。马洛克瓦尔格林德断言
基本ml1,30414,21204.6623无演员清洁0
basemlg(基本)68513,5937.24.37452.7无演员泄漏0
智利218518502737.85无演员清洁0
代码ml5,30918217年4.78.5229.62无演员清洁0
进化者1,12314,0314.558.8297.6无铸造泄漏0
mcmctree2,9708,0792.411.1184.1无演员清洁0
潘普51413,4221.99.7485.4无演员泄漏0
yn00码7129274.250.8315.5无演员泄漏0
PAML组件LoC(自有)LoC(总计)W少校。小调W。Clang W。马洛克瓦尔格林德断言
基本ml1,30414212年04.6623无演员清洁0
basemlg(基本)68513,5937.24.37452.7无铸造泄漏0
智利218518502737.85无演员清洁0
代码ml5,30918,2174.78.5229.62无演员清洁0
进化者1,12314,0314.558.8297.6无铸造泄漏0
mcmctree2,9708,0792.411.1184.1无演员清洁0
潘普51413,4221.99.7485.4无演员泄漏0
yn00码7129274.250.8315.5无演员泄漏0

注释.-LoC(own)是仅属于组件的有效代码行数。LoC(total)是每个组件的有效代码行总数,包括与其他组件共享的代码。列“Major W.”和“Minor W.”给出主要和次要GNU编译器警告,“Clang W.”报告叮当警告的数量,所有这些都标准化为1000行自己的代码。“Malloc”列提供Malloc()强制转换错误,“Valgrind”提供内存行为,“assert”提供每1000行代码的断言数。

表2。

PAML组件。

PAML组件LoC(自有)LoC(总计)W少校。小调W。Clang W。马洛克瓦尔格林德断言
基本ml1,30414,21204.6623无演员清洁0
basemlg(基本)68513,5937.24.37452.7无演员泄漏0
智利218518502737.85无演员清洁0
代码ml5,30918,2174.78.5229.62无演员清洁0
进化者1,1232014年4.558.8297.6无演员泄漏0
mcmctree2,9708,0792.411.1184.1无演员清洁0
潘普51413,4221.99.7485.4无演员泄漏0
yn00码7129274.250.8315.5无演员泄漏0
PAML组件LoC(自有)LoC(总计)W少校。小调W。Clang W。马洛克瓦尔格林德断言
基本ml1,30414,21204.6623无演员清洁0
basemlg(基本)68513593人7.24.37452.7无演员泄漏0
智利218518502737.85无演员清洁0
代码ml5,30918,2174.78.5229.62无演员清洁0
进化者1,1232014年4.558.8297.6无演员泄漏0
mcmctree2,9708,0792.411.1184.1无演员清洁0
潘普51413,4221.99.7485.4无演员泄漏0
yn00码7129274.250.8315.5无演员泄漏0

注释.-LoC(own)是仅属于组件的有效代码行数。LoC(total)是每个组件的有效代码行总数,包括与其他组件共享的代码。列“Major W.”和“Minor W.”给出了GNU编译器的主要和次要警告,“Clang W.”报告了Clang警告的数量,所有警告都被规范化为1000行自己的代码。“Malloc”列提供Malloc()强制转换错误,“Valgrind”提供内存行为,“assert”提供每1000行代码的断言数。

表3。

PAML值是指在中列出的所有单个组件之间共享的部分源代码表2.

代码语言业务线W少校。小调W。Clang W。马洛克瓦尔格林德断言
PAML公司C类12,9080.99.418.8无演员清洁的0
物理层建模语言C类56456个0056.5无演员清洁的0.16
贝叶斯先生C类94,4320.0209.6误播无效/泄漏2.37
RAxML公司C类57,2330016.8无错误泄漏17.5
SOAP协议信用证++37,0203.917155.5无演员泄漏0
深渊C类43189人00134.8无错误清洁23.11
微软C类2,0634.810.762.3错误的演员泄漏0
扫描查找器C类4,465032.352.4无演员清洁1.56
MAFFT公司C类57,6881.11.327.3无演员无效/泄漏0
T-Coffee咖啡C类160,2232.23.934.2无演员泄漏0.44
恶作剧C类++23,9476.80.3121.4无演员无效9.19
野兽爪哇302,6110.0712.5不适用无错误不适用0
FDPPDIV公司C类++11,47433.561.7无错误泄漏0.26
英国石油与天然气公司C类16593年35.849无演员泄漏0
Seq-Gen公司C类3,9770151.3无错误泄漏0
INDELible(索引)C类++11,402022.8182.5无错误清洁0
小工具-2C类12,50902.948.8无演员可能很干净0
代码语言业务线W少校。小调W。Clang W。马洛克瓦尔格林德断言
PAML公司C类12,9080.99.418.8无演员清洁的0
物理层建模语言C类56,4560056.5无铸造清洁的0.16
贝叶斯先生C类94,4320.0209.6误播无效/泄漏2.37
RAxML公司C类57,2330016.8无错误泄漏17.5
SOAP协议信用证++37,0203.917155.5无演员泄漏0
深渊C类43,18900134.8无错误清洁23.11
微软C类2,0634.810.762.3错误的演员泄漏0
扫描查找器C类4,465032.352.4无演员清洁1.56
MAFFT公司C类57,6881.11.327.3无演员无效/泄漏0
T-Coffee咖啡C类160223个2.23.934.2无演员泄漏0.44
恶作剧C类++23,9476.80.3121.4无演员无效9.19
野兽爪哇302,6110.0712.5不适用无错误不适用0
FDPPDIV公司C类++11,47433.561.7无错误泄漏0.26
英国石油与天然气公司C类16,59335.849无铸造泄漏0
Seq-Gen公司C类3,9770151.3无错误泄漏0
INDELible(索引)C类++11,402022.8182.5无错误清洁0
小工具-2C类12,50902.948.8无演员可能是干净的0

注释.-列“语言”表示编程语言,列“LoC”表示有效代码行的总数。列“Major W.”和“Minor W.”给出了GNU编译器的主要和次要警告,“Clang W.”报告了Clang警告的数量,所有警告都被规范化为1000行代码。列“Malloc”提供Malloc()强制转换错误,“Valgrind”提供内存行为。我们将Gadget-2代码表示为“可能干净”,因为我们中断了valgrind分析,该分析在30之后没有报告任何错误运行时间min。最后,“assert”列表示每1000行代码中的断言数。

表3。

PAML值是指在中列出的所有单个组件之间共享的部分源代码表2.

代码语言业务线W少校。小调W。Clang W。马洛克瓦尔格林德断言
PAML公司C类12,9080.99.418.8无铸造清洁的0
物理层建模语言C类56,4560056.5无演员清洁的0.16
贝叶斯先生C类94,4320.0209.6误播无效/泄漏2.37
RAxML公司C类57,2330016.8无错误泄漏17.5
SOAP协议信用证++37,0203.917155.5无演员泄漏0
深渊C类43,18900134.8无错误清洁23.11
微软C类2,0634.810.762.3错误的演员泄漏0
扫描查找器C类4,465032.352.4无演员清洁1.56
MAFFT公司C类57,6881.11.327.3无演员无效/泄漏0
T-Coffee咖啡C类160,2232.23.934.2无演员泄漏0.44
恶作剧C类++23,9476.80.3121.4无演员无效9.19
野兽爪哇302,6110.0712.5不适用无错误不适用0
FDPPDIV公司C类++11474人33.561.7无错误泄漏0.26
英国石油与天然气公司C类16,59335.849无演员泄漏0
Seq-Gen公司C类3,9770151.3无错误泄漏0
INDELible(索引)C类++11,402022.8182.5无错误清洁0
小工具-2C类12,50902.948.8无演员可能很干净0
代码语言业务线W少校。小调W。Clang W。马洛克瓦尔格林德断言
PAML公司C类12,9080.99.418.8无演员清洁的0
物理层建模语言C类56456个0056.5无演员清洁的0.16
贝叶斯先生C类94,4320.0209.6误播无效/泄漏2.37
RAxML公司C类57,2330016.8无错误泄漏17.5
SOAP协议信用证++37,0203.917155.5无铸造泄漏0
深渊C类43,18900134.8无错误清洁23.11
微软C类2,0634.810.762.3错误的演员泄漏0
扫描查找器C类4,465032.352.4无演员清洁1.56
MAFFT公司C类57,6881.11.327.3无演员无效/泄漏0
T-Coffee咖啡C类160,2232.23.934.2无演员泄漏0.44
恶作剧C类++23,9476.80.3121.4无演员无效9.19
野兽爪哇302,6110.0712.5不适用无错误不适用0
FDPPDIV公司C类++11,47433.561.7无错误泄漏0.26
英国石油与天然气公司C类16,59335.849无演员泄漏0
Seq-Gen公司C类3,9770151.3无错误泄漏0
不可分割的C类++11,402022.8182.5无错误清洁0
小工具-2C类12,50902.948.8无演员可能很干净0

注释.-列“语言”表示编程语言,列“LoC”表示有效代码行的总数。列“Major W.”和“Minor W.”给出了GNU编译器的主要和次要警告,“Clang W.”报告了Clang警告的数量,所有警告都被规范化为1000行代码。列“Malloc”提供Malloc()强制转换错误,“Valgrind”提供内存行为。我们将Gadget-2代码表示为“可能干净”,因为我们中断了valgrind分析,该分析在30之后没有报告任何错误运行时间min。最后,“assert”列表示每1000行代码中的断言数。

表4。

使用Simian工具进行代码重复分析的结果。

代码检查的行检查的文件重复的行重复%阻碍文件夹
PAML公司22,200171210年5.5%12011
物理层建模语言42,786735,87813.7%54932
贝叶斯先生70,6801921,86230.9%1,68010
RAxML公司55,8732517137个30.7%1,30422
SOAP协议27,51411610,10736.7%52772
深渊37,0382124,24511.5%44171
微软1,7182418610.8%219
扫描查找器3,777122937.8%28
MAFFT公司45,0457228,63063.6%1,64759
T-Coffee咖啡82,75819619,34523.4%1,32558
恶作剧16,124675,31833.0%46243
野兽228,3162,33664,02428.0%4,7861,151
英国石油与天然气公司14,33255023.5%56
Seq-Gen公司3244个442066.4%256
INDELible(索引)9,84071,95419.9%1065
小工具-29,770313,31433.9%18031
代码已检查行检查的文件重复的行重复%阻碍文件夹
PAML公司22,200171,2105.5%12011
物理层建模语言42,786735,87813.7%54932
贝叶斯先生70,6801921,86230.9%1,68010
RAxML公司55,8732517,13730.7%1,30422
SOAP协议27,51411610,10736.7%52772
深渊37,0382124,24511.5%44171
微软1,7182418610.8%219
扫描查找器3,777122937.8%28
MAFFT公司45,0457228,63063.6%1,64759
T-Coffee咖啡82,75819619345年23.4%1,32558
恶作剧16,124675,31833.0%46243
野兽228,3162,33664,02428.0%4,7861,151
英国石油与天然气公司14,33255023.5%56
Seq-Gen公司3,244442066.4%256
不可分割的9,84071,95419.9%1065
小工具-29,770313,31433.9%18031

注释.-“检查的行”列是指源行总数,“检查的文件”是指用Simian分析的源文件总数。请注意,“检查的行”编号与中报告的LoC编号不同表2,因为Simian工具不考虑头文件。列“重复行”提供检测到的重复行数,“重复%”提供代码重复的相对数量,“块”提供连续重复代码块的总数。最后,“文件”列给出了检测到重复代码的文件数。

表4。

使用Simian工具进行代码重复分析的结果。

代码检查的行检查的文件重复的行重复%阻碍文件夹
PAML公司22200个171,2105.5%12011
物理层建模语言42,786735,87813.7%54932
贝叶斯先生70,6801921,86230.9%1,68010
RAxML公司55,8732517,13730.7%1,30422
SOAP协议27,51411610,10736.7%52772
深渊37,0382124,24511.5%44171
微软1,7182418610.8%219
扫描查找器3,777122937.8%28
MAFFT公司45,0457228,63063.6%1,64759
T-Coffee咖啡82,75819619,34523.4%1,32558
恶作剧16,124675318个33.0%46243
野兽228,3162,33664,02428.0%4,7861,151
英国石油与天然气公司14,33255023.5%56
Seq-Gen公司3,244442066.4%256
INDELible(索引)9,84071,95419.9%1065
小工具-29770个313,31433.9%18031
代码检查的行检查的文件重复的行重复%阻碍文件夹
PAML公司22,200171,2105.5%12011
菲律宾42,786735,87813.7%54932
贝叶斯先生70,6801921,86230.9%1,68010
RAxML公司55,8732517137个30.7%1,30422
SOAP协议27,51411610,10736.7%52772
深渊37,0382124,24511.5%44171
微软1,7182418610.8%219
扫描查找器3,777122937.8%28
MAFFT公司45,0457228,63063.6%1647年59
T-Coffee咖啡82,75819619,34523.4%1,32558
恶作剧16,124675,31833.0%46243
野兽228,3162,3362014年28.0%4,7861,151
英国石油与天然气公司14,33255023.5%56
Seq-Gen公司3244个442066.4%256
INDELible(索引)9,84071,95419.9%1065
小工具-29,770313,31433.9%18031

注释.-“检查的行”列是指源行总数,“检查的文件”是指用Simian分析的源文件总数。请注意,“检查的行”编号与中报告的LoC编号不同表2,因为Simian工具不考虑头文件。列“重复行”提供检测到的重复行数,“重复%”提供代码重复的相对数量,“块”提供连续重复代码块的总数。最后,“文件”列给出了检测到重复代码的文件数。

一个普遍的观察结果是,clang编译器发出的警告远远多于GNU编译器。这是因为它比gcc执行更彻底的静态代码分析,即更深入的检查,包括更严格的类型检查。另一个普遍的趋势是不经常使用断言以及相当松散的内存管理。虽然内存泄漏可能是无害的,但无效的内存访问(Prank、MrBayes、MAFFT)可能会产生未指定的行为。事实上,C代码中的大多数错误过去都与内存有关(Lu等人。2005)但由于像valgrind这样的工具的可用性,他们似乎也有减少的趋势(Li等人。2006)显然,在开发我们在这里测试的大多数工具时,没有定期使用这些工具。

我们还观察到一些代码中存在高度的代码重复(例如,MrBayes、SOAP、MAFFT、Prank、BEAST)。

总的来说,完美的软件似乎并不存在,如果我们忽略了叮当的警告,可能除了深渊。天体物理代码也不完美(例如,根本没有使用断言),尽管它来自更传统的计算科学领域。我们相信,我们的一套标准可以确定在大多数情况下可以轻松修复的潜在问题。

讨论

我们使用一组简单的工具和标准仔细检查了16个广泛使用的进化数据分析代码,这些工具和标准可以用来提高代码质量,有时甚至不完全理解源代码。显然,软件工程质量只能用开源代码来评估,因此我们强烈主张开源,这样用户就有机会评估代码质量。

我们已经检测到几乎所有工具都会出现的几个错误,这些错误相对来说比较容易修复。同样,我们不打算批评这些工具的作者,因为他们在扩展和维护软件方面的时间和资源限制。我们想强调的是,有必要提高对代码质量的认识,也许更重要的是,担心正确性(尽管我们仔细检查了这些工具产生高质量的结果),因为我们社区的研究在很大程度上依赖于长分析管道中整个核心工具的结果。

另一个担忧是,进化分析软件经常被用作带有默认参数的黑盒,而对底层理论或算法没有正确的理解。鉴于现代进化生物学家需要部署大量工具来“发表论文”,这种用户行为是可以理解的。计算分析的彻底性和发表率之间存在明显的权衡。虽然这很难改变,但这个问题可以在教学层面上解决。我们的看法是,生物学的研究生和本科生培训需要更多地关注数学和计算主题。

我们最初讨论了一些代码开发的良好实践,希望它们能被社区广泛采用,并有助于减少潜在错误的数量。然后,我们讨论与浮点运算和数值结果的再现性有关的问题。最后,我们讨论了资助政策问题,即可能需要何种机制来确保科学软件的可持续维护、支持和质量改进。

基本最佳实践

读者应该记住,我们的建议是主观的,因为它们基于我们适当的编程经验和经验软件工程研究。一些建议可以直接从我们部署的简单标准中得出。因此,一个好的代码应该:

  • 使用多个编译器(例如,icc、clang、gcc)在启用所有编译器警告标志的情况下进行编译

  • 应使用valgrind分析内存泄漏和无效读/写访问

  • 应检查malloc()类型转换错误

  • 应该使用尽可能多的断言来确保算法的正确性

让生物信息学软件论文的审稿人根据上述简单标准检查他们所审查的软件可能是一个好主意。或者,期刊可以要求作者在提交之前对他们提交用于发布的代码进行相应的编译和检查。这可以通过要求作者提供适当的代码质量分析记录来实现。这些过程的一部分也可以自动化。最后,在研究生和本科生水平上教授编程实践时,还应该特别强调软件工程质量问题(例如,没有叮当警告、断言的使用、用valgrind进行检查)。

断言对于调试也特别有用,因为用户经常提供不完整的错误报告。与此相反,当断言失败时,用户通常会报告失败的断言,包括源文件名和代码中大大加快问题识别的行。此外,断言是我们考虑的唯一机制,它有助于部分评估实际代码的正确性,而不仅仅是识别潜在的编程错误或糟糕的编程实践。

虽然需要修复无效的读/写访问,但也应解决内存泄漏问题,特别是当程序在终止时没有释放所有使用的内存时(例如,几个PAML组件和RAxML)。当人们打算将泄漏的代码作为库组件集成到某个较大的项目中时,这种程序终止泄漏可能会成为问题。不幸的是,很难预测一个人编写的软件会被广泛使用,以及应该在代码质量上花费多少精力。

上述最佳实践可以很容易地应用,而无需投入太多精力,但肯定会提高代码质量,并有助于减少实现导致的错误数量。显然,我们还需要担心影响正确性的概念错误,例如黑斯廷斯比率计算中的(长期未被发现的)错误(霍尔德等人。2005)在贝叶斯推理程序中。

高级最佳实践

另一个问题是还有什么能够在理想的环境下提高代码质量。用户往往会忘记,许多代码,特别是在群体遗传学和系统发育学中,使用的是基于实数定义的统计模型。因此,它们受制于浮点算法的摆布,存在舍入错误和数值不足或溢出。因此,该领域的每一位程序员都应该阅读经典论文《每一位计算机科学家应该知道的浮点算法》戈德伯格(1991)。人们应该注意的最重要的属性是浮点算术中的结合性(即。,(x个+(+z(z)))=((x个+)+z(z)))由于舍入错误,不一定成立。注意,算术运算的顺序以及因舍入错误导致的偏差程度取决于(1)编译器使用的(2)正在使用的硬件功能,以及(3)程序员如何对算术运算进行排序。因此,不同的ML程序实现(例如RAxML和PHYML)可以产生不同的对数似然分数。

然而,当似然计算在站点上并行时,即使是相同的程序也可能返回不同的值,这取决于由于舍入错误而使用的处理器数量。因此,不同数量的处理器可以产生不同的树形拓扑,因此,即使(1)确切地采用相同的树搜索启发式算法,(2)尽管存在舍入误差,但似然计算通常足够准确。例如,我们执行了两次RAxML的AVX版本(数据可在https://github.com/stamatak/softwareQuality网站; 最后一次访问时间为2018年2月11日),一次在序列版本中,另一次在PThreads版本中,如下所示:

raxmlHPC-AVX-p 12345-m GTRGAMMA

-第354节-第1节

raxmlHPC-PTHREADS-AVX-T 2-p 12345

-m GTRGAMMA-s 354-n T2

这两个调用之间的唯一区别是,由于并行化,用于优化分支长度的每端对数似然和每端导数的加法顺序发生了变化。我们使用的数据集是354个单基因比对智能交通系统460个位点的序列(Grimm等人。2006)这是一个已知的“粗糙”似然表面。换言之,它表现出许多局部极大值,而这些极大值无法通过统计显著性检验相互区分。简单地说,因为数值偏差使树搜索遵循不同的路径,这两个理论上相同的调用产生不同的最终树,其对数似然分数分别为-6562.158295和-6562.185171,并且相对的Robinson–Foulds距离(罗宾逊与犯规1981)占8.26%。当然,任何比较这两棵树的基于相似性的显著性测试都表明它们之间没有显著差异。

因此,在理想情况下,我们还应该对我们的代码进行理论上的全面错误分析。如上所示,这对于努力获得单点估计值的ML代码尤其重要。几十年前,对经典数值问题(如Gram–Schmidt正交化方法)进行了舍入误差分析(Abdelmalek 1971年)或者,最近,对于Cholesky的QR分解算法(Yamamoto等人。2015). 对于贝叶斯推断来说,数值问题的问题要小得多,因为它们采样的是后验概率分布,因此在舍入误差方面也会被边缘化。补充材料,补充材料在线上,我们还提供了一个例子,说明所谓的非规范化浮点值如何影响程序性能。

最后,由于软件工程质量问题刚刚出现,咨询软件工程专家讨论适当的开发模型(例如,极限、敏捷或经典瀑布模型),并改善波动较大的学术程序员团队的组织,可能会非常有帮助(见Rother等人。2012). 此外,已经存在大量可以评估给定软件架构质量的工具,以及用于明确查找错误的更高级工具。

例如,有一个pmccabe工具用于评估C和C++代码中的函数复杂性(https://people.debian.org/~bame/pmccabe/; 上次访问时间为2018年2月11日)。它计算所谓的McCabe圈复杂度(McCabe 1976年)函数。通常,当一个函数的复杂度超过10或15分时,该函数应分为几个子模块。使用以下命令pmccabe-f axml.c对主要RAxML源文件axml.c进行快速分析后发现,仅此源文件中就有22个函数的圈复杂度得分超过15。

此外,静态代码分析工具类似于开创性的Lint(约翰逊1977)应该部署工具。clang编译器和一些Linux内核开发工具(如sparse和smatch)都部分做到了这一点。尾骨框架(Lawall等人。2010)评估代码转换的等效性也可能特别有用。如中所述补充材料,补充材料联机,FindBugs(http://findbugs.sourceforge.net; 最后一次访问时间为2018年2月11日),可用于仔细检查BEAST等Java代码。代码重复识别工具(如Simian)也应在代码开发期间常规使用。最后,我们建议使用死代码识别工具来识别永远不会执行的代码(例如,使用gcc中的–coverage开关)。

提高代码质量和对正确性更有信心的另一个主要方法是测试,例如单元测试或集成测试。有大量关于软件测试的研究和方法。一个很好的起点是关于软件测试艺术的书Myers等人。(2011)。我们领域当前的测试实践似乎是测试主要委托给用户。然而,我们强烈主张增加测试技术的使用。

最后,我们建议部署多个编译器和编译器版本来编译和测试软件(执行单元测试)。通过使用持续集成(CI)工具,如Travis CI,可以无缝地采用此策略(https://travis-ci.org/; 上次访问时间为2018年2月11日)。例如,通过此策略,我们在自己的系统发育推断代码中检测到一个错误,该错误仅在使用较旧版本的clang编译时导致分段错误。由于不同的编译器版本可能会生成包含顺序略有不同的操作的二进制文件,因此检测错误的可能性会增加。

因此,对于程序员,我们进一步推荐以下最佳实践:

  • 阅读“每个计算机科学家都应该了解浮点运算”

  • 进行理论舍入误差分析

  • 注意非规范化浮点数及其对性能的影响

  • 当运行具有不同核心计数的并行代码时,请注意结果的不可重复性

  • 与您当地的软件工程同事交谈

  • 使用静态分析器

  • 使用死代码识别工具

  • 在代码开发过程中反复使用pmccabe等工具,以降低模块复杂性

  • 使用类似Simian的工具来识别重复的代码

  • 使用Pylint之类的工具(网址:http://www.pylint.org/; 上次访问时间:2018年2月11日),用于改进Python脚本

  • 系统测试软件

  • 将您的实现与其他独立实现进行比较

  • 使用不同的编译器和编译器版本编译和测试软件

理想实践

最后,如果我们打算更进一步,我们可以考虑如何为飞机自动驾驶仪等关键系统设计软件。通常,向两个或三个完全独立的软件开发团队提供规范。然后,他们都使用不同的编程语言开发符合这些规范的软件。然后,给定一系列输入参数,比较所有三种独立实现的输出。这极有可能确保自动驾驶仪符合规范。尽管规范本身可能不正确,也可能不涵盖所有情况,但我们必须记住这一点。例如,考虑1993年9月华沙A320跑道超限事件。由于某些参数组合(规范中未涵盖),飞机着陆后不能立即启动刹车和反推装置(拉德金2000). 尽管如此,该系统仍按照其规范工作。

因此,在我们的领域中,任何新工具的结果都应该非常谨慎地对待,直到至少有一个额外的、独立的实现可以产生类似的结果。此外,这种独立的替代实现还可能揭示工具所基于的规范/理论中的错误。这方面的一个例子是检测到贝叶斯推断的错误黑斯廷斯比率计算(霍尔德等人。2005)在这样一个独立的实施过程中,它被解开了。我们认为,这种比较独立实现结果的策略(例如,PHYML、IQ-Tree、RAxML用于最大似然或ExaBayes、MrBayes和PhyloBayes用于贝叶斯推理)代表了一种有价值的方法,可以提高我们对这些工具正确性的信心。在两个独立开发的用于检测系统发育树空间阶地的工具中,我们直接应用了这种方法(Biczok等人。2017)。

与此相反,像R这样的社区项目非常成功,但R也代表了单一的失败点。也就是说,R核心模块中的错误可能比MrBayes或RAxML中的错误具有更大的下游影响。为此,我们提倡裁员这个提高对正确性的信心的机制。

政策问题

迄今为止,我们分析的16个代码已累计超过90000次引用(不包括描述更新版本的所有论文)。有人可能会争辩说,考虑到潜在的编程或概念错误可能会对已发布的结果产生灾难性影响,使用这些代码生成论文所用的资金与维护和改进这些代码所花费的资金不成比例。

对于那些能够维护和改进主要研究人员或博士毕业后离开学术界的学生开发的代码的程序员来说,显然缺乏可持续的资金。首先,一个人受到大学或公共部门工资计划的限制,因为工资太低,无法雇佣优秀的程序员。其次,目前的资助计划不允许无限期雇佣程序员。

如果科学代码快速累积引文,可以考虑分配临时资金用于重新设计科学代码,以提高可维护性。这可以扩展到资助新兴模型和方法的几个独立冗余实现。与代码正确性的质量和概率方面的潜在收益相比,这样做的成本很小。

另一个问题是,科学软件开发本身的资金不足。许多资助机构并不认为科学软件开发是“真正的”研究,因此很难获得资金支持。具有讽刺意味的是,大量资助的研究项目(例如,搜索术语“系统发育”和“Deutsche Forschungsgemeinschaft”的共现性,在谷歌学者中产生了~17800个结果)依赖于此类工具的可用性。

因此,由于对计算工具的依赖不断增加,我们认为需要新的资金计划来开发新的工具,并提高现有软件的质量和正确性。此外,用户社区必须意识到,虽然当前的工具是免费可用的,但它们只是在尽最大努力的基础上开发的。有过多的错误源,因为我们根本没有时间和资源来正确地实现它们,有时甚至会完全重新设计它们。

或者,可以考虑采用商业方法并提高许可费,以用于提供支持和维护。这样做的一个缺点是,发展中国家的研究人员可能负担不起许可证费用。此外,根据我们销售PEAR软件非学术许可证的经验(Zhang等人。2014),许可证管理可能非常耗时。其他潜在的许可模式包括众筹、有偿使用策略,或提供基本、免费和高级的非免费版本的工具(例如,包括图形用户界面)。

结论

我们对广泛使用的进化生物学软件提出了一个初始的、简单的软件工程质量评估。我们表明,通过使用简单的技术和工具,现有软件的质量已经可以提高。我们还提供了未来软件开发项目的最佳实践列表。此外,我们解决了问题,并提供了与数字再现性(或缺乏数字再现性)相关的真实世界示例,以提高用户社区对这些问题的认识。人们还必须记住,考虑到NGS数据海啸,在程序性能和可维护性之间存在明显的权衡。像RAxML这样的程序显式地使用向量内部函数在标准笔记本电脑/服务器处理器体系结构上实现最大性能,因此很难维护。由于复杂性的增加,它们比费尔森斯坦剪枝算法的简单、天真的实现更容易出错(费森斯坦1981)。

此外,我们强调,在我们的领域中广泛使用的软件目前的令人担忧的状态并不是开发人员的错,而是由于软件开发、改进、维护和支持方面缺乏可持续的资金。如果考虑到用于生成数据的资金与用于提高分析这些数据的软件质量的资金之间的不均衡,这一点尤其正确。我们还就期刊、编辑和审稿人如何在审核过程中采取措施提高软件工程质量提出了建议。此外,由不同团队独立开发软件,并对结果进行比较,可以大大有助于确定正确性,而不仅仅是我们在这里讨论的质量问题。

我们确信,在组件数量不断增加的漫长而复杂的NGS数据分析管道时代,软件工程质量问题对该领域的成功至关重要。因此,只要没有额外的努力来提高软件工程质量,并且考虑到目前工具的质量不令人满意,用户就不应该将进化分析工具视为黑匣子,而应该将其视为潜在的潘多拉盒子。除了提高软件工程质量外,我们还需要在未来对代码产生的结果进行系统验证方面投入更多精力。

补充材料

补充数据可在分子生物学与进化在线。

致谢

我们要感谢Volker Springel、Bastien Bousseau和Tracy Heath对该项目的建议和讨论。我们还要感谢我们在KIT的软件工程同事Ralf Reussner,感谢他进行了深入的讨论。我们特别感谢Mark Holder对这份手稿的早期版本提出了非常有用的建议和评论。我们要感谢斯蒂芬·金登(Stephane Guindon)和弗雷德里克·隆奎斯特(Fredrik Ronquist)对这份手稿初始版本的审查。这项工作由克劳斯·奇拉基金会资助。

工具书类

阿卜杜勒马利克
NN.编号。
1971
.
Gram–Schmidt方法的舍入误差分析及线性最小二乘问题的求解
.
位数字。数学
.
11
4
:
345
367
.

男爵
L(左)
,
威廉姆斯
J型
,
米克洛斯
D。
2017
.
未满足的生物大数据分析需求:对704名国家自然科学基金会主要研究人员的调查
.
公共科学图书馆计算生物学
13
10
:
电子1005755
.

比佐克
R(右)
,
博兹索基
P(P)
,
艾森曼
P(P)
,
恩斯特
J型
,
里比泽尔
T型
,
舒尔茨
F类
,
Trefzer公司
A类
,
韦伯
F类
,
哈曼
M(M)
,
斯塔马塔基斯
答:。
2017
.
两个C++库用于计算系统发育平台上的树
.
生物Rxiv。
https://www.biorxiv.org/content/early/2017/11/02/211276.

布里昂
信用证
,
瓦斯特
J型
,
伊科诺莫夫斯基
SV公司
,
卢尼
H。
1999
调查面向对象设计中的质量因素:工业案例研究。摘自:《第21届国际软件工程会议论文集》,ACM。第345–354页。

布里昂
信用证
,
瓦斯特
J型
,
戴利
JW公司
,
搬运工
数字电视。
2000
.
探索面向对象系统中设计度量与软件质量之间的关系
.
J.系统。Softw软件
.
51
:
245
273
.

卡萨尔诺沃
C类
,
德凡布
P(P)
,
奥利维拉
A类
,
菲尔科夫
V(V)
,
B。
2015
.Assert在github项目中的使用。摘自:第37届国际软件工程会议论文集——第1卷,ICSE’15,皮斯卡塔韦(新泽西州):IEEE出版社。第755-766页。

TY公司
,
张(音译)
联合国安全理事会
,
山猫。
1998
变形测试:生成下一个测试用例的新方法。技术报告,技术报告HKUST-CS98-01,香港科技大学计算机科学系,香港。

TY公司
,
JW公司
,
线路接口单元
H(H)
,
十、。
2009
.
使用变形测试测试生物信息学程序的创新方法
.
BMC生物信息学
.
10
1
:
24

德拉蒙德
阿杰
,
兰伯特
答:。
2007
.
BEAST:基于采样树的贝叶斯进化分析
.
BMC演变。生物
.
7
1
:
214

费尔森施泰因
J。
1981
.
DNA序列进化树:一种最大似然方法
.
J.摩尔进化
.
17
6
:
368
376
.

弗莱彻
,
Z.公司。
2009
.
INDELible:生物序列进化的灵活模拟器
.
分子生物学。进化
.
26
8
:
1879
1888
.

吉安努拉图
E类
,
公园
S-H公司
,
汉弗莱斯
DT公司
,
JW公司。
2014
.
无黄金标准的生物信息学软件验证与确认:以BWA和bowtie为例
.
BMC生物信息学
.
15
(
补充16
):
第15节:。

戈德伯格
D。
1991
.
每个计算机科学家都应该了解浮点运算
.
ACM计算。Surv公司
.
23
1
:
5
48
.

格林
千兆瓦
,
雷纳
不锈钢
,
斯塔马塔基斯
A类
,
赫姆莱本
五、。
2006
.
用最大似然法、分裂图和606个序列的基序分析推断槭树核糖体DNA系统发育
.
进化。生物信息。在线
2
:
7
.

金登
S公司
,
迪法亚尔
J-F公司
,
勒福尔
V(V)
,
阿尼西莫娃
M(M)
,
霍迪克
,
Gascuel公司
O。
2010
.
估计最大似然系统发育的新算法和方法:评估PhyML 3.0的性能
.
系统。生物
.
59
:
307
321
.

希思
,
韦尔森贝克
日本
,
斯塔德勒
T。
2014
.
发散时间估计一致校准的僵化出生-死亡过程
.
程序。国家。阿卡德。科学。美国
.
111
29
:
E2957型
E2966型
.

霍尔
汽车。
1969
.
计算机编程的公理基础
.
Commun公司。ACM公司
12
10
:
576
580
.

持有人
机器翻译
,
刘易斯
人事军官
,
斯沃福德
DL公司
,
拉尔热
B。
2005
.
贝叶斯系统发育学中LOCAL建议的黑斯廷斯比率
.
系统。生物
.
54
6
:
961
965
.

哈德逊
右后。
2002
.
在Wright–Fisher遗传变异中性模型下生成样本
.
生物信息学
18
2
:
337
338
.

贾维斯
预计起飞时间
,
米拉拉布
S公司
,
阿贝勒
阿杰
,
B类
,
胡德
P(P)
,
C类
,
SY公司
,
Faircloth公司
不列颠哥伦比亚省
,
纳布霍尔兹
B类
,
霍华德
JT公司。
2014
.
全基因组分析解决了现代鸟类生命树的早期分支
.
科学类
346
6215
:
1320
1331
.

约翰逊
SC.公司。
1977
.Lint,一个C程序检查器。Citeser。

尤尔根斯
E类
,
戴森博克
F类
,
Hummel公司
B类
,
瓦格纳
美国。
2009
代码克隆重要吗?参见:2009年IEEE第31届国际软件工程会议。ICSE 2009。电气与电子工程师协会。第485-495页。

卡马利
AH(AH)
,
吉安努拉图
E类
,
TY公司
,
查尔斯顿
妈妈
,
麦克尤恩
美国铝业公司
,
JW公司。
2015
.
如何测试生物信息学软件?
生物物理学。利润
.
7
:
343
352
.

加藤
K
,
斯坦德利
DM公司。
2013
.
MAFFT多序列比对软件版本7:性能和可用性的改进
.
分子生物学。进化
.
30
4
:
772
780
.

科兹洛夫
调幅
,
阿贝勒
阿杰
,
斯塔马塔基斯
答:。
2015
.
Examl版本3:超级计算机系统发育分析工具
.
生物信息学
31
15
:
2577
2579
.

古玛
S公司
,
达德利
J。
2007
.
基因组时代生物学家的生物信息学软件
.
生物信息学
23
14
:
1713
1717
.

拉德金
PB。
2000
.飞机事故的因果推理。
In:计算机安全、可靠性和安全
,
柏林,海德堡
:
施普林格
第页。
344
360
.

劳尔
J型
,
劳里
B类
,
莱多夫·汉森
R(右)
,
巴利克斯语
N个
,
穆勒
G。
2010
。使用coccinele查找openssl中的错误处理错误。参见:第八届欧洲可靠计算会议记录,EDCC 2010,西班牙巴伦西亚。第191-196页。

勒普雷沃斯特
预测值
,
巴博萨
风险资本
,
弗朗西斯科
EL公司
,
Perez-Riverol公司
Y(Y)
,
卡瓦略
个人电脑。
2014
.
生物信息学软件开发中的最佳实践
.
前面。基因
.
5
:
199
.

R(右)
,
C类
,
Y(Y)
,
T-W公司
,
Yiu公司
S-M公司
,
克里斯蒂安森
K
,
J。
2009
.
SOAP2:一种改进的超快工具,用于短阅读对齐
.
生物信息学
25
15
:
1966
1967
.

Z轴
,
棕褐色
L(左)
,
X(X)
,
S公司
,
Y(Y)
,
C。
2006
.现在情况变了吗?现代开源软件中错误特征的实证研究。摘自:《提高软件可靠性的架构和系统支持第一次研讨会论文集》,ASID’06,纽约(NY):ACM。第25-33页。

Löytynoja公司
A类
,
高盛
N。
2005
.
带插入序列的渐进多重比对算法
.
程序。国家。阿卡德。科学。美国
.
102
30
:
10557
10562
.

S公司
,
Z轴
,
F类
,
棕褐色
L(左)
,
P(P)
,
年。
2005
Bugbench:评估错误检测工具的基准。In:软件缺陷检测工具评估研讨会。

麦卡贝
TJ公司。
1976
.
复杂性度量
.
IEEE传输。柔和。工程师。
SE-2型
4
:
308
320
.

米索夫
B类
,
线路接口单元
S公司
,
梅塞曼
K
,
彼得斯
RS系列
,
多纳思
A类
,
迈耶
C类
,
弗兰森
PB(聚丁二烯)
,
器皿
J型
,
弗洛里
T型
,
贝特尔
RG公司
等人,
2014
.
系统基因组学解决了昆虫进化的时间和模式
.
科学类
346
6210
:
763
767
.

迈尔斯
GJ公司
,
桑德勒
C类
,
巴格特
T。
2011
.
软件测试的艺术
.
新泽西州霍博肯
:
约翰·威利父子公司
.

尼尔森
R(右)
,
威廉姆森
S公司
,
基姆
Y(Y)
,
胡比斯
美赞臣
,
克拉克
AG公司
,
巴斯塔曼特
C。
2005
.
使用SNP数据进行选择性扫描的基因组扫描
.
基因组研究
.
15
11
:
1566
1575
.

Notredame公司
C类
,
希金斯
DG公司
,
赫林加
J。
2000
.
T-Coffee:一种快速准确的多序列比对新方法
.
分子生物学杂志
.
302
1
:
205
217
.

兰伯特
A类
,
草地
北卡罗来纳州。
1997
.
Seq-Gen:DNA序列沿系统发育树演化的蒙特卡罗模拟应用
.
计算。申请。生物分类:CABIOS公司
.
13
:
235
238
.

罗宾逊
D类
,
污垢
L。
1981
.
系统发育树的比较
.
数学。Biosci公司
.
53
(
1–2
):
131
147
.

龙奎斯特
F类
,
捷斯连科
M(M)
,
范德马克
P(P)
,
艾尔斯
DL公司
,
亲爱的
A类
,
霍纳
S公司
,
拉尔热
B类
,
线路接口单元
L(左)
,
祖哈德
妈妈
,
韦尔森贝克
日本。
2012
.
MrBayes 3.2:跨大型模型空间的高效贝叶斯系统发育推断和模型选择
.
系统。生物
.
61
:
539
542
.

罗瑟
K
,
波茨瓦夫斯基
,
皮东
T型
,
罗瑟
M(M)
,
威维尔
E类
,
布尼基
吉咪。
2012
.
开发生物信息学软件的工具箱
.
简介。生物信息素
.
13
2
:
244
257
.

辛普森
JT公司
,
Wong(王)
K
,
杰克曼
标准偏差
,
Schein公司
JE公司
,
琼斯
SJ公司
,
比罗尔
一、。
2009
.
ABySS:一种用于短读序列数据的并行汇编程序
.
基因组研究
.
19
6
:
1117
1123
.

施普林格尔
五、。
2005
.
宇宙学模拟代码小工具-2
.
月份。不是。R.阿斯顿。Soc公司
.
364
4
:
1105
1134
.

斯塔马塔基斯
答:。
2014
.
RAxML版本8:一个用于系统发育分析和大型系统发育后分析的工具
.
生物信息学
30
9
:
1312
1313
.

威尔逊
G公司
,
阿鲁利亚
D类
,
棕色
计算机断层扫描
,
商行
全国人大
,
戴维斯
M(M)
,
家伙
RT公司
,
哈多克
上海
,
杜兰特
,
米切尔
感应电动机
,
铅灰色
医学博士。
2014
.
科学计算最佳实践
.
公共科学图书馆生物
.
12
1
:
电子1001745
.

威尔逊
G公司
,
布莱恩
J型
,
克兰斯顿
K
,
风筝
J型
,
内德布拉格特
L(左)
,
蓝绿色
TK公司。
2017
.
科学计算方面足够好的实践
.
公共科学图书馆计算。生物
.
13
6
:
e1005510。

山本
Y(Y)
,
中務
Y(Y)
,
鹿岛鹿角
Y(Y)
,
富卡亚
T。
2015
.
choleskyqr2算法的舍入误差分析
.
电子。事务处理。数字。Anal公司
.
44
:
306
326
.

Z.公司。
2007
.
PAML 4:最大似然系统发育分析
.
分子生物学。进化
.
24
8
:
1586
1591
.

Z轴
,
兰纳拉
B。
2010
.
基于多点序列数据的贝叶斯物种划分
.
程序。国家。阿卡德。科学。美国
.
107
20
:
9264
9269
.

J型
,
科柏特
K
,
弗洛里
T型
,
斯塔马塔基斯
答:。
2014
.
梨:一种快速准确的光源配对端读合并
.
生物信息学
.
30
5
:
614
620
.

这是一篇根据知识共享署名非商业许可条款发布的开放存取文章(http://creativecommons.org/licenses/by-nc/4.0/)它允许在任何媒体上进行非商业性重复使用、分发和复制,前提是正确引用了原始作品。如需商业再使用,请联系日记.permissions@oup.com
副编辑: 基思·克兰德尔
基思·克兰德尔
助理编辑
搜索此作者的其他作品:

补充数据