【完全剧透预警】
看到其他回答中,有些朋友不太能理解故事的一些技术上的设定,在这里根据个人理解,尝试从技术的角度上讲解一下故事。
本人是计算机科学的学生,在计算机相关技术上了解会多一些,对于生物相关的技术不甚了解。所以可能对故事存在一些理解偏差,也可能漏掉了一些细节,还望加以指正。
Watts和妈妈Lynri的研究方向,都是神经科学。Lynri研究的内容是通过对神经元细胞进行操作,进而改变人的记忆。这也是《去月球》和《寻找天堂》 的技术基础。
但Lynri毕业后没有完成自己的研究,就因为压力太难难以支撑,跟Quincy周游世界去了。她临死之前,选择将自己的记忆数据保存一份,送给自己的孩子Watts作为礼物。
以当时的科技水平,保存下来的一份记忆数据还难以被运用,并没有太大意义,这份礼物只能送给未来的Watts。
而大学毕业的Watts因为妈妈离职而和基金会产生的矛盾,无法从基金会那里拿到资助,只能去私营的Sigmund公司工作。在帮助临终之人修改记忆的空闲,他调用了公司里,自己能接触的一切资源,进行着自己的研究。终于,他完成了自己新的成果。
Watts的新成果其实很简单:通过一份原点上的记忆数据,在某个选择点上做出另一个选择,就能产生一条新的世界线,即大家熟悉的平行世界。类似世界观设定的文艺作品有很多,《影子工厂》选择从计算机科学角度上,给了平行世界一个解释。
简而言之,Watts在一台电脑上,运行了一个程序,这个程序启动时,会启动一个人工智能Lynri——简单说,可以把这个程序理解成一个自动运行的RPG游戏,而游戏的主角是Lynri。这是一个挂机游戏,不需要你进行任何操作,Lynri的故事就会发展下去。
我们把这里的Lynri,称为Lynri【0】。
而随着故事的发展,Lynri【0】会做出很多选择,每一次选择会产生一条新的故事线。新的故事线可能很短——比如小时候的Lynri立刻发病去世了,那这条世界线就立刻结束了。也可能很长——比如故事主线中的Lynri选择提前手术,多活了几十年。
无论如何,新产生的故事线又会产生新的选择——比如那个活下来的Lynri,她长大之后还要回答爸爸的“星星与薰衣草”的问题。每一次选择都生成一条新的故事线,从Lynri【0】的出生开始,这个故事会形成一个树状的结构,可以理解成我们在游戏的每一个选项处都进行存档。理想情况下,Lynri总会在每一条故事线里都走向死亡,所以这个树状的结构总会终结。
注意,这棵树里所有的Lynri都是Lynri【0】,平行世界中的Lynri【0】
很显然,存档需要消耗内存空间,现在的游戏一般也不会允许玩家进行无限次存档。但理论上说,只要内存大到一定程度,那只要一条故事线结束,我们立刻把这个存档删掉,就可以把空间释放出来,那么内存就不会出现问题。
即使这棵树可能会很庞大,凭借现在的计算机技术实现不了处处存档,但是Watts的世界里都能借助量子运算实现篡改记忆了,穷举完所有Lynri可能面对的事情也不是不可能。但总会有一些意外发生。
试想一下这样一种情况:其中一条故事线里,Lynri【0】选择了本作的主线,活到了头发苍白,完成了和Watts一样的研究。这时,她选择用自己的记忆进行一次模拟实验,模拟一下自己的一生。这就产生了意料外的情况——Lynri【0】在程序中,创造出了新的Lynri【1】。这种现象在计算机科学中称为“递归”。
在某种条件下能够结束的递归是很常见的编程思想,但递归一个常见问题就是会产生死循环。在这个故事里,总会有一个Lynri【1】选择提前手术活下来,进而创造出Lynri【2】,而Lynri【2】又会创造出Lynri【3】……这是个永远没有终结的循环。
假设Watts的电脑内存很大很大,一直到Lynri【n】的产生都不会出问题,但总会有Lynri【n+1】的出现,造成内存没有足够的空间。这种现象被称为“堆栈溢出”。
我们用电脑的时候很常遇到一个程序陷入“未响应”的状态,只能强行把程序关掉。而程序未响应一个很可能的原因,就是开发者的编程错误,导致了堆栈溢出的发生。
通常情况下,我们运行的程序,内存不够用时,会跟CPU申请一块新的空白的内存空间。但是CPU的运算也不会绝对正确,我们的程序编写也可能存在错误,进而导致CPU分配给程序的内存,并非是完全空白的。于是,程序可能会在本应是自己独占的内存空间中,接触到别的程序的内存空间——这个内存空间里很有可能是有东西的。这个很常见的BUG名为“内存泄漏”。在我们的故事中,每一条故事线都本应有独占的内存。但当故事线逐渐增多,错误也逐渐增多,内存泄漏的发生越来越频繁。
还记得Lynri说,自己也不理解为什么自己的记忆里,会出现尸体吗?这本就不是这条故事线里她的记忆,而是错误地读取了另一条故事线的记忆。谁知道那条故事线发生了什么,或许是基金会和投资人产生了矛盾,进而火并,在场的人都互相把对方杀死了也说不定。
所以,Quincy每一次进出房间,房间里的人都不一定是死是活——这不是薛定谔的猫,这是Quincy不一定错误地访问到了哪一条故事线的内存。
很显然,Quincy说他看到了尸体的时候,Lynri【n】已经意识到了问题的存在。进而她开始产生了本能的怀疑——自己究竟是活着的人,还是一段程序。
很快,Watts注意到了此处的程序存在一个死循环。说不定前面也有别的死循环,但这一处是递归层数最大的,也就是所有的Lynri【n】中n最大的。
而产生了这样的死循环,也正说明,Watts的实验成功了。他真的可以通过记忆数据,去生成无穷多可能性的新的记忆。
故事到这里已经可以结束了,你的游戏已经未响应了,直接把游戏关掉就可以了,顺便去网上骂一句“开发者**,这游戏有BUG呀”。Watts作为开发者,还得去找一找到底是哪里出的问题。至于Lynri和Quincy的故事,早就被CPU释放掉了。Watts修复了BUG之后,崭新的Lynri【1】又诞生了。
如果高瞰老师真的在这里制造一个程序未响应,他就打破了第四面墙,成功塑造了一个恐怖游戏。
但很显然,我们现在玩的是《影子工厂》,不是《心跳文学部》。这不是一个恐怖故事,只会是一个童话故事,于是就有了Faye的出现。
Faye很神奇,她是前作《寻找天堂》的主角,通过大脑凭空产生的记忆,而在Sigmund的记忆篡改机中,Faye自然也随着全部记忆,化为了一段数据。很显然,Faye这段数据得到了他的关注。所以他把这段数据拷贝下来,作为一个结束循环的“杀手”程序,插入到了自己的程序执行中,给了故事一个童话结局。
程序员很多时候,会有一些奇奇怪怪的浪漫。比如到处都有的“Hello world”,比如在注释里写莫名其妙的东西(之前很流行在代码开头画佛像祈求不出BUG),再比如《头号玩家》中那句经典的“谢谢你来玩我的游戏”。这些行为并不会对程序的执行产生任何影响,有的时候反倒会徒增工作量。
但是,每一位程序员也都是活生生的人,会有着自己的性格与喜怒哀乐。每一段代码中,也寄托了他们的情感。
Watts本可以选择在注意到这种死循环时,直接关掉程序,这并不会产生任何不良影响。哪怕是使用Faye这样的杀手程序来软性结束循环,也完全可以使用一行简单的结束指令。说不定还会有一小段时间,这条故事线里的Lynri和Quincy会眼前一黑,Quincy会担心是不是世界末日了,Lynri或许会释然:自己作为程序的生命结束了,下一秒世界就消失了。一切都很简单,Watts也省心省力。
那Watts花费时间开发一个Faye的意义是什么呢?他为什么要带自己的父母去月球上,亲眼看着地球毁灭,再送他们一段美好的记忆呢?要知道制作一段没有分支的完美数据,也是要花费额外的时间的呀。
Watts的完全想法我们不得而知,而且《影子工厂》这条故事线里的Watts或许也不是真正的Watts——游戏的结尾已经给了很明显的暗示了。千千万万条不同故事线中的Watts,会有不同的心理活动。但我相信,无论是哪一种,他们的心底一定有着一个共同的执念。
那是一道光,一道带来了生命的光。正是这道光,向我们每一个人诠释了生命的意义。
《影子工厂》作为系列的收官之作,在我心里十分完美。原因很简单,这不再是一个简单的爱情故事,或者讨论人生意义的故事(事实上,一直到Faye出现之前,有好几次我都以为故事即将结束,但最后结局的张力远远大于我的想象)。高瞰老师在收官之作中为我们带来了最后一次意义的升华。叙事结构也堪称巧妙,通过一部作品同时叙述了系列的前后传,真的是让我叹为观止。
这两天还欣赏了一部类似主题的作品,是彩虹合唱的《星河旅馆》。虽然体裁完全不同,故事也大相径庭,但这两部作品有一个我很喜欢的共同点:在故事中埋下了无数欺骗性的伏笔,让我对故事的结局产生错误的猜测,却又在真正的结局处慨叹于自己的自作聪明。
更多地,这个故事某种层面上说也是一份送给程序员,乃至于科研人员的小礼物吧。
技术终究是在进步的,在一段段鲜明的生活的推动之下。
不知是巧合,还是高瞰老师真的有所借鉴,大刘的《诗云》和《朝闻道》两篇作品,恰好可以对应上《影子工厂》的开端与结束。这两篇作品我都很喜欢,本文就用《朝闻道》最后那个问题作为结束吧。在我看来,《影子工厂》给了这个问题,一个很精妙的解答:
“妈妈,宇宙的目的是什么?”
来源:知乎 www.zhihu.com
作者:TEACHK
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载
此问题还有 35 个回答,查看全部。
延伸阅读:
《去月球》(to the moon)中通过改变人记忆来帮助人实现愿望的做法是否有意义?