开源技术在云计算领域得到了广泛使用。在云计算时代,开源已经不仅是一种开放源代码的软件产品,而已经成为一种方法论、一种构造大规模复杂软件的协作方式。本书中很多章节的实践部分正是基于一些著名的开源软件展开的。因此,本节将主要围绕开源的相关内容给读者进行简单介绍。
开源,即开放一类技术或一种产品的源代码、源数据、源资产等,可以是各行业的技术或产品,其范畴涵盖文化、产业、法律、技术等多个社会维度。如果开放的是软件代码,一般被称作开源软件。开源的实质是共享资产或资源(技术),扩大社会价值,提升经济效率,减少交易壁垒和社会鸿沟。开源与开放标准、开放平台密切相关。
开源软件是一种版权持有人为任何人和任何目的提供学习、修改和分发权利,并公布源代码的计算机软件。开源软件促进会(Open Source Initiative,OSI)对开源软件有明确的定义,业界公认只有符合该定义的软件才能被称为开发源代码软件,简称开源软件。这称呼源于埃里克·雷蒙德(Eric Raymond)的提议。OSI对开源软件特征的定义如下:
开源软件的许可证不应限制任何个人或团体将包含该开源软件的广义作品进行销售或者赠予;
开源软件的程序必须包含源代码,必须允许发布源代码及以后的程序;
开源软件的许可证必须允许修改和派生作品,并且允许使用原有软件的许可条款发布它们。
开源许可证是一种允许源代码、蓝图或设计在定义的条款和条件下被使用、修改和/或共享的计算机软件和其他产品的许可证。目前经过OSI认证的开源许可证共有74种,而最重要的仅有6~10种(最主要的2种是GPL、Apache)。在开源商业化的浪潮下,适度宽松的Apache等许可证更受欢迎。
自由软件是一种用户可以自由地运行、复制、分发、学习、修改并改进的软件。自由软件需要具备以下几个特点:无论用户处于何种目的,必须可以按照用户意愿,自由地运行该软件;用户可以自由地学习并修改该软件,以此来帮助用户完成用户自己的计算,作为前提,用户必须可以访问到该软件的源代码;用户可以自由地分发该软件及其修改后的拷贝,用户可以把改进后的软件分享给整个社区而令他人收益。
免费软件是一种开发者拥有版权,保留控制发行、修改和销售权利的免费计算机软件,通常不发布源代码,以防用户修改源码。
广义上认为,自由软件是开源软件的一个子集,自由软件的定义比开源软件更严格。同时,开源软件要求软件发行时附上源代码,并不一定免费;同样免费软件只是软件免费提供给用户使用,并不一定开源。开源软件、自由软件和免费软件之间的关系如图1.14所示。
图1.14 开源软件、自有软件和免费软件的关系
开源软件市场应用广泛。据Gartner调查显示,99%的组织在其IT系统中使用了开源软件,同时开源软件在服务器操作系统、云计算领域、Web 领域都有比较广泛的应用。
开源软件市场规模稳居服务器操作系统首位。根据《Linux内核开发报告2017》显示,自从进入Git时代(2005年2.6.11发布之后),共有15637名开发者为Linux 内核的开发做出了贡献,这些开发者来自 1513家公司。全球公有云上运行的负载有90%是Linux操作系统,在嵌入式市场的占有率是62%,而在超算的市场占有率更是达到了 99%,它运行在世界上超过 82%的智能手机中,也是所有公有云厂商的主要支撑服务器(90%)。
开源软件在云计算领域使用也非常广泛。云计算领域开源目前主要以IaaS和PaaS两个层面为主, IaaS有OpenStack、CloudStack、oVirt、ZStack等,PaaS层面有OpenShift、Rancher、Cloud Foundry以及调度平台Kubernetes、Mesos等。2017年的 OpenStack User Survey 显示:2017年,OpenStack全球部署将近1000次,比2016年增加95%;亚洲超越北美成为OpenStack用户分布最广的区域。除IT以外,OpenStack在其他行业也得到了广泛使用,名列前几位的用户行业为电信、研究、金融和政府。2013年Docker发布之后,技术日渐成熟。截至2014年年底,容器镜像下载量高达1亿次;到2017年年初,这一数量超过80亿次。
开源软件在其他领域的广泛应用还包括大数据、SDN与网络功能虚拟化(NFV)以及人工智能领域。例如大数据基础分析平台有Hadoop、Spark等,NFV方面有OPNFV,人工智能方面则有TensorFlow。
开源有效促进技术创新。开源模式可以有效实现信息互通,获得关键技术的最新源代码,利用全球技术资源快速推动技术发展迭代,打破技术壁垒,推动新技术普及。
开源可以实现软件自主可控。开源更加透明和公开,建立我国开源软件产业,既能够有效保障信息安全,实现自主可控,又可以保证信息安全更易治理,产品和服务一般不存在恶意后门,并可以不断改进或修补漏洞。
开源促进教育和科研事业发展。开源为高校师生提供了更多自主学习的资源,学生能够直接、迅速地加入开源项目中,技术水平不断提高,经验不断丰富。
开源促进行业信息化发展。开源模式可以有效降低应用成本和技术门槛,加快企业的信息化发展,从而促进我国经济的蓬勃发展。
软件厂商借助开源技术降低研发成本,通过开源社区参与技术交流,熟悉开源技术使用方法,便于跟踪开源技术版本更新,根据业务需求进行适配。
知名开源项目均有业界高水平研发人员的参与,其源码在编码风格、算法思路等方面有许多供技术人员借鉴的地方。软件厂商研发人员在使用开源项目或基于开源项目进行二次开发的过程中,可以通过阅读源码等方式学习解决问题的创新方法。
软件厂商将项目开源后,项目的用户范围更广,应用场景更复杂,研发人员在开发时不能只考虑本公司的业务需求和人员使用情况,需更加注重代码兼容性、规范性等问题。
企业用户可在开源技术基础上进行定制化开发。终端用户信息系统需要实现的功能各有不同,相比闭源软件,开源软件更灵活,定制化程度更高,终端用户企业可在开源代码的基础上做二次开发,实现特定场景和特定功能的需求,避免绑定风险。
使用开源技术,让企业专注于创新。随着更多的业务资源摆脱了开发软件的束缚,企业的焦点转向创新。创造力在中小型企业中蓬勃发展,因为它们更能够创造竞争力的替代技术和专有软件,从而使自己获得比竞争对手更具有独特性和前瞻性的思维。
企业自主开源能够有效提升研发效率,提高代码质量。项目开源过程中可以吸引优秀的开发者和用户参与到代码贡献中,注入更多新鲜血液,让项目不断发展。与此同时,开源项目部署在不同的应用场景,可以暴露出项目更多的问题,节省测试成本。
企业自主开源能够引领技术发展,建立以开源企业为核心的生态圈。开源项目运营过程中,可以吸引潜在用户使用开源软件,让业内更多的企业、开发者了解开源项目所属企业的技术发展情况,通过开源技术建立提供商和用户的上下游生态圈,及时了解用户需求,抢占商业版图,带动企业良性发展。
开源的发展历程大致如图1.15所示。
图1.15 开源发展历程
1969年,AT&T贝尔实验室研发出UNIX,在AT&T将其商业化之前,UNIX的代码被UNIX社区共享,UNIX诞生为开源奠定了重要的基础;1984年,MIT人工智能实验室资深工程师理查德·斯托曼(Richard Stallman)发起GNU项目,目标是使用自有共享的代码来构建一个UNIX克隆的操作系统,绝大多数GNU项目,均是斯托曼在1984年开始构建的,今天仍处于自由和开源软件生态系统的中心位置;1985 年,斯托曼创建自有软件基金会;1991 年,加利福尼亚大学伯克利分校发布Net/2 BSD操作系统,即自由的类UNIX操作系统,发布后由于法律问题,没有得到大规模推广;1991年,Linux内核出现。
1995年,Apache诞生。20世纪90年代,Web软件还处于封闭专有的状态,1995年一组由系统管理员组成的开发团队开始协作构建叫作Apache HTTP服务器的软件,它是基于国家超算应用中心的一款Web服务平台。1996年,Apache已经占据了Web服务器大部分的市场份额,1999年Apache基金会成立。
2000年以后开源体系开始向移动和云领域延伸,Google等企业开始在移动互联网和云计算领域驱动开源,影响技术发展路线和市场格局。
Linux 开发过程中协作最开始是通过邮件,后续迁移到源代码管理平台,Linux 使用的商业的BitKeeper的源代码管理平台2005年不再为Linux提供免费的使用权,托沃兹(Torvalds)编写了Git的工具代替BitKeeper。2008年开始出现一些以Web形式托管的Git代码仓库(如GitHub),Git将开源编码的开放度带到了更高的高度,让每个人都可以快速推出一个开源项目。
随着开源生态的不断建立,企业参与开源生态的热情度不断提升,参与开源的形式可以分为四类:一是企业可以将内部开源项目开源出来,作为开源发起者;二是企业可以贡献代码,反馈社区;三是企业可以通过培训、组织活动等形式作为开源项目的推动者;四是企业使用开源技术,降低研发投入。
发起开源项目有两种模式,一种是公共开源模式,可以是个人发起开源项目,形成开源社区,开放生产,例如Linux,也可以是个人或商业公司捐献给开源基金会,开放生产,例如OpenStack;另一种是商业开源模式,由企业发起开源,封闭生产,例如Android。
项目开源之后,其他企业可以反馈社区,贡献代码。典型的案例是OpenStack。这是一个非常庞大的项目,它由NASA的运维人员发起,现在全球有数百家企业参与开发并提交自己的代码,红帽等企业积极参与代码贡献和社区贡献,带动开源项目良性发展,影响开源项目发展路径。本书第 3章对OpenStack有进一步的叙述。
开源运动重要的影响在于使学习编程更加容易,任何一个新手都可以免费接触到无数的成熟产品的范例作为参考,而新手总有一天会成为一个经验丰富的开发者,反哺开源社区。所以开源社区才得以不断地、可持续地快速发展,而开源文化也成为程序员社区的代表文化。
开源有两方面内容:一是开源软件技术及相关方面,包括开源软件历史、开源软件协议、技术产品、开源社区、相关硬件、技术人员、开源软件相关行业及企业等;二是开源价值观与方法论相关内容,包括开源价值观体系、开源方法论体系、以开源方法论开展的非技术性项目、相关非技术性组织、社区及人员。开源价值观与开源方法论是开源技术贡献给人类的宝贵精神财富。
开源价值观的内涵主要包括奉献精神、感恩意识、开放精神、勇敢精神、追求持续进步的精神、按照劳动获得公平价值回报的精神等六方面内容。
(1)奉献精神
开源技术是一个巨大的知识宝库,我们在享用这个知识宝库的同时,应当知道这个知识宝库正是无数前人的奉献积累而成的,我们也应当传承这种奉献精神。在我们基于这个知识宝库研发出新的智慧成果时,能够将可以共享的智慧成果累加进这个知识宝库,为这个知识宝库的发展做出我们的贡献。
(2)感恩意识
开源技术是无数的、不分国界的技术人员通过几十年的持续积累形成的人类智慧的结晶,现在任何人都可以无偿的享用这个知识宝库,所以我们应当怀有感恩之心。
(3)开放精神
开源技术得到快速地发展,互联网这种开放的平台起到了十分重要的作用。正是由于开放,使共享的成果能够得到广泛的传播。
(4)勇敢精神
开源技术贡献者在将自己的创新成果及源代码公开时,相应技术既可能会被商业软件开发者、应用者剽窃使用,也可能会被众多技术同行研究、比较、挑剔甚至是嘲笑,贡献者要承担较大压力。开源技术贡献者选择了开源模式,彰显了其勇敢的精神。
(5)追求持续进步的精神
在个人研发出成果、开放共享、其他人持续改进创新、继续开放共享的良性循环中,开源技术在持续快速地进步,并到达今天十分成熟的程度。这种基于无数技术人员通过开放共享平台获得持续进步成果的过程,反映了人类追求持续进步的精神。
(6)按照劳动获得公平价值回报的精神
开源技术产品厂商主张以提供劳动服务的方式收取服务费用,而不是通过对软件加密、复制、销售产品的方式获取收入和利润,体现了按照劳动获得价值回报的价值观。当然开源价值观并不反对传统的软件开发、加密、销售商品获利方式,但不主张、不支持通过这种方式持续获得超额利润。
开源也是一种方法论。开源方法论的内涵主要包括通过开放共享促进进步与创新,通过聚集、累积众多参考者的劳动与智慧来解决复杂性、系统性问题,通过社区平台完成开源项目,通过知名企业、个人的有效组织和引导来发展、完成项目等四方面内容。
(1)通过开放共享促进进步与创新的方法
开源技术通过互联网社区的开放平台,使全社会的人都可以来学习、使用其成果和源代码,无数同行的参与,既促进了原有技术项目的完善,也诞生出更多的创新项目。项目的开放、互联网模式带来的海量人员的参与,使这种进步与创新十分迅速与高效。
(2)通过聚集、累积众多参与者的劳动与智慧来解决复杂性、系统性问题的方法
开源模式是一种利用互联网的开放平台,聚集海量人员的劳动、聚集和累积群体智慧解决问题的模式。众多的大型开源项目如一些操作系统、数据库、知名中间件无不是因这种模式而越来越成功、越来越成熟。人们相信,海量人员、群体智慧一定比有限人员的智慧更能够解决问题。
(3)通过社区平台完成开源项目的方法
开源技术的发展,是通过开源社区平台进行的。无论是综合性开源社区平台、专业产品型社区平台,在开源技术发展过程中都起着十分重要的作用。技术的交流、完善、创新,均是通过社区平台实现。
(4)通过知名企业、个人的有效组织和引导来发展、完成项目的方法
在开源技术领域,红帽(Red Hat)等知名开源企业、一大批有影响力的社区高手起着十分关键的促进和组织引导作用。正是这些企业的研发投入,高效地组织与引导工作,以及社区高手的参与工作,才使众多项目在持续完善并逐步成熟。也正是这些企业的市场推广和技术服务工作,以及技术高手持续的努力,才使开源技术逐步走向应用,并且在应用中逐步成熟。
开源价值观是一种具有新时代特征的价值观,开源方法论是基于开源价值观及互联网技术基础上的具有新时代特征的方法论。开源方法论不仅仅可以应用在开源技术研究与发展方面,在解决复杂社会问题方面也可以发挥重要的作用。
开源开发模式为产业模式变革和转型提供了新的途径,开源软件资源则为IT产业发展提供了直接可用的软件技术、工具和产品。开源开发模式的开放性和透明性有助于快速聚集大众智慧,并有效促进技术和应用生态的形成与发展。
目前围绕Linux操作系统、Android智能手机操作系统、OpenStack云平台等著名开源项目形成了众多成功开源生态系统。这些成功开源生态是由广大开源贡献者建立的,其中的社区形成需要社会提供大规模的潜在用户和开发者群体。例如,Android在全球拥有超过14亿的用户,Linux kernel有来自世界各地约1 300个公司、14 000人为其贡献过代码。开源运动发展至今,软件产品的种类越来越多样、功能越来越强大,社区的规模也越来越庞大,相应地,支撑开源开发的工具和技术体系也越来越难以掌握。新的形势对开源软件的进一步繁荣发展带来了挑战,对开源参与者提出了更高的要求。在开源软件开发的参与方面,有研究指出,近年来在知名开源社区中的长期贡献者的数量和比例有下降的趋势。调查发现,在开源产品和技术的应用方面,国际上有相当多的IT公司缺乏掌握开源技术的人才。有效地培养开源人才,壮大开源贡献者的队伍势在必行。
相对于传统软件开发领域,开源对软件人才有着不同的甚至更宽泛的要求,使传统的人才培养体系可能需要适应需求并关注开源人才教育的特定方面。
首先,开源社区的组织及开发模式有别于传统IT企业,厘清开源开发的特点及其对开发人员的能力需求非常重要。在开源软件开发中,参与人员的地理分布范围广、背景及文化差异大,社区的组织相对松散、自主,开发的过程缺少统一、明确的规范,项目的系统化、标准化的设计和描述文档相对缺乏,各个项目间的上下游关系复杂,同类项目间的竞争激烈,项目本身的流行程度变化迅速。近年来,开源运动中又融入了商业公司的参与,由于各方利益相关者可能存在需求冲突并对社区参与者施加影响,使开源开发更加复杂。开源的这些特点需要开源参与者具备理解开源生态和掌握开源技术的开源意识,具备开拓互联网创新应用的创新意识,以及具备贴近应用、技术熟练、善于协作的实践能力。然而,传统软件人才培养体系对开源能力的关注度还远不够,所培养的学生在这些方面所具备的能力与要求还存在较大差距。根据Dice.com和Linux基金会的开源技术就业统计报告,招募开源技术人才已经成为IT招聘经理的第一要务,87%的招聘经理表示开源人才很难寻觅。企业作为开源技术人才的需求者,已经率先有所动作。例如,RedHat 公司积极开展开源教育来提高参与者的开发能力,希望培养更多能够参与开源运动的人才,以促进开源事业的发展。
其次,开源社区的形成和维持跟传统IT组织(或项目)有很大的不同,特别是参与者的驱动力与传统组织中靠行政力约束员工有很大的差异。根据Dice.com和Linux基金会的开源技术就业统计报告,86%的IT专业人士表示开源技术推动了他们的职业发展,但他们最看重的却并非薪酬和待遇。深入认识开源社区中参与者的动因及社区的成因有助于理解如何建立相应的培育措施来吸引和维持合适的开源人才对社区的参与。开源社区中参与者因为各种各样的驱动力而进行贡献,如想要从社区中学习或通过社区贡献来建立声誉等。研究表明,贡献者加入社区时初始的意愿、能力及其环境对他们是否会在社区中长期贡献有统计意义上的重大影响。目前,开源社区和一些商业公司正在尝试一些针对上述发现的举措来吸引和维持人们的参与。例如,为增强贡献者的意愿,GitHub 公司创立了开放、透明的社会化的编程协助模式,极大地调动了人们的参与热情;为营造友好的社区环境, Rails社区引入了Highfive项目,通过自动化的方法引导新的贡献者融入社区。
开源为学习者提供了开放、低成本的跟踪学习机会,但开源的内涵丰富、规则复杂、文化多元和语言差异明显,如何有效地跟踪学习开源仍面临诸多挑战。开源具有开放、自由、分享的基因,引领者鼓励学习者参与其中并做出贡献。开源涉及的内容非常广泛,除了包括开发者关注的技术性内容,如开源软件本身以及开源开发的支撑技术和工具,还包括开源参与的个人、政府、企业需要学习的开源制度、开源规则、开源方法、开源模式、开源文化等。具体来说,开源人才的教育需要包括下述几个方面。
(1)开源文化教育。对开源的认识首先要从理解开源文化开始。开源最初源自自发的源代码学习与分享,后来发展到来自全球的开发者根据开源社区的规则自由地参与进来,既可以对自己感兴趣的软件项目提供外部贡献,又可以把自己的创新想法发布出去,开发者在项目核心团队的引导下,与全球的开发者共同改进开源软件。开源文化有别于传统的商业开发,其基于互联网的“大众化协同、开放式共享、持续性演化”开发模式是开源软件的核心。开源文化的内容主要包括开源社区的形成机理和运转机制及其得以持续生存和发展的机制机理等,同时还包括开源历史、开源共识及开源社区的治理(governance)规则等。开源文化的熏陶对个体自我开源意识的形成至关重要。
(2)开源意识教育。开源作为一种综合了软件创意、生产、分享、使用、培训、创新、营销、生态等内涵的大规模协作活动,其相关意识主要体现为创新意识和开放透明的协作共享意识。创新意识表现为可以在开源技术迭代的基础上,敏锐感知新兴技术的需求并进行快速创造。而协作共享在当前全球分布式开发的趋势下是必备的意识。我们需要开拓传统教育在开源方面的训练,尤其是全球分布式共享协作思维的训练在传统教育中较少涉及。
(3)开源技能教育。开源技能一方面体现为开发者传统的编程能力,另一方面体现为开发者对开源技术和工具的使用能力。开源中存在适合各类场景的技术和工具(如分布式版本管理工具Git和项目托管平台GitHub),涵盖开发的各个过程和步骤。开源技能还表现为分布式环境下的协调协作能力。它跟传统的协作开发能力有所差别,例如协作成员可能从来没有见过彼此(因此缺乏经常见面可以达到的基本信任),还可能有语言和时区的差异等。