拥抱开源

##引子:我用开源的技术方案去竞标git

大约是4年前,咱们要去浙江移动去竞标一个项目,产品中须要一个流程引擎负责工做流的运转,竞标会上针对这个流程引擎的实现方案展开了激烈的讨论。程序员

 

* 咱们给出的引擎是开源的activiti,成本主要在对activiti的调研研究和二次开发上,报价只有几十万。github

* 另外一个厂商给出的引擎是本身开发的一个产品,成本主要是买该该产品的服务(它还不是个SaaS系统,须要在本地安装的那种),报价高达300多万。安全

 

最终的结果,咱们败了,客户不相信开源产品的稳定性,也不信任咱们有那个能力能够把它研究透,因此宁可多花几百万也要买一个出现问题一个电话能够找人搞定的方案。网络

这件事情对我打击很大,我以为国人对开源仍是存在着种种误区,幸运的是后来一份工做老板是开源产品的拥护者,我天天的工做就是找到适合企业的开源产品并应用到生产。架构

 

##开源的优点工具

###1 快速响应学习

售后响应速率太慢多是全部服务消费者吐槽最多的话题。对于软件行业也同样,特别是那种预付费的服务,你可能获得最多的反馈是“咱们内部先评估一下”、“已经在走流程了”、“这个肯定是咱们的问题,下个版本中会解决”、“有什么最新的进展咱们会第一时间通知您”这种废话,往往收到这种反馈内心确定是一万只羊驼。若是采用开源技术,有本身的技术团队在负责,那就能够经过KPI考核、找他们领导吵架、甚至作在他们身边看着他修复等办法来解决,总之命运掌握在了本身的手上,再也不是隔着邮件或电话看供应商的脸色了。测试

 

###2 免费google

免费意味着成本的下降,特别是复用性很高的技术免费带来的利润上的收益是不可估量的。举个简单的例子,假如你搭建了一套几十个普通实例的OpenStack,一年能够企业节约几十万。固然这里只是从费用的维度来夸大了开源的优势,现阶段公有云的服务质量仍是远远高于私有云的。

 

###3 试错成本

试错成本对一个系统架构来讲很是的重要。当你对某个服务节点的技术选型不是太肯定的时候,最好的办法就是多使用几种技术。若是是开源的组件,只须要安排技术人员安装配置后用过就能知道是否是适合本身,而商用的产品须要去联系供应商、不见得有试用版本、对产品的评估只能经过网上资料调研和供应商忽悠。

若是初期选定了某个开源产品或组件,在使用过程当中发现不合适或者出现了更好的替代品,能够绝不犹豫零成本的过渡到新技术;但若是已经买了商业版的服务,就会有种食之无味弃之惋惜的感受了,极可能由于投资回报率的角度继续使用老技术,等待合同期结束后再考虑新方案。

 

###4 活跃的社区

若是一个开源技术有很高的社区活跃度,那么它的功能就会越稳定,技术革新就会越快。社区活跃度高,说明不少的人在使用这项技术,也就会带来更多的应用场景的生产级别的测试,就会发现和修复更多的bug。因为每一个使用者的应用场景可能有所不一样,就会抽象出更标准的接口,你们把支持本身应用场景的代码提交回github,版本的迭代又会带来更多的功能。这样就造成了一个良性循环,用的人越多,并且你们都把本身的部分反馈回社区,那么这项开源技术的影响力就会越滚越大。

 

###5 摆脱供应商束缚

举个我本身的例子,咱们采购了IBM WebSphere 7.X版本的服务,为了与该服务对接咱们客户也作了一部分定制开发。一年以后IBM推出了WebSphere8.X的版本,服务接口发生了变更,咱们先前的客户端代码不能对接到新的版本中来,为了保证生产的稳定性,咱们选择了保守治疗的方案,继续使用7.X的版本。又过了一年,IBM官方正式通知咱们再也不支持7.X服务,此时摆在咱们面前的只有两条路,第一:被迫升级到8.X,客户端代码想办法从新开发。第二:下车,再也不与其合做,换其它平行的产品。可是不管哪一种选择咱们都是输家,由于这个过程当中生产环境面领着巨大的不肯定性。

 

##开源的劣势

###1 技术门槛高

使用开源的前提是必需要有一直过硬的技术团队,由于开源意味着你没有售后服务,一旦出现问题全靠本身的团队去解决。按照门槛由低到高,技术团队主要负责如下任务:

 

* 1)    产品的安装和配置

* 2)    自定义部分的设计与实现

* 3)      生产环境紧急bug的修复

* 4)      安全隐患和潜在风险的评估

 

建议你的团队至少要达到第三级,也就是说生产一旦出现严重的bug,技术团队能够在最短的时间内修复,可能不是最优的解决方案,可是必定要保证生产环境正常稳定的运做。

 

###2 不适合国情

为何不少在研发和设计人员看似很美好的技术在国内都推广不起来?这是由我国国情决定的。

老外开发的东西,本质上就是制定一套规则,只要按照个人这个规则配置,就能够解决你的问题。而我国这种甲方乙方的传统观念,是不容许有规则存在的,大家乙方不要跟我说你产品的使用规则是什么,我是甲方给了你钱你就得按照我想要的规则来实现。

从这一点来看,咱们在选择使用某个开源产品前第一个要肯定的问题就是:你是否有设计的决策权,若是没有话,开源的推进就会显得很痛苦。

 

###3 免费

在开源的优点里已经提到过免费,它是一把双刃剑,免费也一样是开源的一大缺点。举个最极端的例子,你选择某个开源产品存在巨大的安全隐患,被不法分子利用并形成了巨大的经济损失,这种状况下惟一能作的是就等待或者本身把安全漏洞修复,损失的钱是不可能要的回来了。由于没有严格的法律上的约束,开源项目的质量和安全程度很大程度上取决于开发者的素质和心情, 反之商业产品这一点就会好不少,由于有法律合同的约束,他们在开发和设计的时候就必须把因产品质量放在首位,一旦形成重大损失可能要赔个倾家荡产。

 

###4 网络障碍

长期混迹于开源的朋友会发现一个啼笑皆非的状况,在安装和配置某个开源项目时你90%的精力都在跟我们的墙作斗争。虽然github没有被屏蔽,可是开源产品安装过程当中用到的依赖、插件、第三方工具、操做系统软件包等颇有可能存储在awss三、google storage、国外交付仓库等,这部分常常会被墙住。整个安装过程就是不断的connect timeout、review相关的脚本或者代码、配置http、socker甚至是JVM层的代理,举步维艰的愚公移“墙”。凿墙的过程使得客户体验变差,下降了咱们对开源产品的友好度

 

###5 细节考虑不周到

以下两个例子:

 

* 国外的AWS域名与国内的AWS域名是不同的,并且不少国外的功能在国内是被阉割过的。

* 老外的代码几乎不用考虑编码的问题,而咱们拿到后须要想办法解决中文乱码的bug。

 

##从开源中能得到什么

###1 设计思想

开发人员的设计思想每每是固化的,可是在github上学习别人的项目能够扩展本身的眼界,了解到别人的设计思路是什么样的,有没有本身值得借鉴的地方。

###2 技术细节

Review别人的代码你会学会别人在用的annotation、依赖包、编码思想、甚至新的语言(我第一次接触groovy就是经过github上一个开源项目)。包括你向github提交过程当中老外也会提出对commit message、PR等的一些要求,这些细节都是本身能够运用到之后工做中去的。

###3 社区知名度

5年以上开发经验的研发人员再去找工做,每每会开到招聘单位要求你提供github和博客的帐号,这说明国内对中高等人才愈来愈看中你的社区活跃性和知名度,维护好本身的博客多学习github上开源知识也将称为你简历上的硬实力。

###4 更多的朋友

我始终以为程序员都是单纯可爱的,你在github上与来自世界各地的研发人员一块儿协做,总会遇到一些志同道合的朋友。与他们保持联系,会成为你将来职业道路上的好伙伴。

###5 锻炼英文

据我我的估计开源社区中90%都是老外,中国人在开源社区的活跃度并不高,不管是官网阅读、API详解、与做者的沟通等,只能靠别人的母语来搞定了。

 

##兴趣是动力

若是你也想开始本身的开源之旅,请必定要先找到本身喜欢的方向和项目,由于开源彻底靠的是情怀,是你心甘情愿不求回报的去作这件事情。你的开源项目就像是女神,你以为她设计的那么完美,代码写得那么美丽,虽然你也知道女神终究不属于你,顶多当你的代码被merge吸取时女神会朝你微笑一下,你仍愿意天天晚上默默为她付出,不图回报。