杂谈/essay · 2022年3月12日 0

用代码的逻辑看历史:每一次的朝代更迭都是一次代码重构

这世界绝大部分事物的运行逻辑都是想通的,当你写的和看的代码多了,经历过代码的从0到1、迭代、腐烂、重构等一系列过程以后,会莫名觉得代码的演化过程似乎跟人类历史的演化有着某种惊人的相似之处,来让我们一起来用代码的逻辑看看历史吧。

根据热力学第二定律,这世界是一个熵增的世界,系统在自发的情况下会向无序的方向变化,而代码和人类社会都是一个高度有序的系统,对它们的组织与维系是需要付出很大的代价的,为什么人类会自发地组织起来形成部落,并继而演化出城邦、王国、帝国?一定是出于自身的某种需求,而人类最初的需求,就是生存,而这种对生存的迫切需求,首先催生出了部落。

函数出现阶段(部落)

人类对于生存的保障是一个系统性工程,因为能够威胁生存的因素有很多,比如食物、外敌、猛兽、疾病、气候等等,因此为了让群体能更好地应对各种生存的威胁,人类开始了分工,有人生产粮食、有人建造房屋、有人生产衣服,有人抵御野兽和外敌,互相联系又各司其职。当人类社会形成了固定的职业划分以后,人类就算首次演化出了函数(function),而函数也是大型程序最基本的逻辑单元。

模块形成阶段(城邦)

当人类社会进化出职业以后,在外部生存环境还不错的情况下,粮食逐渐增加、人口得到增长、安全得到保障,整个社会体系会进入快速迭代阶段,也就是进入了“青春期”,人类的需求会变得异常丰富起来,这像极了产品经理提需求的样子,于是,人类社会的代码开始迭代、升级,更多的需求演化出更多的函数,当函数很多,难以维护的时候,人类开始根据分工的特点定义类(class)的概念,比如士 农 工 商

每一个类包含了一系列的职业和分工,以及固定的属性。例如这个类,它固有的方法函数是种地,而具体种玉米还是小麦,是由传入的参数决定的,有一个基本属性是安土重迁,具有不可变性,所以从某种角度上来说,农民可以成为可哈希对象(hashable object)农民的实例化对象)。

除了对类的提出以外,人类还逐渐形成以城市为中心的城邦,这是国家的雏形,它具有一系列完整的功能,并肩负着某些特定的任务,这也就是编程中的模块化,任何大型的项目都必然是模块化的,你模块的多寡也直接影响你整个项目功能的丰富度。

换句话说,模块就是代码的领土。

架构竞争阶段(王国)

在城邦阶段,城邦互相吞并或者联盟进而形成王国。到了王国的阶段,又需要考虑如何更好地对城邦进行管理的问题。于是会催生出各式各样的组织结构,也就是说在这一时期,人类社会的代码项目演化出了一些抽象的架构,不同的王国会使用不同的架构,这些架构互相借鉴也互相竞争,在势均力敌的情况下会表现出“百花齐放,百家争鸣”的局面。

春秋战国就是典型的处于这一阶段的时期,在这一时期,参与竞争的架构层出不穷,从整体治国的理念出发的通用型架构包括儒家、法家、道家等,对于某一细分领域的技术型架构包括墨家、兵家、纵横家等。

各架构会在模块的丰富度、计算和IO效率以及日活等各个层面展开竞争,各架构的开发人员会到处路演、约见客户推销自己的架构,在这种引诱销售的攻势下,一些诸侯国开始尝试引入这些架构,名曰“变法”。

在众多变法中,有成功的也有失败的,而大部分变法失败的原因是来自于原始开发团队成员的抵制,他们认为原来的代码明明能跑,引入新的架构他们还要重新学习,早已进入舒适区的他们想保持现状。而成功的变法主要是老的代码实在是有点跑不动了,干脆死马当活马医,说不定撞大运了呢,于是乎战国初期只有那个被按在地上摩擦的秦国最终变法成功了。

这里还要说一嘴,其实在秦国商鞅变法之前,最早进行变法的是魏国,使用的是李悝的法家架构《法经》,且李悝将《法经》开源,后来商鞅变法时制定的《秦律》就是基于《法经》进行二次开发的。魏国的变法刚开始挺成功的,变法以后综合国力绝对是No.1,但是后来管理层过于膨胀,导致流失了很多优秀的开发人员,比如吴起、乐毅、孙膑、商鞅、范雎、张仪、公孙衍、尉缭、姚贾,这些优秀开发人员的流失一方面使魏国的后续开发后继无人,另一方面又帮助敌国变得更加强大,最后魏国就衰落了,所以管理还是不要太膨胀啊。

不论是李悝、商鞅或是吴起,其变法的核心架构都是采用法家的架构,事实证明,法家架构在当时的经济基础和文化基础下是各方面性能最好的,计算和IO效率高、有详细的文档详细,日活很高。可以说法家架构是当年街上最靓的仔。

大浪淘沙,任何竞争总要有个结果,法家架构凭借各种优势迅速占领市场,后来由于核心开发人员离职,其他开发人员删库跑路,该架构跌下神坛,后经过了一段时间混乱,儒家架构最终趁虚而入占领市场,成为后来各个项目的主导架构。

运行维护阶段(帝国)

当架构竞争结束以后,大量的诸侯小国被淘汰,某个实力超强的诸侯国拥有了巨大的疆域,从此进入了帝国时代。

帝国代码也迎来了稳定期,这一阶段的代码是一个巨型项目,代码量绝对是一个天文数字,而新的具有创造性的需求也渐渐减少直至完全消失。帝国的开发人员的主要任务是找bug,改bug。

但是随着时间的推移,秉承着“能跑就行”的核心思想维护帝国代码几百年,开发人员已经在舒适区待太久了,麻了,退化了。终于在某一天,由于硬件老化导致系统崩溃,他们发现他们更换硬件重启以后代码跑不了了!紧接着投诉如海啸一般涌来,把帝国淹没了。

反复重构阶段(朝代更迭)

开发人员想要紧急修复,奈何拿不动刀了,修复进程异常缓慢。而这个时候,一些民间开发人员也行动起来蹭热点,开始自己写替代系统,写着写着影响力和规模越来越大了,同时帝国内部的开发人员也出现了分裂,最后分了家。

代码又进入了血腥的混沌重塑阶段,经过相当长一段时间的重构,才重新实现了重新的大一统。

而这一代码重构的过程在过去2000多年一次又一次地上演,最终形成了我们精彩的华夏文明史。