导语
1997年5月埃里克·雷蒙德(Eric S.Raymond)发表了被誉为“开源圣经”的《大教堂与集市》,开源运动从此有了自己的独立宣言。开源发展至今,从Linus Torvalds、Kenneth Lane Thompson、Richard Matthew Stallman、Eric Steven Raymond等个人英雄的出现,到越来越多的企业组织意识到开源的价值,并加入到开源中,开放、平等、协作、共享的开源模式逐渐成为新一代软件开发模式。开源已成为全球软件技术和产业创新的主导力量之一,尤其到了云时代,开源覆盖了软件开发的全域场景。
本文试图从企业软件的历史,结合开源软件发展规律,介绍软件开发和交付方式的演进过程,分析常见的开源软件开发和使用误区,讨论开源软件的业务模式和生态,以及在云时代下,开源软件和云的结合与相互促进。
1
为什么开源难以回避
1
特征一:开源基础软件的应用广度与深度提升
基础软件是计算产业的“魂”。过去几十年来,随着开源的蓬勃发展,早期开源软件集中在应用侧,但是重要的基础软件,如操作系统、数据库等,依旧采用封闭专有的开发模式和商业模式。
今天,基础软件也逐渐演变成开源、开放方式。97%的软件开发者和99%的企业使用开源软件,基础软件、工业软件、新兴平台软件采用开源成为弯道超车的重要动力。信通院《开源生态白皮书(2020年)》指出,近年来国内企业逐渐侧重基础软件领域开源项目布局,在操作系统、数据库、中间件等领域涌现多个开源项目,其中不乏国际基金会的顶级开源项目。
2
特征二:开源软件创造的价值凸显
开源已成为全球数字科技创新的动力,成长为一种强大的技术创新模式,并从最初的软件行业走向了硬件、芯片、视频、IoT、AI等多个领域,开源的商业模式也在逐渐成熟。如今,新产品在开源,新架构在开源,新平台也在开源,连顶尖的研究成果也都以开源形式发布。开源逐渐成为全球科技进步至关重要的创新方向。
3
特征三:国家对开源软件前所未有的重视
2021年,《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确指出要“支持数字技术开源社区等创新联合体发展,完善开源知识产权和法律体系,鼓励企业开放软件源代码、硬件设计和应用服务”。毫无疑问,开源被提到国家战略层面进行支持,将走上跨越式发展的快车道。
人民银行办公厅、中央网信办秘书局、工业和信息化部办公厅、银保监会办公厅、证监会办公厅联合发布《关于规范金融业开源技术应用与发展的意见》(以下简称《意见》)。近年来,开源技术在金融业各领域得到广泛应用,在推动金融机构科技创新和数字化转型方面发挥着积极作用,但也面临安全可控等诸多挑战。《意见》的出台,有助于规范金融机构合理应用开源技术,提高应用水平和自主可控能力,促进开源技术健康可持续发展。
2
软件的发展与开源的历史
在计算机行业的早期,软件是作为帮助硬件发挥功能的辅助角色存在。在20世纪70年代Unix诞生之前,业界并没有使用高级语言开发操作系统的先例。由于软件不具备通用性,而且软件本身并不作为独立销售实体存在,只是软件开发项目,交付项目的同时交付源代码也是常规做法。客户需要持续维护系统的运行,开发方也不愿意承担软件全生命周期的维护责任。
随着Unix的诞生并且主要以C语言实现,开放的通用操作系统成为可能,软件的开发与授权售卖也随着硬件和软件对兼容性和通用性的追求成为可能。在Unix发展的早期,由于其拥有者AT&T回避进入软件行业的特殊态度(原因是主营电信业务正在严厉的反垄断高压之下,不愿意添加额外的麻烦),在授权给用户使用时,以源代码形式提供并且不提供后续技术支持,允许用户在自己的环境中修正问题和移植到新的硬件平台。这一阶段得到授权的高校、政府和一些商业机构为后续Unix的发展打下了基础,也为后来的Unix纷争和分裂埋下了种子。
进入20世纪80年代,随着计算机的通用性增强与逐渐普及,可以在大量计算机上运行的通用软件逐渐催生了商业软件行业并且持续蓬勃发展。大批软件公司涌现并且时至今日很多仍然是行业巨头,如Microsoft、SAP、Oracle、Adobe等。这个时代的一个特点是随着计算机的使用者从专业人员扩大到普通用户,软件的交付形态逐渐变成了只提供运行态程序而不再提供源代码,销售给用户的也是厂商定义的使用授权,厂商除了销售软件之外,还提供收费的技术支持服务:为客户升级软件、修正问题,为新的设备提供运行环境。消费者作为使用者不再拥有修改运行软件的权限,软件的授权使用与技术支持服务形成了商业软件行业的重要商业模式。
在个人电脑领域,时至今日,客户使用软件的方式没有本质变化。由于绝大部分用户不是软件开发专业人士,不存在自行修改系统或应用软件的需求,这种模式很好适应了用户需求并得以持续。
在服务器领域,Unix阵营发源于AT&T分发的早期代码,SUN、HP、DEC、IBM等基于不同的硬件架构发展了各自的Unix系统,形成了所谓的开放系统的生态格局。通用与兼容的需求催生了后续的POSIX等统一标准,但是Unix的授权与法律条文的模糊性以及后续持有者的态度和野心等导致了大量问题,各种源自Unix的系统分别改成了各家自己品牌分别发展,与Unix主干间也缺乏统一的协调,这种分裂给了WindowsNT巨大的商业机会,发展成了今天的WindowsServer系列操作系统,这些商业操作系统仍然是只提供运行时的使用许可给最终用户,并且提供商业性的技术支持服务。
20世纪80年代,软件行业的另外一个重要事件是自由软件基金会(Free Software Foundation,简称FSF)的成立,在学术与科研机构中,“黑客精神”始终是很多人的追求,对软件极致自由追求的基础是拥有对源代码的修改权。这里不得不说,理查德·斯托曼(Richard Stallman)(对他的各种毁誉不影响GNU和FSF的意义和价值)发起的GNU(GNU is Not Unix)行动重新开发实现了Unix的大部分工具系统,并且以GPL的许可发行这些软件,GPL对衍生软件强制要求持续提供源代码,GNU实现了绝大部分的Unix常见工具体系,但是仍然无法摆脱对Unix操作系统核心的依赖,直到1991年林纳斯·托瓦兹(Linus Torvalds)开始的Linux核心的开发工作填补了这个空白,同样采用GPL许可的Linux核心和外围工具体系一起形成了Linux的生态系统,大批积累了丰富Unix使用与开发经验的高校、科研机构与商业机构的积极参与促成了Linux的快速成长和成熟。
20世纪90年代中期以后,互联网开始蓬勃发展,各种Unix衍生品与Windows NT在起步阶段也支撑了这个发展过程。
随着用户规模爆炸式增长,成本成为一个不可忽视的因素,尤其很多新创互联网企业并不愿意把宝贵的资金消耗在昂贵的硬件设备和僵化的软件授权上。在这个阶段,Intel也从PC的CPU提供者,逐渐进入了服务器CPU的提供者行列,规模优势也使其CPU能力逐渐可以比肩服务器的RISCCPU,这些CPU为运行开放系统的各种Unix服务器提供核心能力,Linux因其不强制收费和开放后续源代码修改的优势,被很多新兴互联网企业选为后台服务运行平台。广泛应用和大规模的部署也帮助Linux持续快速发展,演进成了支持关键业务的服务器操作系统,与此同时,操作系统之上的各种开源系统也得到了广泛的运用与持续发展,逐渐形成了今天互联网巨头们基于开源软件和自研业务软件的普遍现状。
进入21世纪,随着开源软件在互联网领域的广泛使用,同时结合CPU领域Intel的统治地位的逐渐确立和各种封闭式的开放系统的持续衰落,很多商业企业也开始接受开源操作系统和开源技术平台软件,应用场景的丰富进一步促进了各种开源软件的发展,形成了今天仍然激烈竞争的格局。
3
开源软件的定义与许可体系的发展
从字面上看,开源是指开放软件的源代码给使用者,但是单纯提供源代码并不是目前“开源软件”的标准定义,“开源软件”是指,软件向使用者提供源代码并且授予修改和持续演进的自由,因此对修改后的软件再分发在规定上的差异,形成了不同的开源软件许可体系。
目前开源软件的许可体系主要分为两大类:一类强制要求再开源,代表性的有GPL许可体系;另一类不强制要求衍生开源,为宽松开源许可证,代表性的有BSD、MIT、Apache等许可体系。GPL许可体系强制要求下游“发行”时提供源代码,不得改变GPL的兼容性,限制从开源软件转变成非开源软件(但“发行”的定义,存在可被利用的空间)。强制继续开源,又衍生出对服务提供者,尤其是云服务提供者的不同变种许可,如AGPL等。由于限制过多、过于复杂,所以AGPL的接受程度有限。宽松开源许可,要求声明来源并保留原始软件的许可证部分,但不要求衍生部分强制开源。
开源软件判断的具体标准可以参见Open Source Initiative网站的十条原则:一、不限制软件的再次分发的自由;二、提供可用于持续开发的源代码;三、允许在源代码基础上进行修改和开发工作;四、确保原创源代码完整性,变更可以是补丁方式,也可以改变名称或版本号以进行区别;五、不存在针对特定人或人群的差异性限制条款;六、不存在对软件使用领域的限制;七、衍生产品发行时不施加更严格的使用许可限制;八、软件许可在每一个组件级生效而不是仅适用于整体;九、软件许可不扩散到同介质发行的其他软件;十、软件许可不附带影响技术中立的条款。
4
开源软件对软件行业商业模式的影响
开源没有改变软件运行的基本模式
在一个成熟的软件市场上,软件本身的技术支持服务和开发发行本身同样重要,迄今为止无人能够证明一个复杂软件的正确性。软件的质量取决于设计、实现、测试和运行过程中暴露问题的持续修复,开源软件改变的只是开发阶段和发行形态,其他周期软件规律仍然是一样的,尤其是提供给大量非开发者使用的基础平台类软件,完全把技术支持工作交给使用者是不可行的,技术支持能力也直接影响软件可以支持的业务,以顺应软件本身发展的方式支持客户的业务运行并保证服务质量,仍然是软件业务的重要组成部分。
开源成为分布式协作开发模式的典范和推动者
今天的开源软件,更重要的意义是一种协同开发模式,开源软件项目的治理方式也有封闭与开放的差异,开源项目的主导权与管理权有两种常见方式,一种是项目归属于某个基金会组织,如Apache,另外一种是由发起者或创建者为主导的管理模式,如MySQL和Linux核心等。很难用简单的方法判断哪种方式一定就是最好的,但是相对来说,由一个有信用的、有成熟制度模式的非营利组织管理,更容易受到信任和吸引更广泛的参与者。跨组织跨地域的协同在有效支持各种软件能力的持续发展,像Linux核心这样以千万行代码计的软件仍在持续快速迭代,也推动了整个IT行业持续快速发展。
开源不等于免费
开源软件起源于自由软件运动,自由软件选择的Free Software的名字往往被误解为“免费”,其实在这里free的含义是“自由”,开源是软件自由精神的体现。今天即便是承诺完全开源的软件,如Linux,主要的商业化形态仍然是提供有质量保证的发行版和技术支持服务,收取许可费用不是被认可的业务形态。MySQL是一个特例,因为它同时提供不同的软件许可,商业版软件和社区版软件本质上是两个产品,只不过在集中的控制之下共享了社区版的绝大部分代码,根本原因在于MySQL相关的所有知识产权完全属于单一商业实体。
以发行版的方式提供软件和在云上提供服务仍然是主流业务模式
目前绝大部分软件的使用者,都不是软件本身的开发者。系统和平台软件的功能复杂、规模庞大,依靠使用者自行解决问题和持续演进,既不必要也不现实。软件发行版和云服务除了提供单独的软件外,还要进行整体的验证测试和优化工作。这些保证质量和兼容性的工作与不开源的专有软件的发布没有本质差异,而这些工作是软件与运行环境配合运行时不可或缺的,持续的技术支持是软件运行的必要保障手段,认可这些工作的价值也是提升效率和保障系统运行的选择。
5
企业作为开源使用者的挑战
按照工信部对开源生态组成要素的分析,开源生态以五要素、三环节构成。其中以开源项目为中心,依托开源社区协作形成软件、硬件等开源项目。涉及开源贡献者、开源使用者、开源运营者、开源服务者多个相关方,包含开源治理、开源运营、开源商业布局等多个环节,依托代码托管平台等基础设施,满足开源规则要求。
大多数企业是以行业开源者和行业使用者存在,它们所面临的挑战也不尽相同。
IT架构治理的挑战——CIO的视角
不同的企业因为自身IT建设阶段的不同,使用开源软件的方式也各有不同。但不管哪种方式,最终都需要考虑IT架构统一治理。
第一种,新型企业全部业务从一开始就使用开源软件构建。常见于互联网公司和开源达到比较成熟阶段后创立的企业,一般没有形成为软件和软件服务付费的习惯。而且这类公司把IT能力作为核心竞争力,基于开源技术平台构建自身核心业务系统。平台技术团队完全有能力采用开源和定制化修改的开源衍生产品,定制与适配往往由自己的开发团队承担。但随着定制系统的发展和业务重要性的提升,代码改动和软件升级则面临很大挑战,被迫选择持续加大技术投入,或走向避免改动的保守状态,长此以往,便会陷入落后和僵化的局面,技术升级时面临很高的复杂性和影响业务连续运行。
第二种,传统企业局部使用开源软件替换商业软件。常见于成立时间已久的大中型企业,长期使用商业软件享受软件技术服务,对降本增效和技术掌控的追求催生了对开源软件的诉求,新技术与新开发方式也使新的业务发展无法拒绝已经成为平台级技术主流的开源软件。
第三种,经历开源与商业软件之间的选择与切换过程。特定行业在一定发展阶段选择了商业软件,越过发展台阶后重新拥抱开源软件和加大自身研发投入,典型如阿里巴巴,电商业务对交易一致性有很高要求,主要靠关系数据库提供支撑能力。淘宝起步时MySQL可以帮忙跑通,规模快速扩大后依靠商业数据库软件渡过了快速成长期,后续的发展更多依赖分布式架构的支撑能力,随着技术和架构能力的积累,最终用分布式架构消除了对商业数据库产品的依赖,整体技术栈也采用了开源体系并且持续发展。
鉴于开源软件自身的特点、版本路线不同,以及不同应用开源组合的复杂性,不同企业有选择不同企业级技术架构路线的权利,但都需要考虑避免在开源的使用上重复造轮子。
自主可控的挑战
“自主”的含义大致有两种理解。一种是指采用主权范围内厂商具有完全知识产权掌控力的软件,不受国外产品和服务体系供应的限制,因此这里的“主”是指的国家主体;另一种“主”是指的企业本身,企业可根据自主意志,按自己的需求、想法,在不违反授权的情况下,自由地修改和使用软件。
“可控”对应的是“卡脖子”,无论是开源社区还是商业授权的软件。一些企业想从现在开始就不再采购开源软件的商用发行版和商业服务。诚然,集中精力自己研发、自己把控,在特定的场景上,放弃外部的商用依赖,另起炉灶,做出一套完全自主的产品,这样的成功例子是有的,部分企业也真的做到了,但这毕竟是极少数;客观上,这种做法也需要有大量优秀的软件工程师,并且在开源软件上积累了大量的经验,才能够实现,如果软件业务不是主业,长期也有很大挑战。
对大多数企业而言,要想做到自主可控、规避风险,需要对运行和依赖的软件的适度掌握,最好能仔细钻研开源软件的代码、架构、测试,即便不能,也要一定程度掌握关键的验证能力和调试能力,结合软件的升级和部署能力,确保可以应对紧急问题。这里的诀窍就是,与软件产品的主流社区协同,通过学习和模仿快速构建自身能力。因此,企业不仅不应该切断与开源厂商的联系,相反,自己越是有可能面临风险,越应该广泛建立与开源商业生态体系的联系,除非这种联系真的被外部客观不可抗拒原因所切断。
成本可控的挑战
大多数开源软件的成本,都是隐藏的,来自持续的质量控制、升级和运维服务的成本。开源软件本身也是软件产品,也会遵从软件的基本规律,使用大量开源软件组合对于技术支持能力的要求非常高。虽然广泛使用的开源软件的质量和可靠性水平都很高,但是靠单一企业内部的技术力量支持海量源代码产品的持续运行难度非常大,只有少数把IT作为核心竞争力的巨头才有可能为自己的业务提供非常高的稳定性保障。
虽然各企业在数字化时代都在不断加大IT投入,但是仍需要避免一个认知误区:某个单独软件的授权成本,并不是投入的全部,后续支撑性投入才是重头戏。企业必须超越简单的底线成本模型或ROI计算逻辑,站在业务视角看整体成本。
安全的挑战
开源软件漏洞数量的上升,可以归因于开放源组件的广泛采用。过去几年开源社区的大量增加,以及媒体对最近一些数据泄露事件的报道,使得人们对开放源代码安全的关注提高。根据统计数字,84%的开源代码库至少含有一个漏洞,60%的已审核代码库包含高风险漏洞。2021年12月,最新的log4j2的远程代码执行漏洞就是典型的事件,该漏洞影响巨大,一旦被攻击者利用会造成严重危害。开源软件安全问题多被认为是源于管理上的疏漏。主要体现在:一、开源软件使用者更新不及时;二、开源项目缺少如SDL这样的流程和管理工具;三、攻击者对开源生态的攻击增加。
合规的挑战
以对合规要求最为严格的金融行业为例,《关于规范金融业开源技术应用与发展的意见》明确提出:金融机构应当遵循开源技术相关法律和许可要求,合规使用开源技术,明确开源技术的使用范围和使用的权利与义务,保障开源技术作者或权利人的合法权益。
考虑到开源的合规性,源码的授权模式变得至关重要。为了主动发现问题,起步阶段可以考虑采用集中扫描的方式,在企业内对使用的软件版本发布前批量进行源码开源合规的扫描。但是随着开源软件日益广泛使用,一方面扫描本身是一个复杂过程,另一方面一旦发现问题留给开发人员修复问题的时间太短。如何能高效地统计企业内开源产品许可情况和使用情况、快速修正不合规的使用,形成企业开源软件合规一览表,是目前企业使用开源软件合规性所面临的重大挑战之一。
6
企业作为行业开源者的挑战
构建生态的挑战
早期的开源社区运营,并不能很好地反映开源技术在各行业各企业的实际应用情况。目前,开源社区与基金会的运营更看重产业沟通和用户分享,软件产品基于云的使用量统计可能形成一个新的生态运营机制。
商业模式的挑战
开源产品的商业模型基本上融合了以下四种模型:开放核心(Open-Core),同时提供差异化的商业产品;专业服务(Professional Services);托管(Hosting);市场(Market place),提供应用商店、应用市场、插件。
对于成功的开源公司来说,最常见的模式是开放核心产品,将托管、服务作为第二和第三收入来源。这些组合可能在某一时期对开源产品或某一行业来说是有效的。不过随着市场竞争和客户的不断变化,这些模式可能都不适用,可能需要为自己产品找到独特的商业模式。而传统线下的软件销售、分发和交付模式,很难成为开源的商业模式。
7
云时代企业使用开源软件的变化
云计算带来的变化
客户从购买软件自己负责整个使用过程,转变成直接使用服务,不需要关注服务之外的支撑细节。客户对于软件本身相关的商业条款敏感度下降,服务包装后的不透明性也会削弱使用者对软件开发的参与程度,尤其是确保运行和能力提供的责任会转移到云计算的提供者。
广泛使用的开源软件许可制定时间较早,当时云计算还没有出现或没有形成大影响,许可条款主要针对的软件以发行为主的情况。云服务尤其是封装后的PaaS服务包含的软件,规避了GPL这样的强制再开源的义务,开源衍生出的云服务一定程度纵容了云厂商减少对开源软件本身的贡献和分享。
互联网巨头们广泛使用开源软件的成功经验和公共云的持续发展已经证明了绝大部分场景下闭源的基础设施和支撑平台类软件不再具有普遍的发展前途。
云与开源协同发展
没有客户希望自己被特定供应商绑定,公共云也是一样,支持应用运行的基础平台也从软件年代的操作系统和数据库演进到了容器调度,混合云作为一种会长期存在的支撑方式也会持续发展。基于这些条件,云平台应该提供的是一种通用的开放技术,在应用使用的功能性接口方面,遵守标准的通用性,不限制应用的可迁移性;在下层的运行引擎方面,提供差异化的非功能支撑,帮助客户更有效地实现业务目标;结合具有自身特色构建的关键领域差异化服务能力,如数据库等,为用户提供敏捷灵活的开发能力和稳定高效的支撑能力。
主流云计算厂商正在企业IT市场发挥越来越大的作用,主流开源软件与云平台的有效集成是云平台的重要能力体现。开源技术也是云服务未来的发展方向,积极有效的参与主流开源项目是云厂商的重要机会。大型云厂商投入人力和资金帮助开源项目持续发展,有助于云技术能力得到有效发挥。
对于使用者来说,市场上主流云平台在容器、中间件和数据库这些主要技术能力方面,提供的功能一致性远远高于客户自主搭建。用户在设计自己的业务系统时,也要充分考虑对技术平台的不同层级的抽象和管理,减少对特定管理能力的硬性绑定。应用想要实现在不同云平台之间一行代码都不改的切换并不现实,但是追求云特有能力不侵入应用代码而只是在管控层面发挥作用,应该是现实可行的做法,这也是平台中立的云原生追求的方向。
公共云和各种形态的混合云是未来IT能力的主流承载形式。开源软件已经证明自身是平台技术软件有效的、主流的发展形态,云计算与开源的结合会成为必然趋势。开源软件以不同程度托管在云上运行,提供技术能力,会是未来企业IT面临的主要选择。不同的托管程度,在管理层和云集成程度的差异,运行时的优化能力,都会是云服务的差异所在,更强的管理能力集成往往会伴随更深的运行优化和更少的管理需求,提供的服务也会具备更强的自主运行能力,形成的结果就是PaaS类服务,如数据库等,客户也会选择自行部署和管理,这种情况下云基础设施需要提供足够开放性供客户自己集成。
同时基础设施的服务能力也会直接反映在最终服务和业务应用的整体性价比上。软件尤其是技术平台软件,需要大量的测试验证和优化调整,来达到稳定性和性价比的最优,公共云的运行环境及其支持的海量、差异化客户场景,为软件的成熟提供了最佳的环境。大型公共云厂商也是未来有能力投入软件开发验证和持续支持服务的最重要资源池。除了优化之外,保持托管的软件服务本身的开放性和兼容性,是非常重要的努力方向,以运行效果而不是黑盒方式吸引并留住客户会成为云平台的核心竞争力。
云计算的持续发展为开源软件提供了新的舞台,云平台与开源社区有效合作,并且避免锁定,来获得用户的信任,是云平台开放性的重要体现,也会是未来IT行业持续发展的支撑力量。
结语
总体来说,云自诞生开始与生俱来的特性以及不断发展的能力,天然就具备了解决企业可持续的使用开源软件所带来的挑战。
目前,云被证明是最好的企业IT架构治理的平台,这个治理包括对开源技术的治理。
云平台能够更好地集中解决安全与合规的问题,针对不同的开源软件合规扫描、漏洞扫描、升级等等。
云原生的发展使得各个不同的基础开源软件和创新开源软件的技术融合,云时代开源软件的可观测性、开发效率和管理效能大大提升。
云厂商本身就是开源最大的使用者、最佳实践,可以帮企业管理屏蔽试错风险。
云平台天然是一个协作平台,可以让开源贡献者、开源使用者,在云上互通需求驱动发展。
新的时代,开源的发展越来越蓬勃,开源和云的关系越来越复杂,耦合度越来越高,云是开源软件允许的最佳环境之一,为开源软件插上安全高效的腾飞引擎。
作者:韩鸿源
阿里云新金融&互联网事业部
首席架构师
曾担任OceanBase解决方案总经理,及Oracle数据管理解决方案高级技术总监。熟悉企业级软件、数据管理以及云原生技术领域,有着二十余年带领团队服务运营商、金融及大型互联网企业及机构的丰富经验。
编辑:阿里云研究院内容运营主管 赵子千