本文由恒丰银行科技总经理张晓丹就开源软件发展发表的公开演讲整理而成。张晓丹先生从开源运动的圣经——《大教堂与集市》一书中获得了灵感,对商业软件的转型发展方向、以及未来云服务世界的版图做出个人预测。
▼
对于开源文化的信徒来说,《大教堂与集市》这本书如同一本指引其前行道路的《圣经》,更是开源运动的独立宣言。这本书的作者Eric S. Raymond忠实地记录了Linux在过去的25年间颠覆传统软件世界、构建程序员心中理想国,并且奇迹般的缔造出成就商业、又超越商业力量的全过程。这不仅是软件工程的奇迹,更是对传统人类社会组织的一次重大重构。
那么,为什么一个本科生Linus Torvalds的业余作品最后竟变成了全世界最流行的操作系统之一?开放是唯一的答案。Linus最聪明和最有价值的成就其实并不是构建出一个Linux内核,而是他发明的这种开发模式。这种全新的开发模式,最终让Linux从一个简陋的集市演变成了孕育今日互联网繁荣世界的壮丽的大教堂。
我们都知道,开源源自于黑客文化。Linus Torvalds本人就是一名著名的黑客。所谓黑客,既有世界的破坏者,而是通过贡献礼物表现出他/她既拥有技术能力又懂得声誉竞争如何运转的人。黑客的典型特点就是崇尚自由,所以他们往往是传统集权垄断独裁反面的先锋,他们钻研技术、追求卓越,渴望有所突破,并且乐于分享,形成了互联网上开源的文化。
开源文化代表了一种颠覆性且具备统治力的潮流。开放式的文化未来会占据主流。Linus用自己的智慧和想象力创造出开源这种创新的开发模式,并且转化为商业上的成功。这个过程是否可以复制和推广呢?
要回答这个问题,我们需要仔细研究一下大教堂式和集市式这两种截然不同的开发模式。
大教堂模式是传统大型软件公司所采用的开发模式,他们追求要有一些核心骨干人员经过严密的组织和论证,就像修建一个金字塔一样一层一层的在严密组织上循序渐进地推进开发,这是强集中式模式,管理比较严密。
集市软件开发模式则是构建一个自由市场平台,大家都在这个平台上贩卖自己的商品,相互之间进行交换,很快就可以发展成为一个生机勃勃的新兴的集市。这个模式是典型的去中心化,实践并行开发,对等地进行同行的评审,强调扁平化。因为开放式的合作可以在一个问题上投入多几个数量级的技术工时,封闭的世界无法赢得这样的竞争。
大教堂模式在创新能力、生产力、质量控制(也就是Bug Fix)这三方面远落后于集市模式(开源模式)。事实上,集市模式提供了一个反管理的模式,通过一个自组织的社区,自发的培育出高质量的软件。
开源的主要特点是什么呢?
第一,开发效率更高。传统的开发模式下,当我们为一个延期项目继续增加人手的时候,结果可能会更糟,因为项目复杂度提升后沟通也随之变得更加复杂,沟通效率的问题无法解决。集市模式就可以很好地解决这个问题,他们把客户引进来,把客户作为合作开发者,听取客户的反馈,从中挑选各种各样客户创新的想法,并且从中挑选最有价值的想法进行采纳和推进。所以它的迭代非常快,特别坚持早发布、常发布,每出现一个版本和更新马上发布。
第二,有效降低风险。拥有源代码控制软件可以缓解传统软件商涨价、强制换代、停产被收购等风险。同时,开源软件很难故意安装后门和漏洞。
第三,提升质量。更多的独立同行对代码和设计进行双重审核。而开发者对自己的作品有着极大的荣誉感,希望在行业内建立一定的名誉和地位。这也在无形中凝聚了开发者提升软件质量的动力。
第四,易于剪裁。开源带来了极大的自由和价值。用户能够按照自己的业务需求定制和个性化开发软件,同时用户的挑错和改进反过来对开源软件也是一种宝贵的贡献。
第五,增加透明度。著名的“Linus定律”说:“只要眼睛多,BUG容易捉”。开源社区中云集了大量的Beta测试者和合作开发者。我们都知道在私有软件中存在很多“阴暗的死角”,而在开源模式中这些死角会被暴露在阳光之下。从内到外开发者视角的源码层BUG报告比一般用户测试级报告更重要。
第六,版权许可与价格的灵活性。开放源代码的模式让软件在版权许可方面比私有软件具有更大的灵活性。用户大量安装时可以获得更少的花费,以及更短的申请采购时间。开源的意义不是说我们不尊重版权,也并不是说闭源不道德,其实变相的还是有商业利益在里面。
毫无疑问,开源创造出了一种全新的生产方式。这种生产方式的创新由使用者驱动,分散决策、并行实施,自上而下地优选最佳解决方案,解决信息不对称给信息资源配置带来的逆向选择问题。
我们需要清晰地认识到,开源本质上并不是一个质量很差的技术体系。我个人早年对开源的印象也不好,我觉得很多创业公司是把国外的开源免费软件拿回来以后改一改就去卖东西了,觉得这事一种不负责任的做法。不过,最近几年我发现,很多企业(包括大型IT企业)都丢弃了自有的云平台,转向OpenStack、CloudFoundry、Docker这些开源架构,而在这些开源生态圈中正孕育着10亿美元估值的独角兽初创企业。
我希望从技术的层面为这样的现象找到答案。后来发现under-engineering(设计不足)和over-engineering(设计过度)的对比可以对这样的现象做出很好的解释。under-engineering是指我们简单地做一个基础架构,然后写一个月的代码去满足客户的需求。这样做的结果是系统的复用性和扩展性差,结构僵化无法灵活应变,修改和维护的成本非常高。
而over-engineering则与之相反,它设计出来的系统相对复杂和臃肿,过度地封装,一大堆无用的集成、接口和方法,具有超复杂的XML配置文件。这也意味着,为了实现这个设计要付出额外的代价(开发维护成本上升、缺陷增多、性能下降等)。
under-engineering和over-engineering如何平衡?本质上核心数据结构还是非常重要的,核心代码还是要注重,宁可选择over-engineering的方式。开源代码的核心部分实际上是over-engineering的,其核心是金字塔模式,而外围是集市模式。首先设计一个完美的核心架构,既要简约又能最大限度地封装可能变化,而外围可以进行大规模的开放,大家在上面不断地完善各种新功能。总之,精巧的前瞻数据结构配上愚蠢的代码,远比逻辑清楚华丽的代码配上愚蠢的结构要好。
互联网、云计算成就了开源软件,大规模的免费服务经济选择了开源。但是我们认可开放和封闭是相对的概念,很多互联网企业采用的是开放的技术,形成的产品又是闭源的。从开源模式的蓬勃兴起,我们可以理清商业软件转型的思路。
软件核心价值是使用价值(服务价值),而不是销售价值。可以预期,因为存在开源,未来任何软件技术的最终命运都是灭亡或成为开源基础架构的一部分。平台级软件最终都会趋于开放,而应用级软件也会向SaaS化转变,变得越来越开放。反“公地”模式也非常有意思。它其实讲的是一个非常简单的道理。如果每个人有一块牧场不够用,中间有一块共用的牧场,大家可以共用,大家绝对是把牛赶到共用的牧场,把那边的草吃光,把那边的地弄荒,才会回到自己家里吃自己的那块牧场。公有的东西肯定是损坏的最快的,这是一个定律。那么为什么在开源世界公有的东西大家会积极地维持它,积极为它做贡献呢?这就是反“公地”模型,我们一块到公地养几头好的牛,以他们为种子,等小牛生出来后一人领一头小牛回家继续发展。这种反向架构的价值在于,通过开源降低成本,同时分散和降低风险。
作为Linux之后最为成功的开源项目,OpenStack的价值已经获得了广泛的认可。这个全球IT供应商和开发者广泛参与的开源云项目满足了企业用户对IT基础设施服务化的实际需求,同时在IT基础设施自动化方面实现了关键性的突破。
我们都清楚,传统的IT架构依赖于专业运维服务。现实中运维工程师的安全生产压力非常大,在企业高度追求可用性、一致性、安全性的同时,反向增加了运维的复杂性,增加了操作风险,降低了系统的敏捷性和扩展能力,大量的工作依靠手工操作。而在云的架构之下,高度重视的是扩展性、敏捷性和服务性,企业能够按需、自主获取服务,敏捷地展开弹性伸缩、支持分布式的扩展,而不是不断地添置昂贵的设备。
传统架构和云架构,是高成本架构与经济型架构的对比。相比于旧IT、过渡IT、新IT的划分,我个人更倾向于传统架构、云就绪(Cloud Ready)架构和云原生(Cloud Native)架构的说法。也就是说,我们的传统应用架构可以过渡到Cloud Ready架构,能够使用云的资源、具备云的特性,但是不一定最终走向Cloud Native的方向。
一些传统应用走到Cloud Ready的阶段就可以了,它们拥有自己的需求和定位。而一些新的应用会直接走到云原生的阶段。Cloud Ready和Cloud Native应该有所区分。传统应用如果能够实现一些DNS改造、实现一些物理位置与具体资源的解耦、实现可分布式扩展和多活的目标,就基本上达到了Cloud Ready的阶段。而新那些新的云原生应用设计的前提是,认定基础设施天生是不安全的,应用层自己解决高可用性、连续性、自身监控、运维等问题。
Cloud Ready架构在保持可用性、一致性和安全性方面的能力对于银行的后端体系来说是非常有价值的。但是前端体系面向大量用户的渠道端,我们适合走向Cloud Native架构。未来的IT架构应该是一种融合架构。融合的技术架构封装一层平台,这个平台实现服务化,让用户按需自助获取服务。
银行这样的传统客户向云架构靠拢,印证了旧IT转型的主要潮流。从传统架构到云架构,我们需要改变头脑中一些根深蒂固的概念。资源的独占、对应用和基础设施的高度依赖、专业系统之间大量的手工对接都需要转向高度的标准化操作,要能够实现共享、分布式扩展、资源动态分配,最终实现整个数据中心架构的自动化、服务化交付。
前面我们谈到了OpenStack的价值,现在说说OpenStack在市场上受到的诟病。从技术的角度,OpenStack主要受到的抨击是版本不稳定,Bug太多。如果你使用的是OpenStack的早期版本,情况恐怕确实如此。但是OpenStack的Liberty版本已经趋于稳定,解决了很多问题。如果你能找到一个好的合作供应商,就能够早日进入一个稳定的版本。毫无疑问,选择一个好的服务商,能够让你的开源实践之路走得更加顺畅,同时企业自己也要向开放的文化转变。
OpenStack之所以复杂,是因为它的本意在于要对系统整体进行一个很好的建模。我们选择OpenStack也是看重它对基础设施的抽象和建模能力,OpenStack构建了一个很好的SOA架构。我们去学习这种架构自身就是收获,将来哪怕有新的云架构来替代它,但这种体系和理念不会丢失,我们学到的东西也不会白费。的确,OpenStack为了满足各式各样的适用性,增加了很多代码和功能,我们会选择使用其中最为核心的功能,比如原生的KVM。只选择最成熟的部件,这是你的本质诉求,同时也需要建立一个强大的软件定义化的团队。
还有人说OpenStack基金会今天已经被大厂商把持了。我个人认为这并不能成为一个问题。我们要看到厂商在追求私利的同时是否也在发展公利?互联网企业也具备互连互通,去兼容外部世界。一些大型厂商在传统数据中心耕耘了很多年,但是存储、网络的自动化做得还是不尽如人意。现在他们把自己的东西放弃了,投入开源的怀抱,集全球力量来实现数据中心的自动化,虽然存在一些问题,但肯定是在进步。
有的厂商说:“我们的云没有用OpenStack,它太复杂,而我们的架构却很简单,代码也很精简。”我却看到了这些云存在巨大的危险。OpenStack把自己的核心建模层做得非常复杂,或者说非常前瞻,目的是为了适应未来的变化。如果你没有一个有远见的架构,既没有抽象对象,上来就直接编写代码,这的确是能够很快搭建云,但是却无法形成自动化的管理体系,也不具备足够的稳定性。一旦基础设施发生变化,整个体系就要被颠覆和重写。
还有一种说法是软件是个别精英的产物。他们认为软件的制造者只能是几个天才工程师,一堆人在互联网上弄来弄去难成大事。的确,软件的核心可以是由一两个天才设计的,但是天才最大的问题是他们不愿意干重复的事、琐碎的事。因此,好的软件开发模式是合理地去控制软件精英的个性,并且辅以充分的外围协助。天才设计的架构在外围开放,让更多的人来参与产品规模的提升。这也是开源开发模式的本质。
最后来说说OpenStack会不会被替代的问题吧。我们追求的是OpenStack的方法论,以及我们在实践过程中自身的进步。任何技术或者软件都将被替代,关键是你能够收获价值继续发展。技术总是在进步的,只要你进步了就不用担心被淘汰。
云计算从雏形发展至今已经超过了十年,其版图不断地扩充和变化。未来将会呈现公有云、私有云、行业云、混合云并存的市场格局。其中,公有云提供面向大众的通用解决方案,具有规模优势,但是它不会去照顾你的个性化需求,永远给你标准化的东西。
私有云则是最具差异化和个性化的,但是长期看并不具备规模优势。如果使用了开源框架,你在硬件方面的投入会变小,但是在软件方面,人员上的投入会增加。如果没有长期的规模效益去支撑,这些技术人员非常容易流失,很容易被互联网企业挖走。
行业云是未来的一个重要方向。行业云有行业专有的解决方案和一定的标准化、规模化优势。私有云适合在一定时期内自身有大量IT投入的大型客户,而小型企业长线看并不适合私有云模式。行业云把这些小型企业的云服务聚拢起来,达到一个类似大型私有云的规模。但是与私有云相同,行业云与公有云从远期发展来看与公有云相比没有优势。
私有云和行业云最终会走向混合云。行业云发展到一定程度后,一些工作负载将会转向公有云,私有云发展到一定阶段也会把一些不重要的数据、安全不敏感的应用过渡到公有云上。因此,“私有云+公有云”以及“大型行业云+公有云”将是未来混合云发展的两个重要方向。