你我皆是屎山

生命是短视的,它着眼当下,追寻局部最优。

文章来自知乎 @梧桐 的回答“生物的基因有没有可能是屎山”,读来有趣,稍作摘录。侵删。


新来的架构师第一次打开人类基因组仓库,看到一个文件夹。

ancient_virus_do_not_delete

他问:这是什么?

旁边的老员工说:胎盘相关模块。

他又看到一个文件。

broken_vitamin_c_synthesis_legacy

他说:这个都坏了,删了吧?

老员工说:别急,祖先吃水果的时候坏的,虽然没修好,但历史原因比较复杂。

他继续往下翻。

repeat_repeat_repeat_1048576
old_gene_maybe_unused
enhancer_far_away_but_do_not_move
p53_everything_everywhere

架构师沉默了一会儿。

他说:你们这个项目,没有做过重构吗?

老员工说:做过。寒武纪那次算一次,后来很多分支都没活下来。


普通屎山最多是老板不让重构,前任跑路,文档丢了,需求每天改。

基因组更夸张。没有老板,没有文档,没有测试服,前任全死了。

需求方叫自然环境,提需求的方式是火山、冰期、病毒、饥荒、寄生虫和配偶选择。

最关键的是,系统不能停机。

软件烂了,还能说今晚两点到四点维护。

你不能对怀孕的哺乳动物说:

您好,我们要升级一下胎盘架构,请暂停发育三百万年。


人类有 46 条染色体,30 亿左右碱基对,编码蛋白质的基因大概两万多个。

听起来很像一个巨大项目。

可真正直接编码蛋白质的部分,只占很小一部分(2%)。

剩下的那些在干什么?这就是垃圾DNA这个说法的来源。


基因组里确实有很多东西看起来很不像正经代码。

比如假基因。

这些基因以前能用,后来突变坏了。

坏了以后没被清理掉,就这么留着。

像老项目里的废弃函数,函数名还在,注释还在,甚至参数也是这么回事。

你调用一下,返回一个沉默。

生物学家说:这玩意可能没有用了。

演化说:硬盘还够,先放着吧。


内源性逆转录病毒。

远古病毒感染祖先,把自己的遗传代码插进宿主 DNA。

病毒大概没想到,自己这一下不是临时入侵,是办理了永久落户。

几千万年后,某些病毒来源的片段被哺乳动物拿来干正事。

胎盘形成过程中,一些关键蛋白就和古病毒基因有关。

这事要是放在公司里,大概是这样的:

十年前黑客入侵系统,留下木马。

十年后公司发现木马结构不错,改一改,拿来做核心支付网关。

安全部门看了会流泪。产品部门看了会鼓掌。

生命看了说:能跑就行。


基因调控更像老项目里最阴间的部分。

你以为一个基因旁边有一个开关。

打开,表达。关闭,不表达。

我们中学课本上是这么讲,方便考试。

真实世界里,有些增强子离目标基因几十万、几百万个碱基对。

线性距离很远。

可 DNA 会在细胞核里折叠。折着折着,两个片段在三维空间里靠近了。

一个远方开关,突然控制了一个远方基因。

这就像你看代码调用关系,看半天找不到。

老员工说:你不能平着看。

你要把整套代码打印出来,揉成一个纸团。

第 7 页左上角贴到第 842 页右下角以后,功能就触发了。


还有基因多效性。

一个基因常常不只管一件事。

比如 P53,和肿瘤抑制、细胞周期、DNA 修复、细胞凋亡都有关。

这很像一个老系统里的核心函数。

名字叫 handle_basic_stuff

打开一看,它负责登录、支付、库存、短信、客服、年会抽奖和老板生日提醒。

你想改一行。

同事按住你的手。

他说:上一个改这里的人,现在去卖咖啡了。


人体结构里也有祖传屎山的痕迹。

喉返神经从大脑到喉咙,本来几厘米就够。

它偏要从脖子下去,绕过主动脉,再返回喉部。

在人类身上已经够绕。到了长颈鹿那里,这条神经像一个不愿意承认路线错了的网约车司机,先开出去几米,接着绕城一圈,再把你送回小区门口。

为什么这样?

鱼类祖先那里,这条走线挺合理。

后来演化出脖子,心脏位置变化,身体结构变化。

神经没重新布线。只是原来的线越拉越长。

祖传项目里,每个人都知道它绕了,

但没人敢拆。


维生素 C 合成基因也挺有意思。

很多动物可以自己合成维生素 C。

人类不行。

我们带着相关基因的坏版本。

祖先某个阶段把它弄坏了,正好那时饮食里维生素 C 够,不至于立刻出事。

这就像公司某个内部服务挂了,但外包接口一直免费可用。

大家说:先这样。

这个先这样,持续了几千万年。

今天你吃橙子的时候,记得提醒自己其实是在给祖传坏模块付维护费。


所以说基因组是祖传屎山,很贴切。

生物屎山的麻烦之处在于,它不是单纯的垃圾。

它里面有垃圾,也有保险丝,仓库,备胎,承重墙,消防通道,祖传的邪门配置。

还有一些看起来像垃圾、现在也许真是垃圾、未来某次环境变化时可以救命的东西。

你分不清,自然选择也分不清。

自然选择很朴素:不碍事就放着,碍事就淘汰;有点用就留下,很有用就扩散。


为什么会这样?因为选择不做顶层设计,演化没有终点,没有蓝图,没有测试环境。

每次突变都是一次上线,

上线成功,孩子出生,获得交配机会;

上线失败,分支删除。

生命演化的CI红了,尸体直接进入生态循环。


生命是短视的,它着眼当下,追寻局部最优。

假如你无法预知未来,也无法承担大规模失败的成本,局部最优就是最稳妥的策略。

会不会绕路,会不会耦合,会不会有祖传债务。

以后再说。

它只想活下来。


那个新架构师最后又回到文件夹前。他看着

ancient_virus_do_not_delete

问:这东西真的不能删?

老员工说:你可以试试。

他说:如果出问题呢?

老员工说:没有回滚。

他说:没有备份吗?

老员工说:我们目前最新的备份叫Pan troglodytes (黑猩猩),六七百万年前就 fork 出去了。

他说:那我们这个分支呢?

老员工说:没了就没了。

新架构师把手从键盘上拿开。

过了很久,他给那个文件夹改了个名字。

ancient_virus_do_not_delete_really

评论