忘了是在昨天还是前天,总之像往常一样在QQ群里和群友闲扯的时候,群友转发的一张病例诊断报告照片引起了我的注意。通常来说,和其他绝大多数群聊一样,这个群的群友(赛博吟游诗人)们也会从互联网的各个角落收集草图(注:指令人生草的图片)然后转发到群里;相比之下,如此“正经”的一张图在这个群显得如此突兀。怀着对图片的好奇之心,以及对现代医学一知半解的了解,我点开了图片,然后就看到了——


不知道从哪找来的图,侵删

  相信看到这里,有些略懂医学或者生物学常识的人已经和我一样开始感叹了,而对这些一无所知的人则还蒙在鼓里:这个病例到底“神奇”在哪?在解释这个问题之前,我们需要先回顾一下高中生物知识中,人体的血液流动一节。通常情况下,人体的血液循环路径是这样的:


蓝色代表静脉血,红色代表动脉血,体代表体循环。

  而这位病例上的病人,由于三尖瓣闭锁,因此右心房内的血液无法进入右心室。这在一般的病人身上已经是致命的问题,但在这个人身上没有这么简单:由于其房间隔缺损,因此右心房内的血液首先流入左心房,然后从左心室的室间隔缺损绕了一大圈回到了右心室里,如下图所示。


非常神奇的循环路径。

  三尖瓣闭锁、房间隔缺损和室间隔缺损,这些畸形如果单独来看都已经是非常严重的疾病,但当它们它们叠加在一起之后,总效果不仅没有变得更严重,反而在相当程度上互相抵消了。更神奇的是,这三个病抵消之后唯一留下的一点小缺陷——右心室出力不足——又和剩下的一个相比之下不是那么严重(但也相当厉害)的小问题——肺动脉口狭窄造成的肺动脉高压——相互抵消掉了,以至于让这位患者奇迹般地活到了25岁。可以说,这些问题中如果少了任何一个,那这个患者的病情都会比现在严重的多。

  那么,代价是什么呢?细心的人可能观察到,在上述示意图里出现了不同于红色和蓝色的紫色箭头,它代表什么?没错,就是你想的那样——是动脉血和静脉血的混合。这位患者的命虽然是勉强保住了,但他的循环系统也退化成了和两栖动物一样的不完全双循环,换气效率极差,运动耐量较常人也要低得多。

  看到这里,如果写过几天代码的读者恐怕会和我产生同样的联想——这不就是依赖一堆bug互相耦合运行的祖传屎山代码吗?其最典型的特征,和这一病例相同,就是如果不能同时修好相互抵消的所有bug,而是只修复一部分的话,就会立刻出大问题。


就像这样。

  然而实际上,人体中的“屎山”远比这要多得多、也复杂得多。这里举一些简单的例子:距离过近的食管和气管、装反的视网膜、绕远路的喉返神经、胚胎发育过程中的腮、囟门。。论炸裂程度,似乎也没比这个奇怪心脏好多少。而如果把限制范围进一步扩大到一切生物,那么例子还会更多。究其原因,那么就会发现这些“屎山”毫无例外都是由基因调控的,而基因这种东西则是不折不扣的真·屎山——不仅长度巨长无比,出错也是再正常不过(其实几率已经很低了,奈何细胞数量实在太多)。如果还是按照代码的方式来做比喻,那么就好比:

  • 乱写一气
  • 随机挑一段代码重复n遍
  • 随机挑一段代码倒过来
  • 随机挑一段代码删掉
  • 从其他类甚至其他项目的代码里面随机挑一段复制,然后随便找个位置粘贴
  • 把原来的代码随机挑一些字符改掉
  • 编译运行,Error的代码全都删掉,效率不高的代码选择性删掉,还不错的留着继续瞎改

  因此,绝大多数物种的基因组中都包含了大量不知道什么时候留下、也完全不会运行的死代码(一般称为垃圾基因),而能跑的部分一般不会超过5%。随便举个例子:水稻包含400Mb基因组,而小麦包含14.5Gb基因组。相比之下,人工合成的初代生命syn1.0不过只有1000Kb,而其进化版syn3.0只包含531Kb。包含至少一半的重复序列的水稻基因组尚且远远不能称为精简,比它还足足多出40倍的小麦就只能说是屎海里夹着一点点有用的东西了。

  那么,写出这坨屎山代码的程序员为什么还没被开掉呢?如果简要回答的话,你可以理解为是“需求太简单了”;如果要详细回答的话,就不得不提到演化生物学这门学科。在演化生物学的理论中,开除程序员(自然选择)发生的三个前提条件分别是:variation即性状差异、struggle for life即生存斗争、以及heritability即可遗传。然而,大多数的突变实际上并不会产生选择——产生选择的条件无非是繁殖行为前的存活率,或者繁殖过程中的sexual selection以及产生更多后代的能力——然而大多数突变即使产生了bug也并不能做到这一点。因此,在无数次的屎山翻涌中,活着的基因不断死掉,而死掉的基因又不断复活——这期间,唯一的code review过程仅可能会发生在代码产生巨大bug,比如某些十分重要的基因失去效果时。而这,就是现在的基因这坨屎山产生的根源。

  毫无疑问,这坨屎山的存在给我们彻底揭开生命之谜带来了无穷的麻烦,甚至仅仅是在研究疾病时,就算知道某个基因就是导致某种疾病的元凶,但贸然敲除它又会导致上下游的一系列基因出现连锁反应,进而导致code review,因此基因靶向治疗的研究至今仍然进度十分缓慢。那么。有没有什么办法能彻底解决这坨屎山呢?作为一个程序员,我想在此说出一点非常不成熟的想法:当然是重构!也许目前的屎山本身确实过于复杂难以研究,但是我们可以通过重新创造的方法去逐渐理解它。物理学家费曼曾经曰过:What I cannot create, I do not understand。当有一天,我们能够真的从头创造甚至定制的生命时候,那么我们就无限接近于掌握了基因的奥秘了——而现在的人造生命“辛西娅”,距离这个目标还很遥远。


后记

  尽管在开始动笔时脑子里就已经有了一个大概的形状,但当我真的开始写这篇文章的时候,才发现这个题材驾驭起来有点难度——比如写到一半的时候发现写跑题了。更恶心的是,由于这篇文章涉及大量生物学的基础知识,下笔之前我又不得不去确保这些内容的准确性,因此又耽误了不少时间。由于每天的闲暇时间本就不多,最后足足耗时好几天才把这篇文章真的写完(如果再不写完,估计又要忘了自己想写什么了)。不过最后的最后我总算还是把它完成了,真是可喜可贺啊可喜可贺。