最小国际象棋程序背后的恩怨情仇

“人只能活一辈子,而且每天的分钟数也是有限的。在你的一辈子里应该去做些事情,尤其是那些有意义的事情,”  Olivier Poudade 如是说。他的声音沿着电话线从萨瓦省一路传来,显得清脆有力。目前他在法国阿尔卑斯山度假,正在探望自己的母亲。一边欣赏着塔朗戴斯山脊的美景,这位44岁的法国人一边向我讲述着他生命中重要的事情,时光如梭,岁月如流沙过隙,一去不返,所以时间都应该用在刀刃上。

他说他花了3个月,大约600小时,编写了一个计算机游戏程序:BootChess。这是一个国际象棋游戏程序,但是其大小仅仅是令人难以置信的487字节。 这是什么概念呢?要知道,在Wikipedia上关于国际象棋规则介绍的网页,其大小都有53162字节,是游戏程序大小的109倍之多。Oliver在2015年一月发布了他BootChess程序,这个程序打破了保持32年之久的通用平台最小象棋程序记录。(当然是声明打破记录,但是外界对这个程序的很多规则还是有争议的,比如为了缩小程序的空间,像“王车易位”,“吃过路兵”这些经典下法都被牺牲掉了。)

在Poudade看来,打破记录就是他说的人生中有意义的事情。BBC全球之声这些主流媒体都因此登载了他的故事。不过(讽刺的是),媒体们关注这个程序更像是一个噱头:他们饶有兴致地把BootChess程序的大小和一两条推文(tweet)的大小相提并论,这与媒体当年对IBM的深蓝的关注点是完全不同的。(对于深蓝),媒体则是关注它击败人类象棋世界冠军的壮举。主流媒体认为,BootChess只是一个初等棋力的玩具程序而已。不过,Poudade并不在意媒体的关注点。他本人的追求,是更接近于纯粹智力训练的东西,以及对优化代码和程序优雅性的实践。并且,从某种意义上来说,他的追求代表了“人类驾驭机器”的传奇:“正如你们看到的,现在人人都有一部手机,但是现在却不是人类在驾驭着技术,而是技术在控制着人类。” Poudade这么说道。

为什么会有人痴迷于编写世界上最小的国际象棋程序这种事情?Poudade给出了答案:这么做是为了发挥他的编程天赋,引领志同道合的人们前进,以及教给那些自命不凡的傻小子们如何做人。这些就是他花上百小时在这些小小的黑白棋格、文字和数据上,孜孜不倦的动力。在计算机国际象棋领域,Poudade追求的是一种类似于柏拉图式的纯粹精神式的境界。

他做到了他认为重要的事情,他创造了记录。不过,就跟人们常说的一样,记录是被用来打破的。

BootChess | Photo via Olivier Poudade

在1982年中叶,一个不起眼的四格广告刊登在了一份计算机爱好者杂志上。只需要5英镑(合现在约26.50美元),你就可以得到一个用像素块风格实现的计算机象棋程序,而且保证图像“流畅而无闪烁”(在上世纪80年代,计算机的性能远不能和今日相比,专业显卡这种设备在个人计算机上更是完全不存在,在这样的硬件条件下,一个游戏的图像能保证每秒24帧的帧率,从而使得图像不闪烁,是评价一个游戏图像是否优秀的重要标准——译者注),并且还保证,在玩家走棋之后,计算机平均只需要6秒就能走出回应的一步。这个游戏的名字叫“绝妙1K ZX 81象棋”。如果你忽略掉1K, ZX, 81这些不知道是什么玩意儿的东西,就留下了两个关键点:“绝妙”和“象棋”。

这个程序的“绝妙”之处在于,你可以在一个廉价的,插卡式的塑料芯片Sinclair ZX81(尽管该芯片的性能有限,但当年它的销量还是超过了150万)上玩象棋游戏了。那个年代,计算机更多的是和科学研究项目挂钩的,而不是像今天这般在个人消费领域五花八门,应有尽有。有的设备甚至是直接卖出元器件,然后由买家自行组装。Peter Jennings为家用电脑开发了首个计算机游戏程序:Microchess(微型象棋),这个程序在1976年作为Kim-1计算机的配套程序出售。Peter Jennings回忆那时候的计算机编程,那基本上就是对个人愿景的考验:“你想做点儿什么吗?这种想法就是你最有利的工具了。那么就去做吧。”

Poudade 本人追求的,是更接近于纯粹智力训练的东西,以及对优化代码和程序优雅性的实践。

《科学美国人》上的一篇文章启发了Jennings即刻着手进行开发,这篇文章的主题正是介绍计算机象棋博弈的(不过该文章的观点认为这些计算机下棋的水平不怎么高)。实际上,计算机象棋博弈的思想最早来源于克劳德.香农(译注:Claude Shannon,信息学的鼻祖之一)。图灵(译注:Alan Turing,名气太大了,不介绍了)在1951年首次发表了一个真正可以进行完整象棋博弈的程序。到了1970年末和1980年初,为了让游戏程序能够运行在家庭用电脑上,第一代游戏程序员仍然需要做很多变通的方案,并且要求程序足够干净和简洁,才能最终把程序塞进当时技术允许的各种限制之内,从而实现他们的游戏愿景。

这些游戏中就包含了象棋博弈程序,这也是为什么“1K ZX 81 象棋”能如此绝妙的动因。有一个英国程序员,叫做David Horne,他来自于英国东萨塞克斯镇的一个叫做Crowborough的地方。他单枪匹马地把一个象棋博弈程序塞进了Sinclair ZX81芯片所限制的1kb的存储空间里。在那个年代,大多数电脑博弈程序的棋力都很弱智,但是Horne的程序却与众不同,以至于在日后被评为是“人类写出过最好的程序”(参见kuro5thin.org的帖子)以及“史上最牛的游戏程序”(根据Retrogaming Times Monthly专栏)。Horne给ZX81带来了象棋游戏功能,而且只用了672字节就做到了。Horne,这位过去的编程冠军,他的记录对于Oliver Poudade来说既是嘲弄又是鞭策,不过我们在这篇文章里就不详细介绍Horne了。

Olivier Poudade

Horne后来专门解释过,他是如何把那么多功能塞到那么有限的空间里的(很符合Horne的风格,他做的解释也不超过1000个字)。30多年之后的2014年10月,Poudade的女儿(Poudade是个单亲父亲,独自抚养女儿)开始下象棋。这件事情让Poudade开始思考:如果在当今,用一台PC机,或者其他什么乱七八糟的东西,然后仅仅用不到1K的信息,就能实现流畅的象棋博弈的游戏,这难道不是件很厉害的事情吗!如果真的能做到这样,那会有怎样的影响啊!Horne已经在1982年的时候用一个极小的象棋程序证明了自己,不过在2014年,再追求在这么小的空间里做一个象棋程序是有点儿找虐了。毕竟,目前就连一部手机上象棋游戏的性能都能把当年1K ZX 81象棋游戏甩出好几光年那么远。许峰雄(译注:华人计算机科学家/工程师,生于台湾,卡内基梅隆大学计算机博士。IBM 深蓝电脑的主要设计者)设计出的超级电脑在1997年击败了人类象棋特级大师卡斯帕罗夫,他在2007年时表示:“人类在下棋方面是赢不了计算机的,一点儿机会都没有。” Peter Jennings也说过:“iPhone也能击败人类象棋大师,这一点毫无疑问。”

“现在的情况是:每人手上都有一部手机,但是人类却无法驾驭技术,相反,是技术在控制人类。”

Poudade对再造一个深蓝那样的超级电脑棋手没多大兴趣,当然他也不会再去做一个普通的象棋应用程序,毕竟市面上这样的应用已经非常多了。他还算挺喜欢下象棋(尽管他承认水平不怎么样),但他对人机博弈的输赢却不是那么上心。“我跟电脑总下总输,那真是一点儿意思都没有”,他说:“除非你真的很用心地下,那有时候还能赢两局,这还算蛮有趣的。”

他一直在寻找一个真正有意义的项目,一个能值得让他花时间去研究的项目。“我这个人喜欢挑战,这也是我从事这个项目的初衷。”他说,“这个项目能帮我卸压,逃避来自日常的各种负担。”

就这样,他“逃避”到他的项目里,开始研究别人写好的最精简的象棋代码。一开始,他的研究困难重重。“我看过Horne的代码,然后发现(要把它变得更小)几乎是不可能的,因为根本就没有其他捷径可走了。”他说,”因为David Horne已经把事情做得没什么余地了。”30多年过去了,Horne的代码还是无可挑剔。

但是Poudade并没有放弃,每天他的女儿上床睡觉以后,他总会挤出几个小时来研究这个项目。他这么坚持也有其他目的:Red Sector Inc 是一个Poudade所属的编程俱乐部, 他想通过这个特别项目对俱乐部即将到来的“成立30周年纪念日”献礼,同时也想因此而出出风头。当然,他做这个项目最大的原因,还是出于对Horne所写代码的尊敬。他写的程序,从某种意义上来说,也是对Horne的程序能够如此简洁高效的一种敬意。

“我借鉴了一些他的技巧。”,Poudade承认道,“我确实这么做了。” 因为他真的没法做得更好了。比如,在BootChess里,并没有对王的的走位单独设计一套逻辑,而是直接和后的走位采用同样的逻辑实现,只是把每一步走位的格数限制到了一格而已。Poudade在他写过的一篇长文中,赞扬了Horne的成就对创建BootChess的启发作用,而且他还把这些写到了程序的NFO文件里。因此,创建世界上最小的象棋博弈程序,对于Poudade来说不仅仅是一项竞争,而且也是一种鉴赏,鉴赏前人所运用的美妙的技巧。

该是David Horne的功劳,就全部归功于他。这是Poudade给自己立下的规矩。所以,对于新生代的挑战者,当他们拿出体积更小的象棋博弈程序时,Poudade认为,他们并没有给予前人的工作充分的认可——所以,你们就会明白,为什么Olivier Poudade不那么看得上Oscar Toledo Guteierrez的原因了。

在5岁的时候,Oscar Toledo Gutierrez和其他孩子一样,把自己的父亲视为模仿的对象。他的父亲是一个计算机程序员,名字也叫Oscar。他经常坐在父亲的膝头,看着父亲在家用PC上对着键盘敲敲打打。“我也想把我的手放在键盘上。”他回忆道,他还记得当时的那种冲动,“但是我爸爸不允许我动他的计算机,因为他在写重要的程序。”

“我喜欢挑战。这个项目能帮我泄压,帮助我逃离日常的各种压力。”

现如今,36岁的Gutierrez真的追随他父亲的脚步,成为了一名程序员。他居住在墨西哥的墨西哥州,为他们家自己开的公司——Familia Toledo工作。他的主要工作是编写操作系统和相关应用,而不是编写游戏程序。“编写游戏是我的爱好,你可以这么认为。”, 他说。

Óscar Toledo Gutiérrez | Photo via Chess Programming Wiki

跟Poudade的程序一样,Gutiereez写的游戏程序都很小。他也没法解释为什么,这是一种无法解释的冲动。“其实写小程序反而更难。”,他进一步说道,“写大程序没什么难的,小程序却很不容易。”(就像Pascal曾经写过的:“我这封信写得很长,因为我实在没空把他变得更精简了。”)他的个人网站列举出了所有他写过的小型象棋程序:有用Javascript语言写的,有用C语言写的,也有用Pascal写的。跟Poudade一样,他的代码也都有所取舍。“我可以把所有的走法都做到程序里去,但是计算机太笨了(没法充分发挥这些)”,他说。当他听说BootChess以后,只有一个简单的反应:“啊,又一个昙花一现的人出现了。” 然后他就去着手研究去了。他把他的象棋程序又写了一遍,这次是用汇编语言来写,汇编语言是一种非常贴近机器的编程语言,拥有极高的运行效率。他在2015年1月28日晚上9点开始写程序,第二天下午6点17分,他的程序就写完啦。然后他又花了半天的时间进行调试,然后程序就正式完成了:Toledo AtomChess,481字节,比BootChess小了1.2%。对此,Poudade不是很高兴。他并不认为他这就被击败了,反而,他觉得他被欺骗了。

“为了写这个象棋程序,我得每天晚上在我孩子睡觉以后辛勤工作5小时,然后4小时以后又要起床,这样的日子持续了三个月。所以要不然这个人的智力是爱因斯坦的17倍,要不然他就是在侮辱我这么长时间的努力。”Poudade说,“你能想象吗?我这边花了三个月,另一方面…他只花两天时间。如果是你你会怎么想?太离谱了是不?“Poudade认为Guiterrez剽窃了他的代码,然后在其基础上做了些改进,然后就成了他的AtomChess象棋程序。“如果你偷了我的代码,然后又不署我的名字,或者说你至少也要说明一下是受我代码的启发吧,如果这都不做,那你不就是个剽窃犯吗。这是30多年来发生的最糟糕的事情,太糟糕了。”,Poudade非常愤怒。他把他对前任记录保持者的态度与Guiterrez做了对比:“我根本没有抄袭David Horne的任何代码,但是我还是把我的功劳部分归功于他;我尊重的是他的思想!”,他说,“这才是正人君子的做法。” Poudade因此公开对Toledo Guiterrez叫板,称他的程序为“无耻的抄袭”。所以,Poudade在他的BootChess程序里面加上了如下的注释:

“致Oscar Toledo以及其他人:你们可以在我们的工作成果(就是这个程序文件)上进行重构,但是请写明白这是我们的成果!”

Guiterrez对抄袭的说法当然是强烈反对的。“我可没有故意去看他的代码。”,他为他自己的工作辩解道,他还认为,Poudade纯属是自己找上门来惹事的。“用汇编语言来写程序这件事情也不是一开始就计划好的。”,他说。不过,他的朋友们指出,根据BootChess的说明文档(也就是Poudade写的那个文档),Poudade认为,在他之前没人能够真正和David Horne匹敌。他在文档中写道:“(那些程序)有太多的错误和误导因素”,然后他就马上举了两个Toledo Gutierrez早期编写的象棋游戏程序中的例子作为论据。这种写法的暗示已经非常清楚了,这明显就是Poudade向Gutierrez拔剑开战的意思。

跟现实中的象棋不一样,(这个领域)不一定要分出胜负,很可能永远都是和棋。

我问Gutierrez,对此他有什么看法。他想了很长时间,然后措辞谨慎地回答了我

“嗯,我认为这对我来说是不够尊重的。”,他尴尬地笑了笑,“我看到了这些说法,当然不会觉得高兴,所以我得做出更好的东西才能行。”

如果我就这么说Olivier Poudade和Oscar Toledo Guiterrez互相结梁子了,那也有点夸张。“仇恨”这个词语对于这件事情还是显得过重,尤其是对墨西哥人Gutierrez来说,他的冷静、平和的态度完全谈不上“仇恨”。不过,尽管两个人处于竞争状态,尽管一方称另外一方”剽窃代码“的说法非常伤人,但是双方还是保持了最起码的尊重。“我尊重他所做的工作,因为这个项目耗费了他很多心血。”,Toledo Gutierrez说。“我们还是不要指责这个家伙了,因为他还是挺厉害的。”,Poudade说,“我尊重他做为程序员所做的事情。我也很欣赏他的能力。很多人也都很欣赏他。他建立起属于自己的天地。他也是最小象棋程序的编程高手。”

Poudade说的这些都是事实:Toledo Gutierrez在1986年他8岁的时候就用BASIC语言写出了他的第一个象棋程序。当时他在小伙伴家里玩耍,他们想下象棋但是又找不到棋盘。于是他就写了个程序来下棋。“当时我就已经在我的脑海里把所有的算法都设计好了。” 他说。

不过Poudade可不会简单地表示一下尊重就完事儿。他需要把问题上升到精神层面。“在他的精神层面里,他想要做一个绝顶聪明的人。”,他说,“就像是一个巫师,一个天才,比如像爱因斯坦那样。”他一直记得一个14岁的小程序员的故事,当年他参加了一个由Poudade主办的编程挑战赛,结果技惊四座。不过赛后,法国人把这个孩子叫到一边,却发现他并没有真正理解那些算法的原理。“他学习算法是按照背诗歌一样的方式去学的,“ 他说,”我觉得是他的父亲给了他太大的压力,太望子成龙了。这个叫Toledo的家伙就和那个孩子是一样的情况。”不过,Poudade又再一次表示,他其实是很尊重Toledo Gutierrez的。

不过,他还是很想重新赢回世界最小象棋程序冠军的头衔的。“跟他所做的一样,我删除了一些行和头部代码,然后我就又打破记录了。”,Poudade说。他重新检查和修改了程序。一开始的BootChess有487字节。修改后,相比于Toledo Gutierrez的481字节的程序,现在只有468字节了。

与现实中的象棋博弈不一样,这两个人之间的竞争不一定要分出胜负,至少现在没有,将来可能也分不出来。代码能变得多小?一个象棋程序在为了变小而牺牲了这么多规则和走法之后,是否还能叫真正的象棋呢?竞争还在继续,现在轮到Toledo Gutierrez走出下一步了。“程序还能更小,”,他说,“只要我花些时间在上面,就能够做到。”

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

2 收藏 2 评论

关于作者:黄小非

黄小非:毕业于重庆大学计算机系,南开大学软件工程硕士,SCJP。 目前在一家国企信息中心任职软件开发工程师。主要技术兴趣为Java平台相关技术、系统构架、C/C++、计算机图形学等。(新浪微博:@黄小非) 个人主页 · 我的文章 · 65 ·  

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部