人类基因是一套屎山代码吗
人类基因组大约有30亿个碱基对,但真正用来编码蛋白质的部分只占不到2%。剩下将近98%,里面堆满了各种东西:失去功能的假基因,曾经能用,后来突变坏掉了,但就这么留着没被清除;转座子的残骸,一种会自我复制、到处乱插入的寄生序列,光这一类就占了将近一半的基因组;还有数不清的重复片段,有些短序列在基因组里重复出现几十万次,没有人知道为什么。
很长一段时间里,这些东西被统称为垃圾DNA。这非常像一个几十年的老项目,里面全是注释掉的函数、废弃的模块、没人敢动的死代码,因为没有人确定它们是不是真的没用。
然后是内含子。一个基因在被转录成RNA之后,里面大量的片段需要先被剪掉,剩下的部分拼接在一起,才能用来合成蛋白质。被剪掉的叫内含子,留下来的叫外显子。人类基因里内含子的比例远大于外显子,有些基因超过95%都是内含子。整个过程相当于写了一万行代码,运行之前要先自动删掉九千行,再把剩下的拼起来才能执行。更麻烦的是同一个基因还可以通过不同的剪接方式产生结构和功能都不同的蛋白质,这叫可变剪接。人类基因数量大约只有两万个,但蛋白质种类远不止这个数,很大程度上就靠这个机制。同一段源代码,在不同条件下剪出完全不同的版本,行为各异。从复用的角度看勉强算聪明,从可维护性的角度看是彻底的灾难。
基因组里还有一类叫内源性逆转录病毒的东西。人类基因组里大约8%的序列来自古代逆转录病毒,它们在某个时间点感染了我们的祖先,把自己的基因组插进了宿主DNA,然后病毒死了,但插入的序列就这么一代代遗传下来。其中一些后来被身体改造成了有用的东西,比如胎盘形成过程中用到的合胞素蛋白,就来源于古病毒的包膜蛋白基因。这相当于当年被注入的一段恶意代码,后来被主系统改造成了自己的基础设施,将错就错,还真的跑起来了。
有一类叫增强子的调控序列,它可以在距离目标基因几十万甚至几百万碱基对之外的地方,通过DNA在空间上的折叠弯曲,远程影响目标基因的表达。一个增强子可以调控多个基因,一个基因也可以被多个增强子调控,调用关系不是线性的,是通过三维空间结构实现的,根本看不出来谁在影响谁。这相当于代码库里存在大量全局变量和远程调用,而且所有依赖关系只有在把整个代码库在三维空间里折叠起来之后才看得清楚。
还有一个现象叫基因多效性,意思是一个基因往往同时参与多个完全不相干的生理过程。P53基因既参与抑制肿瘤,又调控细胞周期,还涉及DNA修复和细胞凋亡。这种高度耦合在软件工程里是教科书级别的反模式,一个函数同时承担七八种职责,牵一发而动全身,让人想重构都不知道该从哪里下手。
基因组里也存在很多没有人敢动的区域。有些序列在从鱼到人几亿年的进化过程中几乎一字未改,高度保守。按理说,如果一段序列真的无关紧要,进化早就把它改得面目全非了。保持不变说明它非常重要,但很多至今我们不知道它在做什么。这就是那种典型的屎山,不知道做什么,但谁也不敢删。
我们今天还保留着控制鳃弓发育的基因,在胚胎早期会短暂出现类似鳃的结构,然后消失。我们还带着一段合成维生素C的基因的残骸,这个基因在某个祖先身上突变坏掉了,我们就这么带着一段损坏的代码一路活到了今天。最典型的是喉返神经,它连接大脑和喉咙,本来走几厘米就够了,但实际上要绕过心脏和主动脉,在人体里走将近一米的弯路。这是因为在鱼类祖先身上这条路径是合理的,后来颈部和胸腔的结构变了,但神经的走线从来没有被重新规划,就这么将错就错地延续了几亿年。
如果基因组是精心设计的,越复杂的生物应该有越大的基因组。但现实情况是,某些蝾螈的基因组是人类的十倍,有一种叫巴黎草的野花,基因组是人类的五十倍。代码量和系统复杂度完全脱钩,这在任何正经的工程项目里都意味着存在大量冗余和膨胀。
Y染色体是另一个值得单独说的案例。哺乳动物的祖先,X和Y染色体最初大小相当,基因数量接近。但在几亿年里,Y染色体持续萎缩,基因从最初的数百个降到今天不足百个。原因是Y染色体没办法像其他染色体那样通过交叉互换来修复自身的突变,错误只能不断积累,功能基因一个个消失。这是一个因为架构限制导致无法自我修复、只能持续退化的模块,而且目前没有任何迹象表明这个过程会停止。
DNA修复机制也一样是屎山。基因组本身并不稳定,每天每个细胞的DNA都会发生数以万计的损伤,来自辐射、氧化压力、复制错误。为了应对这些损伤,细胞演化出了十几种不同的修复机制,各管一类问题,互相之间有备份和协调,整套系统涉及数百个蛋白质。这像是一个在生产环境上不断打补丁的系统,每出现一类新问题就再加一套应对机制,久而久之,补丁比原始代码还复杂,而且各种补丁之间的相互关系没有人完整地理清楚过。
所以我们的基因组不只是一段没有注释的老代码,它同时还是一个混入了大量历史病毒注入、模块之间高度耦合、调用关系靠三维折叠实现、文档近乎为零、技术债堆积如山、却从未停机一次的系统。
source
人类基因组大约有30亿个碱基对,但真正用来编码蛋白质的部分只占不到2%。剩下将近98%,里面堆满了各种东西:失去功能的假基因,曾经能用,后来突变坏掉了,但就这么留着没被清除;转座子的残骸,一种会自我复制、到处乱插入的寄生序列,光这一类就占了将近一半的基因组;还有数不清的重复片段,有些短序列在基因组里重复出现几十万次,没有人知道为什么。
很长一段时间里,这些东西被统称为垃圾DNA。这非常像一个几十年的老项目,里面全是注释掉的函数、废弃的模块、没人敢动的死代码,因为没有人确定它们是不是真的没用。
然后是内含子。一个基因在被转录成RNA之后,里面大量的片段需要先被剪掉,剩下的部分拼接在一起,才能用来合成蛋白质。被剪掉的叫内含子,留下来的叫外显子。人类基因里内含子的比例远大于外显子,有些基因超过95%都是内含子。整个过程相当于写了一万行代码,运行之前要先自动删掉九千行,再把剩下的拼起来才能执行。更麻烦的是同一个基因还可以通过不同的剪接方式产生结构和功能都不同的蛋白质,这叫可变剪接。人类基因数量大约只有两万个,但蛋白质种类远不止这个数,很大程度上就靠这个机制。同一段源代码,在不同条件下剪出完全不同的版本,行为各异。从复用的角度看勉强算聪明,从可维护性的角度看是彻底的灾难。
基因组里还有一类叫内源性逆转录病毒的东西。人类基因组里大约8%的序列来自古代逆转录病毒,它们在某个时间点感染了我们的祖先,把自己的基因组插进了宿主DNA,然后病毒死了,但插入的序列就这么一代代遗传下来。其中一些后来被身体改造成了有用的东西,比如胎盘形成过程中用到的合胞素蛋白,就来源于古病毒的包膜蛋白基因。这相当于当年被注入的一段恶意代码,后来被主系统改造成了自己的基础设施,将错就错,还真的跑起来了。
有一类叫增强子的调控序列,它可以在距离目标基因几十万甚至几百万碱基对之外的地方,通过DNA在空间上的折叠弯曲,远程影响目标基因的表达。一个增强子可以调控多个基因,一个基因也可以被多个增强子调控,调用关系不是线性的,是通过三维空间结构实现的,根本看不出来谁在影响谁。这相当于代码库里存在大量全局变量和远程调用,而且所有依赖关系只有在把整个代码库在三维空间里折叠起来之后才看得清楚。
还有一个现象叫基因多效性,意思是一个基因往往同时参与多个完全不相干的生理过程。P53基因既参与抑制肿瘤,又调控细胞周期,还涉及DNA修复和细胞凋亡。这种高度耦合在软件工程里是教科书级别的反模式,一个函数同时承担七八种职责,牵一发而动全身,让人想重构都不知道该从哪里下手。
基因组里也存在很多没有人敢动的区域。有些序列在从鱼到人几亿年的进化过程中几乎一字未改,高度保守。按理说,如果一段序列真的无关紧要,进化早就把它改得面目全非了。保持不变说明它非常重要,但很多至今我们不知道它在做什么。这就是那种典型的屎山,不知道做什么,但谁也不敢删。
我们今天还保留着控制鳃弓发育的基因,在胚胎早期会短暂出现类似鳃的结构,然后消失。我们还带着一段合成维生素C的基因的残骸,这个基因在某个祖先身上突变坏掉了,我们就这么带着一段损坏的代码一路活到了今天。最典型的是喉返神经,它连接大脑和喉咙,本来走几厘米就够了,但实际上要绕过心脏和主动脉,在人体里走将近一米的弯路。这是因为在鱼类祖先身上这条路径是合理的,后来颈部和胸腔的结构变了,但神经的走线从来没有被重新规划,就这么将错就错地延续了几亿年。
如果基因组是精心设计的,越复杂的生物应该有越大的基因组。但现实情况是,某些蝾螈的基因组是人类的十倍,有一种叫巴黎草的野花,基因组是人类的五十倍。代码量和系统复杂度完全脱钩,这在任何正经的工程项目里都意味着存在大量冗余和膨胀。
Y染色体是另一个值得单独说的案例。哺乳动物的祖先,X和Y染色体最初大小相当,基因数量接近。但在几亿年里,Y染色体持续萎缩,基因从最初的数百个降到今天不足百个。原因是Y染色体没办法像其他染色体那样通过交叉互换来修复自身的突变,错误只能不断积累,功能基因一个个消失。这是一个因为架构限制导致无法自我修复、只能持续退化的模块,而且目前没有任何迹象表明这个过程会停止。
DNA修复机制也一样是屎山。基因组本身并不稳定,每天每个细胞的DNA都会发生数以万计的损伤,来自辐射、氧化压力、复制错误。为了应对这些损伤,细胞演化出了十几种不同的修复机制,各管一类问题,互相之间有备份和协调,整套系统涉及数百个蛋白质。这像是一个在生产环境上不断打补丁的系统,每出现一类新问题就再加一套应对机制,久而久之,补丁比原始代码还复杂,而且各种补丁之间的相互关系没有人完整地理清楚过。
所以我们的基因组不只是一段没有注释的老代码,它同时还是一个混入了大量历史病毒注入、模块之间高度耦合、调用关系靠三维折叠实现、文档近乎为零、技术债堆积如山、却从未停机一次的系统。
source