你我皆是屎山
生命是短视的,它着眼当下,追寻局部最优。
文章来自知乎 @梧桐 的回答“生物的基因有没有可能是屎山”,读来有趣,稍作摘录。侵删。
新来的架构师第一次打开人类基因组仓库,看到一个文件夹。
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
评论