准备落笔写《深圳I/O》(Shenzhen I/O)时,我的心情其实有点矛盾。
最初,编辑约稿是因为《深圳I/O》是一款与程序语言关系很深的游戏,想找个会写程序语言的人来写。这部作品在 Steam 上获得不少好评,它让玩家体验到程序员的工作环境。游戏中接驳电路、选电子零件、编程等等内容都对玩家有一定技术要求——玩家扮演在深圳电子科技公司打工的外国工程师,工作职责是为指定的产品专案设计电路。需要设计的产品可能是计算机、VR 装置或其它电子产品。游戏目标是设计电路,成功发送客户专案要求的输出讯号模式。
例如第一个游戏任务是设计闭路电视。玩家需要在可供选择的电子零件中挑选出合适的部分放进产品机箱中,然后接驳电线、选择电线接口和撰写晶片程序。完成设计初稿后进入调试(Debug)阶段,要以不同节奏检视模式检测输出讯号,找出并作修正电路和程序中所有潜在错误。如果你的设计方案能让产品成功发放指定的输出讯号,就算成功过关,公司会分析玩家电路的制作成本、运作功率、程序效率等等数值。然后“同事”就会将下一个产品专案的要求发送至玩家的工作邮箱。
是不是真的很像上班?
游戏的重点是让玩家能“入戏”地体验工程师的日常工作。游戏初始画面是临场感十足、可俯瞰深圳大街的办公室。工作期间,你会不断收到同事的电邮,游戏附有仿真度很高的公司内部工作手册,让玩家工作时查阅——不过电路设计过程没有一点提示,全靠玩家自行解决。作为一只大小只有400Mb 左右的游戏,它营造了一定的沉浸感。网上玩家特别赞赏游戏的电邮系统与工作手册,不少人甚至认为这些电邮本身就很有敍事深度。
的确,《深圳I/O》在技术层面很优秀,但我却无法在游戏中深刻体会到硬件与编程带给我的乐趣。这样说吧:虽然这是游戏,我却不觉得自己在玩乐。它反而令我想起以前上班的日子。
电路设计与程序语言
《深圳I/O》的重点是设计电路,玩家要接驳不同的电子零件,以组合语言(Assembly Language)为每一块晶片编程。不得不说,对我这类 geek 而言,编写组合语言还是很有趣的,甚至是有型的。
Geek 和常人不一样,我们写的语言愈“低阶”,正常人愈看不懂,我们就愈高兴。用电脑科学界术语来说,人类的自然语言是高阶语言,是“to the human” 的语言,而组合语言是一种“接近机械”(to the metal)的语言,即是说相比 Python、Java一般常见的高阶程序语言,组合语言更原始,也更接近电脑硬件的真实运作逻辑。组合语言甚至比用来撰写运作系统的 C 语言更为低阶,几乎是微型处理器处理演算法的方式。
游戏中,玩家必须要考虑将数据暂存于晶片上哪个暂存器(register)上,考虑如何储存及取用数据——这都是组合语言的考量。光是这点,已经足够让 geek 们向其它人推销这款能够编写“几乎是最原始程序语言”的游戏了。
虽然写组合语言很有型,但玩下来感觉像上班多于游戏:游戏只要求玩家的电路设计成功配对输出讯号,而到底设计的产品是闭路电视、计算机还是 VR 装置,毫不重要。最大的问题是《深圳I/O》几乎没故事性:如果我在可以角色扮演坏老板,要设计闭路电视监察员工,保证他们连上厕所抽个烟都逃不过我的法眼,那作为玩家我最少还有一点做坏事的快感。
技术型游戏其实可以很好玩,很多FPS(第一身射击)游戏都有找零件砌枪的环节,但重点是砌完可以杀怪。《深圳I/O》令我有点沮丧的原因,就是在游戏里工作的目标就是工作本身,简直像现实世界一样令人觉得人生没有意义。
模式配对的异化——产品设计 vs. 工程配对
马克思有所谓“异化”的概念:工人感到失去对劳动意义的控制,更甚者工人感到工作从劳动手段变成目标本身。老板叫你做甚么就做甚么,人只是一条长长生产线中一粒螺丝。《深圳I/O》带给玩家的感觉有点相似,里面生产的不同产品只是不同形状的数位讯号或数字串,工作本身的意义为零。
工业革命后,人类的生产分工愈来愈细,人的异化也变得更明显。这种意义感的丧失当然不只是电路设计从业者面对的情况。所有做工程配对的人都应该明白我在说甚么。设计产品的人已经定义了产品的目的、功能与真实意义,负责配对的人只是在工程技术层面上达到这些数学要求。生产出来的产品到底是甚么都跟配对者无关,这也算一种异化了。
作为一名前精算师,《深圳I/O》居然让我回想到以往做人寿保险精算定价的日子。寿保公司的“产品设计”(product design)与“定价”(pricing)往往由两批不同的团队负责,产品团队决定寿险产品的保障范围、收取保费以及理赔的方式,“定价”精算团队在数学层面上按照产品团队定下的现金流及风险模式进行配对,以决定保费及储备的水平。精算业的定价工作就是一种“工程型”的模式配对工作,在最极端的情况下,定价精算师根本不需仔细理解寿险产品在真实世界的意义。精算师就好像《深圳I/O》里的玩家,只要将数字计算到符合指定要求就好。就好像一个人在家具厂工作,每天生产一条条木条,但最终做出来的是床还是椅子都跟他无关。
这也是为什么我有点不理解为甚么我连玩游戏也得回到以往那种工作环境——还没有薪金……起码,对我来说,游戏始终不是真实的工作,两者追求的终极目的不同。那为甚么我居然在游戏中感受到了工作的异化?我自己是百思不得其解。
著名的游戏设计师 Sid Meier 说“游戏是一系列有意义的选择”。这方面《深圳I/O》就不及格了:基本上故事线是线状的,也就是说除小部份“额外关卡”,故事是一条直线几乎没有分岔点。玩家每成功设计一个电路,便会收到同事的新电邮,内里是下一关的产品要求。这种简单设计太像手机游戏。设计出来的电路效率和成本都不会影响之后关卡出现的顺序与方式。
这样设计的确会让玩家专注在编程与电路设计的技术层面,但也轻视了游戏整体结构的重要性。作为对比,同样是“上班族”类模拟游戏的《请出示文件》(Papers, Please),扮演海关人员的玩家作出工作决定的过程——要否放面前的入境者过关,真的会影响玩家在威权体制下的命运与故事进程方向,树状的游戏剧情结构比《深圳I/O》的线状结构有趣得多。
属于程序员的接龙——麻将接龙
虽然讲了那么多《深圳I/O》的坏话,还是不得不赞里面异常出色的“麻将接龙”小游戏。虽说是附属游戏,但麻将接龙是《深圳I/O》的重点组件。这个出色的小游戏得到大量玩家的正面回向,并且在《深圳I/O》推出3个月后就被作为独立游戏——《深圳纸牌》发行了。
麻将接龙的设计极之简单,也极之聪明:它是一个体现程序语言本质的游戏。
麻将接龙与经典微软接龙(Classic Solitaire)十分相似,游戏赌桌展列出八叠纸牌,玩家要将所有点数纸牌移动至赌桌的右上方。里面的牌是中式筒索万三色麻将纸牌再加十二张中发白。所有纸牌自开局就面朝上让玩家可见,没有微软接龙中的隐藏牌叠,但有三个纸牌暂存位置让玩家寄放无法处理的纸牌。玩家需要连续地从大至小以不同花色排列的牌,这就算是有效接驳。十二张中发白纸牌在整个游戏过程中不能被接驳,如果四张同款牌都暴露于牌面就可回收,代价是失去一个暂存位置。
麻将接龙与微软接龙表面看来只有些微不同,但正正是那数个关键改变令麻将接龙成为一个聪明得多、也困难得多的游戏。
规则上麻将接龙比微软接龙多了很多限制。十二张中白发牌是游戏主要难度来源。牌只有八叠,拦路的中发白却有十二张,即使千辛万苦将四张同款牌置于牌面,收起它们的代价竟然是三个暂存位置之一,可谓十分昂贵。我开始几局都失败收场,慢慢掌握窍门后成功率才略高于五成。麻将接龙没有向玩家隐藏的牌,所以没有丝毫幸运成份,是个烧脑的硬核游戏。这是一个随机性难度和组合计算量难度之间的取舍交易(tradeoff)。
这种难度取舍其实有点违反人类天性。动物在大自然世界猎食讲求运气,这一刻很难确知下一刻会出现甚么随机事件。猎食讲求一击必杀,张开口咬下去就是,顶多就是怕周围有比自己更凶猛的捕食者,所以需求的计算量极低。相反来说,麻将接龙那种思维就比较像政治暗杀,需要从头到尾都思虑周密,严谨布局。其实精确计算的思维模式自工业革命后才兴起,又在上世纪50年代电脑诞生后才大行其道。人类本身还是很靠运气的动物。
麻将接龙多出3个暂存位置让玩家暂存无法处理的纸牌,而这3个暂存位置正正发挥了组合语言中暂存器(register)暂存数据以换取运算空间的作用(详见上文介绍组合语言的部份)。也即是说普通接龙那种玩法是行不通了。玩家必需事先想好数步以至十多步,像玩围棋般严谨地执行“接龙程序”。在Steam讨论区上更有人讨论麻将接龙的开局在甚么情况下才是数学上可解的。这些都凸显了麻将接龙的程序本质。
尾声
“All work and no play makes a good boy dull.”
《深圳I/O》模糊了工作和游戏的界线,对于想透过游戏逃离现实的玩家(如我)确实有点摸不著头脑。如果有个游戏要我扮演科研人员,要求我检视理论、做实验、投寄论文和准备座谈会报告,都肯定比塞一堆论文给我再叫我堆砌数学公式有趣吧?正如我在《三国志》扮演诸葛亮,游戏也总不会让我每天只批改奏章,即使那是孔明本人真实的工作。我甚至觉得,《深圳I/O》的工程师干的有点像大卫格雷伯(David Graeber) 讲的bullshit job,如果将这种工作视为人生意义所在,恐怕很快会疯掉。
(作者为美国威斯康星大学研究生,研究专业为人工智能——深度学习、机械学习以及电脑视觉。)
支持这栏目
寫得太好了,謝謝作者,謝謝端。
to 无需多言
關掉又重開了。還是有很多讀者想念這個系列的
the one who is alienated won’t be able to fell any joy, even from game!
Game On这个栏目当初说要关了,最后一期的时候我还说:天啊,终于结束了…..
为什么现在它还在