3.143. 谁是主线?

今天和人讨论开源社区玩法的一个逻辑,其中讨论到这样一个问题:开源代码的主线,到底是谁控制的?

我发现很多做惯商用软件的人对这个问题真的是毫无概念的。他们一直在追问:我们控制哪个管理层,哪个董事会,就可以控制那个软件?你怎么解释,他们都想往这个角度去靠。

但开源代码的模型根本不是这样的。既然当面说不清楚,我就把逻辑写下来,希望他们冷静一点的时候有机会看一看吧。

很多人把开源看做是一种情怀,好像是开发之外的加成,而没有注意到:开源是一种类似区块链那样的生物圈优胜劣汰的发展模型,是通过淘汰实现选择的(其实是区块链学习开源社区的维护方法)。

拿Linux来说吧,http://kernel.org维护了一套代码(包括它的修改历史),这就是一个“分支”(主线分支),相当于生态区中的一个族群,个体可能死亡,族群持续发展。我要做手机了,我把这个分支拷贝过来,加入我的修改,我也会有一个我的分支(Kenneth手机分支),这相当于在我的手机这个地盘上生存的另一个族群。别人做机顶盒解决方案,也拷贝一个版本拿出来,加入他的修改,也是一个“分支”(某人机顶盒解决方案分支),他这个解决方案卖给一个终端客户,那个客户做了一个他们家的机顶盒,然后基于某人机顶盒解决方案做了一个他的分支,这就叫某机顶盒分支……

这些分支,很多代码一样,但也有自己不一样的代码。

这些分支里面谁是控制者?答案是:在谁的地盘,谁就是控制者。某机顶盒分支,根本就不需要甩Linux主线分支,在他的机顶盒世界里,他爱怎么着就怎么着,根本不受任何人的控制。

很多商业公司拷贝开源软件回家,不再对外贡献,这同样是一个分支,并没有因为你不对外贡献了就改变我们后面要讨论的逻辑。

这是基础,不理解这一点,就无法理解开源是什么。开源的整个分支生态链确实是可以控制的,但不是你理解的那种控制,如果对方不想被你控制,你是肯定控制不了的。这是前提。

好了,大家都有分支,大家都要加特性,每个分支都会往前发展,你当然可以就自己的分支上随便加你自己想加的东西,但假设Linux主线修正了100个安全补丁,你想不想把这个补丁合进来?不合当然是你的自由,但这100个补丁你就要用自己的手段来修复,你能付出这个工作量吗?你还可以留着这100个漏洞不管它,但你和你的用户能否忍受?如果不能,你就受Linux主线的控制了,因为你要把Linux主线的代码合进来。

为了把这个代码合进来,这些代码又和Linux主线本身加入的特性有关系,那么,你要不要把这些特性也合进来?这样,它对你的控制又加深了。

好了,它合入的特性如果和你加入的特性冲突了,你留它的特性,还是留你的特性?如果你为了他的特性而放弃你自己的特性,他对你的控制就更深了。

你看,开源社区是没有权威的,它是看谁的分支做得好,从而淘汰掉别人的分支。这一点,连Linus都无法改变,如果他作死,把Linux主线维护得差一点,Linux主线就会被其他主线超过,这个就不再是主线了。

所以,你做惯商业软件,想成立一个董事会,搞一堆管理层,想通过决策左右Linux的发展方向,想卖自己的私盐,无论你多权威,多有钱,你这些权威和钱,也只能用来买最好的工程师和项目,把你的分支做得人人想用,否则你再定义你的分支是“主线”,它不是还是不是,这个是你无法挣扎的。你做商业软件的时候用惯的那套讨好领导,讨好资本的技巧,在开源社区是玩不转的。

开源社区是一个蛮荒的森林,所有族群为了生存无所不用其极,不相信权威,只有如何活下去是动力。但这种野蛮是有规律的,这个规律就是生存压力,耍横是没有用的。在生物界,小到蟑螂也能活得很好,大到恐龙该死还是死。活下来的都是身经百战,不在乎“名义上对不对”只在乎和环境最好贴合的精英。你把自己封闭起来不见得保护得了自己,你完全开放合作也同样可能被人一口咬死。

基本上,把一个分支维护好,最大的难点不是你加人加功能(当然,这个是前提),而是你怎么保证你的架构,每个特性加入到分支中,都是一次对别人的冲击,因为你的特性和别人的特性是会冲突的,能接受更多的特性而不互相冲突,你要控制这个合入过程,要选择让哪个特性进,哪个特性不能进,怎么进,这是需要良好的架构控制能力去做到的,不是你给某个领导说通了就可以搞定的,你放了一个扰乱性特性就去,几个版本后就得回退甚至整个分支放弃。所以社区的文化才是“show me the code”——你少来耍嘴皮子,我们用竞争力说了算。

这个不以任何个人意志而转移,国家意志都不行。我们要面对这个竞争,就要想好自己稳定的设计逻辑和策略逻辑,不要再想依附谁,把心思都放在生存上。对开源这个问题,外其身而身存,开和不开,都不是我们讨论的关键问题。