你有没有想过一个问题:你,到底有多少是"你自己"的?
别误会,不是说你的性格或者灵魂,我说的是基因层面的。
答案可能会让你愣一下,你基因组里大约8%的序列,根本不是人类的,而是古代病毒留下来的。
啥意思?
说白了,几万年前甚至几百万年前,有某种逆转录病毒感染了我们祖先的生殖细胞,把自己的基因插到了人类的DNA里。
然后这个病毒就这么一代代传下来了,传着传着,病毒本身早就死透了,但它的基因代码就这么留在了我们身体里。
你可能会说:那岂不是体内全是病毒残留,会不会出事?
别慌,大部分确实没什么用,但有一些还真被人体"收编"了。
最典型的就是胎盘形成过程中用到的合胞素蛋白。
这个蛋白的基因,就来自一种古病毒的包膜蛋白基因。
当年病毒拿这个蛋白来突破宿主细胞,结果被人类改造成了胎盘细胞融合的关键工具。
相当于当年一段恶意代码注入进来,本来是想搞破坏的,结果被主系统逆向改造,变成了基础设施的一部分。
将错就错,居然还跑通了。
听到这你可能觉得:病毒入侵?那也太离谱了吧,人类基因里怎么能留着这种东西?
其实比病毒更离谱的还在后面。
病毒那8%虽然多,但跟另一类东西比起来,只能算小巫见大巫。那就是:转座子。
转座子是啥?
你可以把它理解成基因组里的"自我复制插件"。
这种序列有个特点,就是会不停地把自己复制粘贴到基因组的各个位置,到处乱插。
光这一类东西,就占了人类基因组差不多一半的位置。
一半啊。
相当于你打开电脑C盘,发现一半的空间都被一种自动复制的恶意程序占了,而且你还不敢删,因为不知道删了会不会把系统搞崩。
那真正有用的基因有多少呢?
不到2%。
对,你没看错。
人类基因组大概有30亿个碱基对,但真正用来编码蛋白质的部分,连2%都不到。
剩下那98%是啥?
刚才说了,转座子占一半,内源性逆转录病毒占8%,还有一大堆假基因、重复片段、乱七八糟的调控序列。
很长一段时间里,这些东西都被叫做"垃圾DNA"。
名字叫"垃圾",但没人敢真删。
为什么?因为你不确定它到底是不是真的没用。
这就像一个几十年的老项目,里面全是注释掉的函数、废弃的模块、没人敢动的死代码。
你说删了吧,怕哪天出问题;留着吧,又占地方。
典型的技术债。
说到假基因,有个特别有意思的例子。
我们人类为什么要吃蔬菜水果补充维生素C?因为我们自己合成不了。
但很多动物都能自己合成维生素C啊,比如猫啊狗啊,它们从来不觉得需要专门吃橙子。
为啥人类不行?
因为我们基因组里有一段负责合成维生素C的基因,在某个祖先身上突变坏掉了。
坏了就坏了呗,反正那个时候果子到处都是,吃点就能补上,也就没什么生存压力。
然后这个坏掉的基因就这么一代代传下来了。
相当于一段早就不能运行的代码,没人去清理,就一直搁在代码库里。
你说它占多少地方吧,也不占多少。但你就是删不掉,删了好像也没啥影响,但谁也不敢试。
类似的"历史遗留问题"还有很多。
比如我们胚胎发育的时候,早期会出现类似鳃弓的结构。
这玩意儿是干嘛的?我们又不是鱼。
但它确实会出现,然后慢慢消失。
这就是进化留下的痕迹。
我们的祖先确实是从鱼过来的,那段控制鳃发育的代码一直没删,就这么留着。
虽然现在不用了,但胚胎发育的时候还是会先跑一遍,然后再改。
更离谱的是喉返神经。
这条神经连接大脑和喉咙,本来走直线的话,几厘米就够了。
但实际上它要从大脑下来,绕过心脏旁边的主动脉,再绕回喉咙,在人身体里走了将近一米的弯路。
你没听错,一米。
为啥要走这么远?因为在鱼类祖先身上,这条路径是合理的,鱼的心脏和鳃离得近,神经这么走很顺。
后来慢慢进化,脖子变长了,胸腔位置变了,但这条神经的走线从来没有被重新规划过。
就这么将错就错,延续了几亿年。
这要是在软件工程里,就是典型的"祖传屎山",当年的设计在当时的架构下是合理的,后来架构变了,没人敢动那根神经,就这么绕着。
再说说基因本身的写法,那也是相当奇怪。
我们平时理解的基因,应该是一段连续的代码,读出来直接就能用对吧?
实际上根本不是。
一个基因在被转录成RNA之后,里面大量的片段要先被剪掉,剩下的部分拼在一起,才能用来合成蛋白质。
被剪掉的那些叫内含子,留下来的叫外显子。
人类基因里,内含子的比例远大于外显子。
有些基因,95%以上都是内含子。
啥概念?相当于你写了一万行代码,运行之前要先自动删掉九千行,再把剩下的拼起来才能执行。
你说这设计合理吗?
从可维护性的角度看,简直是灾难。
但你也别说它完全没好处。因为同一个基因,可以通过不同的剪接方式,产生结构和功能都不一样的蛋白质。
这叫可变剪接。
人类的基因数量大概只有两万个,但蛋白质的种类远不止这个数,很大程度上就靠这个机制。
同一段源代码,在不同条件下剪出完全不同的版本,行为各异。
从复用的角度看,勉强算聪明。
从可维护性的角度看,是彻底的灾难。
就像一个函数,传不同的参数进去,能跑出完全不相干的功能。你说它是高内聚呢,还是高耦合呢?
说到耦合,基因的耦合程度,那才叫一个离谱。
有个词叫基因多效性,意思是一个基因往往同时参与好几个完全不相干的生理过程。
最典型的就是P53基因。
这个基因你可能听说过,它跟癌症有关,主要作用是抑制肿瘤。
但你知道它还管啥吗?细胞周期调控、DNA修复、细胞凋亡……
反正跟细胞生死有关的大事,它几乎都插一脚。
一个函数同时承担七八种职责,牵一发而动全身。
在软件工程里,这是教科书级别的反模式。
你想重构?你都不知道从哪下手。
动一下P53,不知道会牵扯出多少连锁反应。
那调控系统呢?是不是写得稍微整齐一点?
想多了。
基因组里有一类叫增强子的调控序列,它的作用是增强目标基因的表达。
但这个增强子的位置,离目标基因可能有几十万甚至上百万个碱基对那么远。
这么远怎么调控?
靠DNA在空间上折叠弯曲,把两个地方凑到一起。
你没听错。
整个基因组不是一条直线摊开的,它是一团乱糟糟的线球,在三维空间里折叠来折叠去。
增强子和目标基因,就是靠这种空间折叠来产生联系的。
而且更乱的是,一个增强子可以调控好几个基因,一个基因也可以被好几个增强子调控。
调用关系完全不是线性的,是三维空间里的网状结构。
相当于代码库里全是全局变量和远程调用,而且所有依赖关系,只有你把整个代码库在三维空间里折叠起来之后,才看得清楚。
谁要是想在这种系统里做重构,我敬他是条汉子。
还有更绝的。
基因组里有很多序列,从鱼到人,几亿年的进化过程中几乎一字未改。
这些叫高度保守序列。
按理说,如果一段序列真的无关紧要,进化早就把它改得面目全非了。
能保持几亿年不变,说明它非常重要。
但问题是,很多这种高度保守的序列,我们至今不知道它在做什么。
这就很尴尬了。
不知道做什么,但谁也不敢删。
典型的屎山代码特征,没人敢动的区域,占着位置,你说它没用吧,它又留了几亿年;你说它有用吧,没人知道干嘛的。
聊到这你可能会问:那是不是因为人类基因组太复杂了,所以才这么乱?复杂系统难免有技术债嘛。
还真不是。
如果基因组越复杂,生物越高级,基因组就应该越大对吧?
但现实完全不是这样。
某些蝾螈的基因组,是人类的十倍大。
有一种叫巴黎草的野花,基因组是人类的五十倍。
代码量和系统复杂度完全脱钩。
这在任何正经工程项目里都意味着什么?意味着大量冗余和膨胀。
你说蝾螈比人类高级?不可能吧。那它基因组为啥比我们大十倍?
因为里面塞满了没用的重复序列。就像一个项目,文件越来越多,但大部分都是历史版本和废弃代码,实际功能没增加多少。
还有一个值得单独聊聊的:Y染色体。
哺乳动物的祖先,X染色体和Y染色体最初大小差不多,基因数量也接近。
但在几亿年的时间里,Y染色体一直在萎缩。
基因从最初的几百个,降到今天的不足一百个。
为啥会这样?
因为Y染色体有个架构缺陷:它没办法像其他染色体那样,通过交叉互换来修复自身的突变。
其他染色体都是成对的,出了问题可以互相拷贝修复。
但Y染色体只有一个,没有备份。
错误只能不断积累,功能基因一个接一个消失。
这是一个因为架构限制导致无法自我修复、只能持续退化的模块。
而且目前没有任何迹象表明这个过程会停止。
当然,人类文明才几千年,几亿年的尺度上的事,我们也不用太操心Y染色体的存亡。
最后再说说DNA修复机制。
基因组本身其实并不稳定。
每天,每个细胞的DNA都会发生数以万计的损伤,辐射啊、氧化压力啊、复制错误啊,各种原因。
为了应对这些损伤,细胞演化出了十几种不同的修复机制。
各管一类问题,互相之间有备份有协调,整套系统涉及几百个蛋白质。
听起来很精密对吧?
但你换个角度想:这不就是一个在生产环境上不断打补丁的系统吗?
每出现一类新问题,就再加一套应对机制。
久而久之,补丁比原始代码还复杂。
而且各种补丁之间的相互关系,没有人完整地理清楚过。
哪天真出了什么新问题,估计又得再加一套补丁。
所以你看,我们这套基因组系统,不只是一段没有注释的老代码。
它同时还混入了大量历史病毒注入的片段,模块之间高度耦合,调用关系靠三维折叠实现,文档近乎为零,技术债堆积如山。
但它居然跑了几亿年,从来没停机过一次。
你说它是屎山吧,它确实是。
你说它脆弱吧,它又顽强得离谱。
毕竟,一个能连续运行几亿年不宕机的系统,哪怕代码写得再乱,你也不得不服。