独家深度 | 那些年我做开源和自研走过的弯路和经验
作者:阿里云数据库OLAP产品部——韩述
工作十年,一直专注于技术研发。一路走来,既参与过从第一行代码写起的纯自研的项目,也做过基于开源产品扩展慢慢转型成自研的项目,还负责过开源社区的管理和维护。
辗转折腾的过程中,有幸以各种不同角色(小白用户、开发者、维护者、管理员)参与过数个顶级开源项目Nginx、K8s、Postgres等的开发和维护。尤其是近几年一直在做开源结合自研类型的基础平台类项目,走过一些弯路,踩过很多坑,也总结了一些经验,本文将重点分享开源结合自研项目的一些经验。
优秀而历经考验的Base Code,包括附属的周边生态
源源不断更新的Feature,Bugfix以及它们背后的tester们
世界通行的人才圈子,良性的竞争和循环
定义问题:确定公司的业务目前已经或者未来即将遇到的问题,只有明确了问题,才有解决的必要,也就有了目标,这是所有后续一切行动的基础。
开源选型:通过一系列方法,包括并不限于查阅资料、试用、阅读源码、找人打听等等各种手段对比选择一款最match之前定义的问题,并且符合公司和业务未来发展情况的Base产品。
源码掌控:很多时候,上面两条都由项目的Leader代劳了,开发同学遇到的最大挑战往往是,开源代码动辄几十万几百万行,如何熟悉和上手掌握是一个很大的挑战。借用一句传说中的俗语,改不改得动。
与一般通用的仅仅使用开源项目不同,更多需要考虑的是后续的二次开发,以及持续的维护扩展。我们不仅仅是选择一个开源项目,更重要的是要选择一个优秀的框架,我们需要基于这个框架向前演进,所以源码的质量,架构的先进性就会很大程度上影响我们的倾向。 举一个具体例子,对于Web服务器的选型,Nginx VS Apache。从流行度上看,Apache的使用规模和生态是远大于Nginx的,但是Nginx是基于Linux2.6以上内核的异步多路复用架构设计的,而Apache是多进程模型。简单来说,Nginx可以轻松应对百万连接,而Apache则显得老迈了(访问量一大就容易遇到瓶颈)。所以全世界TOP级别的公司几乎清一色是Nginx系。 一定要先定义问题,再做选型。只有问题定义清楚了,才能去想对应解决问题的方案,整个动作才能不变形。我遇到过的重大失败的项目,很多都是,先选定了一个开源产品,然后才来丈量业务,对着已经选定的产品挖掘问题。 这无异于碰运气,运气好,找到一些场景去解决了。运气不好,你选择的开源产品或者技术路线根本不适合公司或者业务的情况,你就死掉了。就好比医生看病,肯定是首先看症状确定你哪里有问题,然后选择合适的药去医治,而不可能先预设好要用的药,再来找有没有对应的病。
非必要的情况下尽量保持开源架构的目录和文件结构
尽量避免重命名文件、函数、变量,而是以新增的方式代替
大规模的修改是可以的,但是尽量以增加的方式,比如增加文件、函数、逻辑,而不是把原来大段的文件、函数、逻辑删除掉
大部分的开源都是设计了扩展能力的,结合扩展能力辅以内核中增加少量代码配合。而不是简单暴力的大段重构
对代码的小修改尽量保留原有的逻辑,而不是删掉重写
放弃自研而采用高版本的开源对应的实现。对于曾经开源没有的能力或者优化点,当时是通过自研实现的,而可能过了1,2年,开源也有了,这种情况就可以做合并同列项。相应的自研模块可以完成历史使命光荣退役,改用开源在高版本中的类似能力替代。
把自研的模块和优化回馈开源社区。有些自研团队,会对自己研发的代码严格保密,作为构筑竞争力的保证,这样做其实不是最佳的,适当的将已经成熟的代码回馈给开源社区既是有利于全世界的用户们,也是对自己最好的解脱,实实在在是一个双赢的局面。可以放下包袱投入下一阶段的攻坚。真正的壁垒,不是造一个火箭保密藏起来,而是始终有引领下一代潮流的能力,永远超越过去的自己更快、更好、更先进。
砍掉一些价值不大,却又严重破坏和开源一致性的模块和优化。在过热期,很容易上很多KPI产物的项目,遗留很多低价值能力,实际效果微小,远不值得为之维护一份特殊的逻辑,一定要坚定的砍掉,轻装上阵。
业务规模:最典型的可能是就是K8s,别看开源的K8s如火如荼,事实上超过几千的个节点的大集群,也没怎么玩过,而今天的中国,已经有很多企业需要管理数万节点,这就需要自研的时候,针对集群规模进行大量优化,甚至于重构,以支撑规模。
稳定性:可能对于很多开源产品来说,99.99%的保证已经不错了,但是如果恰好你的业务,或者你所在的公司至少需要99.9999%,别小看只是多了2个数字而已,很可能从架构,到整体设计,都需要一次飞跃,才能达到。虽然实现困难,可是一旦成功,反而将成为一项先进的核心技术优势,轻易难以撼动。
性能优化:对于很多商业产品来说,性能有时候可能有着远远超越成本降低的意义。比如你打开一个网页,是1秒加载完成还是2秒完成加载,其意义可能远超50%成本节约,因为可能三分之一的人在1秒之后会选择关闭网页不等加载了。流失掉这些客户的损失是无可估量和难以弥补的,那么优化这些性能,哪怕每快那么一点点,都将意义重大。这里面就很容易催生技术的革新。
我们经常听到一些成功的人在介绍自己的时候会很谦虚的说,自己只是站在巨人的肩膀上,才摘到了一些成果而已。
然而事实上,真相是:
有一半的人看了一眼巨人,觉得没什么了不起,于是开始在巨人的旁边重新挖地基、盖房子,要与巨人争高,结果只是又重复造了一个轮子。
剩下的人中,又有一半,没有找对肩膀的方向,迷失在了向上爬的路上。此时只剩下不到四分之一的人了。
然而,在爬上巨人肩膀的人中又有一半直接就地躺倒,他们也没错,因为已经是十之一二的佼佼者了,更何况每前进一步风险就愈增加一分。
果然,在剩下的人中,又有一半在尝试站起来的过程中,没有站稳,反而摔了下去,功亏一篑。
那些成功在巨人肩膀上站稳的人们,都看到了远处美丽的风景,不过大部分都只是流连于此。
最后,只有那不到 1% 的人能够不流连于前方的美景,他们倔犟而又坚定的仰起头,望向更高的地方,那里才是他们的心之所向,最终向上伸出了手。
确实,只是简简单单的站在巨人的肩膀上,摘了一些果实而已,看上去很容易。
深度 | 阿里云李飞飞:中国数据库的时与势
专访阿里云王伟民:一站式全链路,阿里云向云原生数据库2.0跃迁
点击“阅读原文”
了解阿里云数据库产品家族更多信息