1.2 开源软件供应链的基础知识

1.2.1 开源软件供应链的定义

在研究开源软件供应链之前,首先需要明确软件供应链的定义。学术界和工业界对于软件供应链提出了许多不同的定义。在目前所知的文献中,最早于1995年由学者Jacqueline Holdsworth提出,用于描述软件开发过程中的合作关系。随后,国内外学者从不同角度对软件供应链进行定义。2001年,Lynne F. Baxter和John E.L. Simmons在文章“The Software Supply Chain for Manufactured Products:Reassessing Partnership Sourcing”中提出,软件供应链只涉及供应商和客户,是供应商和客户之间购买软件时存在的二元关系。就职于卡内基·梅隆大学软件工程研究所(Software Engineering Institute,SEI)的Alberts等人,在文章“Systemic Approach for Assessing Software Supply-Chain Risk”中指出,软件供应链是由开发或修改软件产品的利益相关者组成的网络。在2020年发表的文章“Software Supply Chain Security:A Survey”中,He等人定义软件供应链是一个通过一级或多级软件设计和开发阶段来编写软件,并通过软件交付渠道将该软件从供应商传送到最终用户的系统。Du等人在文章“Towards An Analysis of Software Supply Chain Risk Management”中,定义软件供应链是开发软件和组装软件的过程,其中包括从源代码到最终软件交付给用户的整个开发、发布、部署和维护过程。上述对软件供应链的定义仅停留在传统的软件开发和交付的过程上,并未考虑到当前开源协作模式的不断发展导致软件构成和开发过程发生巨变的情况。当今的软件开发更加关注高效和协作,会优先使用已有的第三方组件实现大部分基本功能,并由多个参与方共同扩展和改进软件系统。然而,在这种开发模式下,软件系统的构成也越发复杂,即应用软件将依赖大量的第三方组件,同时第三方组件又依赖更多的其他第三方组件,形成依赖嵌套。以自动化展示报表工具ReportLearning为例,该应用软件依赖poi、jxls等组件,而poi组件又依赖commons-collection4和commons-codec组件,它们之间的依赖关系如图1-1所示。Gao等学者在文章《开源软件供应链研究综述》中,将开源软件供应链定义为开源制品之间在各自开发、构建、发布和运维过程中通过各种形式的代码复用形成的供应关系网络。他们总结了五种开源代码复用的方式,包括安装依赖、API调用、fork、文件拷贝及代码克隆。这些关系很好地反映了开源软件供应链中代码之间的供应和流转,但忽略了开源世界中的其他参与角色,如贡献者。同样以ReportLearning为例,图1-1中的组件和应用软件均由多个开发人员共同贡献代码协作完成。这些开发人员或以个人身份,或者从属于某个组织,他们之间复杂的社会关系同样会对开源软件供应链的运转造成影响。因此,需要对开源软件供应链进行新的定义。

图1-1 复杂的组件和应用软件依赖关系图

本书定义开源软件供应链是指,在开发和运行软件的过程中,涉及的所有开源软件的上游社区、源码包、二进制包、第三方组件分发市场和应用软件分发市场,以及开发者、维护者、社区和基金会等,按照依赖、组合等关系形成的供应网络。