万水千山 且行且歌
韶光荏苒,离我2017年从ACM班毕业已经过去了5年,但记忆中,无论是ACM赛场上和队友们的热血拼搏,是ACM班俞老师苦口婆心的谆谆教诲,还是同学们别出心裁的《学子讲坛》都仿佛发生在昨日一般鲜活。Always Challenge Miracles,ACM班和ACM队教给我的,不仅是如何灵活运用所学知识解决问题的“做事”,更是既勇于挑战又求真务实的“做人”。在此ACM班成立20周年之际,应《超越》征文之邀,分享我出国以来的一些经历和思考。不奢求能对大家有什么启发,但愿能以此文表达我对ACM班和ACM队的点滴感恩。
万水千山
我17年秋才从ACM班毕业来到康奈尔大学读博的时候,可谓“初生牛犊不怕虎”:我五年ACM班(12年提前入学)四年ACM队队员(最后一年当教练)实打实练就的功夫,正是找不到施展拳脚的地方。康奈尔的研究生课程虽然有些难度,有不少知识点我也缺乏相关背景,但我很快就赶上了节奏。第一学期我就上了分布式系统和形式化证明两门“硬核”课程。我从分布式系统课程当中发现,分布式系统的算法和实现不仅烦琐而且很容易出错;而我又从形式化证明的课程学会了如何通过严格的数学证明来验证程序的正确性,系统性地排除漏洞。于是我很自然地想到了用形式化证明这个“锤子”去解决分布式系统的正确性的这一“钉子”的研究课题。说来也巧,我在交大ACM 2013—2014年的Secret;Weapon队时,我的队友刘奇刘大师精通分布式系统,而我的队长“叉姐”郭晓旭当时就热心于学习函数式编程思想,和形式化证明有很深的联系。当时才大一的我对此一窍不通,没想到多年后博一的我却踏入了同一条河流。在进行了简单的文献调查确认了这仍然是个open problem(尚未被解决的问题)之后,我在18年初正式开始了对于这一问题的研究。
我最初对项目的进度很是自信,预计在18年暑期就能完成一个经过形式化验证的共识协议(一种分布式系统协议)的原型。这一方面是我觉得自己“码力”很足,另一方面是当时觉得这个问题并不困难:分布式系统的理论已经较为成熟,而形式化证明要做的不过是把写在纸上的证明用形式逻辑严格地重写一遍。然而我在第一步就卡住了:原来形式化地描述分布式系统协议本身就已经是个很大的难点,更别提写证明了。不过我很快就折腾出了改进思路:分布式系统的理论证明之所以简单,是因为忽略了很多细节,但这些细节在形式证明当中则不可或缺,所以关键就是要提供一个逻辑框架,能够事无巨细地将这些细节都明白地写出来。而且这样做不仅能验证某一个特定的协议,更能够以一当十,为解决分布式系统形式化验证这个更加一般的问题提供经验。
19年初,我摸索出了一套在我看来能够比较自然地描述分布式系统的协议和待证明的性质的逻辑框架。我又一次充满了信心,觉得离问题的解决不远了。但事情的发展却再一次诠释了什么叫“Too young,too simple”。我向系里的老教授展示我提出的新框架,正当我觉得自己讲得头头是道时,直接就遭遇了当头棒喝:我的这套系统固然可以严格地描述一些分布式系统和想要证明的性质,但正因为它对各种细节无所不包,想要在这一框架内实际证明这些性质,则是举步维艰,事倍功半,甚至于一个简单性质的证明就需要上百步。老教授一针见血的批评毫不照顾我的脸面,却让我猛然意识到了这一问题的严重性,以这个工作量,就算我能打十个恐怕也无望在毕业之前完成对于完整性质的证明。这一提案便遭到了否决。
19年秋进入博士三年级,我却没有任何发表或是在投的论文。有朋友劝我也许该考虑换个更容易做的题目,不然可能会对毕业产生影响,但我却很不甘心:明明分布式系统的理论证明简单而又优美,怎么形式化的证明就只能这么麻烦呢?“他山之石,可以攻玉”,我之前全凭自信自己倒腾可能是有些井底之蛙。想想我15—16年在Dreadnought队的日子,卡题的时候就会去找我的队友刘严培根和“主代码手”黄文瀚理论,往往能茅塞顿开,谈笑间,错误算法灰飞烟灭(或者直接打出GG)。于是我展开了一轮更加深入的相关文献学习。在浏览了近百篇相关论文之后,我发现现有的相关工作都遭遇了类似的瓶颈:要么框架模型高度抽象,这样证明不至于过于麻烦,但只能验证一些简单分布式系统的比较弱的性质;要么用更加一般的计算模型较为实际地刻画分布式系统的行为,可以描述更为复杂的系统,但这样证明就会极其繁琐。看来这题场上的其他队也不会做。如果采用类似的思路进行一些incremental的优化看来也无法得到理想的结果,项目再次陷入僵局。屋漏偏逢连夜雨,我生活的其他方面也遇到了一些的挫折。我的信心跌入了谷底:难道我博一开的这个坑就真的将成为我的葬身之地了吗?
此时的我虽然常常苦笑着念叨着什么“拙者の負けでござる”(是在下输了)“打不过,完全打不过”,心里却还是咬着牙想着这项目有没有可能还有一线生机。我的两位老板对于项目缺乏关键性进展也感到有些着急,但仍然支持我继续进行探索。在他们的启发下,我开始进行一些跨领域的思考,将眼光投向程序语言设计的一些概念和方法。如果“合适的抽象”能够在描述程序逻辑时化难为易,那么在描述证明的时候或许也有效果。这是我之前没有怎么涉足的领域,于是我又恶补了一番相应的基础知识,从具体的函数式编程语言Haskell和OCaml到抽象的类型论和范畴论,再次踏入了我当年的队长郭晓旭曾经踏入过的河流。之前的尝试给我的感觉是还有一些边界可循,但这种跨界的探索真的有点大海捞针,没有尽头。在很偶然的一个场合,我去听康奈尔一位学长的毕业答辩,当中提到了基于monad(单子)和comonad(协单子)来处理有多重副作用的程序的方法。我听得迷迷糊糊,但我隐约觉得可能可以应用于我的问题。这一思路给我带来了新的希望,在我的老板们和这位学长的帮助下,到了20年夏天,我终于提出了一套基于协单子的较为系统的新架构。
这个新方案兼顾了易于描述、易于证明、可运行的三重目标。我本以为这次我终于找到解了,但在验证了一个较为简单的例子之后,我发现这个新架构仍然存在着相当大的局限性:它只适用于对称型协议,一类较为特殊的分布式系统协议。此时的我面临两难选择:要么承认这一局限性,尝试拿这部分的学术贡献发一篇文章;要么就得另辟蹊径,重新展开搜索,尝试突破这一根本限制。面对publication(发表论文)和其他方面的重重压力,我还是选择了后者:这research,字面上就是search(搜索)和re-(前缀,表示反复)组成的。虽然某种程度上说我又回到了原点,但这次我并没有感到十分气馁,因为相信自己在反复搜索的过程中对于这一问题的理解已经达到了新高度。
突如其来的疫情从20年延续到21年,我在并不宽敞的公寓房间里“闭门造车”,又经历了数次碰壁,但最终摸索出了基于Arrow(暂无中文翻译)这一抽象的新方法,它相当于之前方案更加一般的版本,能处理很多非对称的分布式协议。凭借这套方案,我于21年12月份作为一个博五的学生通过了康奈尔A-exam(相当于开题答辩,一般是博三进行),总算是向前迈出了一步。
事情到这里我本该可以缓一口气,期待一篇顶会论文并宣布胜利了。但随着实现和写作工作的进行,我又遇到了新的挑战:我的这一方法因为它既有些“跨界”又有一些较为深奥的部分,分布式系统的研究者可能很难理解当中程序语言设计的部分,而程序语言的研究者又可能看不懂当中分布式系统的部分。搞一套世界上只有我和我的两位老板能够用(也许只有我实际用)的框架或许足以发一篇文章,但这样能算是妥善解决了这一问题吗?我的内心无法给出否定以外的答案。于是必须要把这一方法再进行精炼,得到其真正简单的内核,让它可以被更广泛地理解和运用。这一部分的工作现在我写这篇征文的时候仍在进行当中。
我的博士生涯目前还前途未卜。我这五年来走过的路,正如西游记主题曲《通天大道宽又阔》中唱的那样:“刚翻过了几座山,又越过了几条河。崎岖坎坷怎么它就这么多!”我能坚持走到今天,离不开我的两位导师对于我一如既往地支持和指导,也离不开我在ACM班和ACM队打拼的五年所磨炼出的一股韧劲。我觉得是这样的精神力量支撑着我,使我心里“做真正的计算机科学研究”的火焰持续燃烧,使我在面对一次又一次的失败和打击时从中学习并继续前行,使我将生活的困苦通过时而自嘲时而鼓舞的“歌”转化为奋斗的力量。“去你个山更险来水更恶”,只有在困难面前不轻言放弃,才有可能超越这万水千山,到达AC(AC在比赛中表示解决了一道题目)的彼岸!
且行且歌
“患得患失行往他处,怕苦怕累勿入斯门”是我本科期间俞老师常提起ACM班的两句“对联”。这两句改编自孙中山为黄埔军校书写的大门对联(“升官发财行往他处,贪生怕死勿入斯门”)。原意是激励黄埔军校的师生们投身于中国的武装革命事业。而我理解俞老师则是引用来鞭策同学们将科学和教育事业的发展作为个人奋斗的首要目标。
读博之后我常常回想起这两句话,逐渐才开始体会到这其中的分量。出国的圈子里有这样一个很“火”的说法:“Financial Independence and Retire Early”,翻译成中文就是“财务自由并及早退休”,取首字母简称“FIRE”。有不少人以此作为这一阶段人生的目标,并对如何多快好省地实现“FIRE”津津乐道。而读博-做科研的人生道路,就算不是完全背道而驰,至少也是在浪费“FIRE”的时间和机会成本了。博士生的收入十分微薄众所周知,大抵只够一人生活基本开支。而就算突破了层层筛选,百里挑一当上了教授,仅凭工资收入也无法实现所谓的“Financial Independence”。而Tenure track(终身教职)的退休年龄则一般在75—85岁,和及早退休相去甚远。至于读博-工作的“曲线救国”路线也有人算过账,其“经济效益”也不如直接工作。
也许读博真的不是最大化“发财”的最优解,“升官”则又如何呢?名校教授的Title比起别的职位可谓是光鲜亮丽。拿着这Title去捞取别的社会资源岂不多是一件美事?学术圈里怀抱着这种想法的人也不在少数。但正如一个人的财富收入并非仅取决于其所创造的实际价值,一个人在学术圈的名望也并不直接反映其实际完成的科研工作的价值。真正地妥善解决科学问题往往不是通往“升官”这一目标的“最短路”。因此,“学术包工头”“学术研究经理”也并非个例。
究其根本,是因为真正的科研工作是非常困难的。它的风险极高:一个问题没法保证就真的能够找到解,一个想法在充分论证之前也没法保证就真的有效。它的周期又很长:只有充分的实验和探索才能够得出有效的证据。这与资本追求低风险,高回报,短周期的逐利本质是矛盾的。若是把读博做科研当成是一项投资,那只能劝君“行往他处”了。
革命年代的“贪生怕死”,是指为了保全自身的性命而背叛人民。而科研工作中的“贪生怕死”,我认为,是为了个人的脸面、福祉而抛弃科学精神和科研事业。“升官发财请走别路”是说“二者不可得兼”,而“贪生怕死莫入斯门”则是更进一步,告诉我们“舍生而取义者也”。做出这样的选择,并不是因为科研“值得”,而是一种“信仰之跃”,是公理系统的一条公理。
科学论断的真与假却不为人的主观意志转移。一个人是不是被一个时代、一个社会所尊崇,取决于人们的观点。在民主社会,一部法律的颁布与修订,也理应遵循公众的意志。但即便人们普遍相信“轻的物体落得慢,重的物体落得快”,也无法使其为真。
科研工作这样的性质决定了其与“贪生怕死”的矛盾:假如自己的工作被别人尖锐地指出其中的漏洞,是不是会十分丢脸?假如你牺牲周末和假期拼命赶出来的一项工作却被发现有一个细节问题需要推倒重来,是不是会懊恼不已?假如读了五年博竟没有一点拿得出手的工作,是不是会成为大家的笑柄?那对于科学而言,只要论断与事实不符,就必须接受失败的结果,没有讨价还价的余地。我在这五年中,丢了很多很多脸,懊了很多很多恼,而且我现在就正是这样的笑柄。而想要“退一步海阔天空”总有很多借口:也许计算机科学的研究“少我一个不少”,也许论文怎么投怎么被拒是学术圈拉帮结派过于黑暗“此处不留爷,自有留爷处”,也许我应该“先去解决家庭/经济基础问题”再来搞研究……但由“贪生怕死勿入斯门”导出,应该将眼光紧盯着科学问题的实际解决,而将这样的“生死”置之度外。一箪食,一瓢饮,在陋巷,足矣!
认清了这样的现实,究竟应该怀抱着怎样的心态选择读博-科研的道路?很多人的答案是一种终极关怀:对社会的影响,促使全人类的进步,改善人们的生产生活。但是我认为,这些都和实际的科研工作过于脱离,而显得虚无缥缈。我的答案是:且行且歌。
行,是前进,是不停下脚步,是从一个思路到另一个思路,是从不理解到理解到更加透彻地理解。行,是看paper,是想算法,是敲代码,是写证明,是跑实验,是写report,是脚踏实地地做科研。行,是超越。但仅有行是无法持续的,歌,给我们提供了持续前行的动力。歌,是赞美,是对行程中风景的欣赏,是超越了之后的喜悦,是走出黑暗山洞之后的豁然开朗,是将苦难化为自嘲和鼓舞的豁达与升华。歌,是“山重水复疑无路,柳暗花明又一村”,是“庐山不识真面目,只缘身在此山中”,是“走出个通天大道宽又阔”,是“月月火水木金金”,是2014年《MahoushoujoMiracle队》主题曲《Sis puella magica!》,是“犹豫就会败北”,是“to be or not to be”,是“Proof of a Hero”,是“我们的理想在希望的田野上”……要是能够回到5年前,与才入校的那个“初生牛犊不怕虎”的我见上一面,我想我一定会用夏威夷小吉他即兴弹奏一曲《图森破》(我在疫情期间在我老板的指导下学了夏威夷小吉他),笑着跟他讲述他未来五年将要遭的难罢!
提笔写到这里,突然好奇我的这一标题是不是已经被别人用过了,怕是会出现一些理解的偏差。通过搜索引擎,我才知道原来有首歌叫《千山万水》,是周杰伦为08年北京奥运所做,歌中唱道:“有目标就不累/等着我超越/远远抛开一切/过千山万水”。我想,等待我继续超越的,是这科研的万水千山,而目标为中国和世界培养拔尖计算机人才的ACM班,则需要克服更为严峻的崎岖坎坷,超越作为个人难以想象的千山万水。但从十周年的《携手》到现在二十周年的《超越》,我们且行且歌。相信大家的歌声必将超越时空,鼓舞ACM班的每一位同学,一同奔向更加光明的未来。
祝ACM班越办越好!
简介:倪昊斌,男,ACM班2013级。高中毕业于上海市上海中学。本科期间效力于上海大学ACM队,参加2014年叶卡捷琳堡和2016年普吉岛两次ACM国际大学生程序设计竞赛世界总决赛,分获第六名(银牌)和亚军(金牌)。现在美国康奈尔大学攻读计算机科学博士,研究方向:形式化证明和分布式系统。