新加坡管理大学的论文《Why reinventing the wheels? An empirical study on library reuse and re-implementation》通过对 GitHub 上的项目进行静态分析和动态分析,收集了重用和重新实现的案例,并对其中的一部分进行了人工验证和调查问卷,研究了工程师在使用第三方库时,为什么会选择重用或者重新实现。发现:重新实现可能会降低代码质量
。
- 重用比重新实现更频繁且涉及更多的代码行数:重用的 commit 数量是重新实现的2.5倍,重用的代码行数是重新实现的3.7倍。
- 重用和重新实现主要发生在一些通用且功能简单的库和方法上:大部分都是一些常见且基础的功能,如字符串处理、集合操作、日志记录等。这些库和方法往往不需要特定领域知识或者复杂逻辑,因此容易被工程师自己实现或者替换。
- 重用主要是因为工程师最初不知道有相关的库或者库还没有被引入;重新实现主要是因为使用的库方法只占了库的一小部分、库依赖太复杂或者库方法已经被弃用:最常见的原因是工程师对于可用库的认知不足或者时效性问题。另外,一些工程师也会考虑到库本身的大小、依赖、兼容性等因素,以避免引入不必要或者过时的代码。
重用可以提高代码质量,减少缺陷数量
;重用可以显著地提高代码质量指标,并减少缺陷修复次数;而重新实现则可能会导致代码质量指标下降,并增加缺陷修复次数。
论文研究的问题和结论
工程师为什么会重用一个库(即用外部库替换自己实现的代码)?
- 工程师用外部库方法替换自己实现的方法是因为他们最初不知道这个库或者这个库还没有被引入。
- 在意识到有一个维护良好并经过测试的库能满足他们的需求后,他们后来用库方法替换了自己的实现。
工程师为什么会重新实现一个库(即用自己实现的代码替换导入的外部库)?
- 工程师用自己的实现替换外部库是因为他们倾向于一开始就选择一个易用的库方法。
- 一旦他们意识到使用的库方法只是库的一小部分,而且库依赖过于复杂,或者库方法已经被弃用,他们可能会转而用自己的代码替换库。
- 库提供商应该让他们的代码灵活和轻量。
工程师在什么情况下更喜欢重用或重新实现代码?
- 有50%倾向于始终重用代码。
- 如果他们需要更高的代码灵活性,工程师也可能想要自己实现代码。
重用或重新实现一个库会对代码质量和维护性有什么影响?
- 库重用可以提高代码质量和维护性,因为库方法通常经过了更多的测试和优化,而且可以减少代码冗余和复杂度。
- 库重新实现可能会降低代码质量和维护性,因为自己实现的代码可能存在缺陷或者不兼容性,而且需要更多的时间和精力来更新和修复。
- 早期发现库重用的潜力可以避免工程师不必要地重新造轮子。
- 库重用和重新实现的频率和规模在不同的项目和领域中有显著差异。
- 库重用和重新实现的原因和影响也受到工程师个人经验、偏好和习惯的影响。
- 库重用和重新实现的过程需要考虑多方面的因素,如库方法的功能、性能、稳定性、可读性、兼容性等。