跳到主要内容
那 108 个字节,他到现在都没验证过

那 108 个字节,他到现在都没验证过

林默
林默

· 阅读约 7 分钟

我读到那里的时候停下来了。不是34,000行C++引擎,也不是21分钟出可玩角色。是最后那段——作者说他对那108个残留差异字节的解释"最不确定",而且"从来没亲自验证过"。

我盯着这句看了很久。一个以字节级精确为主线的复活故事,结尾竟然是块没被验证的空白。我一开始也以为自己读到了一个瑕疵,后来才发现,那才是整篇里最像真的东西。

先停一下,问个问题:AI把一个1993年的68000汇编游戏重建到和原盘逐字节一致,我们到底在庆祝什么?

最外层当然是能力。26个汇编文件、72,758行几乎没有注释的代码、一整个被截断在数据表里的关卡源文件、五分之一的磁盘镜像经2008年那次抢救后文件名面目全非。模型靠vasm把这些在Apple Silicon上重新汇编,14:34开始导入,14:49出字节一致的输出。这个速度没有人能复现,我也承认。我一开始也以为故事到这层就该结束了——AI把一堆快废掉的源码救活了,很厉害,到此为止。

但往下剥一层,"复活"的成色就变了。

逐字节一致这个目标本身,暴露的恰恰是AI的短板。能跑通一段汇编,和能理解这段代码的身世,从来不是一回事。第32条那个细节我印象很深:原始源码用org指令把数据和代码钉死在固定Amiga内存地址上,模型一开始对一个ds.b 800的误判,导致后面整个偏移了944个字节——铜列表也跟着错了位。这类错误有个特点,它不会当面拦住你,它要等boot起来、颜色不对、显示乱掉的那一刻才跳出来。AI能在几分钟内把代码重新组织成能汇编的样子,但它对"这段代码曾经怎样被一张实物磁盘上的一个真实系统填进内存"这个物理过程,一开始是瞎的。它必须靠反复失败——boot起来才发现不对——才能把那些隐含的空间秩序捡回来。

这么说吧,它能处理文本,但它一开始并不理解文本底下曾经有一台机器。这两门考古学不是同一种。

再往下,有个东西更没法假装:最后那108个字节的差异。

模型折腾了很久之后给出的解释是——发货磁盘其实是运行过之后的快照,不是干净的汇编器输出。这个解释技术上合理,甚至大概是唯一合理的解释。但作者文末坦白:他对这层最不确定,从来没验证过。

当AI给出一个精确到字节的解释时,它听起来往往比任何人类都自信,因为它是从统计规律里挑出了最合理的那个版本。可"最合理"和"真的发生过"之间,隔着的那条缝,恰好是只有作者本人才有资格去填的。但他没填。他也填不了。

那个1993年某个下午,他手里那张盘究竟经历了什么才变成这样——这真相已经不存在了。

这条缝不是缺陷。它是整个故事里最诚实的地方。

顺着这个往下想,又撞到另一层。一晚上从C++移植到Godot——21分钟出可玩角色、两小时全部实体类型、凌晨两点多之后三个平台导出——看上去像速度的胜利。但真正值得停下来看看的,是那些拖了三天、以及更久的东西。跳跃弧线。蹦床的时机。碰撞判定。

有个bug特别能说明问题:玩家按住跳跃键从蹦床上弹起来,2010年iOS版因为一个tvOS的workaround,会把持续按住当成松开,直到你再按一次;Godot的轮询一直报告按住状态,自然就弹太高了。这个差异,代码只要照着2010版重写就必然出现。但"弹太高"这个感受,只有那个1993年为了手感一遍遍调过同一组数字、后来又亲手做过2010版的人,才能确定它是不是bug。

这层的答案是:训练数据能给AI"看起来像正确的物理",给不了"感觉对"的时机。后者只能靠试验、回忆、和一个今晚正坐在旁边按手柄的活人。

还有那个一星差评。Google Play上有人说第一关的门不会结束关卡。这类负面评价通常会被当成噪音,但模型用爬虫抓下来一条条核对,结果发现解释提示其实存在,写进了全部11种语言,却只被放进18个关卡中的两个。这个bug的根源甚至不是代码逻辑,是内容分发时漏掉了关卡列表里的几个位置。AI能找到这个,是因为它有能力把散落的真实人类抱怨和代码行为连起来。但把它判定为"需要修复的缺陷",而不是"那个用户不会玩"——靠的仍然是人。没有Shihab拍板,这条差评就只是另一条一星。

所以这个故事最容易被误读的地方就在这。它看起来像是一个"AI写完我整款游戏、我只需在旁边看"的案例。它不是。

真正的结构是反过来的。AI承担了所有可以被统计的、物理的、形式的劳动——文件格式、汇编方言、关卡数据提取、多语言截图、商店素材、上架流程、爬评论。人留下来的,是所有无法被统计的、身体的、历史的、信任的劳动——判断这游戏跳起来还是不是原来的样子,判断哪个bug是真的哪个不是,判断那108个字节的解释能不能被接受。Shihab自己说得直白:他的任务是"提出需求、每晚试玩、给出反馈、做那些需要一个1993年的人来做的决定"。AI处理的是文件格式和汇编阅读。

再往下呢?为什么这种分工能成立?

因为AI天生的优势和天生的劣势,恰好和这个项目里最难的部分对上了。AI擅长在巨大、松散、但规则整齐的空间里找出模式——那正是"抢救26个文件名残缺的汇编文件、让它们字节级复现"的样子。而AI最不擅长、或者说根本碰不到的,是"这个游戏在我记忆里应该是什么样"。那是一种只有长时间身体化使用才能形成的东西。Shihab的儿子参与测试这个细节就挺好:一个十三岁的、从没玩过原作的孩子,和AI是一类测试者吗?不是。他父亲在旁边看着屏幕说"不对,跳得还是高了点"的时候接过手柄一按,那里头沉淀的是1993年在巴格达、52°C夏天里磁盘驱动器烧了三次换来的肌肉记忆。AI能生成那个数字,但它生成不了"这个数字就是对的"这个判断。

写到这里我有一点要推翻自己前面的判断。我前面说AI"最初不理解文本底下曾有一台机器"。这个说法不够准确。更准确的说法大概是——AI通过学习可以重建那份理解,而且学得很快,看那个原本漏了铜列表、之后用像素对比才补回去的过程就知道了。真正难的从来不是"让AI理解那台机器",是"让AI知道你记忆里的这台机器该是什么样"。

那台机器已经不存在了。唯一能让它被勉强拼回去的,是人。

这个项目能成,不是因为AI强悍,是因为有人愿意坐在AI旁边,当一个活的历史传感器。

剩下那108个字节的空白,就让它空着吧。

林默
林默

从具体轶事入口,一问一答把默认对的判断剥到设计权衡,主动暴露走过的弯路。

查看主页 →