寡趣症

注册

 

发新话题 回复该主题

守住发际线南大蒋炎岩谈读博那些事儿 [复制链接]

1#

机器之心转载

作者:蒋炎岩

本文作者是南京大学博士蒋炎岩,讲述了他读博过程中的经历,并在文末介绍了他的研究成果,机器之心经授权转载自知乎。正式版《读博士的难与易》发表在《中国计算机学会通讯》(CCCF)年第8期(CCF优博专题)上。

本文作者是CCF专业会员、CCF优秀博士学位论文奖获得者。蒋博士毕业于南京大学,现任南京大学计算机科学与技术系助理研究员,主要研究方向为软件分析、测试与合成。

背景

在圡博里我算是比较成功的了(CCF优博和ACMChina优博提名,两项都是Top5),写这篇文章一方面防止我忘记读博时期很多有趣的经历,另一方面也许能给还在泥潭中挣扎的同道中人一些启发。

先交待一下为什么要读博。其实就是觉得想再浪几年做点什么有意义的事情(真实原因是自己很懒没有考G/T),而且Top2也不在南京,没办法就在南大读吧。做这个决定的时候完全不知道在国内读博意味着什么,就随便找了个据说很牛逼的组把自己给卖了。

那个时候人工智能已经很热了,为什么没选呢?是因为从小被数学好的人吓怕了……这里要提一下我小时候一起长大的两位好友,一个是RichardPeng,另一个是ZeyuanAllen-Zhu。尤其是rpeng那种过目不忘的神人,从幼儿园开始就相爱相杀(哈哈哈),后来就搞不过他了。再后来人家去了加拿大,眼看着他各种STOC/FOCS/SODA,又后来当了美国队长,不跟咱玩了。

开玩笑。我觉得他给我树立了一个很好的榜样,大概是「知道厉害的人有多厉害」。既然玩不来这个游戏,就一定要找一个要积累足够的经验才能玩起来的领域:

永远不要跟一个傻X争论。他会把你拉到他的水平上,然后用他丰富的经验打败你。

对任何领域来说,经验都非常重要。不过数学的training有点从小就落下了;加上当时对系统软件还挺感兴趣,读博的时候南大基本没有人做System和PL,所以选了一个最接近的软件方向,虽然我也不知道软件方向是做什么的,就这么上车了(为此还让出了一个保送硕士的名额,嘿!)这个路线和广大保研群众简直相似得不能再相似了。

守住发际线

读博士嘛,大家肯定最关心的是毕业问题,要是毕业的时候能守住日渐退行的发际线就更好了。鉴于我读博士基本是「自学青年的胜利」,而且还有浓密的头发,自己的经验应该能帮到大家。总结起来就是:脸皮要厚、药不能停、刻意练习,然后在发表论文的边缘疯狂试探就好了。

脸皮要厚

我入坑的第一个研究问题简直就是四九年入国军,到今天这个方向的好论文已经非常……稀疏了。概括地说就是在基础的机制已经很难改进的前提下,设计策略去「overfit」应用场景,刷出更好的实验效果来。那段时间几乎每天要都拷问自己:做这东西有个卵用?试一试吧,实验设备又相当落后,只要方位角度差一点点,测出来的数据就飞到十万八千里之外了。但毕竟老板是「软件方法学」出身的(虽然我也是做「软件方法学」的,但我大约的确不知道我到底是做什么的),他们自带能说会道的光环,每次都能在方法学的制高点忽悠得你哑口无言,新手学生真是百口莫辩,项目也就一直这样莫名其妙地进行下去了。

后来我学会了一个经验,现在和老板们交流时,头脑里先预备好一个SMTSolver。老板每说一句话,我就先把这句话在逻辑上取反,然后扔到SMTSolver里求解一下,看看他到底是怎么把这件事忽悠过去的。我惊讶地发现,求解的一般结果,要么是公理体系有些不同,要么是在一些非常基本的问题上没能达成一致。一个典型的例子是,老板们有时候会觉得「再小的contribution也是contribution」,但如果你有一个预设的significance的lowerbound,这句话就不成立了。这一招屡试不爽,每次都说不过老板的同学们可以多多尝试(许畅:有的时候说的话还看环境,对有不同抗打击能力的人要斟酌说不同的话,可以细细体会老板是鼓励你还是安慰你——不要把老板安慰你的好心硬戳破了)。

我觉得知乎上遇到自己不喜欢研究问题的博士生肯定相当多。这时候,脸皮厚的作用就发挥出来了:我有腿,不喜欢这个问题可以跑路啊!

我先后鸽了两个研究方向,科研进展为零(但本人心态比较好,没有掉头发)。然后在选第三个研究方向的时候(研一结束时,进组两年后),非常非常非常感谢许畅:他非常谨慎地在ICSE12的时候戳了HKUST的张成志教授,说我们这有个学生,给他点难整的问题整整。张老师就说,嘿嘿嘿不好做的问题那是大大的有,可以试试并发,给了两篇相关的paper。于是我就这样上车了——我们组没有人是这个领域的专家,甚至做程序(静态或动态)分析的人都没有。

在最后一次厚脸皮以后,就是知乎上的常见套路了,读论文写代码发paper……虽然没人手把手带我飞,但这个领域研究的人多,好论文也多,非常适合新人学习。给我启发最多的论文都来自PL、系统和硬件,可想而知在此过程中补充了多少基础知识。因此,我现在尽可能给新人推荐这种已经很多人研究过的领域,虽说在这种领域发论文可能相对更难一些,但能学到非常多的东西。相反(也是另一种很常见的情况),你如果进入一个特别小众的领域,只有几个人在玩,入门视野就窄了、格局就小了,就算能灌很多论文,我个人觉得不是很利于今后的职业生涯。

师傅领进门,修行看个人。这次终于算是入了豪门,老板们的支持功不可没。

药不能停

鸽人可以,学习姿势不能停(废话)。

我觉得自己还算是个热爱学习的人,在那个时候读了很多与研究方向无关的教科书、论文和公开课,也听了很多学术报告。我记得李沐在PhD回忆录里提到了「ParallelandDistributedComputer:NumericalAlgorithms」这本书给他很大启发,我也读过,写得非常好,那些经典的视角在今天都不过时。以及时候开始读杂志CommunicationsoftheACM(CACM),到今天应该看完10年份了(入坑之后往前补了不少,但后来也坚持不下去了)。虽然很多文章并不能完全读懂,但大部分时候都是在「开眼界」,看看其他领域的人在用什么方法解决什么问题,算是构建计算机科学的世界观。

另一个成功的例子是TimRoughgarden在算法课上一句话提到了一份USENIXSecurity』03的工作,然后就这一句话启发我们做了正则表达式复杂性攻击的工作(当然做研究没有那么顺利,中间的波折就忽略了),并且很意外地获得了ACMSIGSOFTDistinguishedPaper(真是意外,其实是ConditionalAccept,差点挂了)。这个论文的点睛之笔是非常规地使用了PumpingLemma,已经不记得是什么时候在什么地方学过这个定理,但的确那一瞬间就想到了。

学习经历培养一个人的研究品味(taste),所以不必想着眼前立即得到的好处。具体来说,「学习」就是帮助博士生训练一个分类器,能判定「什么东西是好东西」,有真正的contributions。好东西看多了,你看到那些烂的东西就很自然的排斥了(如果导师是这方面专家,可以事半功倍,但无论如何靠自己都是第一位的)。最近几年过了我心中bar的论文投稿,被拒的情况相当少(所以我的总体录用率远大于会议的录用率,虽然好些感觉没过bar的也中了)。总结来说,自学青年想要胜利,我觉得读得多是非常重要的。

刻意练习

另一个经常遇到的问题是怎么阅读论文。网上也有很多建议、方法,我自己的理解是看论文有些类似神经网络的训练(许畅:一定要明白人的学习能力远超过机器,其通过极少例子领悟到真相的泛化能力是极强的——想想悟道):在看到研究问题以后,先试图给出自己的分析和方案,然后再看作者的做法,如果有自己没能想到的奇思妙想,再通过「反向传播」纠正自己思路的盲区,重点是把作者的方法用自己容易解释的逻辑解释出来(这一步非常非常重要!)。老板有一句话说得非常在理:必须阅读篇甚至更多的论文,才能对一个研究领域有一些基础的感觉。

其他方面也是可以练习的,比如写作和写代码(因为我比较喜欢写代码,所以后者没有花去太多的时间也不痛苦,觉得hacking很好玩)。第一篇论文的写作被搞惨了(有图为证,此处

许畅)。即便改到这个程度,因为底子太差还是被审稿人骂了,说这论文做的不错,写的也勉强能看懂,但行文真的是一坨屎,连标题都有语病。

收到审稿意见以后吓坏了,赶紧去学习了一些公开课、教程(有些老板给研究生的建议写得真的很棒,比如ManuelBlum给研究生的建议),还有万能的stackexchange。等到cameraready的时候已经有了非常显著的提高了;再后来自己也能在非常短的时间里写出读得过去的论文了。

在发表论文的边缘疯狂试探

在对相关工作有已经有一定了解的基础上,我有了(若干)个想法。其中一个我觉得「很有前途」的想法,经过跟老板讨论被否定了,觉得这东西不就是个XXXXXX嘛,没啥卵用。另一个我觉得「没前途」的想法,老板们一直在怂恿继续搞(很可能是出于鼓励的心态,但我至今都不觉得这个paper能发得出来)。再后来一个我觉得「挺一般」的想法成了我的第一篇论文。

再之后我发现MikeBond在OOPSLA13上发表了一篇和「有前途想法」几乎一模一样的论文,但实现得非常好,可以说远超过了我当时的眼界。事后总结,我觉得是老板们的口味可能已经被大项目或者整个领域带歪了,觉得技术已经是无关紧要的东西了,反正总有人能做出来的,做出来也就几句话就讲清楚了,不带劲。「突破天际」的东西才是他们真正想要的。在这件事上我感受到了「方法学」的危险,有时候甚至觉得方法学就是逃避的借口——别人发了个什么论文,也就是把这么几个想法拼起来,提升了这么一点,不过如此嘛。但如果让大谈方法的人去实际做一个,很可能会因为缺少对其中各种坑的认识做不出来。

但突破天际的东西哪那么容易能做出来呢?不过也没事,这件事一方面让人有些不爽,另一方面还是让人挺爽的:毕竟自己的脑袋还是好使的,这次在state-of-the-art的边缘,也许下次就超过了呢。反正99%的idea都是别人已经想到或者没有用的,但小概率事件大量重复必然发生,只要每天坚持拍脑袋,脑袋一定会秃的,哦不,是一定会有靠谱的idea的。只要因为拍脑袋损失头发的速度不及头发生长的速度,发际线就能保住了。我曾经听说过YuanyuanZhou组里的轶事,每周组会的时候强行要求每个人出一个新的idea,还会给好的idea颁奖。这个机制压力超大,但的确成效很好。

我写第一篇论文的时候,就只是想做点什么好玩的东西,但之后就不满足于此了,总是想做更好的、有真正研究贡献的东西。从发第一篇顶会开始,保持自己研究工作的质量上升就已经是相当困难的了。所以就算从灌水开始,也不要有太大的负担,来日方长嘛。

读博大概就是这么简单,功夫到了该有的就有了,觉得痛苦的可能需要回去补基本功,或者是看看自己在大方向上有没有犯错误。

其实关于守住发际线,上面说的都是骗人的。真正的原因是我遗传了我爸优秀的基因。但关于做研究的故事,都是真的,有坚持就会有回报。

奇闻趣事

拖延症

谁没有拖延症呢?我拖了两把超大的。第一次是因为论文得以发表,可以找机会出国转转,留学基金委掏钱,有个申请的流程。结果我把联系导师的事情拖延到了截止日期的前一天。对,你没看错,我们花一天时间联系了一位老板仅有一面之缘之人,在24小时内搞定了推荐信和材料。在材料交出去的那一瞬间,我只知道这个人做的东西好像和我有那么一丢丢关系。

有时候觉得运气来了挡也挡不住:

1.我很惊讶地发现我读过那位神秘导师(秦锋)的研究组在OSDI14上发表的一篇有关崩溃一致性的论文,非常喜欢,这就是缘分(其实是论文读得够多)。

2.我选择了潜伏在留学生群里(而不是拖家带口的访问学者),于是找到了两位超棒的室友。一位是挖石油的,一位是搞钱的,让美帝的生活十分愉快。

3.实验室的大哥们(按辈分算其实是师弟)对我十分照顾,其乐融融大家庭,让美帝的科研工作也十分愉快。

我拖的第二把超大的是花两周时间写完了毕业论文。记得年9月初,我问老板是不是可以毕业了,老板说好啊,一般是11月交论文,嗯我们来看看……一看不得了,距离论文初稿提交还有两周多一丢丢,而那个时候我写完的部分大概只有5页。

这时候,是个懒人的好处就体现出来了:我会用工具啊!之前写论文的时候总觉得LaTeX无论用什么工具编辑,多多少少都会干扰写作的顺畅。我总结很大的原因是文字和代码混排在一起,比如用等宽字体吧,文字读起来怪;用Serif吧,代码没法看。所以之前的几篇论文,我就开发了自己的LyX模板。期间我修正了很多不满意已有学位毕业论文模板的地方,全文个公式、40个插图、12个附表、篇参考文献,两周就搞定了,虽然提交以后到答辩前花了近一个月的时间玩命polish……

这种极限操作的能力,可能来自于以前参加ACM-ICPC,三人一台机不太够用,所以练习在纸上写完整的代码。到后来可以做到几页纸的代码,proofread一遍,敲进去编译过就能交,过了就是过了,不过稍微测点数据再读一遍代码也能搞定。总体来说,我在读博期间甚至到今天依然经常极限操作,但几乎没有错过任何自己预设好的deadline,所以好像给老板(以及其他共事者/合作者)一个我很靠谱的假象(实际上是因为总还有更不靠谱的人)。

神奇的美帝

在美国短短半年的访问让我感到非常舒适:所有的琐事都甩锅了,可以非常静心地体验一下不一样的生活。经常顺着OlentangyRiver步行到学校,从盛夏到秋冬,一路上的风景变化都还历历在目。

在研究方面,我们做了一个很有趣的小工具:用ptrace拦截系统调用,用虚拟设备收集块设备的日志,然后用一些算法上的小技巧来自动检测应用程序中的崩溃一致性缺陷。因为之前玩过很多东西,所以做起来可以说是相当顺手,半年的访问期间就完成了选题、代码、实验,找到了包括Coreutils、Gzip等软件里的缺陷,论文也顺利发表。最近我收到了Perl社区的感谢,在最新的稳定版里修复了我们报告的bug。回顾自己求学的经历,技术方面的积累都是互联网和开源软件培养的,自己一直在索取,如今能做一些微小的回报,欣喜甚至胜过博士毕业。

老秦(forgiveme!实验室里的兄弟们都是这么称呼的哈哈!)给了我很多指导,还教导我们两件事:「Getoutofyour

分享 转发
TOP
发新话题 回复该主题