六三——父亲、象棋与 AI
从我小时候记事开始,父亲就爱好下象棋——准确来说,这是他为数不多的几个爱好之一(另外两个是打麻将和看电视剧)。一个典型的画面就是小时候坐在父亲的腿上,面前是一块笔记本的显示屏,屏幕内的圆形物体有时候会在中间连成一条线,之后又会分开;再过一段时间,这种圆形物体的数量逐渐减少,直到某一个时刻突然又恢复了初始的样子——新的循环又开始了。
再后来,我知道这个界面是 QQ 游戏的“经典中国象棋”,他赢了一千多局,也输了一千多局,和了几十局,胜率是 48%。我开始上小学,父亲见我学习成绩不错,在我学有余力之时开始向我普及象棋的玩法。父亲主要走过宫炮,但教我开局还是从中炮、上马这些比较经典的路线学起;杀法就是重炮、卧槽、双车错、马后炮之类的常见招式。基本的东西学完之后,父亲和我每周就会来几局。为了不打击我的信心,父亲在下棋的时候有时会露出一些破绽让我得以一击毙命,幸运的情况下我的确可以找到。
到了二三年级的时候,父亲说我可以去挑战其他小朋友了。当时的我在父亲的鼓励下到处挑战周边会象棋的孩子,的确很少输过。眼见附近的同龄人已经无法满足我的需求,我甚至开始在广场上找那些老年人下棋——似乎也是赢多输少。学校有一次举办象棋比赛,我也一路杀入决赛,那场棋我终于遇到了一些困难,但具体的胜负我现在已经淡忘了。
四年级之后,父亲也许关闭了他的“鼓励模式”,之后下棋我就很难赢他了。中炮局自然是属于进攻类型,那个时候我完全不知道士象这类棋子的重要性。尤其是中炮难以过河的时候,我为了一直保持自己的攻势,对自己的象被吃也毫不在意。不出意外,因为防守有所缺陷,如果不能快速进攻,之后的局势也逐渐陷入被动。当时的我自然是不服气,但显然父亲并没有无限的时间陪我下棋,他建议我去找网上的人切磋来磨练水平。我自然是没有勇气找网上的一个随机陌生人下棋的,万一他比我的父亲更厉害呢,那岂不是我输的更惨?于是我选择了一个 alternative,那就是象棋 AI。
当时流行的象棋 AI 主要有两个,一个是象棋巫师,另一个是象棋旋风。这两个除了“特级大师”或者“自定义思考时间”需要付费外,其余都是免费进行对弈。我当时觉得我的水平应该至少有“高级”,因为我已经可以闯进象棋比赛的决赛圈了,然而事实是跟 Hikari no Go 中塔矢亮第一次跟开了挂的小光对弈失败一样那么绝望(没错,当时我也自学围棋,虽然只有 5-6k 水平,也同时在优酷追这个日漫)。只有跟那个 AI 的“初级”打一打,才能偶尔赢一两把。
当然,绝望归绝望,我想试试这些 AI 的极限在哪儿。小孩子有一个攀比心理,就是用的话,总得用最好的。当时我并没有足够的 money 来购买付费版本,于是在网上寻找“免费又更强“的版本,结果还真找到一个:《勇芳中国象棋》里面有个引擎叫“象棋名手”,勇芳或者那个引擎有 claim,说是比这两个商业引擎 elo 分数更高。那个时候移动 app 刚开始流行,我家也有一个 iPad 2,于是我装上了 QQ 中国象棋的 app,开始用 AI 大杀四方。我记得姐姐结婚的时候,QQ 象棋当时就有一个华山论剑功能,那真是一路过关斩将,好像也是到了接近山顶那一局——和了。我的目的于是也达到了,之后我也觉得这种行为不太道德,那个号基本上也就没用了。
五年级的时候,学习的压力逐渐上来,父亲没有再让我和他下象棋,让我上了“大学”再和他继续。我问父亲,那我会不会又回到一年级的水平呢?他说不会,不仅不会退步,而且你还会对象棋有新的理解。我相信了他的话。
之后的事情就是:模拟试卷、小升预、离开故乡;分班、预升初、分班、周考月考期中期末、中考、再次迁居;七中夏令营、分班、竞赛、校测,然后高考。故乡的那盒象棋从锃亮蒙上一层厚厚的灰,之前的 QQ 游戏网络对战平台也基本废弃,父亲的那几千局的账号也不知是否健在。与此同时,2016 年 AlphaGo 打败了 Lee Sedol,次年又打败了柯洁——Hikari no Go 十几年前对 AI 的预言也真的变成了现实。
在幻想“大学”的日子时,老师经常说“等你们上了大学就解放了”。而初中玩 dancing line 时特别喜欢 The Autumn 这首歌,认为那就是我想象中“大学”的样子:和自己的朋友,甚至是另一半坐在枫林下的长椅上,诉说各自来时的路、目前的三观以及憧憬的远方。然而当时间真的来到了另一头,才发现那句话要么只是一句 placebo,要么就是时代变化实在是太快,足以让过去的经验直接失效。只不过父亲并没有骗我,我的棋的确没有变成小学一年级水平,甚至胜率还达到了三四成。变化的是,自己有一些胆怯,就像五年级考完钢琴十级之后再也不敢将自己的双手按下那 88 根琴键。父亲仍然记得儿时的约定,偶尔会邀请我和他切磋一下,我有时候心情好会花一个下午和他切磋两三局,但更多时候还是以学业忙推辞了(无论我当时是真忙,还是单纯无法面对儿时的自己)。
父亲没有说什么。退休后的日子,如果下午有人约他打麻将,他就会打。其余时间他会窝在沙发上看电视剧,或者干脆睡觉,无论是白天还是黑夜。母亲抱怨他除了洗碗之外不做其他家务,但其实她隐约向我提到,她更担心的事情是父亲什么动脑筋的事情都不干,哪一天就老年痴呆了。我想了想,父亲下象棋这个爱好得重新捡起来。于是调研之后我问父亲,之前那个 QQ 中国象棋变成天天象棋了,要不要在手机上安装一个继续下?父亲说算了,他老花了,看不清手机。然后我知道天天象棋有一个网页版本,而电视上可以装一个 Via 浏览器就能解决问题。父亲有一点兴奋,让我赶紧尝试,经过一两个小时研究如何将 Android APK 装到电视之后,我成功了!
父亲登录账号,发现当年的数据竟然还在,脸上露出了笑意。但是他并不熟悉全新的界面,我帮他找到他曾经下的 20 分钟场之后,他开始了第一局。熟悉的圆形物体减少又恢复如初的循环又开始了,父亲在 2024 年的那个明媚的下午念叨:自己曾经能达到“将军”等级,而现在守住“刺史”都有点难咯。天天象棋也多了一个新功能叫“棋力测试”,系统把他曾经的段位换算为【业3-3】。父亲也像当时的我一样抱怨“不可能这么低”,于是我和父亲合作看棋尝试升段,结果最多也只是【业4-1】就停滞不前。那一年暑假,父亲和一位棋力【业9-1】的同学一起避暑时,同学向他抱怨为了达到这个段位,看手机眼睛都要看瞎了。父亲这个时候就开始炫耀我的成果了:“我儿子给我弄的,在电视上面下棋,多安逸!”
CS 知识告诉我,不能让 single point failure 这种事情发生。于是当时我也在电视安装了一个备用象棋 app,也有对战功能,甚至坚持十多年来完全免费。只不过那个 app 仅有竖屏版本,棋盘看着比较小,因此父亲还是偏向于下这边的天天象棋。只不过好景不长,过了一段时间,天天象棋真的出来一个铜币机制——之前的二十分钟场不免费了,需要铜币才能进入。虽然腾讯每天还是会给两笔补助金,但父亲还是觉得一天能下的盘数变少了,再加上谁知道未来补助金会不会取消呢?于是父亲与我合作,竭尽全力重新上了刺史之后,就此“金盆洗手”,再也没玩过天天象棋了。
经过腾讯“变坏”这件事后,父亲开始要求我除了目前这颗备用独苗后,再找一个真人对战平台。但要在电视这种低配置平台中流畅运行,现代 app 基本上不太可能。网页端我也试过 xiangqi.com,结果走子依旧卡得不行。又是一个下午的 research,最终并没有找到一个合适的解决方案。
问题的转机,又一次与 AI 有关——那就是 vibe coding 的流行:既然市面上没有,那就自己做一个!
2026 年的暑假,刚刚经历完论文投稿的我,难得在家里休息两周,瞥见了父亲遮不住的白发。我突然意识到,如果这篇论文最终被录用,将来的合作、实习不再会是纯粹的 fantasy,人生的齿轮将会迎来一个新的转折:越来越快,也越来越难以由自己控制,就像之前离开故乡一样。一个自然的结果就是,陪伴父母的时间越来越少,我便意识到自己必须在这个暑假,在这个稀有的、集中的大块时间,给父母做点什么。我想起父亲几个月前再次让我找其他的象棋 app,但依然没有找到。但仅仅几个月的时间,LLM 的进步神速,证明了更多的数学猜想,更别说对 software engineering 的冲击了。那段时间 GPT 5.6-Sol 刚出来,我想:既然现在 LLM 那么强大,那为什么不试试把目前这个象棋 app 变成横屏版本的呢?我便马上行动了。
首先一个最显然的尝试是看看能不能把这个 app 的“强制竖屏”开关关掉,GPT 给出的答案是 yes,但更改完之后应用却启动崩溃。GPT 给出的理由是跟 canvas 绘制有关,我想了一下,也许是这个 app 确实写死了长宽比,对横屏设备没有支持。
那既然简单的路走不通,只能试那条复杂但更彻底的路:重新让 GPT vibe 一个适配横屏的客户端,但兼容原 app 的联网对战协议。前端的棋盘界面倒是很简单,一次 prompt 就能搞定。后端就复杂了,首先逆向原 app 的对战协议,然后按照协议恢复登录、开局功能,接着是对局走子、求和认输、自动拒绝悔棋的功能,再接着就是写好计时规则。做完这些之后就基本上可以用了,然后开始进行痛苦的联机调试。联调就是用自己的手机的另一个号与 app 的号互相对局,陆续发现大厅切换房间的同步、计时规则与客户端不一致、下完一局无法正常开启第二局、开局两回合以内无法正常退出等各种问题。把这些调试好,交付给父亲之后,又会遇到另外一些奇葩的需求,比如说用户 ID 要我改一个更顺眼的数字、声音响度要从原来的 100% 宁可破音也要变成 150%、表示棋步的框框大小不够大,颜色不够明显这些问题。甚至还会出现前面的 A 功能好不容易写好了,修复 B 功能的时候又导致 A 功能回退这种让人挠头的经典场合,感觉真像提前上班了。
其实父亲也知道调试这些东西很麻烦,几次都让我别做了,专心搞我的研究。但我说最近论文刚投完,又刚好是暑假,之后就没有这么一段时间满足你的需求了。父亲也没说什么。三天之后,经过几十轮迭代,app 的版本终于稳定到了 v1.1.2。父亲看着长宽变为原来两倍的棋盘,对我说了声“谢谢”,然后又一次进入了那个似乎永恒的循环中。
父亲后来甚至问我,能不能顺便接一个 AI 帮他下——这次轮到我拒绝了。父亲仍然想看我和电视屏幕对面的人对战,还说可以指导我,我又以这几天写代码太累,不想动脑拒绝了。几天之后,我已经回到了学校,在某一个夜晚,我问父亲 app 还有没有什么问题。他果断回答:“没有!”
那一刻,我终于意识到,这或许就是 software engineering 的意义所在吧。Lee Sedol 的那场比赛已经过去十年了,但围棋依然活着;父亲可能永远下不赢现在的任何一款象棋 AI,但这并不影响他感受象棋的变幻莫测;AI 也许也真的会导致数百万人失去岗位,但这也并不影响我去完成父亲的一个心愿。
我想好了,下一次回家,我一定要和父亲面对面下一盘,和网上的陌生人下一盘,亲手体验自己和 AI 的劳动成果。