
1.2.2 开源软件供应链的特征
供应链领域的核心任务是,通过研究供应链的特征,找到有效的管理方法,保障供应链系统正常运转,并降低风险造成的影响,开源软件供应链也不例外。然而,目前对于开源软件供应链特征的研究较少,已有研究主要集中在传统软件供应链。而开源软件供应链与传统软件供应链在组成和工作原理方面存在一定的差异性,无法很好地适用现有的研究成果。在已有的开源软件供应链相关研究中,研究点相对分散,缺少整体的、系统性的分析,导致开源软件供应链特征不明确,这进一步导致领域问题不清晰、研究方向不明确等一系列问题。
开源软件供应链是传统供应链、软件工程和开源软件结合的产物,拥有自己特有的性质,而这些特征也在一定程度上决定了其面临的风险。从Christopher对传统供应链的定义可知,供应链是一款产品从原始物料经过多次加工和集成后,最终交付客户使用的过程。如图1-2所示,在这个过程中,至少有以下几种角色参与。
●源头供应商:根据上一级供应商的需求,负责采集或提取原始物料。
●多级中间供应商:根据上一级供应商的需求,负责对原材料或基础工件进行加工,以便形成更符合终端用户需求的工件。
●集成商:根据零售商反馈的需求,将工件组装为最终的产品。
●零售商:和终端用户直接接触,一方面负责产品销售,另一方面负责获取终端用户的需求反馈。
●终端用户:使用产品,提出需求。
●各级仓储:负责暂时保存原材料、工件和最终产品。

图1-2 传统供应链实例
除了图1-2中所列出的角色,供应链中一般还包括生产者。(负责实施具体的生产活动,包括人类、机器设备等)物流商(负责原始物料、工件以及最终产品的运输)等角色。这些角色之间的交互,构成了一个复杂的系统。其复杂性主要包括两个方面:材料流转方向和需求传递方向。材料流转方向指,从原材料逐级加工到最终形成完整产品并交付给终端客户;而需求传递则是沿图中虚线方向逐级反馈。无论是材料还是需求,都需要经过多个层级的传递、扩展和汇总,并涉及多个环节和参与角色,任何环节出现偏差,都会导致整个系统受到影响。
软件供应链是指在软件工程领域中,以供应链相关技术和概念为基础的一种延展模式。尽管流程与传统的供应链类似,但仍存在着一些与该领域特有的差别。从传统供应链的定义容易推导出,软件供应链即最终产品是软件的供应链。使用供应链的语境,就是多个组织间通过协作,将原材料(源代码)转变为完整软件产品的过程。而在软件工程的语境下,软件供应链是传统的软件生命周期管理基础上的进一步延展。软件生命周期主要包括编码、构建、测试、打包、发布、部署和监控等阶段,相应地,管理涵盖源码管理、构建管理、质量管理、打包管理、发布管理、配置管理和运行状态管理等方面。软件供应链则更强调软件的模块化特征,即认为软件生命周期管理应该递归地扩展至软件产品所依赖的第三方模块,以及模块依赖的模块。综上所述,软件供应链的基本组成结构如图1-3所示。

图1-3 软件供应链的基本组成结构
对应传统供应链,软件供应链中的角色和职责划分总结如下。
●开发者:主要负责编码,编码是软件供应链中主要的生产活动者,因此该角色对应传统供应链中的生产者,从属于软件供应商。
●源码仓库:用于保存和管理源码、文档等物料的地方,如Git、SVN等,所有权归属于某个软件供应商,对应传统供应链中的物料仓库。
●构建工具/平台:负责对软件源码进行必要的静态检测和依赖检测,并根据需求执行构建、测试、打包和发布4个步骤。在当前的软件生命周期管理实践中,通常使用持续集成工具将以上6个步骤串联起来作为一个整体,形成生产基础设施,对应传统供应链中的生产设备。
●制品仓库:软件制品通常指不可变的、主要由代码组成或生产的数据块,例如文件、源码包、容器镜像、固件镜像等。对应到传统供应链中,这些制品既可以是中间供应商提供的工件,也可以是零售商销售的产品。开发工具虽然用于生产,但是本质上也应该被视为完整的软件产品,并包含在软件制品中。相应地,制品仓库就是用于存放和管理软件制品的工具,例如包管理工具、镜像仓库等,通常由软件供应商自行搭建和维护。
●软件供应商:通常由开发者、源码仓库、构建工具/平台及制品仓库4个角色组合而成,对应传统供应链中供应商的角色,若软件构建时不依赖任何第三方模块,则为源头供应商,若最终发布的是完整的软件产品,则对应集成商的角色。
●零售商:负责软件产品销售,当软件以光盘等介质进行分发时比较常见,和传统供应链零售商类似。
●终端用户:使用产品,提出需求,反馈问题,和传统供应链类似。
●物流:负责物料和制品的传输,与传统供应链类似。
虽然与传统供应链在流程和角色方面基本对应,但是软件供应链仍然有很多自有的特征主要包括以下几点。
(1)生产自动化程度较低 现阶段,软件仍然主要是人类智力活动的产物,软件的主要创造者是人,虽然有不少研究者尝试通过人工智能的方法生产软件代码,但是距离完全替代人类还有较大距离,因此较难通过引进或仿造、改造生产设备实现自动化流水线般的生产效率增速。
(2)产品复制成本低 软件产品一旦开发完成,再分发只需简单地复制,边际成本几乎为零。
(3)产品迭代速度快 一方面软件产品的更新周期要比其他产品短很多;另一方面,软件产品需要尽早发现自身存在的安全漏洞并及时修复,以将可能的危害降到最低,这导致软件产品的维护成本较高。
(4)物流传输主要通过网络 早期的软件产品主要依靠光盘等介质进行分发,这种方式需要依赖传统的物流手段进行传输;但随着网络基础设施的不断完善,现在大部分软件产品以数字形式进行分发,并且主要借助于网络传输,因此物流成本大大降低。
开源软件供应链的主要特征继承于传统软件供应链,但由于开源软件支持大规模分布式协作开发和允许自由分享、传播和修改的特点,使得其参与角色在职责或组成方面有所不同,主要体现在以下几个方面。
●开发者大多以兴趣为导向参与软件生产活动,不再与软件供应商存在雇佣关系。
●源码仓库、构建工具/平台和制品仓库更多地使用开放的公共服务,而不是软件供应商内部的自建服务。
●软件供应商的组成变得更加复杂,不仅包括一般的软件服务公司,还涵盖了个人开发者、开源社区、大学等不同角色。
●集成商的角色变得更为重要,他们需要帮助供应链下游整合和屏蔽上游的差异,并优化供应链的组成。
●零售商的角色仅存在于基于开源软件构建的商业产品供应链中,对于一般的开源产品而言,几乎不存在销售需求,相反,对宣传和推广的需求更加迫切。
●终端用户在生产过程中的参与度提高了,他们的反馈变得更加重要,是推进软件更新的重要途径。
●开源软件供应链几乎完全依靠网络进行物流传输。
这些差异也为开源软件供应链引入新的特性,主要包括以下几点。
(1)柔性[10]有所提升 一方面,这是因为开源软件的规模逐年扩大。截至2024年[11],较为主流的Java、NPM、PyPI和NuGet生态分别能够提供666 314、4 952 498、603 884和550 385款开源软件供开发者下载。大量的开源软件丰富了下游开发者的选择,能够快速满足各种需求。另一方面,开源软件的生产方式模糊了角色的界限。终端用户不再仅仅是简单地使用软件产品,他们成为了生产过程中的一部分,不仅参与测试验证的工作,甚至可以直接参与到生产活动当中。这种现象能有效缩短从需求到实现再到反馈的周期,加速需求的实现,提升供应链对需求的响应能力。
(2)弹性在有些方面有所提升,有些方面有所下降 改善之处在于开源软件在一定程度上减少了软件产品被某个软件供应商锁定的风险。当供应链某个环节中断时,只需要更换其他功能类似的软件,即可以较低的成本恢复正常运作。然而,开源软件供应商通常不受合同约束,不承诺任何故障修复时间,导致供应中断而又无法找到替代时,软件难以在确定的时间内恢复供应链正常运作。
(3)鲁棒性有所下降 开放的生产方式使得开源软件供应商类型更为复杂,他们可能是个人或者开源组织,也可能是学校、公司等,导致生产质量难以把控,进而降低了供应链的鲁棒性。
(4)脆弱性加剧 开源软件的生产方式降低了参与生产的门槛,促进了知识的传递和共享,但同时也降低了恶意攻击的成本。主要原因是这种生产方式会导致依赖链条明显变长,而供应链中某一节点对全局状态的可见性和可控性有限,使得攻击者更容易对开源软件供应链展开攻击。另外,使用开源软件必须符合其开源许可证的要求,这是开源软件的天然属性,供应链可见性的限制也会导致软件产品面临许可证风险。
综合以上分析,开源软件供应链不仅继承了传统供应链的复杂性,同时也具备生产自动化程度较低、产品复制成本低、迭代速度快及网络物流等软件供应链的特征。此外,开源软件开放的生产方式,使得开源软件供应链,相对传统软件供应链,在柔性、弹性、鲁棒性和脆弱性方面存在差异。