本文要点
软件开发过程非常复杂,因此很难理解。
这种复杂性导致了许多没有根据的信念和来历不明的直觉。
对开发过程的最新研究挑战了许多人们普遍持有的信念。
某些研究结果没有那么直观,但它们揭示了开发过程中意想不到的力量。
在软件开发中,非技术因素往往胜过技术因素。
最近,我对项目中使用的编程语言与代码质量之间的相关性进行了研究。我很震惊,因为结果和我的期待恰恰相反。一方面,该研究可能存在缺陷,另一方面,软件开发中的许多既定实践和信念起源不明。我们之所这样做,是因为“每个人”都在这样做,或者它们被认为是最佳实践,或者它们是由“福音传教士”(这个名字本身就是一个警告信号)所宣讲的。它们真的有用吗,还是只是“都市传奇”?如果我们看看硬数据(hard data)呢?我查了其他几篇论文,所有的结果都令人惊讶。
考虑到软件系统在我们经济中的重要性,令人惊讶的是,关于开发过程的科学研究是如此之少。其中一个原因可能是软件开发过程非常昂贵,并且通常由那些不愿意让研究人员进入的公司所有,这使得在实际项目上进行实验变得不切实际。最近,像GitHub或GitLab这样的公共代码库改变了这种情况,它们提供了易于访问的数据。越来越多的研究人员试图深入研究这些数据。
最早的一项基于公共存储库数据的研究发表于2016年,题为《大型生态系统研究:编程语言对代码质量的影响》。它试图验证一个被普遍认为是理所当然的信念,即某些编程语言生成的代码质量要高于其他语言生成的。研究人员正在寻找编程语言与缺陷数量和类型之间的关系。在用17种语言开发的729个GitHub项目中,通过对与bug相关的提交进行分析,结果确实显示出了预期的相关性。值得注意的是,像TypeScript、 Clojure、Haskell、Ruby和Scala这样的语言比C、C++、Objective-C、JavaScript、PHP和Python更容易出错。
一般来说,函数式和静态类型语言比动态类型、脚本或过程式语言更不容易出错。有趣的是,缺陷类型与语言的相关性比缺陷的数量更强。总的来说,这一结果并不令人惊讶,它证实了社区大多数人所相信的事实。这项研究获得了普及,并被广泛引用。需要注意的是,结果是基于统计的,解释统计结果必须要小心。统计上的显著性并不总是具有实际意义,而且正如作者所合理警告的那样,相关性并非因果关系。这项研究的结果并不意味着(尽管很多读者都是这样解释的)如果你把C改成Haskell,代码中的bug就会减少。无论如何,这篇论文至少提供了有数据支持的论点。
Comments