先来看几个数字。2015年,谷歌公司统计了自家所有产品的代码,加起来20亿行。2018年,阿里巴巴公司的程序员,一年写下了12亿行代码。听起来也还好吧?这个数字和一个芯片上的晶体管数量,在量级上是差不多。所以一个芯片我们人类可以控制。那软件我们人类也可以控制。但是请注意,它们的复杂性完全不一样。为啥?因为代码和代码之间是要发生互相影响的。这叫“级联效应”。十几亿行的代码,一旦发生互相之间的关联互动,而且是一层一层的不同级别的互动,产生的情况有多少种呢?肯定比整个宇宙的粒子数量还要多无数倍。
一堆东西放在那里,即使很多,很乱,那叫“庞杂”。但是一堆东西,到了一定数量,之间还互相影响,发生“级联效应”,那叫“复杂”。一旦达到这样的复杂。那是一个无法控制的,甚至是无法理解的系统。
所以,过去机械时代的工程师形象是很严谨的。他们干的活儿是绘制蓝图、按图施工、精确控制、准确无误。当他们造出了一个机械系统,不管多复杂,他们就是这个系统的神。但是今天的软件工程师呢?不行了。虽然这个系统是他们一行行写的,也是他们造出来的,但他们远远不是这个系统的神。总有一些他们控制不住的东西,比如他们一辈子都要和bug打交道。永远不可能把它们彻底消除。不是软件工程师不优秀,而是bug实在太狡猾。这就像是那个故事讲的,渔夫从瓶子里放出了一个魔鬼,发现这个魔鬼既不听自己的,也收不回去了。
这是一个很深刻的变化。举个例子,1986年1月,美国挑战者号航天飞机升空爆炸。不到一个月后,著名物理学家费曼就提交了一份报告,说出事的原因分析出来了,是因为一个密封圈出了问题。虽然也很难,需要费曼这样大神级的物理学家才能分析出来,但是毕竟最后罪魁祸首找到了。但是10年后,1996年,欧洲阿丽亚娜火箭在发射升空后爆炸。为啥呢?只有一个模糊的原因,说火箭在新环境下使用了一些较为陈旧的软件代码。但是,没有任何一个承包商被追责。因为这次爆炸并不是某个决策失误导致的,找不到挑战者号密封圈的那样的东西。整个发射系统的极度复杂,带来了这样的灾难。再过10年,2007年,丰田汽车在美国出了一个重大事故,车子在行驶中突然加速,刹车失灵,最后致人死亡。这件事当时闹得很大。事后,丰田请来专家调查原因。查来查去,发现是软件的原因。说到底,是因为丰田发动机软件系统过度庞大、极度复杂,没有办法把事故责任明确地归咎于某个设计或部件出了错。
你看,就在过去这几十年里,人类制造的系统的复杂性空前提高了,高到了既搞不清楚原因,也找不到罪魁祸首的程度。有句话说得好:雪崩时,没有一片雪花是无辜的。反过来说,雪崩时,因为没有一片雪花是无辜的,所以,也没有一片雪花是要负责的。这就是我们这代人面对的复杂性。
那你说怎么办呢?难道就只能这样束手无策?
要用生物学的思维来看待我们的生存。对啊,只要转念一想,你就会发现,没有什么可怕的。我们人类从来就是生活在无穷的复杂性里的。你想啊,宇宙是复杂的、海洋是复杂的、天气是复杂的、就是我们人类自己的身体也是复杂系统。这些系统,哪一个是能完全控制、制造和预测的?哪一个不是充满了不确定性和大量 bug 的?我们不都能和它们和平共处吗?也没有惶惶不可终日啊。有什么可怕的呢?
所谓用物理学思维理解世界,觉得一切可设计、可控制、可预测,那不过是过去200多年才开始流行的一种思维方式。放长远看,200年,那只是人类社会非常短暂的一个瞬间。今天讲用生物学思维理解世界,其实不过是回归人类生存状态的本来面目而已。和错误共存,和风险共存,只要有效,不求精确,甚至不求甚解,这是所有成功物种的常态。
那怎么做呢?
比如,应对风险。物理学的方法,是要通过精确,来规避风险。而生物学的方法,是通过冗余来规避风险。昆虫、鱼,通过大量产卵诞生大量的后代,最后活下来的没几个,但是物种基因的安全是有保证的。这就是通过冗余规避风险。人类造飞机不也是这样吗?一个发动机不安全,那就装四个呗?听起来好像很浪费。但是要知道飞机发动机作为一个复杂系统,你要让它做到万无一失,是不可能的,就算可能,那成本也会高到不像话。所以,装四个发动机,反而是一种低成本的办法。
再比如,修正错误。物理学的办法,是先搞清楚原理,再改正错误,正本清源。而生物学的方法呢?在各种环境突变中,只要你能生存下来,能穿越进化剪刀,就是好样的,就已经适者生存了,至于是不是已经完全没有错误,生物学不关心,这不重要。