Loading...

最新动态

揭开人类基因组的秘密:复杂却混乱的遗传代码

先来问你一个问题。如果你刚入职一个新公司,领导私下找你,神秘兮兮地说:“小X,咱们有个重要项目,已经运行了38亿年,至今没有发生过任何故障,这次交给你负责。”你是否会觉得自己运气极好?38亿年没有宕机,这个系统得多强大?然后领导又说:“对了,这个项目没有任何文档和测试环境,之前负责的程序员都已经去世了,你先看看代码吧。”当你打开代码库时,惊呆了。整个库竟有30亿行代码,其中90%都是注释掉的过时版本,还有不少是不知哪个程序员错误地复制过来的代码片段。想找到某个函数的具体说明,你却只搜到了大量带有// TODO: deprecated的标签,但没人敢去删除。更可怕的是,你发现某个核心模块的结构居然是反的,但无法更改,一改整个系统会崩溃。你无奈地瘫坐在椅子上,问领导:“这是谁写的?”领导回答:“没人写。这项目是自发演化的。”这个项目,便是人类基因组。

换句话说,当你第一次看到人类基因组图谱时,任何一个有三年以上经验的程序员都会有种强烈的熟悉感:这不就是我刚接手的那个烂摊子吗?你静下心来,开始熟悉代码。一开始随机打开一个基因,嗅觉受体基因,仔细查看后,你会发现一个不可思议的事实:这堆基因中,几乎一半是无效的。那些函数名还在,注释也在,但里面的逻辑因为几个随机字符的替换而失效,调用时直接返回错误。然而,这些无效的函数仍然留在代码库中,每次编译时都被一同打包,细胞分裂时又被完整复制,既占用空间又浪费CPU。你数了一下,发现人类基因组中大概包含两万个假基因。你或许会想:那就删掉它们吧?但别急。你正准备删除时,旁边一位老员工拍了拍你的肩膀:“小伙子,别乱动。上次有个人删掉一个看似没用的假基因,结果竟然引发了整个系统的问题。”

about image

更离谱的是,随着你继续深入代码,你发现基因组中有大约10%的内容是重复的序列,称为Alu片段,竟有一百多万份拷贝。就像在一个程序里,同样的注释块被复制了无数遍,分散在各处,没人知道它为什么存在,也没人敢动它。此外,你还发现大概8%的代码显然不是“原生”的,它们是古代病毒在感染时插入到人类基因组中的。就好比你在审查一个古老项目时,发现有8%的代码是十年前被黑客留的后门,始终没人清理,依旧在每次编译中出现。看到这里,你开始怀疑人生。

接着,你又发现了一件更离谱的事情:一个正常的基因在转录后,有一大段内容是无用的,必须手动去除才能使用。这个无用部分被称为内含子。也就是说,你写的一个函数,90%的代码都是注释,而实际能运行的外显子仅占10%。每次调用这个函数之前,系统需要先花费大量CPU时间将这些注释逐一剪掉,才能运行真正的逻辑。有些基因更夸张,99%的内容需要剪掉。如果能把这些内含子删除,转录效率至少能提高十倍。你再次想要删掉它们,却又被那位老员工阻止:“小伙子,内含子是不能删的。你知道吗?它有一个叫可变剪接的功能,同样的基因可以通过不同剪接产生不同的蛋白质。要是删掉内含子,这个基因就只能执行一个功能,那得损失多少能力?”你愣住了:“那么,为什么不一开始就让其简洁明晰呢?一个基因对应一个功能,多好。”老员工翻了个白眼:“你以为这是写简单的代码吗?”

好吧,你决定继续查找。在浏览眼睛相关模块时,你完全坐不住了。你发现视网膜的感光细胞竟然是朝后的。也就是说,光线进入眼睛后,必须先穿透一层血管和神经纤维,然后才能到达感光细胞,且感光细胞背对光源。更荒谬的是,所有神经纤维必须从视网膜前部集中到一起,再穿出眼球连向大脑,而那个穿出的点恰恰就是我们的盲点。这时你愤怒拍桌:“这谁设计的?把感光细胞反向安装,难道没问题吗?”老员工慢条斯理地解释:“这是五亿年前的设计,那时我们的祖先还是鱼。”

about image

“五亿年前……那可以改过来吧?”你不解地问。“改不了。”老员工摇头,“想想看,要把视网膜翻转过来,首先得让感光细胞在中间过渡,可是半朝后半朝前的鱼,其视觉肯定会比朝后视的差。”你若有所思:“……这倒是。”老员工继续说:“五亿年前,有条想翻转视网膜的鱼,因为在过渡状态时视觉太差被捕食掉了。这条路就此中断,后续的脊椎动物也只得继续在这个错误的设计上进行优化。如今,你还想尝试改动吗?试一试,损失的视力让你活不到下一代。”你沉默了。

这时,你想起之前看到过的一个竞争对手代码,章鱼的眼睛。人家的视网膜设计就是正的,感光细胞直接面对光线,没有盲点。你问老员工:“章鱼不是和我们同源进化的吗?为什么它们的视网膜设计得更合理呢?”

about image