You are on page 1of 115

博士研磨

一个博士研究生的回忆录 1

原著 Philip J. Guo (philip@pgbovine.net)


翻译 齐鹏 (pengqi@cs.stanford.edu)
罗宇男 (luoyunan@gmail.com)

1英 ⽂ 原 ⽂ 链 接:http://www.pgbovine.net/PhD-memoir/pguo-PhD-grind.
pdf。本翻译基于原⽂ 2012 年 7 ⽉ 16 ⽇发布的版本译成。
献给所有热爱创造的⼈。
目录

前言 1

第一年:碎梦大道 5

第二年:整装启程 19

第三年:噩梦未止 29

插曲 41

第四年:卷土重来 49

第五年:峥嵘岁月 63

第六年:尘埃落定 77

结语 89

后记 97

iii
iv 目录
1

Disclaimer

This is an unauthorized Chinese translation of Philip J. Guo’s memoir


The Ph.D. Grind, and the original author did not have any input on the
translation.
The copyright of the content belongs to the original author, and the
translation to the translator. This work may not be used for business pur-
poses, and may only be used as non-commercial material.
Apart from the Translator’s Preface, none of the content of this work
represents, none should be interpreted as, the opinion of the translator; nor
will the translator be responsible for the consequences of any interpretation
of this translation.

声明

本作品是 Philip J. Guo 的回忆录《The Ph.D. Grind》的中⽂翻译,翻


译并没有得到原作者的任何授权,原作者也并没有以任何形式参与到翻译
过程中。
本作品内容的版权归原作者所有,翻译版本归译者所有。本作品不得
被⽤于任何商业⽬的,只能作为⾮盈利性材料传播。
除译序外,本作品的⼀切内容均不代表——且不应被认为是——译者
的观点;译者对此翻译的任何理解以及其导致的影响亦不负有任何责任。
2

这本书记述了从 2006 年到 2012 年,我在斯坦福⼤学攻读博⼠研究⽣


期间六年的求学经历。这本书适合⼴泛的读者群,其中包括:

• 有志攻读博⼠研究⽣1 的本科⽣;

• 寻求⽅向或灵感的在读博⼠⽣;

• 希望更深⼊了解博⼠研究⽣的教授;

• 希望聘⽤和管理拥有博⼠学位员⼯的雇主;

• 在充满竞争的创新领域⼯作、与⾃我追求和⾃我激励密不可分的专业
⼈⼠;

• 对学术研究充满好奇的有⼀定教育背景的成年⼈(或者早熟的青少
年)。

《博⼠研磨》与已有的与博⼠经历相关的⽂章在写作形式、写作时机和
写作基调上都有所不同:
1
研究⽣(graduate student)本是指本科之后的⾼等教育,通常包括硕⼠研究⽣和博⼠
研究⽣两种学位。现代汉语中“研究⽣”⼀词经常被滥⽤,⽤以单指硕⼠研究⽣,这其实是
错误的。——译者注

1
2

形式 《博⼠研磨》是⼀本⾯向⼤众的回忆录,⽽⾮⼀本⾯向在读博⼠⽣
的“成功指南”。尽管博⼠⽣也能在我的经历中学习到经验和教训,但我的⽬
标并不是直接提供建议。对于博⼠⽣⽽⾔,市⾯上的“成功指南”和“建议专
栏”已经不胜枚举,我也⽆意画蛇添⾜。这些⽂章充满了“持之以恒”和“不积
跬步,⽆以⾄千⾥”等等空泛的词汇,但相反,回忆录的形式让我能丰富、
具体地叙述发⽣在我⾃⼰⾝上的故事。

时机 《博⼠研磨》是我在完成博⼠学位之后马上着⼿写作的,⽽这正是
撰写这样⼀本回忆录的最佳时机。不同于在读博⼠⽣的是,我可以在回忆
录中对整个博⼠求学期间的⼯作进⾏系统的整理和反思;⽽相⽐资历较深
的研究者⽽⾔,我可能更容易忠于攻读期间的经历,不会引⼊过多由研究
经历带来的有选择性的观点和感受。

基调 尽管保持完全客观是不可能的,但我在写作《博⼠研磨》过程中仍
然试图贯穿⼀种相对客观的基调。与其他作者不同的是,很多撰写博⼠相
关⽂章、书籍,或者绘制漫画的⼈通常属于以下两类之⼀:

• 成功的教授或者科学家,他们通常给出⼀些冠冕堂皇的建议,⽐如他
们可能会说:“研究⽣⽣活诚然⾟苦,但它同时应该是⼀段美好的知识
之旅,你应该享受这个过程、并从中受益……因为我当年就是这样做
的!”

• 或者是苦涩的博⼠研究⽣或者辍学博⼠,他们常常因为⾃⼰的经历留
下了⼼理阴影,当提及博⼠⽣活的时候会⽤⼀种过分夸张、“看破⼀
切”、⾃我怨恨的腔调:“啊,那时我的世界就是个活⽣⽣的地狱,我到
底拿我的青春换了什么?!?”

冠冕堂皇的建议可能能激励⼀些学⽣,⽽⼤倒苦⽔的呻吟可能能引起
另⼀些处境不佳的学⽣的共鸣,但作为⼤众读者⽽⾔,他们可能并不能感
受到这些极端的情绪。
3

最后,在我开始讲述⾃⼰的故事之前,我希望强调⼀下,每个博⼠研
究⽣的经历与他/她所在的学校、院系、研究领域、经费状况等都有巨⼤的
关系。在我的读博⽣涯中,我感到⾃⼰⾮常幸运,能很⼤程度上⾃由⾃愿
地完成⾃⼰的学业;我知道很多学⽣相⽐⽽⾔受到了很多的限制。我的故
事只是⼀个孤⽴的数据点,所以我所呈现的故事可能并不能泛化、推⼴到
每⼀个⼈。然⽽,我会尽⼒避免叙述变得过分局限于我个⼈的情况。
祝阅读愉快!

Philip Guo, 2012 年 6 ⽉


4
译者序

巫术与⽕刑

可能最经常被家⼈朋友问到的问题之⼀,就是:“你说你在做研究、想
读博,那读博⼠、做研究到底是在做什么?”我⼀直想不到⼀个很好的答案,
直到读了 Philip Guo 的 The Ph.D. Grind。
有时候,读博做研究在⼤众眼⾥,就好像中世纪早期欧洲的医学。彼时
的⼈们仍然处于蒙昧状态,现代⼈习以为常的⽣物和化学知识,在那时仍
⼤多是未知的领域。在战乱和饥荒之外,最多夺去⼈们⽣命的,就是疾病。
当时的社会主流仍然认为⾝体不适是由恶魔侵袭造成的,⽽对此的对策也
往往只是信仰治疗。与此同时,⼀个不被主流社会所认可的群体开始形成,
在使⽤信仰治疗之外,他们开始尝试⽤各种草药对付不同的病症。这种和
当时社会常识截然不同的治疗⽅法尽管⽐单纯的信仰治疗有效许多,但因
为它和⼈们⼴为接受的宗教信仰有所冲突,所以⼤多巫医的治疗都在地下
进⾏。巫医们似乎也不愿意把⾃⼰的草药知识普及到⼤众之中,所以他们
草药知识体系的⼤部分都在⾃⼰的群体中形成,知识的累积和传授也通常
在巫医们的地下集会中传播。没有不透风的墙,这种和教廷宣扬的教义冲
突的“巫术”很快就被封禁了,很多参与者也被处以了当时的极刑——⽕刑
——意在彻底消灭这些“恶魔”。可能迫于宗教势⼒的压迫,并没有⼈挺⾝⽽
出救下这些曾经救死扶伤的巫医,⽽受此影响,传统医学的发展也⼤⼤受
到了阻滞。

5
6

或许除了教会的压制之外,另⼀个阻⽌⼈们挺⾝⽽出的因素,正是他
们对巫医治疗原理的不了解。作为少数掌握当时较⾼医学知识的群体,巫
医迫于种种现实因素选择了将⾃⼰的知识保存在相对狭窄的群体中,并没
有试图让更多普通⼈认识到他们对疾病的深⼊理解和反复试验累积的经验。
这其实某种意义上和今天的象⽛塔别⽆⼆致。受到⾼等教育的⼈群往往不
愿意、甚⾄不屑于与⼤众分享⾃⼰专业领域的知识或者技能,从⽽两者之
间通常会产⽣隔阂与不信任。当然今天的世界已不存在⽕刑这样残忍的刑
罚,但对⼤众的不了解、不认同、甚⾄不信任,象⽛塔⾥的学者们不能说
毫⽆责任。
《博⼠研磨》虽然并不是直接以此为⽬的的,但为⼤众了解象⽛塔内的
⽣活也能提供第⼀⼿资料,是⼀本不可多得的回忆录。也正是出于这个考
虑,我才决定把整本书翻译成中⽂,希望能让更多英语阅读有障碍的中⽂
母语者能获得同样的体验。

研磨的故事

在动⼿开始翻译之前,已经在许多中⽂材料中听说了 The Ph.D. Grind,


也见到过未完成的翻译作品。不同的材料中,对书名中 grind ⼀词的翻译
往往见仁见智。

Grind,原意研磨或者碾压,指将物体细细碾成碎⽚或者粉末。
后来这⼀词汇被引申为磨砺(通过摩擦使物体变得锋利或光滑),
或者与研磨、磨砺相类似的,需要长期努⼒的苦⼯。
——翻译⾃ Merriam-Webster 字典释义

⼀个相对⼴为接受的翻译似乎是《博⼠磨砺》,想必当时的译者取义
“宝剑锋从磨砺出,梅花⾹⾃苦寒来”的暗喻,喻指博⼠⽣涯是⼀种对品格、
性情、毅⼒、素养的磨练,当苦尽⽢来时,回望来路彼时种种磨练都塑造
了此时的⾃⼰。这种看法不⽆可取之处,它给⼈以希望,让我们提前看到
7

这本回忆录应该有⼀个圆满的结局,⽽之前的⼀切苦难和不幸,都是最后
成功之花绽放的铺垫。
⽽另⼀种⼴为流传的翻译似乎是另⼀个极端,即《博⼠磨难》。这位译
者可能对书中描述的科研中遇到的困难和点滴都深有同感,也为我们还原
了⼀个博⼠⽣在求学过程中经常看到的实景:真理的⾼峰往往在迷雾中不
知所踪,⽽就算有幸看到了峰顶的光芒,攀登的过程也绝⾮⼀路康庄。
刚刚开始翻译的时候,我也曾经为 grind 这个词的翻译⼤伤脑筋。在
翻译书名的时候想当然地借⽤了“磨砺”这个更加激励⼈⼼的翻译,但当翻
译中⼀次次遇到这个词在正⽂中出现时,我开始质疑⾃⼰的选择。在整本
回忆录中,grind 更像是⼀个中性词,没有“磨砺”这种事后回望,⼀切苦功
都没⽩费的庆幸,也鲜有“磨难”这种抱怨眼前困难,⾃悲⾃怜的消极。
为了尽量忠于原⽂的阅读体验,并尽量保持正⽂和书名中的 grind 翻
译⼀致,我最终还是选择了“研磨”这个更接近词语原意,也不具有明显感
情倾向的翻译。尽管这个词在现代汉语中并没有直接⽤作“⾟苦⼯作、历练、
磨砺”的意思,我仍真切地希望读者能理解这个选择。

献给所有热爱创造的⼈

正如原作者在回忆录最后强调的,读博⼠带来的磨砺、成长和创造的
乐趣并不只有读博⼠这⼀条路可以带来,不同⼈在不同的⼈⽣道路上可能
都有相似的体验。尤其是那些热爱创造的⼈,他们在路上往往经历着相似
的艰难险阻:因为从零到⼀往往是充满挑战的,即使眼前有确定的⽬标,前
进的路上也决难以预料会有怎样未知的问题在等待解决。但他们又往往有
着同样坚韧不拔的品格:尽管跋⼭涉⽔、披荆斩棘,经历过⽆数次失败和
重来,⽆数次跌倒和重新启程,⽆数次⽌步不前的沮丧和取得进展的喜悦,
他们仍然朝着⼼中的那个⽬标努⼒着。
借原作者致礼的这句话,再次表达对他们的敬意:献给所有热爱创造
的⼈。
8

最后,也借此机会感谢背后⼀直⽀持我的家⼈、⼥友和朋友们,你们
⼀直是我前进路上最⼤的动⼒和最坚实的依靠。还要由衷感谢罗宇男参与
了本书后半段的翻译⼯作,没有他的⾟勤⼯作,这份完整的翻译稿也很难
现在完成。其它在⼯作、⽣活和翻译上曾经给予过我⿎励、指导、建议和
⽀持的朋友们,在此也⼀并感激。

齐鹏
2015 年 4 ⽉ 16 ⽇ 于斯坦福
前言

因为我本科的专业是电⼦⼯程和计算机科学,⼤部分本科同学在毕业
之后,都马上投⼊到了⼯程性的⼯作中了。⽽我最终选择攻读博⼠学位,究
其原因,⼀⽅⾯是受到来⾃⽗母潜移默化的影响,另⼀⽅⾯也和我在本科
期间对⼯程性的实习产⽣的不良印象不⽆关系。
我⽗母从未要求过我去攻读博⼠学位,但我可以看出,终⾝⼤学教
授 是他们最尊重的职业——⽽博⼠学位正是成为终⾝教授的必要条件。为
2

什么终⾝教授会是他们⼼⽬中的理想职业呢?这其实并不是因为他们对纯
粹的学术追求有什么不切实际的盲⽬推崇。尽管我的⽗母也都到过良好的
教育,但他们同时也是⾮常现实的移民——⼀份终⾝教授的职位对他们⽽
⾔,更⼤的吸引⼒在于终⾝制所带来的⼯作保障。
我⽗母的很多朋友都是在企业的⼯程性职位上供职的中国移民。由于
他们在英语技巧和美国⽂化了解上的不⾜,他们中的⼤多数⼈在职业⽣涯
中的经历都并不顺利,⽽这⼀问题往往随着年龄增长⽽更加突出。在假⽇
聚会上,我经常能听到⼀个不变的主题:⼈们的⼯作因为难以相处的经理
⽽处处不顺、成为年龄歧视和“玻璃天花板”效应3 的牺牲品、甚⾄⾯临⼤规

2
在美国和加拿⼤等国家,终⾝职位(tenure)是指资深学者拥有的,除因正当理由外,
免于被解雇的合同权利。与此不同的是任意性职位(at-will),规定劳动双⽅随时可以以任
何理由终⽌劳动合同,不需要法定的正当理由,也不需要提前通知。⼤多数⾮学术研究类
(⼯程性)的⼯作属于后者。——译者注
3
玻璃天花板(Glass Ceiling)效应是⼀个政治术语,⽤于形容“在企业内升职过程中看
不到但难以逾越的障碍,通常见于少数⼈种和⼥性⾝上,且与这些⼈群的资历和成就并⽆

1
2 前⾔

模裁员和长期失业的风险。尽管我⽗亲不是⼀位⼯程师,⽽是在⾼技术产
业就职,但他也难逃这种魔咒,在⼀系列和管理层极其官僚做派的⽃争中
失败,最终早早地结束了他在公司的⼯作。那时他还相对很年轻,只有 45
岁。
我的母亲则是这种不幸潮流中唯⼀的幸存者。她⼗分热爱⾃⼰在
UCLA4 作为社会学终⾝教授的⼯作。和她的⼤部分中国移民朋友不同的是,
她享受终⾝职务保障,不⽤向⽼板汇报⼯作,可以⼏乎完全⾃由地追求她
⾃⼰的学术兴趣,在她的研究领域也⼩有名⽓。亲眼⽬睹我母亲成功的职
业轨迹,和⽗亲及他们的朋友们在职业⽣涯上的恶性循环两者之间的巨⼤
反差,这在我⾼中和⼤学本科的学习⽣涯中留下了难以磨灭的印象。
当然,仅仅因为这种⾮理性的、年少时的恐惧就去选择读博显然是不
明智的。为了让⾃⼰对在企业的⼯作⽣活有所印象,我在本科的每个假期
都参加了⼯程性公司的实习。因为我⼯作过的办公室都碰巧只有我⼀个实
习⽣,我被赋予了⼀种罕有的特权——我的⼯作职责是按照全职初级⼯程
师的标准分配的。尽管在这个过程中我学到了很多技术上的技巧,我仍然
觉得这种⽇复⼀⽇的⼯作极少需要思考且⾮常⽆聊;这也可能与我实习过
的公司不是⼀流公司有关。我本科的很多朋友都在微软(Microsoft)和⾕
歌(Google)等⼀流公司实习过,并⾮常喜欢他们的实习经历,他们最终
也往往在毕业后和这些公司签下了全职⼯作合同。
因为我对我的实习经历感到厌倦,⽽另⼀⽅⾯对本科时作教学助理
(助教)和研究助理(助研)的经历⽐较感兴趣,我当时将未来的职业⽬标
定在了⼤学教学和学术研究上。等到我在 MIT5 的第三年过半,我已经下定
决⼼在毕业后攻读博⼠学位,因为这是实现我职业⽬标的必经之路。我决
定留在 MIT,完成⼀个五年制本硕连读的项⽬,以此来在申请博⼠项⽬之
前积累更多的研究经验,以期能被录取到更多排名顶尖的院系中去。

关联”的现象。 ——译者注
4
UCLA 是加州⼤学洛杉矶分校(University of California, Los Angeles)的简称。——
译者注
5
MIT 是⿇省理⼯学院(Massachusetts Institute of Technology)的简称。——译者注
博⼠研磨 3

我找到了⼀位硕⼠论⽂的导师,并且就像很多壮志踌躇的年轻⼈⼀样,
开始向他阐述⾃⼰不甚成熟、遑论完善的研究思路和计划。我的导师很耐
⼼的听我说完了我的想法,但最终仍然成功地说服我进⾏⼀些和他的研究
兴趣更契合、更主流的研究,⽽且更重要的是,这些研究项⽬更契合他的基
⾦项⽬要求。因为当时我的硕⼠项⽬学费⼀部分来⾃我的导师从美国政府
申请的⼀个研究基⾦,我有义务在基⾦所规定的范围内完成研究⼯作。因
此,我听从了他的建议,并将接下来两年半的时间⽤于开发⼀类新的原型
⼯具,⽤于分析由 C 和 C++ 语⾔编写的计算机程序的运⾏时⾏为。6
虽然我并不是⾮常热衷于我硕⼠论⽂的项⽬,但事实证明选择⼀个和
导师研究兴趣契合的项⽬是⼀个明智的选择:在他有⼒的指导下,我发表
了两篇论⽂——⼀篇我被列为第⼀作者(主要作者),另⼀篇的位置稍微靠
后——并且我的硕⼠论⽂获得了系⾥年度最佳毕业论⽂奖。这些成就,加
上导师在我申请⽂档中的帮助,为我赢得了⼏所顶尖计算机科学系博⼠项
⽬的录取。因为斯坦福是我的⾸选,在我收到录取的当天晚上,我甚⾄激
动得⼏乎⽆法⼊睡。
我还⾮常幸运地得到了 NSF7 和 NDSEG8 研究⽣奖学⾦的垂青,这两
者都只颁发给了⼤概 5% 的申请者。这两个奖学⾦为我免除了攻读博⼠的
六年之中,五年的全部费⽤,也使我不必完成各种研究基⾦相关的研究项
6
运⾏时⾏为分析(run-time behavior analysis)是计算机程序编写和维护中⼀种重要
的技术,它可以帮助软件⼯程师更快、更准确地发现在程序编写时难以注意到的程序缺陷
和漏洞(bug),进⽽完善其功能并提⾼稳定性。Bug ⼀词的原意是⾍⼦,现代被⽤于形容
软件缺陷。这⼀说法⼀个可能的来源,是源于 1947 年电⼦管计算机刚刚问世前后。当时
在哈佛⼤学的⼆号机(Mark II)中,⼀位操作员仔细排查后发现,⼆号机当时⼀些计算谬
误的产⽣,是由于⼀只飞蛾被困在了⼀个继电器上。这件事被记录在了当时的实验室⽇志
中,后来常被称为“第⼀次真正找到的 bug(此处为⾍⼦和程序缺陷的双关)”。——译者注
7
NSF 是美国国家⾃然基⾦会(National Science Foundation)的简称。NSF 是⽀持美
国各⼤⾼等院校进⾏基础⾃然科学研究的重要基⾦来源之⼀。该奖学⾦的申请只⾯向美国
公民及永久居民开放。 ——译者注
8
NDSEG 是美国国防科学与⼯程研究⽣奖学⾦(National Defense Science & Engineer-
ing Graduate Fellowship)的简称。该奖学⾦由美国国防部出资设⽴,旨在推动国防相关
的科学与⼯程研究的发展,其申请只⾯向拥有美国国籍的⼈⼠开放。——译者注
4 前⾔

⽬。与我不同的是,在我的研究领域中,⼤部分博⼠研究⽣依赖于教授提供
的研究经费和院系提供的助教经费。博⼠研究⽣的经费包括全额学费,以
及⼤约每个⽉ 1,800 美元的补贴,⽤于贴补⽣活开⽀。(在我的研究领域⼏
乎没有⼈⾃费攻读博⼠,因为那样在经济上⾮常不划算。

因为我已经有⼀定的研究和写作论⽂的经验,当我在 2006 年 9 ⽉来到
斯坦福时,我觉得⾃⼰已经为未来艰苦的博⼠研究做好了充⾜的准备。然
⽽,那时我完全没有预见到的是,我的博⼠第⼀年即将成为我⽣命中到此
为⽌最为打击信⼼、令⼈灰⼼丧⽓的⼀段时间。
第一年:碎梦大道

2006 年的夏天,在我开始在斯坦福攻读博⼠学位的⼏个⽉前,我考虑
了⼀些我认为⾃⼰感兴趣研究的课题。⼤体⽽⾔,我想要创造⼀些创新性
的⼯具,⽤来帮助⼈们在进⾏计算机编程时提⾼效率,换⾔之,提⾼程序
员⽣产⼒。我之所以对这个⽅向感兴趣,主要源于我在暑期实习中⾃⼰的
编程经历:因为⽇复⼀⽇,公司分配给我的⼯作并不能让我提起太多兴趣,
⼯作中的很多时间,我都坐在⾃⼰的格⼦间⾥反思,在我⼯作的这些公司
中计算机编程的流程如何低效。那时我认为,如果能投⾝于旨在降低这种
低效性的科学研究,应该是不错的⽅向。更宽泛地说,我的研究兴趣集中
在能让所有类型的计算机使⽤者更加⾼效的⼯作中——⽽⾮仅仅聚焦在专
业程序员的⾝上。举例来说,我希望能设计出新的⼯具,能帮助科学家分
析和绘制数据、帮助系统管理员调整服务器配置、或者帮助计算机新⼿学
习使⽤新的软件。
尽管我当时就有这些模糊、不成型的兴趣,但距离我将这些兴趣转化
为真正可以发表的研究项⽬,并最终形成⼀篇博⼠论⽂,还有很多年的差
距。对斯坦福计算机科学系的博⼠研究⽣⽽⾔,通常他们需要发表⼆到四
篇第⼀作者的学术论⽂,并将这些论⽂合并成⼀篇博⼠论⽂——通常是⼀
篇长度与书籍相仿的科技⽂档。当博⼠论⽂通过⼀个由三位教授组成的博
⼠论⽂委员会批准后,学⽣就可以毕业,从⽽获得博⼠学位了。在我所在
的计算机系,通常⼀个博⼠研究⽣需要四到⼋年毕业,这个年限取决于他
们发表⽂章的效率。

5
6 第⼀年:碎梦⼤道

在 2006 年 9 ⽉的新⽣信息会9 上,系⾥的教授⿎励所有的博⼠新⽣尽


快找到⾃⼰的导师,所以我和我的同学们⼀样,把⼀开始的⼏个⽉花在了
找教授谈话上,希望尽快找到⼀个研究⽅向匹配的导师。对于⼀个学⽣的
论⽂委员会来说,导师扮演了最重要的⾓⾊,因为他/她对学⽣能否毕业拥
有最终的决定权。在我的研究领域,导师通常还负责通过⾃⼰的科研经费
为学⽣提供经费⽀持,并且指导他们开展课题研究、写作论⽂。和⼏位教
授谈话后,我发现 Dawson10 和我的研究兴趣和研究风格都似乎最为接近,
所以我选择了他作为我的导师。
在我刚去斯坦福的时候,Dawson 已经在斯坦福度过了⼋年,并且刚刚
获得终⾝教授职位;通常,教授在他们⼯作的前七年如果发表了⾜够多⾼
⽔平的研究论⽂,就可以得到终身职位(终⽣的⼯作保障)。Dawson 的主
要研究兴趣是创造新的⼯具以⾃动在复杂、真实的软件中寻找 bug(软件
代码中的缺陷)。在过去的⼗年间,Dawson 和他的学⽣编写了许多这样的
⼯具,相⽐他们的竞争者⽽⾔,他们能找到程序中更多的 bug。他们的研究
成果⼗分有效——他们甚⾄成⽴了⼀个成功的创业公司,通过提供基于这
类技术的缺陷检测服务⽽盈利。尽管我对 Dawson 的研究项⽬感兴趣,更
吸引我的⼀点则是他的研究哲学和我⾃⼰的想法⼗分接近:他是充满激情
的“务实派”——相⽐于单纯为了显得“学术”⽽去研究理论上“新颖”的课题,
他更关注的是得到实实在在、有说服⼒的结果。
我和 Dawson 第⼀次⾯谈时,他似乎对我的⼤⽅向——让计算机的使
⽤和计算机编程变得更⾼效——只是稍感兴趣。不过,有⼀点他说的很清
楚:他⾮常希望招收⼀些新的研究⽣来帮助他完成⼀个叫 Klee 的软件缺陷

9
信息会(Orientation),或译为迎新会,是在学校或⼤型组织中常见的,统⼀为新成员
提供常⽤信息、帮助其尽快适应环境的活动,通常由资深成员主持。
10
Dawson 是这位教授的名字(first name),⽽⾮姓(last name),故翻译成 Dawson 教
授是不准确的——原⽂也没有出现 Professor Dawson(Dawson 教授)这⼀称呼。单独使
⽤名字在英语中⾮常普遍,通常⽤于熟⼈之间互相称呼、陌⽣⼈之间互相介绍、以及不希
望提及全名的场合。⽂中出现的⼈名都是单独的名字。为了忠于原⽂的阅读体验,译者没
有对这些名字进⾏标准化翻译和加⼯。
——译者注
博⼠研磨 7

检查⼯具,因为这个项⽬是他现在的科研经费所⽀持的。
(这个⼯具有好⼏
个名字,但为了简便,这⾥就叫它“Klee”。)和其他的教授和⾼年级博⼠谈
过之后我才意识到,对于新⽣⽽⾔,加⼊⼀个已有的、由研究基⾦⽀持的
项⽬是⼀种常规现象,⽽并不是马上开始进⾏⾃⼰原创的研究项⽬。我说
服了⾃⼰,认为⾃动查找软件缺陷也是⼀种间接提⾼程序员⼯作效率的研
究,于是便打定主意,加⼊ Klee 项⽬组。
当 2006 年 12 ⽉,我准备加⼊ Klee 项⽬组时,Dawson 已经在指导五
个学⽣参加这个项⽬了。项⽬组的带头⼈ Cristi 是第三年的博⼠⽣,⽽正
是他和 Dawson 开发了最初版本的 Klee。Dawson、Cristi 和其他研究者不
久前还发表了第⼀篇说明 Klee 系统的论⽂,并展⽰了 Klee 在发现⼀些新
的缺陷上⼗分有效。那篇论⽂受到了学术界的好评,所以 Dawson 希望保
持这⼀势头,继续发表⼏篇跟进这⼀项⽬的⽂章。值得注意的是,从同⼀个
研究项⽬中发表多篇论⽂是可能的(即“跟进论⽂”),只要这些新的论⽂有
新的原创观点,相⽐前作的改进和创新,或者相⽐前作⽽⾔在结果上有很
⼤的改善。当时,下⼀个相关领域的顶级会议的论⽂提交截⽌⽇期是 2007
年 3 ⽉,所以 Klee 团队有四个⽉⽤于基于之前的论⽂做出创新性的改进,
以期发表⼀篇新论⽂。

在我继续讲述我的故事之前,我想简单地介绍⼀下学术论⽂是如何评
审和发表的。在计算机科学领域,发表⽂章最受关注的场合是学术会议。
当然,值得指出的是,再很多其他学科中,学术期刊才是最受关注的,⽽
对这些领域⽽⾔,“学术会议”往往和计算机科学领域⼤相径庭。对计算机科
学⽽⾔,学术会议的论⽂发表流程⼤概如下:

1. 每个会议发布⼀个征稿启事,其中说明了会议所要求的课题范围和⼀
个论⽂提交的截⽌⽇期。

2. 研究者需要在指定的截⽌⽇期之前提交⾃⼰的论⽂。通常每个学术会
8 第⼀年:碎梦⼤道

议会收到 100 到 300 份论⽂稿件,每篇论⽂⼤概包含 30 到 40 页双


倍⾏距11 的⽂字。

3. 学术会议的程序委员会(Program Comittee,简称 PC)通常由⼤约


20 位专家研究者组成,他们负责将论⽂负责分类,以便审稿。每篇
论⽂通常由三到五个⼈完成评审,参与评审的⼈员可能包括 PC 的成
员,或者由 PC 成员邀请的、来⾃学术界⾃愿参与审稿过程的审稿⼈。
论⽂的评审过程通常需要⼤约三个⽉。

4. 当每位 PC 成员都完成审稿后,整个委员会将开会商议,通过审稿⼈
的反馈决定接收⼀部分论⽂稿件,并拒收剩下的稿件。

5. 程序委员会会发出电⼦邮件通知所有的作者,告知他们论⽂是否被接
收,并将审稿⼈对他们的论⽂提出的审稿评价附在电⼦邮件中。

6. 论⽂被接收的作者参加学术会议,并关于⾃⼰的论⽂做⼀个 30 分钟
左右的演讲。学术会议结束后,所有的论⽂都将被收录在在线的数字
图书馆中。12

通常,⼀个备受关注的顶级学术会议的论⽂接收率在 8% 到 16% 之间,


⽽第⼆级的学术会议⼤概接收 20% 到 30% 的投稿。由于这些接收率相对
较低,对于⼀篇学术论⽂来说,被拒收、修改并重新提交并不罕见——在
论⽂最终被接收之前可能这⼀过程要重复多次,⽽这⼀过程可能会花费数
年的时间。
(在同⼀时间,⼀篇论⽂只能被提交到⼀个会议。

11
双倍⾏距排版时,⾏间距与⽂字⾼度相同,通常⽤于学术期刊初稿的排版。⽽计算机
科学的学术论⽂通常采⽤单倍⾏距、双栏排版。——译者注
12
根据研究领域不同,学术会议的举办⽅式略有不同。在⼀些领域中,论⽂会被 PC 分
为演讲展⽰(oral presentation)和海报展⽰(poster presentation)两种形式。演讲展⽰
中,通常有 5 ⾄ 30 分钟供作者在报告厅等场合公开真实⾃⼰的研究成果;海报展⽰时,
所有参与的作者则将⾃⼰的研究成果展⽰在⼀张海报上,并以海报为基础向观众展⽰⾃
⼰的研究。通常演讲展⽰会有更多听众和更⼤的影响⼒,在有演讲展⽰和海报展⽰之分
的学术会议中,PC 也会把有限的演讲展⽰机会分配给他们认为更有影响⼒的学术研究项
⽬。——译者注
博⼠研磨 9

当 Dawson 说他想要提交⼀篇论⽂到 2007 年 3 ⽉截⽌提交的顶级会


议之后,他向我介绍了当时其他五个学⽣⼯作的⽅向,并让我选择⾃⼰感
兴趣的⼯作。我选择了使⽤ Klee 来寻找 Linux 驱动程序中存在的新的程
序缺陷。驱动程序是指⽤于帮助操作系统完成其与外置设备(如⿏标或键
盘)通信的软件代码。⽽ Linux 操作系统,和微软 Windows 系统或者苹果
Mac OS 系统类似,包含了成千上万这样的驱动程序,⽤以连接各种各样的
外置设备。对于传统的调试⽅法⽽⾔,驱动程序中的软件缺陷⼗分难以找
到,甚⾄有可能是危险的,因为驱动程序的缺陷可能会导致操作系统死机
甚⾄崩溃。
Dawson 认为 Klee 可以在 Linux 驱动程序的成千上万⾏代码中,找到
其他⾃动缺陷分析软件(甚⾄⼈)从未找到过的软件缺陷。我记得我当时考
虑过,尽管在 Linux 驱动程序中找到缺陷写在论⽂⾥看起来很不错,但我
并不是很明⽩这样的⼯作能不能算是真正的研究贡献。按照我的理解,我
要做的事情是⽤ Klee 去寻找程序缺陷——将⼀个已有的研究应⽤在实际问
题上——⽽不是采⽤⼀种创新的⽅法来提⾼ Klee 的性能。此外,我并不明
⽩,到三⽉份论⽂截稿时,我的⼯作和其他五个学⽣的⼯作如何能融合成
⼀篇⾃洽的论⽂。尽管如此,我当时相信 Dawson 在头脑中有⼀个⾼瞻远
瞩的思路完成这篇论⽂。介于我刚刚加⼊研究项⽬,我并不想马上开始对
这些应该由教授决定的问题开始指⼿画脚。任务已经摆在眼前,我要考虑
的只是尽我所能,完成这个任务。

我博⼠⽣涯的前四个⽉被我⽤于配置 Klee 以⽤它来分析上千⾏的


Linux 设备驱动程序,以期从中发现新的程序缺陷——这⼀过程并不顺利。
尽管看起来我的任务并不复杂,但我很快就被淹没在了⼀些细节问题中,
⽽这些细节对于让 Klee 能够分析 Linux 驱动程序又是必不可少的。我经
10 第⼀年:碎梦⼤道

常会花⼏个⼩时设置好 Klee 所需的复杂的实验环境,以分析某⼀个驱动程


序的程序缺陷;但这种⼯作又往往以 Klee 因为其⾃⾝的程序缺陷⽽崩溃告
终,让我的努⼒付诸东流。当我把这些 Klee 中存在的问题报告给 Cristi 时,
他会竭尽全⼒解决,但由于 Klee 本⾝极其复杂、环节众多,在其中找到并
解决程序缺陷绝⾮易事。我并不是想要专门指责 Klee:任何以科研为⽬的
开发的原型软件都会或多或少有⼀些难以预见的缺陷。我的任务是⽤ Klee
去 Linux 驱动程序代码中寻找缺陷,但讽刺的是,我整个第⼀个⽉的⼯作
都变成了在 Klee ⾥找缺陷。(Klee 不能在⾃⼰的代码⾥⾃动找到缺陷,这
实在是太遗憾了!)随着时间的流逝,我对于⼿头的⼯作越来越感到沮丧,
我觉得⾃⼰被分配的任务就是单纯的苦⼒,毫⽆知识含量——我的时间都
⽤在让 Klee 能正常运⾏上了。
这是我⽣命中第⼀次感受到被⼿头的⼯作所淹没的⽆望。以前,我的
暑期实习都相对不难,⽽且就算⼀些学校的作业对我来说有些挑战,作业
中也总有⼀个需要找到的正确答案等着我。如果我课上有没听懂的内容,
助教或者⾼年级的学⽣总可以帮我答疑解惑。就算在本科进⾏学术研究的
时候,我也总能请辅导我的博⼠学长帮忙,因为我当时处理的问题相对⽐
较简单,⽽他通常知道问题的解决⽅法。对于本科的研究助理⽽⾔,对学术
研究的投⼊以及期望也相对较低:科研只是我⽇常⽣活很⼩的⼀部分。如
果我在某个科研问题上毫⽆头绪,我可以选择集中精⼒在课程作业上,或
者⼲脆和朋友们出去玩。本科毕业也和学术研究毫⽆关联。然⽽,作为博
⼠研究⽣,学术研究是我唯⼀的⼯作,除⾮我在学术研究上能有所成果,否
则我将得不到博⼠学位。我难以把⾃⼰的情绪和每天的研究进展分离开来,
⽽在那⼏个⽉中,我的研究进展出奇得缓慢。
我现在步⼊了⼀个完全陌⽣的领域,所以我很难再向本科时候那样
向别⼈寻求帮助,因为问题的答案往往是不确定的。因为我是唯⼀试图
将 Klee 应⽤于驱动程序代码的⼈,我的同事们并不能为我提供任何指导。
Dawson 偶尔会给我⼀些较⾼层⾯的策略性的建议,但就像所有已经获得终
⾝职位的教授⼀样,他的⾓⾊并不是和他的学⽣们⼀起“在战壕⾥(第⼀线)
博⼠研磨 11

参与战⽃”。在做出研究成果的过程中,弄清楚所有复杂的细节是我们学⽣
的任务——对我来说,这些细节就是如何找到别⼈从未发现过的、Linux 驱
动程序中的软件缺陷。教授们都喜欢重复这句⽼⽣常谈:“如果有⼈曾经做
过这样的⼯作的话,那就不能叫做学术研究啦!”这是我第⼀次亲⾝体会到
了这句话的含义。
尽管我每天都觉得⼯作很⽆望,但我仍然不断安慰⾃⼰:我只是刚刚
开始在这里⼯作,我应该保持耐⼼。我不想在我的导师或者同事⾯前显得
软弱⽆能,尤其因为我当时是 Dawson 组⾥最年轻的学⽣。所以,我在超
过 100 天的时间⾥,每天修复 Klee 不断产⽣的新问题,不断遇到新的、更
加棘⼿的问题,在我的“寻找 Linux 驱动程序缺陷之旅”中,拖着沉重的脚
步前进。
当时,在我醒着的每时每刻,我不是在⼯作,就是在思考研究中的问
题,抑或是在因为⾃⼰在研究中被艰深的技术问题所困扰⽽感到沮丧。与
⼀般的朝九晚五的⼯作(⽐如我的暑期实习)所不同的是,以前每天晚上
我可以把⼯作留在办公室,坐在电视前放松⾃⼰;⽽现在的学术研究在情
绪上和⼼理上都是⽆休⽆⽌的。我晚上⼏乎没法让⼤脑停⽌思考问题,尽
情放松休息——后来我发现⼏乎所有的博⼠研究⽣都有类似的困扰。有时,
因为我的研究任务繁重得难以想象,我甚⾄会因为压⼒⽽失眠。想要在研
究中休息⼀段时间也⼏乎不可能,因为在 3 ⽉份的论⽂提交截⽌⽇期之前,
还有很多⼯作需要完成。
在做这些苦⼒时,我曾经试图想出⼀些半⾃动的⽅法,可以让每天的
研磨不那么⾟苦。我和 Dawson 交流过⼀些初步的想法,但我们最终的结
论是,如果我们想让 Klee 能在 Linux 驱动程序⾥找到缺陷,这种耗时间的
研磨是⽆法避免的。接下来,在论⽂提交前的⼏个⽉⾥,我只能继续⾟苦
⼯作。
理性⽽⾔,我⼗分理解在科学和⼯程领域中,通过实验式的研究⽅法
获得研究成果,通常并不光鲜、甚⾄包含很多⾟苦的⼯作。⽽博⼠研究⽣,
尤其是第⼀、第⼆年的博⼠⽣,通常不得不在这⼀过程中参与最⾟苦、最劳
12 第⼀年:碎梦⼤道

⼒的⼯作——这是他们的资⾦来源所决定的。通常,在⼀个研究组中,教
授和⾼年级博⼠⽣制订⾼瞻远瞩的研究计划,并将任务布置给低年级的学
⽣,由他们去研磨所有的细节,并让项⽬实际运转起来。第⼀、第⼆年的
学⽣通常很难影响研究组项⽬的⼤⽅向。尽管我完全接受⾃⼰在这种“等级
制度”下较低的地位,但感性上,我仍然深受打击,因为⼿头的⼯作实在是
太他妈难了13 ,⽽且毫⽆成就感可⾔。

经过两个⽉的研磨之后,我收获了⼀些⼩⼩的成功。我成功地让 Klee
能在⼀些较⼩的驱动程序上良好⼯作,并开始找到了⼏个程序缺陷。为了
确定这些缺陷是否真实存在(⽽⾮因为 Klee 的局限⽽导致的误报),我向
开发这些驱动程序 Linux 的程序开发者发了⼏封电⼦邮件,说明了这些
可能存在缺陷的地⽅。⼏位开发者回复了我邮件,确认了我的确是在他们
的代码中找到了真正的缺陷。当我收到这些确认的邮件时⼗分激动,因为
这是我第⼀次受到外界的认可,尽管它们只能算很⼩的⿎励。尽管我没有
做出什么⾰新性的研究,我依然收获了⼀些成就感,因为这些缺陷在没有
Klee 的帮助下可能⾮常难以找到。
在这些⼩的驱动程序⾥的缺陷得到确认之后,我的⼠⽓有所恢复,所
以我开始着⼿分析更⼤、更复杂的驱动程序。然⽽,接下来的⼏周中不断
浮现的技术问题逐渐变得难以承受,并⼏乎把我推到了崩溃的边缘。这⾥
简单总结⼀下我当时遇到的问题:Klee 实际上只能在不超过⼤概 3000 ⾏,
由 C 语⾔写成的代码中找到缺陷。最⼩的 Linux 驱动程序代码⼤概有 100
⾏,所以 Klee 分析它们游刃有余。⽽稍微⼤⼀些的驱动程序就有⼤约 1000
⾏代码,⽽这些代码还与⼤约⼀万⾏到两万⾏的 Linux 操作系统代码密不
可分。这就导致问题⼀下远远超过 Klee 可以分析解决的范围,因为 Klee
并不能把这 1000 ⾏代码和其他部分“斩断联系”⽽单独分析。我试过很多⽅
法减少这些外部的连接(术语称为依赖),但是这样做意味着对每⼀个驱动
13
原⽂此处为“so damn hard”,此处为保持原⽂语⽓,进⾏了直译。
博⼠研磨 13

程序,我将需要花费⼏天的时间去完成⼗分复杂的⼯作,⽽最终这些⼯作
也只对这⼀个驱动程序有效。
我和 Dawson ⾯谈了⼀次,向他说明了我⾯临的问题的复杂程度,也
表达了⾃⼰对此的消极情绪。对我来说,在每⼀个新的驱动程序上都要花
费⼏天的时间才能让 Klee 可以运⾏,这简直是荒唐⾄极的⼯作。这种⼯作
不仅让我疲惫不堪,它本⾝甚⾄不能算是学术研究!在我们的论⽂⾥,我
应该怎么描述我的⼯作——我花了⼤概 1000 ⼩时的苦⼯,就为了让 Klee
能分析⼀堆驱动程序,除此之外我并没有其他可说的了?这根本不是学术
贡献,反⽽听起来太愚蠢了。另⼀⽅⾯,我开始着急,因为距离论⽂提交截
⽌只有五周了,⽽ Dawson 似乎还没有提过我们组的研究论⽂应该从什么
思路着⼿写作。通常⼀篇优秀的学术论⽂需要⾄少四周时间才能完成,⽽
且我们的情况可能更加复杂,因为我们有六个学⽣各⾃负责项⽬的⼀部分,
我们需要把这些部分融合在⼀起。
我和 Dawson ⾯谈过后⼏天,他提出了⼀个改进的思路,让 Klee 能够
克服我所⾯临的依赖问题。他提出的这个观点叫做约束下运⾏(UnderCons-
trained execution,简称 UC),⽽这种⽅法也许能让 Klee 将 Linux 驱动程
序和外部的⼀两万⾏代码剥离开来,并单独在驱动程序代码中进⾏分析。
他马上就开始和⼀个⾼年级的学⽣开始将 UC 技术融合在 Klee 中;他们把
改进后的版本称为 Klee-UC。尽管我当时筋疲⼒竭、接近崩溃,但我仍然
⾮常欣慰看到⾃⼰的痛苦挣扎⾄少激发了 Dawson 的灵感,想到了这个有
朝⼀⽇可能成为学术贡献的新思路。
接下来,Dawson 和那名学⽣在 Klee-UC 上花了⼏周的时间。与此同
时,他们让我继续⽤原来的⽅法,⼿⼯在 Linux 驱动程序中寻找缺陷。他
们打算通过⽤ Klee-UC 试图找到我⽤普通 Klee 找到的缺陷,来证明其有
效性。他们想在论⽂⾥阐述的观点是,与其让⼀个博⼠⽣(就是我!
)为了
找到每个缺陷⽽在繁杂的⼯作上花费⼏天的时间,不如⽤ Klee-UC 来在⼏
分钟之内找到这些缺陷,⽽且不需要准备任何特定的实验环境。
在近乎疯狂地又研磨了⼏周之后,我终于让原版的 Klee 成功分析了
14 第⼀年:碎梦⼤道

937 个 Linux 驱动程序,并找到了 55 个新的软件缺陷(其中 32 个收到了


开发者的确认)。接着,我还得把刚刚成型的 Klee-UC 配置好,并准备分析
这 937 个驱动程序。这⽐之前的配置还要⿇烦,因为在我准备⽤ Klee-UC
分析驱动程序的同时,Dawson 和那个学⽣仍然在(编程)实现它。谢天谢
地,最终 Klee-UC 的确找到了我找到的缺陷中的⼤部分,这样我们做了⼀
些学术贡献,也有成果可以在论⽂⾥展⽰了。
但是这⾥有个巨⼤的问题。等到我们得到那些不错的结果时,到论⽂
截⽌⽇期已经只剩下三天了,⽽我们都完全没有着⼿开始写论⽂。在这么
短的时间⾥,撰写、编辑、完善⼀篇⽂章,使得它能被顶级计算机科学学术
会议录⽤是完全不可能的。但我们还是努⼒这么做了。在提交截⽌前的 72
⼩时⾥,Dawson 和我们五个学⽣(其中⼀位现在已经退学了)两个通宵住
在办公室,以期完成实验和论⽂。我们所有学⽣⼼⾥都知道这篇论⽂不可
能被接收,但我们还是在 Dawson 的带领下,顺从地向⽬标前进。
最终,我们提交了⼀篇令⼈尴尬的⽂章,⾥⾯充满了错误拼写、不通
顺的句⼦⽚段、没有解释的图表,甚⾄连结论段都没有。整个是⼀团乱⿇。
在那⼀刻,我难以想象,如果我的研究⼯作⼀直是这样毫⽆章法,我到底
要如何从博⼠项⽬中毕业。三个⽉后,不出所料,我们收到的审稿意见极
其消极,甚⾄包括这样的严厉谴责:“程序委员会(PC)认为这篇论⽂简直
太过草率,根本不可能被录⽤;请不要提交这种甚⾄⽆法审阅的论⽂。”

这次惨痛经历之后,我申请了去⾕歌实习,因为我急需换⼀换环境。那
份实习和我的研究兴趣毫不相关,但我并不在意。当时我只想逃离斯坦福
⼏个⽉。
这时是 2007 年 4 ⽉份了,距离 6 ⽉份我的实习开始,还有⼗周的时
间。我不知道我能做些什么,但我想逃离我之前四个⽉折腾 Klee 和 Linux
驱动程序的经历,逃得越远越好。我根本不关⼼我们是不是会修改并且重
新提交那篇论⽂(最后没有);我只想逃离那段梦魇。但因为我已经积累了
博⼠研磨 15

近千⼩时的使⽤ Klee 的经验,⽽这也是 Dawson 当时唯⼀关⼼的项⽬,我


想这可能是⼀个开展新课题不错的切⼊点。于是,我找 Dawson 谈了谈,和
他交流了⼀些“不寻常”的使⽤ Klee 的⽅法,⽽不仅仅是局限于寻找软件缺
陷。
然⽽我很快就意识到,我完全没必要把⾃⼰局限在 Klee 上,因为我的
经费来⾃ NDSEG 奖学⾦,⽽⾮ Dawson 的研究经费。⽽ Dawson 其他学
⽣的境况则于我不同,他们除了继续在 Klee 项⽬中⼯作之外别⽆选择,因
为他们都是靠 Klee 的研究经费⽀持的。所以我决定仍然让 Dawson 作为我
的导师,但离开 Klee 项⽬组去从头开始开展我⾃⼰的研究项⽬。
为什么我不早点“单飞”呢?因为尽管我的奖学⾦理论上给予了我研究
⽅向的⾃由,但我知道我仍然需要⼀位导师的⽀持才能最终毕业。当时,
Dawson 显然想让他所有的新⽣都把精⼒投⼊到 Klee 上,所以我就花了四
个⽉的时间在 Klee 上研磨,塑造了⼀个“好⼠兵”的形象,⽽不是⼀开始就
傲慢地要求做⾃⼰的项⽬。⽽且,就算我选择了别的导师,我⼀开始还是
会需要花时间在他们的项⽬上,来证明⾃⼰的能⼒。这种“交学费”的⼯作
根本⽆法避免。
接下来的⼗周⾥,我在⼀个完全真空的环境思考⾃⼰的研究思路,完
全没有与⼈交流。因为我⼀开始对研究组留下了如此消极的印象,我现在
只想⾃⼰⼀个⼈清静地思考。Dawson 对我的消失并没什么意见,因为他并
没有在⽤⾃⼰的研究经费⽀持我。
我把⾃⼰完全与世隔绝,⼼理上基本处于崩溃状态,但我仍然试着每
天能有所进步。我尝试着每天阅读⼏篇计算机科学的学术论⽂,并做好笔
记,以帮助我激发⾃⼰的灵感。但因为没有良好的引导和研究背景,我最
后浪费了很多时间,有时读完了论⽂却⼀⽆所获。我还曾经骑着⾃⾏车在
校园⾥漫⽆⽬的地游荡,试图在过程中思考⾃⼰的研究思路但常常⽆功⽽
返。最终,我把时间都浪费在了拖延上,可能甚于我这辈⼦⾄今为⽌的任
何⼀段时光:我看了很多电视节⽬,睡了很多觉,花了⽆数个钟头在⽹上
蹉跎。与我的朝九晚五的朋友们不同的是,我没有⽼板每天监督我的⼯作,
16 第⼀年:碎梦⼤道

所以我可以⽆拘⽆束,让我的⼤脑⾃由思考。
尽管我对研究⽅向的头脑风暴⼤部分都毫⽆⽬标,但我的想法逐渐地
开始向⼀个问题聚拢:我们如何才能经验性地度量软件的质量呢?这是在
我开始读博之前,受到⼯程性实习中遇到的低质量的软件⽽启发,所想到
过的⼀个感兴趣的研究⽅向。然⽽,在真空中空想研究思路的问题所在,是
我当时没有⾜够所需的经验来把这些思路转化为现实的项⽬。因为我还没
有准备好,显然这种完全的思想⾃由在当时更像是⼀种诅咒。
尽管我对创造新⽅法来度量软件质量⾮常感兴趣,我当时也明⽩这只
能是⼀个模糊的梦,没有⾜够的形式化的研究⽅法⽀持,是不可能被学术
界所接受的。如果我当时⾃⼰闭门造车研究这个项⽬,我的下场只能是成
为⼀个胡说⼋道却又假装内⾏的⼈。我永远不可能有机会把这些想法发表
在顶级、甚⾄次⼀级的学术会议中,⽽发表不了论⽂就意味着不能毕业。那
时,我已经不再抱有虚⽆缥缈的梦想,想要成为⼀名终⾝教授了:我只想
能找到个办法毕业。
在那整整⼗周的与世隔绝中,我⼏乎没跟任何⼈说话——甚⾄包括朋
友和家⼈。找⼈抱怨也毫⽆意义,因为没⼈能明⽩我当时经历的⼀切。我
的不读博的朋友们以为我就是“在学校上上课”。⽽少数⼏个我在系⾥新认识
的朋友也和我⼀样,正在因为他们博⼠第⼀年⾥的挣扎感到抑郁——这些
挣扎的主要部分,多半就是不得不直⾯充满挑战、不知从何⼊⼿的研究问
题带来的震惊,以及⽆法影响实验室研究⽅向、只能随波逐流的⽆奈。我们
这⼀群年轻的计算机科学家来到这⾥,⾃愿地投⾝于复杂⽽看起来毫⽆意
义的⼯作中,所收获的却只是我们在公司⼯作的朋友们四分之⼀左右的⼯
资。这种现实简直可悲到可笑的地步。但我觉得⼤家凑在⼀起互倒苦⽔也
毫⽆裨益,所以我选择了闭嘴。我选择了不来计算机系的⼤楼⾥⼯作,因
为我害怕碰到同事、同学们。我害怕他们会不可避免地问我我现在研究的
课题是什么,⽽我并没有什么可说的东西。藏⾝于图书馆或者咖啡店让我
感觉更为安逸。
反观当初,这么早脱离实验室单⼲是⼀个⾮常糟糕的选择。和想象中
博⼠研磨 17

⼀位孤独的学者坐在路边,⼀边喝着拿铁咖啡⼀边在⼀张笔记纸上涂涂画
画这种浪漫化的场景不同的是,真正的学术研究从来就不是在“真空”中完
成的。为了创新,⼀个⼈需要有坚实的知识、历史、甚⾄物质基础(⽐如
实验室设备)。在那⼏周中,我应该追寻的更明智的路线是找更多机会和
Dawson 谈话,并积极寻求和其他教授以及⾼年级学⽣的合作。但当时的我
太过崩溃和沮丧,不满于“等级分明”的基于研究组的学术风格——把新来
的博⼠研究⽣放在最繁杂枯燥的⼯作中——所以产⽣了逆反⽽选择了单飞。

在我⼗ 周的 与世 隔 绝 接 近 尾 声,即 将去 ⾕歌暑期实习之前,我给


Dawson 发了个电⼦邮件,简单说明了⼀下我最近读到的⼀篇让我思考了很
多的科技博客。那篇博客让我想到了⼀个想法,那就是通过开发者在程序
代码存在的整段时间⾥编辑代码的过程,来衡量⼀个软件项⽬的质量。令
我惊喜的是,Dawson 很快给我发了⼀个简短的回复,说他对这种衡量软件
质量的技术也很感兴趣,尤其是如何⽤这种技术来帮助 Klee 这样的⾃动缺
陷检测⼯具。
当知道 Dawson 对我感兴趣的领域也感兴趣之后,我再次燃起了希望,
因为他也许能帮助我把这个想法变得更接近现实。我很快的为这个新想到
的经验化软件质量度量的项⽬记下了⼀些笔记,并打算从暑期实习回来后
开始研究这个课题。这样,在四个⽉与 Klee 的痛苦研磨,以及⼗周漫⽆⽬
的的找寻⽅向之后,我博⼠⽣涯的第⼀年画上了⼀个还算乐观的休⽌符。
18 第⼀年:碎梦⼤道
第二年:整装启程

在⾕歌的暑期实习对我⽽⾔,是⼀段脱离学术研究的轻松时光。我的
⼯作压⼒并不⼤,所以我经常有机会和其他实习⽣⼀起闲聊、交朋友。临
近夏天结束时,我已经从第⼀年的痛苦和折磨中痊愈,做好了重新开始博
⼠⽣活的准备。
在夏季最后⼏天,我给 Dawson 写了⼀封电⼦邮件,重申了我对追求
⾃⼰研究兴趣的渴望,但同时强调了从研究中发表论⽂对我⽽⾔的重要
性:“我从这个暑期以及之前的暑期实习经验,发现⾃⼰很难集中精⼒完成
⼀个博⼠科研项⽬,除⾮我对这个项⽬有强烈的归属感和科研的热情;所
以我⾮常希望能在令我感到激动的研究⽅向,和学术界中的教授们⼴泛认
为具有‘研究价值’的问题中,找到⼀个交集,并为之奋⽃。”
我准备继续和 Dawson ⼀起在经验化软件质量度量的课题上做⼀番研
究,因为我们已经在我第⼀年结束的时候讨论过这⼀问题。然⽽,我当时
预感这个项⽬可能会风险较⼤,因为这不是 Dawson 主要的研究兴趣,也
不是他主要的专业知识的所在;对他⽽⾔,Klee 仍然是最⾼优先级的⼯
作。于是,我想到⾃⼰可以去寻找另⼀个课题,通过同时在两个课题上做
研究(并寄希望于⾄少⼀个能成功),来冲淡风险。我将在这章稍后介绍我
和 Dawson 合作的主要研究项⽬,但我想先说说我的另⼀个项⽬。

就在 2007 年 9 ⽉,我准备开始我博⼠⽣涯的第⼆年之前,我去波⼠顿

19
20 第⼆年:整装启程

度假了⼀周,看望我⼤学时的朋友。因为我当时离得不远,所以我给⼏位
我本科时就认识的 MIT 教授发了邮件,希望可以向他们寻求⼀些指导。他
们和我见⾯的时候,⼤概都谈到了同样的事情:要主动去找教授谈话,尽
量去找⼀个共同的兴趣点作为研究课题;不论如何,把自⼰关起来闭门造
车是万万不可取的。这句简单的建议在我博⼠接下来的五年⾥反复得到印
证,也最终指引我顺利完成了博⼠学习。
还在波⼠顿时,我就马上将这个建议印在⼼⾥并付诸⾏动。我给 MIT
计算机系⼀位叫 Rob 的教授发了⼀封冷邮件(向从未通信过的⼈冒昧发送
的邮件)
,并礼貌地请求和他⾯谈⼀次。在这封邮件中,我简单地说明了⾃
⼰是 MIT 毕业不久的学⽣,现在在斯坦福攻读博⼠,并希望能开发出⼀
些让计算机程序开发者能提⾼⼯作效率的⼯具。因为我知道 Rob 也对这⼀
研究领域有兴趣,我希望他能回复我的邮件,⽽不是把它标记为垃圾邮件。
Rob ⾮常慷慨地在他的办公室和我⾯谈了⼀个⼩时,期间我向他介绍了⼏
个研究项⽬的想法,希望能从他那⾥得到反馈。他似乎对这些想法很感兴
趣,这让我信⼼倍增,因为我的想法或多或少得到了⼀位研究领域内的教
授的认可。可惜,因为我不再是 MIT 的学⽣,我没有机会和 Rob ⼀起开
展研究。在我们⾯谈的最后,Rob 推荐我和斯坦福计算机系⼀位名叫 Scott
的教授谈⼀谈,看看我有没有机会成功向他推销这些观点。
回到斯坦福后,我给 Scott 发了⼀封冷邮件,请他给我⼀个机会⾯谈。
去⾯谈时,我针对想和他沟通的三个具体的研究思路准备了⼀些笔记,⼤
致格式如下:

1. 问题的定义是什么?

2. 我准备⽤什么⽅法解决?

3. ⽤什么样的实验,才能有说服⼒地证明我的⽅法具有良好的效果?

Rob 的⼀位博⼠学⽣,也是我的朋友,Greg,教会了我其中第三点——
⽤实验指导思考——在提出研究项⽬思路中的重要性。教授们很乐意让⾃
博⼠研磨 21

⼰的名字出现在发表的论⽂上,⽽计算机科学领域的学术论⽂通常需要强
有⼒的实验⽀持才能有机会发表。因此,在提出项⽬的想法时就考虑到实
验设计是⼗分重要的。
尽管我的介绍都没能赢得 Scott 的全⼒⽀持,但他仍然希望可以和我
⼀起开展⼀个和我⼤致研究兴趣相关的研究课题。当时,他是⼀位刚刚来
到斯坦福三年的助理教授(尚未获得终⾝职位),所以他⾮常希望能多多发
表论⽂,早⽇拿到终⾝教职。因为我⾃⼰有奖学⾦,Scott 并不需要⽤⾃⼰
的经费⽀持我,所以对他来说也没有什么顾虑。

Scott 所精通的,是⼀个称为⼈机交互(Human-Computer Interaction,


简称 HCI)的、较为贴近实⽤的⼦领域。和其它⼦领域不同的是,HCI 的
研究⽅法以⼈的需要为核⼼。⼀般来说,HCI 的研究项⽬都是这样完成的:

1. 观察⼈,并弄清楚他们⾯临的真正问题是什么。

2. 设计⼀些创新性的⼯具,以帮助缓解这些问题带来的影响。

3. ⽤实验来评估这些⼯具,以检验它们是否真的可以帮助⼈们解决问
题。

因为我希望创造能提⾼程序开发者⼯作效率的⼯具,Scott 就先建议我
去开发者们真正的⼯作场所,观察他们的⼯作,并借此发现他们真正⾯临
的问题。具体来说,Scott ⾮常好奇为什么现代的软件开发者使⽤多种编
程语⾔,并且严重依赖于在⽹上搜索、并剪贴代码⽚段来完成开发。之前
⼏⼗年的⾼效开发⼯具的研究中,都假设了开发者只⽤⼀种语⾔进⾏开发,
并且认为他们所处的环境中开发者的⽔平⼤致相同,⽽这些假设现在显然
都早就过时了。通过观察现代程序开发者的⽇常活动,也许我就能设计出
更贴合他们需求的新⼯具。
22 第⼆年:整装启程

接到 Scott 给我的定下的⼤致⽬标之后,我就马上着⼿开始寻找可以
让我观察的、专业的软件开发者。因为我刚刚在⾕歌实习,我试过在那⾥
找到⽬标,所以我发邮件给了我实习时的经理,他也同意将我的邮件转发
给其他同事。我很快就收到了⼏封婉拒的邮件,因为没⼈想因为⼀个⾮雇
员看着他们⼯作,⽽惹上知识产权的⿇烦。接着我又给⼀些在斯坦福附近
创业的朋友们发了邮件,但很快就发现他们和⼤公司的程序员⼀样,也收
到种种限制。遗憾的是,他们更难以答应我的请求,因为为了避免竞争者
抄袭,他们需要对⾃⼰的创业项⽬保密。⽽且,他们远⽐⼤公司的开发者
们更加繁忙,所以也不太希望浪费⾃⼰的时间,去帮随便⼀个研究⽣完成
这种对他们没什么帮助的科研项⽬。
我当时最后的希望是去谋智(Mozilla)观察软件开发者⼯作,因为谋
智是⼀个⾮营利性的软件开发组织,他们的产品包括著名的⽕狐(Firefox)
浏览器。因为谋智的软件项⽬都是开放源代码14 的,所以我以为他们应该不
怕会有⼀个局外⼈来观察他们的程序员⼯作。我没有试着发冷邮件(其实
我都不知道应该要给谁发!),我决定直接开车去谋智的总部,直接登门造
访。我冒然和我看到的第⼀个⼈打了招呼,并向他介绍了⾃⼰。他很热⼼
地告诉了我两位谋智⾼层领导的电⼦邮箱,并说明这两位可能会对这样的
研究合作感兴趣。我当天就给两个⼈发了冷邮件,令我感到惊喜的是,其
中⼀位回复称对我的研究很感兴趣。不幸的是,那也是我收到的来⾃他的
最后⼀封邮件;当我请求继续开展研究时,他就再也没有回复我了。
现在反观当时,对于⾃⼰试图在⼯作场所观察别⼈⼯作的尝试以失败
告终,我并不感到奇怪。毕竟,我并不能为那些被我观察的专业程序员带
来任何好处;相反,我只会⼲扰他们的⽇常⼯作。幸运的是,⼏年后,我
有机会观察了⼀组(⾮专业)程序员——为科学研究⽽编写程序的研究⽣

14
开放源代码(Open Source),简称“开源”,是⼀种在⾃由软件开发者中⾮常流⾏的形
式。开发者⾃愿将⾃⼰软件的源代码向其他开发者公开,⽽在⼀定的通⽤协议下(通常被
称为“证书”),其他开发者可以基于这些软件代码进⾏改动和再次开发。开放源代码有助于
⿎励开发者分享⾃⼰的成果,避免重复劳动。当然,尽管软件源代码是开放、可供⼈任意
下载的,有些开源软件也是可以盈利的。
——译者注
博⼠研磨 23

们——的⼯作,他们并不排斥我可能带来的⼩⼩打扰,反⽽⾮常乐于和我
交流他们⼯作环境中的问题。这些访谈的经历,最终激发了我的灵感,并
直接为我的毕业论⽂做出了很⼤贡献。

在寻找专业程序员的路线上碰了南墙,我就决定回头,开始在斯坦福
内部寻找这样的机会了。当我看到⼀张海报,宣传系⾥即将举办⼀年⼀度
的编程竞赛时,我马上给主办者发了⼀封冷邮件。我向他说明了⾃⼰想要
观察学⽣们⽐赛过程的想法,他欣然接受了。
尽管学⽣的编程竞赛对说明现实中的软件开发环境⽽⾔毫⽆代表性,
但总是聊胜于⽆。Scott 的⼀个⽐我⾼⼀年的博⼠学⽣,Joel,也希望来参
加这种观察。Joel 和我把整个周六上午四个⼩时都花费在了观察⼏个学⽣
参加⽐赛这件事情上。我们看到的结果很⽆聊,最终也没能从我们的笔记
中整理出太多有⽤的东西。然⽽,这个经历促使我们产⽣了⼀个想法,那
就是进⾏条件更加可控的实验室研究。
这时,Scott 已经决定让 Joel 和我合作进⾏研究,⼀起开展⼀个实验
室研究,⽽不是分散精⼒在不同的项⽬上。因为 Joel 和我的研究兴趣相似,
Scott 也可以通过让我们合作,减轻⾃⼰管理学⽣的压⼒。Joel 主要负责了
实验室研究的设计,我也同时乐得清闲,因为我同时还在和 Dawson 做另
⼀个课题的研究。
Joel、Scott 和我设计了⼀个时长两个半⼩时的实验室研究,研究中,
⼀名斯坦福的学⽣将会被要求从头开始,编程完成⼀个简单的⽹络聊天应
⽤。他们可以使⽤任何他们想⽤的资源,最主要的就包括在⽹上搜索现成
的代码,或者已有的教程。我们找到了 20 名学⽣参加实验,其中⼤部分来
⾃ Scott 当时在讲授的⼈机交互导论课程的学⽣中。
在接下来的⼏周⾥,Joel 和我在系⾥地下室的机房坐了 50 个⼩时(20
个学⽣,每⼈两个半⼩时),观察参与研究的学⽣,并同时将学⽣使⽤的电
脑屏幕录制下来。⼀开始,观察学⽣如何⼯作⾮常引⼈⼊胜,但好景不长,
24 第⼆年:整装启程

我们很快就发现这个⼯作变得冗长繁杂,⽽且总能看到学⽣们⼀遍又⼀遍
地做同样的操作、犯同样的错误。之后,我们又⼤概花了 50 个⼩时重放我
们录下的视频,并在视频中标记了⼀些关键事件发⽣的时间。最终,我们
分析⾃⼰的笔记,并回放标记好的关键事件,得到了⼀些关于“当这些学⽣
⾯对⼀个简单、但实际⼯作中可能遇到的任务时,会遇到哪些问题”的深⼊
了解。
我们把实验室研究的成果写成了论⽂,并将论⽂提交到了⼀个顶级的
HCI 学术会议。三个⽉后,我们发现论⽂被录⽤了,审稿意见⾮常令⼈振
奋,⽽论⽂甚⾄还被提名了最佳论⽂奖。在这篇论⽂⾥,Joel 是第⼀作者,
⽽我是第⼆作者。⼏乎所有计算机科学领域的论⽂都是由多位作者合作完
成的,⽽作者的顺序也是⾄关重要的。名字出现在⾸位的作者通常是研究
项⽬的负责⼈(⽐如 Joel),他通常在项⽬中完成的部分远多于其他位置
靠后的作者,所以也最应当受到承认。其他的作者通常都是项⽬中的助理
——通常是年轻的学⽣(⽐如我)或者远程的合作者——这些⼈也做出了
⾜够多的贡献,可以被列为作者之⼀。博⼠⽣们通常把⾃⼰的导师(⽐如
Scott)列在最后,因为导师通常会在研究想法形成、项⽬规划和论⽂写作
⽅⾯提供帮助。
因为我不是论⽂的第⼀作者,这篇论⽂也就对我的毕业论⽂没有什么
帮助;然⽽,这个经历教会了我许多关于如何开展研究、以及如何写作学
术论⽂的知识。更重要的是,看到这个研究项⽬最终发表了⼀篇顶级会议
的论⽂,我感到很有成就感——这和我博⼠第⼀年被拒收的 Klee 的论⽂形
成了鲜明的对⽐。
Joel 后来继续沿着这条研究路线⾛了下去,把我们的论⽂转化成了他
博⼠论⽂的第⼀部分。在接下来的⼏年中,针对在⼀开始的实验室研究中
发现的程序开发者们⾯临的困难,他又创造了⼏个能帮助克服这些困难的
⼯具,并发表了论⽂描述这些⼯具的原理。同时,Scott 也没有积极招我⼊
麾下,我也就没有考虑过更换导师的事。当时看来,似乎我和 Joel 的兴趣
太过接近了,⽽且 Joel 已经在他的⼦领域⼩有成就了。所以,我继续将研
博⼠研磨 25

究重点放在和 Dawson ⼀起研究的课题上,毕竟他仍然是我的导师。然⽽


在这⼀边,研究进展就没这么顺利了。

读者可以回忆⼀下,在我博⼠第⼀年接近尾声时,我开始在⼀个被称
为经验化软件质量衡量的⼦领域寻找研究灵感——具体来说,就是通过软
件开发的历史记录,来衡量软件的质量。正好 Dawson 也对这⼀课题感兴
趣,所以在我博⼠第⼆年⾥,我们就继续在这⼀问题上开展研究。他的主
要兴趣还是在于发明像 Klee 这样的⾃动缺陷检测⼯具,但他也在软件质量
⽅⾯有⼀些兴趣。对他⽽⾔,让他感兴趣的研究课题包括:

• 如果给定⼀个⼤型软件项⽬,其中包含上千万⾏代码,如何区分哪些
部分对项⽬⽽⾔更加重要,⽽哪些部分不那么重要?

• 有哪些因素影响了⼀些部分更容易出现软件缺陷?⽐如,是最近刚刚
被新⼿修改过的程序代码更容易包含更多缺陷呢,还是短时间内被很
多⼈修改过的程序更容易出问题?

• 如果⼀个⾃动查找缺陷的⼯具找到了 1000 个可能的问题,哪些会是


其中更重要的呢?程序开发者可能并没有时间和经历处理全部 1000
个缺陷,所以他们必须根据⼀个重要度的评估,来优先完成重要的部
分。

我通过分析和 Linux 系统核⼼这个软件项⽬相关的数据集,开始调查


这些问题。我选择了 Linux 作为研究对象,因为它是当时最⼤且影响最⼴
泛的开源软件项⽬,有数以万计的程序开发者在⼆⼗年间贡献了⼏千万⾏
的程序代码。Linux 完整的版本控制历史能在⽹上免费得到,所以这成为
了我主要的数据来源。项⽬的版本控制历史记录了在项⽬的整个⽣存周
期中,所有代码⽂件中出现过的所有改动,包括改动出现的时间,更重要
的是,改动是谁做出的。为了将这些项⽬历史和软件缺陷对应起来,我从
26 第⼆年:整装启程

Dawson 的软件缺陷检测公司拿到了⼀份数据集,其中包含了公司的⼀个
产品在 Linux 中发现的 2000 个缺陷。当然,这不会是 Linux ⾥所有的缺
陷,但这是我能接触到的数据集中,唯⼀能为我提供了⾜够的信息,来研
究我们的学术问题的了。
那时,我每天的⼯作流程就是写程序来从 Linux 的版本控制历史以及
那 2000 个缺陷报告中提取、和清洗数据15 ,并将它们转化成便于分析的格
式,并进⾏分析。为了能对这些数据有更深层次的认识,我⾃学了量化数
据分析、统计学和⼀些数据可视化的技巧。在研究过程中,我细致地将⾃
⼰的实验进展记录在了⼀本研究笔记中,⽤来记录哪些尝试并没有给我想
要的结果。⼤概每周,我都会和 Dawson ⾯谈⼀次,汇报⾃⼰的研究进展。
我们的会⾯通常是我想他展⽰我从分析中得到的图表或者表格,⽽他则会
提供⼀些较⾼层次的评价,⽐如:“嘿,这张图的这个部分看起来不太对劲。
这是为什么呢?试试这样分割你的数据,并做⼀些更深⼊的分析。”很多年
后,我意识到这其实是⼀种对于很多学术领域中的计算研究者们⽽⾔,再
平常不过的⼯作流程;⽽在我的博⼠论⽂中,我也创造了⼀些⼯具,来消
除这⼀过程中的⼀些效率不⾼的环节。不过那时我还没有这么长远的计划;
我所想的只是做出⼀些有趣的发现,并把他们写成论⽂发表。

Dawson 和我在将我们的成果发表的道路上并⾮⼀帆风顺。在那⼀年
⾥,我们提交了两篇论⽂,最后都以被拒收场。这个研究项⽬后来又经过
了⼀年,才转化成为⼀篇长度较短的、第⼆级学术会议中的论⽂得以发表,
论⽂影响⼒微乎其微,也没有“作数”成为我博⼠论⽂的⼀部分。不过到那
时,我已经不太计较这些了,因为我已经在开展其他研究项⽬了。
15
数据清洗(Data cleansing)在科研项⽬中通常被⼴泛应⽤,尤其是当数据来⾃实际的
项⽬,或数据产⽣、采集的过程没有严格监控时。数据清洗通常包括丢弃数据中对研究没
有帮助的部分,或者丢弃因格式、内容、完整性等问题不能被⽤于研究的“脏数据”。此处
作者应该指前者,即将和研究相关的数据分离出来的过程。——译者注
博⼠研磨 27

我们的论⽂在发表上遇到了这么多障碍,究其原因是因为我们不是经
验化软件质量衡量(有时也被称为经验化软件⼯程)这⼀⼦领域的“圈内⼈”,
⽽我们的论⽂恰恰属于这⼀⼦领域。在我们步⼊这个⽅向之前,已经有⼏
⼗所⼤学的研究⼩组在进⾏类似的研究了。Dawson 和我在这种竞争中完全
处于劣势,因为我们的竞争对⼿包括很多专于此道的教授和科学家,⽽他
们⼿下通常有很多博⼠⽣为他们产⽣研究成果。这些⼈对发表论⽂如饥似
渴,因为他们中很多⼈仍然是年轻的教授,渴望借此得到终⾝职位。他们
也更擅长于⼀些能让论⽂更容易被接收发表的技巧,包括统计⽅法、相关
⽂献的引⽤,以及“营销技巧”等。最重要的是,他们中很多⼈在相关的学术
会议中担当了外部审稿⼈或者程序委员会成员等职务,所以他们很清楚如
果⼀篇论⽂想要被这个领域的学术会议所接收发表,应该需要怎么撰写。
读者可以回忆⼀下,我介绍过每篇论⽂都会由三到五位⾃愿参与的
领域内专家——通常都是领域内的教授或者科研⼯作者——进⾏同⾏评
审16 来决定是否可以发表。如果审稿⼈认为⽂章值得发表,⽂章就会被接收
并发表;否则,作者就需要修改论⽂,之后再重新投稿。同⾏评审的⽬的
在于保证所有被发表的论⽂都有⼀定的质量保障,这⼀保障的⽔平则由学
术圈来决定。这种检阅的机制是必要的,因为总要有⼀些公认的标准,来
过滤掉⼀些不靠谱的⾔论。然⽽,同⾏评审这种制度本⾝存在其缺陷,尽
管它努⼒使得评审结果更加客观,审稿⼈也仍然是⼈,还是不可避免地有
⾃⼰的品味和偏见。
因为学术会议通常只接受不超过百分之⼆⼗的论⽂,如果⼀篇论⽂给
审稿⼈以不好的第⼀印象,可能就会被拒收。Dawson 和我都不是经验化

16
同⾏评审(Peer-review)是⼀种⼴泛⽤于计算机科学学术会议的评审模式,其中参与
审稿的审稿⼈可能是领域内的教授、专家、研究者或在读博⼠⽣(本科⽣和硕⼠⽣较为罕
见),这些⼈可能也是学术会议中的投稿⼈(审稿⼈不能审阅和⾃⼰有利益相关性的——
⽐如⾃⼰撰写的——稿件)。“同⾏(Peer)”⼀词即⽤于强调这种审稿⼈和投稿⼈之间的平
等性。与此不同的是,很多学术期刊采⽤专业审稿⼈审稿的制度,审稿⼈往往是领域内名
⾄实归的教授或者科研⼯作者,⼀般认为他们在领域内的经验、学识等⽐⼀般投稿作者都
略⾼⼀筹。——译者注
28 第⼆年:整装启程

软件度量领域的专家,所以我们并不能以⼀种审稿⼈所期待的⽅式,去“推
销”⾃⼰的论⽂。所以,我们经常因为⼀些负⾯的评审意见受到打击,⽐
如:“结果,我发现我就是对作者展⽰的结果不太信任。我的疑惑来⾃于两
个⽅⾯:⼀⽅⾯我不相信他们对度量⽅法的认知是否合理;另⼀⽅⾯他们
也没有使⽤⼀些有效的统计⽅法验证⾃⼰的成果。”在发表学术论⽂这个残
酷的世界中,仅仅对⼀个课题感兴趣远远不⾜以让⾃⼰的论⽂得以成功发
表;想要⾃⼰的论⽂可以发表,就得⾮常清楚作为论⽂审稿⼈的、⾃⼰领
域中年长的同事们的偏好。简⽽⾔之,我们的数据集没有别⼈的好,技巧
没有别⼈的细致,我们的成果和展⽰⽅式也和这⼀领域中有经验的研究者
所期待的形式似乎格格不⼊。
相⽐⽽⾔,我和 Scott、Joel 发表的论⽂就更加成功,因为 Scott 是
HCI 领域的专家,并且在这⼀领域(尤其是我们发表⽂章的学术会议中)
已经发表和评审了很多论⽂。当然,作为内⾏⼈并不能让审稿⼈在评审我
们的论⽂时,对标准有任何的放松,因为那就太不公平了。但是,Scott 仍
然可以利⽤⾃⼰的经验,让我们的项⽬从动机到成果,都以⼀种审稿⼈所
期待的形式展现出来,从⽽论⽂被接受的概率也⼤⼤上升。

在我博⼠第⼆年接近尾声时(2008 年 6 ⽉),我因为仍然缺乏有说服
⼒的成果,又看到在经验化软件度量领域的论⽂如⾬后春笋般地冒出来,
开始变得越来越沮丧。我仍然没能将⾃⼰的发现发表成论⽂,也意识到⾃
⼰和圈内的⽼⼿根本没法竞争:因为 Dawson 和我都不知道审稿⼈期待看
到的是什么,我开始明⽩继续在这个领域试图发表论⽂,只能是⼀路逆⽔
⾏⾈。又因为发表论⽂是毕业的先决条件,我必须尽快找到⼀个新的项⽬,
否则我就不能拿到⾃⼰的博⼠学位了。在我准备在斯坦福开始⾃⼰博⼠⽣
涯的第三年时,我⾮常绝望,以致不愿放过任何⼀棵能为我带来论⽂发表
的救命稻草。也就是那时,我选择了回到博⼠第⼀年曾经让我痛苦不堪的
项⽬——Klee——当中去。
第三年:噩梦未止

在 2008 年中,我的博⼠第三年拉开帷幕时,我作为项⽬组最年轻的学
⽣,重新回到了 Klee 项⽬中。当时,项⽬⾥只剩下两个⼈了——两位 Klee
的创造者,Dawson 和 Cristi (Cristi 这是已经是他最⾼年级的博⼠⽣了)。
Klee 项⽬组的其他成员都已经离开了这个项⽬。
对于回到项⽬中来,我的⼼情很复杂。⼀⽅⾯,我第⼀年不堪回⾸的
经历让我对项⽬本⾝和项⽬组的⼯作状态都感到抵触。另⼀⽅⾯,Cristi 和
Dawson 都对这个项⽬充满激情,他们也都希望发表更多的跟进论⽂。因为
他们在软件缺陷检测这⼀领域已经⾝经百战,我觉得和他们合作似乎更有
机会能够发表论⽂。我的另⼀个选择,则是继续在我第⼆年开展的经验化
软件度量项⽬上进⾏研究。虽然我仍然对那个项⽬很感兴趣,我清楚地知
道对于我和 Dawson 两个外⾏⼈来说,在那⼀领域发表论⽂并⾮易事。因
为我的⽬标是发表论⽂,取得博⼠学位,我决定收起⾃⼰的⾃尊和⾃⼤,并
重新投⾝于 Klee 项⽬中。我给 Dawson 发了⼀封邮件,说到:“我⼤体的计
划就是与你和 Cristi 合作,尽量⽤ Klee 做出⼀些脚踏实地的研究,争取内
能投稿⼏篇论⽂。我认为对我来说,为学术做出贡献以及每天做出⼀点令
⼈满意的成果的最佳选择,就是尽可能利⽤ Klee,并和你们的研究兴趣以
及⽬标保持⼀致。”

Cristi 和 Dawson 希望我能实验⼀种被称为交叉检测的、运⾏ Klee 的

29
30 第三年:噩梦未⽌

新⽅法,这种⽅法能让 Klee 找到同⼀个软件的不同版本之间的差异。在


接下来的四个⽉中(2008 年 7 ⽉到 10 ⽉),我每天的研磨和我第⼀年⽤
Klee 寻找 Linux 驱动程序缺陷的任务别⽆⼆致,只不过我现在学会了更好
地劳逸结合,让⾃⼰不⾄于过度劳累。但就像我第⼀年的情况⼀样,我在
⽤ Klee 做很多繁重的苦⼯,⽽实质上并没有⽤什么⽅法改进 Klee,以让它
能找到新的软件缺陷。我每天的⼯作就是配置好⼀系列 Klee 的运⾏环境,
⽤ 10 个⼩时运⾏ Klee 让它完成对软件的⼀系列检测,第⼆天早上再来收
集、分析、可视化、并弄明⽩结果的含义,对 Klee 的设置进⾏适当的调整,
然后再开始新的⼀轮 10 ⼩时的实验。
就像很多复杂的软件⼯具⼀样,Klee 有很多可以设置的选项。⽽因为
它是⼀个由很多学⽣合作完成的⽤于学术研究的原型系统,它的选项中有
很多都没有清晰的⽂档说明其功能。这就导致我因为误解了⼀些选项间
复杂的相互作⽤,进⽽浪费了很多时间在调整这些选项上⾯。当时我的研
究笔记上随处可见这样的脏话:“妈的,我觉得我的问题是没发现 Klee 需
要某些调⽤参数(⽐如-emit-all-errors),⽽⽬标程序也需要⼀些参数(⽐
如-sym-args),如果把这些搞混了,你也不知道会发⽣什么,因为 Klee 在
运⾏⽬标程序时采⽤的参数列表和你想象的不⼀样!”
在那⼏个⽉间,Cristi 和 Dawson 时不时地提起他们想提交⼀篇关于
Klee 交叉检测的论⽂,所以我对于这个看似具体的⽬标充满动⼒。在我⼯
作的同时,我完成了⼀篇论⽂的初稿,并在⾥⾯填上了我的实验结果和⼀
些笔记。然⽽,令我惊讶的是,Christi 和 Dawson 似乎都不急于完善这篇
论⽂并让它得以发表。我当时还做不到在没有他们帮助的情况下,在这⼀
领域发表⼀篇像样的论⽂,因为我还只是⼀个帮忙完成苦⼯的研究助理:
真正的研究意义以及有说服⼒的“营销”仍然离不开他们。后来,我们完全没
有提交论⽂,所以我四个⽉的⼯作再⼀次付诸东流,就像我第⼀年在 Klee
上的研磨⼀样。
因为我⾃⼰对领域内的技术不够精通,加之缺乏年长的同事的指导,
这个项⽬很快就流产了。尽管 Cristi 在指导我交叉检测的思路、以及调试
博⼠研磨 31

Klee 的各种奇怪问题时⼗分耐⼼,但可以看出他的精⼒并没有完全投⼊在
这个项⽬上。因为当时他已经即将完成博⼠学习了,他的主要精⼒都⽤在
了申请助理教授职位上。教学职位的申请通常需要花费⼏个⽉的时间,投
⼊⼗⾜的精⼒准备,⽽尽管这样也仍然有很多申请者⽆法获得职位。每年,
每所⼤学的院系⾄多会招收⼀到两名新的终⾝制导向17 的新教授,⽽上百
位能⼒超群的⾼年级博⼠⽣、博⼠后(博⼠毕业后暂时留在实验室进⾏研
究的学者)、以及从事研究的学者会竞争这些令⼈垂涎的空缺。申请学术职
位是⼀种充满压⼒、耗尽⼀个⼈所有时间和精⼒的过程。所以,Cristi 并
没有动⼒花⼏百个⼩时的时间再去投稿⼀篇论⽂,因为就算论⽂被接收了,
对于他的职位申请⽽⾔也已经太晚了。
事后回想,我能明⽩这个项⽬因为参与者动机不同注定失败,⽽当时
的我却缺乏预知这种失败的智慧。我当时只是单纯地想要和年长的博⼠⽣
以及富有经验的教授⼀起在他们熟知的领域发表论⽂,才回到了 Klee 项⽬
中和 Cristi、Dawson ⼀起合作。我之所以这么打算,是因为同样的策略在
前⼀年收效显著,我帮助 Joel(年长的博⼠⽣)和 Scott(富有经验的教授)
完成了他们的 HCI 项⽬,⽽那个项⽬最终让我们发表了⼀篇在⼀流学术会
议中被提名最佳论⽂奖的论⽂。
这边的状况又有什么不同呢?简⽽⾔之,Cristi 和 Dawson 都没有发表
论⽂的渴望。此前,他们已经⼀起发表了很多篇 Klee 相关的论⽂,⽽和我
⼀起完成⼀篇交叉检测的论⽂,对他们⽽⾔是“锦上添花”,但绝⾮雪中送
炭。Cristi 已经是博⼠最后⼀年了,所以并不需要再发表任何新论⽂就可以
毕业了;Dawson 已经获得了全职职位,所以他也不急于发表论⽂。相⽐⽽
⾔,Joel 当时正处于博⼠⽣涯的中段,急需发表⽤于博⼠论⽂的第⼀篇论
⽂;⽽ Scott 还是助理教授,他需要发表⾜够多的论⽂才能获得终⾝职位。
这两次结果完全不同的经历让我明⽩了,在和可能的合作者合作研究之前,
深⼊了解他们对项⽬的动⼒和动机的重要性。
17
终⾝制导向教授(Tenure-track professor)职位是区别于研究导向教授(Research
professor)职位的⼀种称呼,后者和学校的⼯作合同通常是任意性(at-will)的,相应也
不需完成教学的任务。只有终⾝制导向的助理教授才有机会获得终⾝职位。——译者注
32 第三年:噩梦未⽌

因为 Cristi 在忙于申请教职,交叉检测的项⽬完全没有进展,我决定
⾃⼰起头,试图完成⼀个和 Klee 相关的项⽬,⽽不再继续作为交叉检测的
实验助⼿。和 Dawson 讨论之后,他建议我试着改进⼀下 Klee 的核⼼组件
——它的搜索算法。Klee 通过在软件的可执⾏代码中像搜索“迷宫”⼀样查
找软件缺陷,所以改进搜索算法可能能让 Klee 找到更多的缺陷。
这是第⼀次,我开始在 Klee 上进⾏创新——改进其搜索算法——⽽不
是为了⽤ Klee 找到软件⾥的缺陷⽽做苦⼯。对于衡量我的⼯作的有效性⽽
⾔,⼀种办法是测试 Klee 在⼀系列测试软件程序中的覆盖率(即测试 Klee
的搜索算法能覆盖代码迷宫中多⼤的部分)。Dawson 的⽬标很简单:取得
⼀个⽐最近⼀篇 Klee 论⽂中报告的结果更⾼的覆盖率。当时,在 89 个测
试程序上,Klee 已经能达到 91% 的覆盖率了(完美覆盖是 100%),⽽我的
任务就是尽可能提升这⼀⽐率。每天,我都会尝试修改⼀下搜索算法,然
后在 89 个测试程序上运⾏⼀遍(⼤概需要⼗⼩时的时间),然后第⼆天早
上再查看覆盖率的数据,然后再改动程序、运⾏测试,如此往复。
这时已经是我博⼠第三年的⼀半了,我和很多同期的同学⼀样,都陷
⼊了⼀种“炼狱”般的状态,我们都不太会每天到办公室⼯作了。我们还因
为⾃⼰所研磨的问题⾮常抽象和过分专业⽽饱受孤独的折磨,因为我们研
究的问题可能除了我们之外很少有⼈理解或者感兴趣。我们的导师和⾼年
级同事会给出⼀些较⾼层⾯的建议,但他们⼏乎从不坐下来和我们⼀起仔
细研究项⽬中每⼀个恼⼈的细节。
和我们在公司上班的朝九晚五的同学们不同的是,我们没有马上做出
任何实物的压⼒——我们没有项⽬截⽌⽇期的催促,也没有中层管理⼈员
需要取悦。对于系⾥⼤部分学⽣⽽⾔,他们偶尔休息⼀天其实并没有⼈会
在意,所以以此类推,为什么不⼲脆休息两天、休息⼀周,甚⾄休息⼀个
⽉呢?所以,博⼠⽣在第三年左右退出博⼠项⽬并不是什么应该令⼈惊讶
的事情。
博⼠研磨 33

为了防⽌拖延症,我不知疲倦地⼯作,逼⾃⼰保持⾃律,并保持⼯作
⽇规律地⼯作。我试着对⾃⼰进⾏“微观管理”,每天给⾃⼰制定较⼩、容
易完成的⽬标来激励⾃⼰,期望着最终能收获⼀个积极的结果。但结果是,
因为很难看到⾃⼰每天的进展,我很难保持⾃⼰在⼯作中充满动⼒。
只有⾃律是不够的——在三个⽉的对 Klee 搜索算法的调试之后,我仍
然没有得到任何令⼈振奋的结果。因为 Klee 在我们的测试程序上已经达到
了 91% 的覆盖率,把这个数字仅仅提⾼⼏个百分点,⽐如到 94%,都极
其困难。雪上加霜的是,这些微乎其微的进展写在论⽂⾥也不会引⼈注⽬。
我们的论⽂主旨⽤⼀句话来说将是:“我们以某种⽅式改进了 Klee 的搜索
算法,使得它的平均覆盖率从 91% 提升到了 94%。”这种成果在审稿⼈眼中
很难谈得上令⼈激动,甚⾄可能连有趣都谈不上;这只是⼀种常见的、⽆
趣的在已有的项⽬上进⾏的增量式的⼯作。不出意外,Dawson 也并没有兴
趣投稿这样的⼀篇⽆趣的论⽂。
如果我当时能⽤⼀种更有趣且有效的⽅法改进 Klee 的搜索算法,可能
Dawson 会更感兴趣投稿这样⼀篇论⽂。然⽽在 2009 年 1 ⽉,我经过三个
⽉的研磨徒劳⽆果后,我开始觉得⾃⼰⽇复⼀⽇的缓慢努⼒永远不可能达
到⼀个符合 Dawson 期待的突破性进展。我不喜欢被称作⼀个经常放弃的
⼈,但我意识到 Klee 搜索算法这个项⽬只有死路⼀条,所以我还是放弃了。
现在回想当初,我在⼀个悲剧性的事实中找到了对当时选择的宽慰:
在我离开 Klee 搜索算法的项⽬之后,Dawson 的博⼠⽣中有两个⼈先后对
这个问题展开了研究,结果两个⼈都没能在过去的三年中就这⼀问题发表
任何论⽂。我并不觉得⾃⼰能⽐那两个学⽣做的更好,所以如果我继续在
那个课题上努⼒,可能我也会像这样卡在⼀个长达三年的炼狱之中。

尽管在 Klee 项⽬上屡战屡败,我还是想要在它上⾯做出⼀点成果,毕


竟这是 Dawson 当时唯⼀关⼼的项⽬。我开始讨厌 Klee 了,但因为我已经
在这个项⽬上消耗了上千⼩时的时间,我希望能最终收获⼀些实质的成果
34 第三年:噩梦未⽌

来证明⾃⼰的努⼒没有付诸东流。这时已经是我博⼠第三年的⼀半,我⾮
常急于发表⼀篇第⼀作者的论⽂作为我博⼠论⽂的⼀部分;我开始感到⾃
⼰有些落后于⾝边的同学们,因为他们中有些⼈已经发表了⾃⼰第⼀篇可
以贡献于博⼠论⽂的学术论⽂。我天真地以为 Klee 是我通往博⼠学位道路
上“阻⼒最⼩的⽅向”,因为它和我导师的研究兴趣⽐较贴合。
这时,⼀个名叫 Peter 的第⼀年的博⼠⽣加⼊了 Dawson 的实验室,并
且在寻找研究项⽬。我和 Dawson 商量了⼀下和 Peter 合作的事情,考虑是
两个⼈⼀起⼯作可能能⽐我⼀个⼈更容易做出较好的成果。Dawson 对此表
⽰赞同,并建议 Peter 和我⼀起在 Klee 中重新实现约束下运⾏的功能(简
称“Klee-UC”)
。读者可能还记得,在我博⼠第⼀年时,Dawson 和他的另⼀
位博⼠⽣⼀起实现了第⼀个版本的 Klee-UC。他们做出了⼀份粗略的初稿,
投稿了⼀篇在三天之内粗制滥造出来的论⽂(我仍然清晰地记得当时的惨
痛教训)
,⽽在那个学⽣从博⼠项⽬中退学之后不久,项⽬也就停滞了。所
以,两年之后的现在,轮到 Peter 和我来重新实现这个想法,并尽量让它能
够做出⾜够好的成果发表⼀篇论⽂了。
我带着我能⿎起的所有勇⽓和乐观精神接受了这个新任务,并努⼒忘
掉我和 Klee 并不愉快的过去。我对⾃⼰说,如果我能发表 Klee 相关的论
⽂,那⼀定就是这个 Klee-UC 的项⽬没错了。我全⼼全意地相信 Dawson
的 Klee-UC 创意在学术研究的⾓度看来是新颖有趣的,所以如果 Peter 和
我能够⾜够努⼒实现它,并⽤它找到⼀些更加重要的软件缺陷,我们就能
发表⼀篇很好的论⽂。⽽且,我还可以重复利⽤我之前在 Linux 驱动程序
的实验中⼤部分的程序和设置。然后,我还幻想着⼀篇关于 Klee-UC 的很
好的论⽂可以⼀扫之前我在 Klee 上⼏千⼩时苦⼯的阴霾,让我扬眉吐⽓。
毕竟,还是我博⼠第⼀年⽤ Klee 查找 Linux 驱动程序缺陷时的经历,让
Dawson 想到了 Klee-UC 这个点⼦。这样的话,如果我能以第⼀作者⾝份
完成这篇论⽂,把想法变成现实,也算是⼀个合情合理的交代(在我所在
的领域,尽管有时候研究想法是教授产⽣的,他们也会让⾃⼰的学⽣作为
论⽂的第⼀作者)。我甚⾄期待这个项⽬会成为我博⼠论⽂的第⼀部分,并
博⼠研磨 35

从此为我最终博⼠毕业扫清障碍。
在接下来的两个⽉之间(2009 年 2 ⽉到 3 ⽉),Peter 和我全⼼全意地
投⼊到了变成实现 Klee-UC 之中。我们每天⼀起在办公室编程,过程⼗分
有趣;这对于很多博⼠⽣所过的孤独的⽣活⽽⾔是⼀个很好的调剂。然⽽
不久之后,Dawson 似乎就开始对我们缓慢的进展感到不满。Peter 和我都
认为我们的进展还算不错,但是 Dawson 似乎对我们的⼯作很不满意,所
以他很快就打消了写⼀篇论⽂赶在下⼀个截⽌⽇期之前提交的打算。
当时,我完全不理解 Dawson 为什么对我们如此缺乏耐⼼,但现在我
能完全理解他当初的感受了。他当时⼼中有⼀个⼗分清晰的 Klee-UC 的想
法,并且希望⼏个有天分、并且勤奋努⼒的研究⽣能把他的想法变成现实。
如果 Dawson 仍然是⼀个博⼠⽣,他肯定⽤不了⼏个⽉就能让 Klee-UC 正
常⼯作,然后⾃⼰单打独⽃就能写出⼀篇顶级论⽂。当他还是个学⽣的时
候,他的发表⽂章的记录就已经⾮常惊⼈了,也正是因此,他才能得到像
斯坦福这样的顶尖⼤学的教授职位。然⽽,现在他需要完成⼀些教授需要
完成的任务,⽐如教学、论⽂/程序委员会⼯作、论⽂审稿等等,所以他不
能再像之前⼀样投⼊上千⼩时,专注于把⼀个想法变成⼀篇可以发表的论
⽂了。就像所有劳⼒密集型的研究领域的教授⼀样,Dawson 需要⼀些学⽣
的帮助才能把他的想法变成现实。
我认为 Dawson 期望 Peter 和我能⽐实际进展更快得到能⽤于论⽂发
表的成果,所以对于他来说,我们似乎对于给我们的任务不是能⼒不⾜,就
是不够⽤⼼。作为⼀个顶尖⼤学的教授⽽⾔,Dawson 所有的学⽣恐怕都不
如博⼠时代的他⾃⼰有能⼒,这着实是⼀个不幸的事实。⽽这⼀事实的原
因很简单:在顶尖⼤学的博⼠毕业⽣中,⼤概 75 个学⽣中只有⼀个能有幸
在斯坦福这样的⼤学任教(⽽对于普通⼤学的博⼠毕业⽣中这个数字可能
是 200 ⽐ 1)。所以其实并不出乎意料的是,Peter 和我都不是这样出类拔
萃的⼈才。如果 Dawson 能和他⾃⼰的年轻版的克隆⼈⼀起研究,估计研
究进展会快很多!
尽管 Peter 和我在那两个⽉中在这个项⽬中投⼊了很多精⼒,但我们
36 第三年:噩梦未⽌

能清楚地意识到 Dawson 对我们并不满意。Peter 对此感到很失望,于是他


之后更换了导师,并最终从博⼠项⽬中退学了。我的合作者离开之后,我
对 Klee 的最后⼀丝幻想也随之破灭,所以我也很快离开了 Klee 项⽬,⽽
且再也没回来过。

Peter 和我离开 Klee 项⽬的两年之后,Dawson 终于找到了⼀个博⼠


⽣,可以帮助他把他 Klee-UC 的想法最终变成现实。2011 年,Dawson 和
这位新学⽣发表了⼀篇⾮常优秀的论⽂,其中包含了 Klee-UC 和交叉检测
的思想。最终,通过四个博⼠⽣长达五年的努⼒,Dawson 的 Klee-UC 的想
法终于变成了⼀个可以发表论⽂的研究项⽬。在这四个学⽣中,只有⼀个
“幸存”了下来——我离开了 Klee 项⽬组,另外两个博⼠⽣则直接退学了。
从每个学⽣的⾓度看来,成功的概率实在是过分渺茫了。
然⽽,从⼀个教授的⾓度来说,Klee-UC 是⼀个令⼈激动的成功!因为
Dawson 已经获得了终⾝职位,所以他的⼯作并没有什么风险。事实上,终
⾝教授制的主要意义之⼀就在于,获得终⾝教职之后,教授们就可以有机
会尝试更加⼤胆的项⽬思路。不过,这个制度的阴暗⾯就是,往往教授们会
让学⽣去风险较⼤的项⽬上研磨,⽽这些项⽬的成功率往往并不⾼。学⽣
也并不能拒绝教授的要求,因为他们都是由导师的科研经费⽀持的。幸运
的是,我有外源奖学⾦的赞助,所以对我来说离开 Klee 项⽬要容易很多。
我并⽆意专门把 Dawson 和 Klee 拿出来,作为批评的典型。在⼤多数
劳⼒密集型的科学与⼯程学的研究领域中,这种在终⾝教授和博⼠⽣之间
学术动机的鸿沟都是普遍存在的。通常的情况都是,⾸先,教授获得⼀些
研究经费,并产⽣⼀系列⾼瞻远瞩的研究思路(⽐如 Klee-UC 或者交叉检
测)。然后,教授⽤研究经费将⼀些学⽣招⼊麾下,指导他们实现⾃⼰的研
究思路,通常(但并不⼀定)作为这些学⽣的毕业论⽂的主要⼯作。离开
了这些上千⼩时的学⽣的⼯作时间,这些研究思路永远不可能转化为现实
的成果,更遑论发表论⽂了。
博⼠研磨 37

有时,教授们可能需要经历好⼏届的学⽣在项⽬上的失败甚⾄退学,
直到某⼀届学⽣最终将项⽬引向成功。这⼀过程有时需要两年,有时需要
五年,有时甚⾄需要⼗年的时间。很多项⽬常常持续的时间都超过了博⼠
⽣的“⽣命周期”。但只要最终这些项⽬的想法得到实现并形成论⽂得以发
表,项⽬就算是成功了。教授对此感到很满意,院系也感到很满意,出资
资助研究项⽬的机构也表⽰满意,最终将项⽬引向成功的学⽣也会感到满
意。但在这之前,⼀路上“伤亡”的学⽣呢?终⾝教授通常可以接受⼏年的损
失在临时的失败上,但对⼀个博⼠⽣来说,这⼀系列的失望可能导致的是
学术事业夭折在萌芽中,甚⾄⼼理健康都可能岌岌可危。

2009 年 5 ⽉,在我博⼠第三年接近尾声的时候,我参加了 Cristi 的论


⽂答辩。论⽂答辩是博⼠⽣获得博⼠学位之前最终的“神圣仪式”:博⼠⽣就
⾃⼰博⼠期间和博⼠论⽂相关的研究做出⼀个⼀⼩时的⼜头汇报,并需要
回答⼀个教授⼩组提出的尖锐的问题。Dawson 通常都很安静和内敛,⽽这
次当他向观众介绍 Cristi、并激动地说到和他⼀起合作创造出 Klee 是⼀段
令⼈愉快的时光时,他脸上的骄傲和⾃豪清晰可见。他对 Cristi 的夸奖并
⾮空⽳来风:Cristi 在博⼠阶段的⼯作⽆可指摘,⽽且他在 Klee 中发展出
的思想,创⽴了软件缺陷检测领域中的⼀个新的⼦研究领域(称作混合式
实际/符号化程序运⾏)。
看过 Cristi 的论⽂答辩展⽰之后,我更清晰地意识到⾃⼰⼏乎不可能
从 Klee 中继续做出⼀整个博⼠论⽂的⼯作了,这也进⼀步增强了我离开
Klee 项⽬的决⼼。Cristi 闪耀的成功,让 Dawson 年轻的学⽣们发表论⽂
和最终毕业变得更加困难了。从⽆到有的 Klee 的创造的⼯作已经完成;所
剩下的⼤多是在此基础上⼀些添加和改进,或是将 Klee 应⽤在⼀些新的软
件上,⽐如 Linux 驱动程序软件。尽管这些⼯作也可以最终成为可以发表
的论⽂,甚⾄成为博⼠论⽂的⼀部分,Dawson 已经不像其它刚刚进⼊我们
研究领域的竞争者⼀样急于发表论⽂了。
38 第三年:噩梦未⽌

因为 Klee(以及⼀些 2005 年到 2008 年的相关项⽬)创建了⼀个全新


的⼦领域,很多助理教授和年轻的学者很快就加⼊到了这个⼤潮中,并迅
速发表了很多篇论⽂描述针对这些项⽬的改进,以期获得终⾝教职或者职
位晋升。这就像⼀个学术圈的淘⾦潮,⽽ Cristi、Dawson 以及其它⼀些少
数的先驱者引领了这个潮流。因为 Dawson 已经获得了终⾝教职,并创造
了包括 Klee 在内的很多著名的项⽬,他并不需要随波逐流,也没有强烈的
欲望发表很多论⽂来填满⾃⼰的简历了。
这⼀现象的结果是,和那些年轻的研究者⼀起开展研究的博⼠⽣更容
易发表论⽂并取得博⼠学位,⽽与此同时 Dawson 的学⽣似乎都没那么顺
利。在我离开 Klee 项⽬后的三年中,来⾃世界各地的很多研究⼩组发表了
上百篇和 Klee 思路类似的论⽂。令⼈欣慰的是,其中有 15 篇论⽂描述了
对 Klee 本⾝的改进——作为我们开放 Klee 源代码,以促进这⽅⾯研究进
展的结果。同时,Dawson 的博⼠⽣中有五位在 Klee 上下过苦⼯;⽽到⽬
前为⽌,只有⼀位成功地发表了⼀篇论⽂(即 Klee-UC)。
让然觉得讽刺和不幸的是,现在作为学术会议程序委员会成员和论⽂
审稿⼈的都是 Dawson 的直接竞争者,尽管他参与创⽴了这⼀研究领域,他
⾃⼰的论⽂也更难以得到发表了。因为 Dawson 已经有⼏年没有积极发表
论⽂了,他已经对于发表论⽂所需要的修辞技巧、新诞⽣的术语、以及符合
审稿⼈⼜味的⼀些“营销技巧”有些⽣疏,所以在顶级会议发表论⽂已经变
得困难了。此外,他的竞争者们发表越多的⽂章,审稿⼈对论⽂的要求也
就越加苛刻,他和他的学⽣在发表论⽂时也就越需要说明⾃⼰研究思路的
与这些论⽂的区别与联系,最终导致他们的论⽂更容易被拒收,收获更多
令⼈失望的结果。这很讽刺,因为归根结底,如果不是因为⼗年前 Dawson
的远见,这些挑剔的审稿⼈根本不可能在这⼀领域开展研究,更别说拒收
他的论⽂了!
我考虑了⼀下,留在 Klee 项⽬中唯⼀的优势就只剩下 Dawson 发⾃内
⼼热爱这个项⽬了。尽管可能我最后不能在这个项⽬上发表论⽂,也许他
也能最终给我⼀个“怜悯毕业”。但因为我之前在 Klee 上的经历并不顺利,
博⼠研磨 39

我没有勇⽓在 Klee 上再研磨不知道多少年的时间,仅仅指望⼀个“怜悯毕


业”的结果。
这时,我已经度过了我博⼠⽣涯三年的时光,但仍然对我最终要怎么
完成⼀篇博⼠论⽂毫⽆概念。我对未来没有什么计划,但我清楚地知道,⾃
⼰肯定不可能再回到 Klee 项⽬中来了。
40 第三年:噩梦未⽌
插曲

我博⼠第三年结束后,我马上就动⾝去了华盛顿州的西雅图,去那⾥
的微软研究院总部实习。那个夏天成了我⽣命中最有趣和最有成效的夏天
之⼀:我实习时参加的研究项⽬让我发表了三篇顶级论⽂,⽽且更重要的
是,这个项⽬为我的博⼠论⽂奠定了基⽯。
现在,微软研究院已经是⼀个进⾏⾼⽔平学术研究的企业研究所了。
在更多的公司中,研究所往往将精⼒投⼊在研发⼯程中,以期改善公司即
将推出的产品。然⽽,微软研究院(简称 MSR)的主要任务则是进⾏科学
与⼯程⽅⾯的基础科研,并以在相关领域发表顶尖学术论⽂作为⽬标。
如果做⽐喻的话,MSR 可能最像是⼀个没有学⽣的、巨⼤的研究型⼤
学。全职的研究员就像这⾥的教授,⽽区别是他们并没有教学或者指导学
⽣的义务,所以他们可以将⾃⼰的⼏乎全部精⼒投⼊到研究当中。可能他
们最享受的职业优势,则是不需要去申请科研经费,⽽对教授们来说这是
⼀种周⽽复始、极其消耗时间精⼒的⼯作。因为微软已经是⼀个利润可观
的公司,所以它可以每年将成百上千万美元的盈利⽤于⽀持学术研究(发
表论⽂)
。微软的打算是,由其麾下的研究员研发的⼀些知识产权可能作为
新产品灵感的来源,⽽且它也希望能拥有计算机科学界最顶尖的研究者能
作为⾃⼰的顾问。正因为如此,微软公司给予了研究者们所有他们所需的
资源,让他们完成最好的学术研究。
在 MSR 获得全职研究员的难度不亚于在⼀个知名⼤学获得教职的难
度。尽管技术上来说 MSR 的研究员们并没有终⾝职位,他们的⼯作保障很

41
42 插曲

优越,只要他们能保证不断发表学术论⽂。因为在计算机科学领域,很多
研究领域都是劳⼒密集型的,所以研究员们经常招募博⼠⽣作为暑期实习
⽣,帮他们完成⾃⼰的研究计划。这对于双⽅来说都是个不错的交易:研
究员们可以请博⼠⽣们来帮助处理⼀些研究中的苦⼯,⽽博⼠⽣们同时也
能有机会和学校以外的著名研究者⼀起,发表顶级的学术论⽂,甚⾄之后
得到⼯作的推荐信。在过去的⼗年间,计算机科学领域顶级学术会议的论
⽂中,有相当⼀部分都是由 MSR 的研究员和他们的实习⽣完成的。
当初夏我抵达 MSR 总部时,整个地⽅都充满了活⼒,有上百位博⼠
⽣在和他们的经理会⾯,并准备开展⼯作。因为我们只能在那⾥实习三个
⽉,我们的经历都为我们精⼼策划了研究项⽬,以期在实习结束时能发表
论⽂。我们中的⼤部分⼈都能⽤⾃⼰暑期实习的⼯作投稿⼀篇论⽂,⽽其
中⼀部分最终能够得到发表。当然,学术研究本⾝是有风险的,所以也有
⼀些实习⽣被分配到的项⽬并不能产⽣可以发表的论⽂。尽管如此,⼏乎
每个⼈都很享受在这⾥的时间——我们的⼯资⽐平时在学校的津贴⼏乎翻
了两番,微软还会组织有趣的出游活动增进⼤家的交流,我们还有机会聆
听由⼀流的学者做出的激动⼈⼼的学术讲座。
可能 MSR 实习带来的最深远的影响,就是我们在实习中形成的友谊。
在那个夏天,我有幸结识了⼀些我同辈中最聪明、最充满灵感的年轻的计
算机科学家。⽐如,和我同⼀个办公室的三位实习⽣之⼀的⼀位⼥⽣即将
开始她在 MIT 的博⼠项⽬,⽽她在本科学习期间发表的顶级论⽂可能已
经超过了⼤多数博⼠⽣在博⼠期间所能发表的数量。另外⼀位是来⾃加州
⼤学伯克利分校的博⼠⽣,在⼯作⽇⽩天的实习⼯作之外,他还将每天晚
上和周末都⽤于有全国各地的合作者参与的另⼀个研究项⽬。他们都很可
能将来成为获得诸多荣誉的教授、研究领袖、或是⾼科技⾏业的创业新秀,
所以我感到⾮常荣幸能和这些⼈共事了⼀个夏天。

关于我如何获得进⼊ MSR 实习的机会,这个过程则是⼀个对充分结


博⼠研磨 43

合⾃⼰的研究成果、并积极发展专业内的⼈际关系,其重要性的明证。很
多博⼠⽣都会通过某种⼈际关系获得实习机会(以及之后的全职⼯作)
,⽽
我也不例外。
在我博⼠第⼆年,和 Scott、Joel 在他们的 HCI 项⽬上开展研究时,就
申请过⼀次 MSR 的实习。我通过常规渠道申请,在⽹上递交了⾃⼰的简
历,但我的申请很快就被拒绝了,因为实习岗位被发表论⽂更多、且通常
有更多内部⼈际关系的博⼠⽣们占去了。
⼀年之后,在我博⼠第三年,⼀位 MSR 的研究员注意到了我和 Scott、
Joel 合作的 HCI 项⽬(论⽂发表在⼀个该领域的学术会议上),所以他给
我发了⼀封电⼦邮件,问我是否有兴趣在⼀个⼤致相关的项⽬上,跟着他
做实习。他专门找到了我,是因为在我 MIT 本科的时候,我的研究导师曾
经将我介绍给他过,所以他对上了号。
我对他的邀请深感荣幸,但我回复了他我已经不在 HCI ⽅向做研究
了;那时,我已经回到了 Klee 项⽬中,继续进⾏着软件缺陷检测的研究。
不过,我表达了⾃⼰对去 MSR 开展经验化软件质量度量课题的强烈兴趣,
因为我博⼠第⼆年都在和 Dawson 做这类的⼯作。他马上就把我的邮件转
发给了他的同事 Tom,⽽ Tom 是经验化软件度量领域正在冉冉升起的新
星。通过邮件简单地⾃我介绍之后,我将⾃⼰和 Dawson 撰写的关于 Linux
缺陷报告度量的论⽂发给了 Tom。Tom 很喜欢我的论⽂,于是便决定招聘
我作为他的实习⽣。在我博⼠第⼆年中我曾经读过好⼏篇 Tom 的学术论
⽂,所以我对于他招募我为他⼯作,感到⼗分激动。
如果我只是像上百位其他申请者⼀样,盲⽬地在⽹上递交⾃⼰的申请,
可能我永远也没机会吸引 Tom 的注意。很多其他的实习⽣也是通过某种
⼈际关系得到实习职位的,不过对他们⽽⾔,可能是导师直接将他们推荐
给了在 MSR 研究⽅向相关的学者。有趣的是,不是 Dawson,⽽是我本科
⼀位研究导师(我们的项⽬⼤概是在六年前)为我提供了这种我当时亟需
的⼈际关系。这位导师后来还为我的第⼀份全职⼯作,介绍了⼀位关键的
44 插曲

⼈18 。从这个经历,我明⽩了被有影响⼒的⼈推荐的重要性;在⼀个充满挑
战的领域,仅仅做得好是远远不够的。

Tom 在较⾼层次上为我的实习研究制定了计划,并⿎励我完成⼀个可
以实现但雄⼼勃勃的⽬标——在夏天结束之前投稿⼀篇顶级学术会议的论
⽂。我的项⽬是使⽤量化的⽅法研究在软件缺陷报告⽣成之后,缺陷被修
复,被分配给其它开发者,或者被认为已经修复、然⽽后来发现还有问题
等,这些现象中背后的⼈为因素。为了深⼊研究这个问题,我需要写程序
分析软件缺陷数据库,并对⽐微软内部的员⼯个⼈信息。我当时⾮常擅长
做这类的数据挖掘和分析的⼯作,因为我整个博⼠第⼆年都在和 Dawson
⼀起,就 Linux 的缺陷报告和版本控制历史数据做着类似的分析。
每天下午五点,Tom 在下班之前都会来看看我的进展。尽管每天的进
度检查可能让⼈压⼒很⼤,但实际上我发现这些进度检查⾮常有帮助,因
为 Tom 态度和蔼,对我的⼯作也并不抱有批判的态度。每天都能得到及时
的反馈,让我能保证专⼼在⼯作上,也更有⼯作的动⼒。这种确定、短期
的⽬标和持续、有效的反馈的组合,使得我实习期间的⼯作⽇⽐之前三年
博⼠⽣涯中任何⼀段时间都更加⾼效。最让我开⼼的是,我每天只在正常
的⼯作时间⼯作(早九点到晚六点)。我并不能将⼯作带回住处,因为我需
要的数据都只能从微软内部才能访问,所以我每天晚上都有机会出去放松,
⽽不需要担⼼⾃⼰是不是要做更多的⼯作;⽽在学校时,我常常在担⼼⾃
⼰是不是⼯作得够多,因为⼏乎醒着的每⼀分每⼀秒我都能⼯作。
由于 Tom 发表过也评审过很多软件度量⽅向的论⽂,他是绝对的“局
内⼈”,他知道什么样的结果和写作⽅式在这⼀⼦领域更受欢迎。在夏天结
束、我们提交论⽂的时候,Tom ⾮常熟练地在相关研究的基础之上说明了
我们研究⼯作的贡献,阐明了我们论⽂的结果新颖、有影响⼒的原因,并
18
原⽂是 “provide a crucial introduction’’,也可能是指介绍了⼀个机构/组织等,但从
上下⽂⽆从推断。这⾥译者采⽤了更符合中⽂语⾔习惯的翻译。——译者注
博⼠研磨 45

尽量完善了论⽂的叙述。三个⽉后,我就听说了我们研究软件缺陷修复的
论⽂被⼀个顶级会议收录的好消息,⽽那年这个会议的收录率只有 14%。
但 Tom 没有就此收⼿!因为他刚刚⼊职 MSR 不久,他⾮常渴望能够
发表更多的跟进论⽂,以建⽴⾃⼰在公司的名望。在接下来的⼏年中,我们
⽤我 2009 年暑期实习时得到的实验结果又发表了两篇顶级会议的论⽂,⼀
篇是关于缺陷报告负责⼈变更的,另⼀篇是关于缺陷报告重新开放的(这
篇论⽂获得了最佳论⽂奖)。

我在 MSR 和 Tom 开展经验化软件度量研究所收获的成功(发表了三


篇顶级论⽂)
,对我来说是⼀个令⼈满意的拯救——将我救出了博⼠第⼆年
在这⼀领域失败的低⾕(投稿了两篇论⽂被拒,最后只发表了⼀篇次级会
议的短⽂)。因为我在这两次截然不同的经验之间并不是变得聪明了很多,
我将我实习项⽬的成功归功于两个因素:微软和 Tom。
⾸先,作为⼀个 MSR 的实习⽣,我可以访问到包含微软软件缺陷和
⼈员资料在内的⼤量内部数据。如果是作为外部⼈员,我是永远不可能获
得这些数据的访问权限的。MSR 所拥有的庞⼤的数据资源使得他们的研究
员们(⽐如 Tom)可以更快地做出开辟性的研究,⽽他们的竞争者因为没
有相应的数据,可能永远都做不到这⼀点。相⽐⽽⾔,当我和 Dawson ⼀
起做研究的时候,我能获得的 Linux 数据集规模⼩了很多,质量也差强⼈
意,因为开源软件项⽬往往不如⼀个世界⼀流的软件公司在维护数据记录
上更为⽤⼼。
此外,Tom 在其中的贡献也不可或缺:因为他在经验化软件度量领
域是⽼⼿,所以他知道应该如何作为⼀个技术导师来指导我,他还清楚论
⽂需要怎样的精⼼调整才能尽可能最⼤化被接收的概率。与此相反的是,
Dawson 在这⼀领域只是⼀位充满研究热情的局外⼈,所以对他⽽⾔,他并
没有在这⼀领域开展研究的动⼒,也不能良好地指导我完成研究项⽬(尽
管他在另⼀领域——软件缺陷检测——是世界知名的学者)。
46 插曲

在我博⼠第⼆年时,因为 Dawson 和我在经验化软件度量这⼀领域发


表论⽂困难重重⽽倍感煎熬,因为我们的竞争对⼿都是这⼀领域的专家和
⽼⼿。现在当我终于和这些专家之⼀⼀起发表论⽂,站在了成功的这⼀边
时,这种感觉令我由衷地欣喜。

尽管我在暑期经历了⼀段美妙的“插曲”,当秋天回到斯坦福时,我仍然
对博⼠论⽂的项⽬毫⽆头绪。我只知道我不想再 Klee 项⽬上继续消耗下去
了,但我对于什么样的研究⼯作使我感兴趣——⽽且更重要的是,可以发
表论⽂——仍然⼀⽆所知。
我考虑过将我在实习做的研究⼯作扩展成我的毕业论⽂。然⽽,我最
终得出的结论是,我回到斯坦福之后就很难在这个问题上发表更多论⽂了,
因为那样我就⽆法访问微软的数据了。最好的打算似乎是,我能在微软完
成⾃⼰博⼠论⽂的所有相关⼯作。然⽽这显然可能性不⼤,因为我没听说
过之前有学⽣这样做过。
作为最后的努⼒,我尝试联系了我在⾕歌实习时的经理,以寻求重新
回到⾕歌实习,利⽤他们关于软件缺陷的内部数据集继续经验化软件度量
的研究。他似乎对此没什么意见,但我后来没有继续跟进这个计划:因为
他⾃⼰也不是学术研究者,⽽除了他之外,我似乎也想不到谁会愿意帮我
完成这个研究计划。所以,我最终决定放弃经验化软件度量这个⽅向,所
以在 MSR 发表的三篇论⽂最终也没有为我博⼠毕业做出贡献。然⽽,这
些经历对于我提升研究⽔平和论⽂写作⽔平,⽆疑产⽣了积极的影响。
因为求毕业⼼切,我在暑期实习期间,将很多天晚上和周末⽤于阅读
学术论⽂,或者是在咖啡店展开头脑风暴。在某⼀阶段,我甚⾄产⽣了⼀
个想法,那就是创造⼀个和 Klee 类似的博⼠论⽂项⽬,但不使⽤到 Klee
这个软件本⾝。这个计划可以⼀⽅⾯让我远离 Klee 的深渊,⽽另⼀⽅⾯也
保持 Dawson 对我研究项⽬的兴趣。不幸的是,我没能从已经发表的论⽂
中找到我⾃⼰原创的、有⾜够创新性的思路。
博⼠研磨 47

接着,2009 年 7 ⽉ 24 ⽇,就在我的暑期实习刚刚过半的时候,灵感
突然降临了。在 MSR 的办公室编写程序分析数据的时候,我开始想到了
⼀个想法,⽽这个想法最终转化为了组成我博⼠论⽂的第⼀个项⽬。我发
狂似地写下了⼀页接⼀页的笔记,并让我的朋友 Robert 帮我确认我的想法
不是异想天开。当时,我完全没有预料到这个想法会不会被更⼴泛的学术
圈认可,但对我⽽⾔,这⾄少是我回到斯坦福、开始我博⼠第四年时,⼀
个明确的前进⽅向。
48 插曲
第四年:卷土重来

在我整个博⼠第⼆年、和 2009 年在 MSR 暑期实习期间进⾏经验化软


件度量研究的过程中,我⼀直在使⽤⼀种叫 Python 的⾮常流⾏的编程语
⾔19 ,进⾏数据处理、分析、和可视化。具体来说,为了我的程序可以运⾏,
我需要在我的电脑上存储很多程序所需的数据;为了我的程序在数据分析
过程中,经过每⼀次很⼩的改动之后可以运⾏得更快,我不得不把我的程
序改得过分复杂。当这种想法在我的头脑中慢慢地酝酿⼀个夏天之后,在
七⽉的⼀个安静的下午,我突然萌⽣了这样⼀个想法:如果我能以某种创
新的⽅式修改 Python 的运⾏环境(术语称为解释器)
,也许我就能消除我
每天⾯对的很多低效的⼯作,从⽽提⾼使⽤ Python 进⾏计算的研究者的
⼯作效率。我将我对 Python 解释器的改进想法称为 IncPy,这来⾃于增量
式 Python (Incremental Python)的缩写。

就像所有务实的研究者⼀样,我想到 IncPy 想法之后的第⼀件事(其


实是从⼀开始的激动平静下来之后的第⼀件事),就是仔细地在⽹上搜索,
试图确定是不是有⼈曾经做过相关研究。谢天谢地,没⼈曾经做出过我计
划完成的⼯作,但的确有⼀些之前的研究项⽬和我的想法有点接近。不过
这不是⼤问题;没有什么研究创意完全是原创的,所以学术界永远存在着
19
Python 是⼀种解释型的编程语⾔,语法灵活且简洁明了,⾮常适合⽤于编写需要很
快完成的数据处理、分析程序,也因此被很多研究者、数据分析师等采⽤。

49
50 第四年:卷⼟重来

很多相似、相关的研究项⽬。不过,如果想最终发表论⽂,我需要令⼈信
服地说明 IncPy 和这些已经存在的项⽬有何不同。在⼏天之内,我就简单
地规划出了⼀个初步的项⽬计划,包括⼀些说明 IncPy 为什么独特、新颖、
值得研究的论述。
因为我还有⼀个多⽉才离开 MSR,我充分利⽤了我周围的环境——有
很多聪明的同事都在像我⼀样,为他们的研究编写着类似的数据处理程序。
我和⼏位同事⼀起喝咖啡谈过话,我简单地问了问他们在⼯作中进⾏数据
分析时的习惯,以及他们⼯作中遇到的低效问题。我还向他们简单阐述了
⾃⼰的 IncPy 想法,并和他们讨论了如果要让这个想法更加实⽤、以及更
加适合作为学术研究问题,项⽬的哪些⽅⾯还需要微调。这些早期的谈话
增进了我的信⼼,让我知道我正前进在正确的⽅向上,因为其他⼈和我⼀
样对数据分析中的低效感到失望,并且渴望看到⼀个 IncPy 这样的解决⽅
案。
那个夏天接下来的时间⾥,我将晚上和周末都⽤于在咖啡店⾥不断完
善我逐渐成型的 IncPy 想法,强化它的“营销宣传”,并且从我的 MSR 同事
们中获得反馈。我还将我的想法的初稿发给了 Dawson,但那时我并不太关
⼼他对这个想法感不感兴趣,因为这将会成为我⾃⼰的研究项⽬。我不是
在征求他的同意;我只是想告诉他这是我秋天回到斯坦福之后想要开展的
研究⼯作。

我的博⼠⽣涯在我在斯坦福的第四年重新启程,我斩断与过去三年的
联系,并翻开新的⼀页。不再在已有的研究项⽬上开展⼯作,不再去尝试制
定计划使得⾃已与教授和⾼年级学⽣的研究兴趣相⼀致,也不再去担⼼什
么样的研究才是学术圈乐于看到的。我现在拼命地只想把我 IncPy 的新想
法实现出来,形成⼀篇可发表的⽂章,并使之成为我毕业论⽂的第⼀部分。
虽然充满了新的热情与激情,我还是有些忧惧的,因为我是脱离了原
有的⼯作来做⼀件新的⼯作,并且还未得到教授的⽀持,不知道是否会成
博⼠研磨 51

功。我们系⼤多数博⼠⽣都会做他们的导师或者教授感兴趣的项⽬,毕竟
有了教授的帮助和专业知识会更容易发表论⽂。然⽽,即使没有教授撑腰,
我还是预感 IncPy 会成为⼀个能发表出来的想法;在过去三年中的研究失
败中我积累了不少经验教训,从⽽对哪些想法可能会成功有了⼀个更好的
直觉。对这种直觉的坚信不疑成为了我博⼠⽣涯的转折点。
还有⼀点⽐较务实的事是,我依然保持 Dawson 作为我的导师,因为
他同意我做⾃⼰的项⽬,⽽且还能时不时给我的⼯作⼀点⾼层⾯的回馈。
由于我仍然有外源奖学⾦来作⾃我基⾦⽀持,我也就没有义务像 Dawson
的其他学⽣那样必须继续在 Klee 项⽬中⼯作。在我博⼠的接下来⼏年⾥,
Dawson 开始不太插⼿我的⼯作了。我们碰⾯讨论项⽬可能总共才⼗余次;
我⼤多时候还是⾃⼰⼯作或者寻找其他合作者。但我却不想正式地更换导
师,因为那样的话,我到了⼀个新的研究组⾥还是得再⼀次“交学费”,⼀切
从头做起。况且,我也不知道系⾥还有哪个教授对我 IncPy 的想法感兴趣,
不然的话我可能还是会认真考虑⼀下换导师的事情的。
为了最终能够毕业,我需要找到三位同意阅读并且会批准通过我的毕
业论⽂的教授,来组成⼀个博⼠论⽂委员会。⼤多数学⽣会直接请导师帮
他们选择这个委员会的成员,毕竟他们⼀直在做导师指定的“官⽅”项⽬。但
由于我单飞了,没有在 Dawson 的 Klee 项⽬上开展⼯作,事情就没有这么
简单了。我努⼒地寻找我们系或者其他相关院系(如统计系,⽣物信息学
系)的教授来做我的委员会成员。我给⼀些教授发了冷邮件,并试图通过
他们现在指导的学⽣联系到他们。我甚⾄还做了⼀个幻灯⽚准备向这些潜
在的委员会成员展⽰我毕业论⽂的初步想法,但不幸的是,没有教授有兴
趣和我⾯谈。然⽽,我没有选择放弃并回到有院系教授⽀持的传统项⽬上
去,⽽是冒险在 IncPy 的征途上继续前进,并且觉得委员会成员的事⼀定
会车到⼭前必有路。

受第⼆年时与 Scott 和 Joel 在⼈机交互⼯作上的启发,我 2009 年秋天


52 第四年:卷⼟重来

⼀回到斯坦福,就开始采访⼀些写 Python 程序来在研究中分析数据的同


学。我的⽬标是发现他们在编程中被什么影响了⼯作效率,以及如何能⽤
IncPy 消除这些影响效率的问题。我的⼀些朋友还帮我在他们的实验室组
会中安排了报告的机会,让我能介绍关于 IncPy 的想法——尽管它当时还
只是半成品。在项⽬启动阶段的这些采访和汇报,对我新想法的提出和“营
销技巧”的提升都有很⼤帮助。我也特别感谢那些在我除了⼏页粗制滥造的
幻灯⽚⽽外别⽆其他东西展⽰时,还能帮助我让我的项⽬起步的朋友们。
我越来越感到振奋,因为我发现很多基于计算的领域,例如机器学习、
制药学、⽣物⼯程、⽣物信息学、神经科学,还有海洋⼯程,都在使⽤相
似的⽅法进⾏数据分析,并且能从类似 IncPy 这样的⼯具中受益。经过了
⼏个星期的调研采访和后续的计划细化以后,我⾃信我有了⾜够的卖点来
令⼈信服地“推销”出这个项⽬,形成⼀篇论⽂投稿出去。我想提出的论点
是:各种领域的众多计算型研究者每天都在与编程⼯作流中常见的低效问
题抗争,⽽ IncPy 正好提供了针对这些低效问题的⼀个完全⾃动的解决⽅
案,这是之前没有⼈做到的。这个初期形成的卖点最终也演化成了我整个
博⼠论⽂的主题。
有了⼀个总体的策略之后,我准备好了开始⼀个长达⼏千⼩时的⾟苦
⼯作——研磨——这也是把 IncPy 从想法变成现实的原型⼯具所必经的⼯
作。在那个夏天快要结束的时候,我扮演了⼀个“教授的⾓⾊”,草拟出了⾼
层⾯的设计提纲,作了报告演讲,并细化了概念性的想法。现在我准备好
了转成“学⽣的⾓⾊”,在接下来的⼀年经过⾟苦的研磨从⽽把 IncPy 变成
现实。

这时我也清楚有了⼀个不错的想法只是做出可发表的研究成果的必要
条件,⽽绝⾮充分条件。年轻的研究者——通常是博⼠⽣——必须在这⾥
那⾥花费成百上千⼩时,在细节处挥洒汗⽔,最终才能让想法结出果实。
在计算机科学的研究中,苦⼒劳动最主要的形式就是编写计算机程序来搭
博⼠研磨 53

建、测试和评估基于软件的新的原型⼯具和技术。我在过去⼗年中花了近
万⼩时在各种形式的编程⼯作上,这些⼯作有的在课堂上、有的在业余⽣
活中、有的在实验室⾥、还有的在⼯业界的实习中,这些让我对实现⼀个
类似 IncPy 这样的研究创意所必须的、⾼强度的、复杂的编程要求有了充
分准备。
实现 IncPy 包含了⼀些我从未完成过的编程中的脏活累活。如果我在
过去⼗年没有经历过这么多⼩时的如⽕炼真⾦般的训练,那我也绝不会去
尝试这么⼀个劳动密集型的项⽬。不⽤怀疑,肯定也有其他⼈已经发现了
我所注意到的计算型研究⼯作流中的这些低效问题,他们本可能成为我的
竞争者,但将我与他们区分开来的要素是,他们没有创造出像 IncPy 这样
完全自动的解决⽅案所需要的深厚编程功底。他们可能最多也就能做出⼀
个半⾃动的解决⽅案⽽已,⽽实质上这样的⼯作还不⾜以在优秀的会议上
发表论⽂。
虽然我不太喜欢我研究⽣初期和本科期间的研究项⽬,但我从这些经
历中获得的技术上的技巧以及判断⼒,使得我现在能将⾃⼰真正关⼼的想
法实现出来变得可能。在接下来的三年中(2009 年到 2011 年),我不知疲
倦地做出了五款帮助计算型研究者的新原型⼯具(IncPy 是其中的第⼀个),
发表了多篇20 介绍这些⼯具的第⼀作者论⽂,接着将这些⼯作组合在⼀起
形成了⼀篇我深感⾃豪的博⼠论⽂。那三年——我博⼠⽣涯的后半程——
是我迄今为⽌最具创造⼒和最⾼产的⼀段时期,与我博⼠⽣涯的前半程形
成了鲜明的对⽐。
强烈的想要做出成果的狂怒让我疯狂地主动⼯作。我变得刚毅、果决、
⾼度专注。每当我回想起我前三年博⼠⽣活所忍受的低效、失败、沮丧所带
来的煎熬时,我⼼中就会产⽣⼀团怒⽕,然后逼迫⾃⼰⼯作得更努⼒;我
被这种强迫性的鞭策所驱动,来弥补假想的浪费掉的时间。诚然,早些年
的光阴实际上并没有浪费;没有那些挣扎,我也不会获得创造出组成我博

20
原⽂是 “published one or more first-author papers describing each tool",这⾥没有直
译,⽽是根据上下⽂翻译成了“多篇”。——译者注
54 第四年:卷⼟重来

⼠论⽂的这五个项⽬的灵感和能⼒。

然⽽,2009 年 9 ⽉,在我开始我第四年博⼠⽣涯的时候,我还不知道
有什么会在未来等着我,也绝没有像五个项⽬、230 页的毕业论⽂这样的宏
伟计划。我甚⾄都不知道有没有教授会认真地看待我未经检验的想法,并
同意担任我的论⽂评委。我想做的就只是将 IncPy 实现出来,尽可能让其
发表,然后到时候再来考虑接下来⼀步做什么。
当我正准备开始(编写程序)实现 IncPy 的时候,出⼈意料的好运从
天⽽降。当时,我还不知道这么⼀件⼩事竟能带来⼀系列的好运,为我铺
开了⼀条通往毕业的⼤道。有⼀天午饭的时候,我的⼀个朋友 Robert 给我
说他正计划把他⼀个新研究项⽬的论⽂投稿到⼀个研讨会21 ,这个研讨会
的论⽂截⽌⽇期是两个半⽉之后。
按常理来说,我对这件事应该不会有太多想法,有两个原因:⾸先,
Robert 的研究主题(⼀个叫做数据溯源的⼦领域)和 IncPy 并不相关,所
以他准备投稿其实和我没有⼀点关系。第⼆,在我们系,⼀篇发表的研讨
会论⽂对于博⼠论⽂来说并不“作数”。研讨会论⽂的⽬的是宣传初期的研究
想法,它并不像会议论⽂那样要经过严格的审稿。会议论⽂的接收率⼀般
在 8% 到 30%,⽽研讨会论⽂的接收率却有 60% 到 80%。我们系的⼤多数
教授都不主张学⽣往研讨会投稿,因为论⽂⼀旦被接收(这通常也是很容
易的⼀件事),教授就得从他们的经费中拿出⼤约 1500 美元,来承担学⽣
参加研讨会并作报告产⽣的车旅费、住宿费和注册费。送⼀个学⽣去参加
研讨会的费⽤已经⼏乎和参加⼀个会议的费⽤相当了,但发表会议论⽂对
学⽣和教授来说却又更有声望。因此,顶级的计算机科学教授会强烈建议
学⽣发表更多的优质会议的论⽂,同时也要避免投稿到研讨会。
21
研讨会:相⽐起学术会议(conference),研讨会(workshop)的规模较⼩,更倾向于
集中讨论某⼀个特定的话题。
——译者注
博⼠研磨 55

我问了问 Robert 为什么他的导师会建议他把初期的想法投稿到⼀个


研讨会,⽽不是再深⼊挖掘⼀下,⽇后再投稿到⼀个学术会议。他说部分
原因也是出于⽅便,因为这个研讨会就在圣何塞22 举⾏。他们整个组都准备
去参加这个研讨会,圣何塞离斯坦福也就 20 英⾥的路程,所以他也想在那
做⼀个论⽂报告。
出于好奇,我浏览了⼀下那个研讨会的主页,看⼀看组织者们对哪些
话题感兴趣。虽然这是⼀个关于数据溯源(Robert 的研究领域)的研讨
会,它的话题列表⾥却包含了这么⼀点:“⾼效/增量式再计算”。我⼼⾥暗
想:嗯,IncPy 为 Python 程序员提供了⾼效的增量式再计算,所以如果我
以合适的⽅式推⼴我的论⽂,也许还正好契合这个研讨会!由于我不需要
长距离奔波就能参加这个会,所以如果我的论⽂被接收,我也就不⽤忐忑
地去找 Dawson 让他帮我报销注册费了。我发邮件给 Dawson 告诉他我准
备往这个研讨会投稿的计划,他不冷不热地回复了我。不出所料,他对研
讨会提不起多⼤的兴趣,但是觉得我要想投稿过去也可以,因为他很敬重
这个研讨会的程序委员会的联合主席,⼀名名叫 Margo 的哈佛教授(她后
来也扮演了⼀个⾄关重要的⾓⾊,帮助我得以毕业)。
时间也正合适:我还有两个半⽉来加班加点地实现出第⼀个能够⼯作
的 IncPy 原型,然后写⼀篇研讨会论⽂并投稿。由于我知道研讨会的接收
门槛⽐会议论⽂的低很多,所以我的压⼒也没那么⼤。我只需要让⼀个基
本的 IncPy 原型能够合理地运⾏,并且⽣动地讨论⼀下这个经验就⾏了。
我发现这种找到并为⾃⼰设定短期⽬标的策略出奇地有效,也让我能够在
我后来的博⼠⽣涯中⼀直保持专注。如果没有⼀系列⾃我设定的截⽌⽇期,
很容易就会陷⼊倦怠期并且患上拖延症。
我的论⽂最终被接收了,还获得了不错的审稿意见,我在 2010 年 2 ⽉
参加了那个研讨会并做了个半⼩时的报告。值得⼀提的是,我的论⽂还很
荣幸地得到了程序委员会联合主席 Margo 的赞扬,她还指出了我的论⽂是
如何与她的学⽣ Elaine 正起步的⼀个基于 Python 的新项⽬产⽣关联的。

22
San José,加利福尼亚州城市,距离斯坦福校园不⾜⼀⼩时车程。——译者注
56 第四年:卷⼟重来

Elaine 没有来参加这次研讨会,不过 Margo 给了我 Elaine 的邮件地址并建


议我们联系⼀下。
起初,我担⼼ Elaine 会成为我的直接竞争对⼿,还可能在我之前发表
会议论⽂,这会使得我发表⼀篇关于 IncPy 的会议论⽂变得更为困难:因
为在学术界成为第⼀⼈是很被珍视的,⼀旦其他研究者在你之前发表了⼀
篇类似你的想法的论⽂,你再想把你的想法发表出来就会变得更难了。但
是经过⼏次试探性的邮件接触和视频聊天之后,我发现她并没有把这个⼯
作作为会议论⽂投稿的打算,这让我放松了⼀些。⽽且,她的⼯具也没有
全⾃动的能⼒,⽽这正是把 IncPy 和其他类似⼯作区分开来的特点。当我
们意识到彼此不是竞争对⼿后,我们⽴马成为了朋友。我很⾼兴在接下来
的⼏年⾥,我还和 Elaine 保持了联系。后来我和 Margo 重新取得联系,让
我能够奔向博⼠征途的终点,部分也要归功与 Elaine。

即使做这样⼀个有关 IncPy 的研讨会论⽂报告有利于获得反馈,尤其


还让我有机会能和 Margo 会⾯,但那篇论⽂对我的博⼠论⽂⽽⾔并不算做
是“真正”发表的论⽂。我知道我仍然还需要将这个⼯作发表在我们系教授
所认可的会议上。研讨会论⽂和会议论⽂最⼤的区别就是⼀篇会议论⽂必
须有⼀个有说服⼒的实验评估来体现论⽂中所描述的⼯具或者技术的⾼效
性。⼀篇论⽂的评估章节可以是多种形式,包括从对运⾏时间的测量,到
⽤户⾏为的控制性实验研究。由于很多研究者都提出了相似的想法,所以
审稿⼈会仔细地审查这些想法是如何被实现出来的,以及试验评估是如何
设计的,从⽽决定哪些论⽂可以接收,哪些论⽂应该拒绝。
虽然在 IncPy 项⽬开始时,我就知道展⽰⼀个令⼈信服的实验评估是
很困难的,因为我想说明的论点——IncPy 可以提⾼计算型研究者的⽣产
⼒——是⼀个主观且模糊的概念。在读了⼀些同样也提出⽣产⼒的提升这
⼀论点的论⽂之后,我设计了⼀个可分为两部分的评估策略:

1. 案例研究:从各种计算型研究者处收集⼀些⽤ Python 语⾔编写的程


博⼠研磨 57

序,并进⾏模拟,看看如果研究者们采⽤ IncPy ⽽不是常规的 Python


后,⽣产⼒可以提升到什么程度。

2. 部署:找⼀些研究者来让他们在⽇常⼯作中使⽤ IncPy ⽽不是常规的


Python,之后再让他们报告是否 IncPy 提升了他们的⽣产⼒。

下⼀个相关会议的论⽂提交截⽌⽇期在七个⽉之后,我计划在那之前准备
好论⽂。我花了很多时间来寻找⽤于案例研究的程序样本和⽤于部署的潜
在⽤户。没有这些,就没有评估,也就没有会议论⽂,也没有博⼠论⽂,更
别说毕业了。(当然,我还是把我⼤部分醒着的时间花在了恼⼈的写代码、
调试,以及测试上,从⽽来实现 IncPy。)
我学着扮演⼀个⼀半推销员⼀半乞求者的⾓⾊,坚持不懈地询问同学
是否有 Python 程序可以拿来给我⽤作案例研究,或者更好的是,是否愿意
安装并使⽤ IncPy,以此作为⽇常⼯作的基础,并向我提供他们的使⽤感
受。如我所料,我得到的回答多半是否定的,但我还是礼貌地询问了他们
能否给推荐其他⼀些我可以联系联系的⼈。我也到许多研究组的组会上做
了不少报告来招徕⼤家对 IncPy 的兴趣。历经了⼏个⽉的“乞求”之后,我
获得了来⾃不同领域的近⼗个研究者的 Python 程序,⾜够我进⾏案例研
究了。我感激当时帮助过我的每⼀个⼈,毕竟他们除了来⾃⼀个素不相识
博⼠⽣的善意请求外,没有得到任何东西。

虽然案例研究对我论⽂中评估的那⼀个章节来说已经⾜够了,但我真
⼼希望的还是部署我的原型⼯具——让真正的研究者使⽤ IncPy。这不仅
是因为我觉得通过部署我能够做⼀个更有⼒的评估,⽽且更重要的是,我
发⾃内⼼地相信 IncPy 可以提升计算型研究者们每⽇⼯作的⽣产⼒。⼤多
数研究型原型⼯具的搭建都是为了证明⼀个新颖的想法,但之后就被抛弃
了,但我想让 IncPy 成为⼀个实⽤且能被沿⽤下去的⼯具。我并不是为了
发表论⽂才凭空想出 IncPy 这个点⼦的,创造它的灵感来⾃于我研究时碰
到的真真正正的实际的编程问题,所以我希望⼈们也能够在实际中使⽤它。
58 第四年:卷⼟重来

尽管我追求理想主义,但我也理解为什么⼏乎没有研究型的原型⼯具
成功地得到部署使⽤。这背后的原因是因为⼈们往往不愿意去尝试⼀个全
新的⼯具,除⾮他们看到这个⼯具有很多⽴竿见影的好处,⽽且没有⼀点
缺点;研究者们却通常没有⾜够的时间和资源来让他们的原型⼯具运⾏得
⾜够好,从⽽满⾜这些严苛的条件。尤其对我⽽⾔,我的⽬标⽤户对使⽤
常规的 Python 很满意——即使它存在⼀些低效问题,他们也不愿意冒险
转移阵地到 IncPy 上来。为了说服某个⼈试⼀试使⽤ IncPy,我就必须保
证 IncPy 在任何情况下都⽐常规的 Python 表现得要好。尽管这在理论上
是可以保证的,但实际上 IncPy 只是⼀个仅由⼀个学⽣维护的研究型原型
⼯具,所以它⼀定会存在很多漏洞。相反,官⽅版的 Python 是⼀个有⼆⼗
余年历史的项⽬,⽽且同时还有⼏百个经验丰富的程序员在维护它,所以
它更加稳定和可靠。只要有⼀个⼈发现了 IncPy 的⼀个漏洞,⼤家⽴马就
会觉得 IncPy 是靠不住的,转⽽回去使⽤常规的 Python。我知道胜算不站
在我这边,但我不在意。
在斯坦福寻找⼈来安装和使⽤ IncPy 未果后,我转⽽在附近的⼤学来
寻找愿意第⼀个吃螃蟹的⼈。2010 年 3 ⽉,我给 UC Davis23 的⼏个博⼠⽣
发了封冷邮件,他们都是和我同在 MSR 实习的⼀位同学的朋友。感谢他
们⽆私奉献的精神,在我这个研究⽣亟需援助时拉了我⼀把,还邀请我去
宣传我的 IncPy。⼏个和蔼的教授甚⾄还同意和我会⾯,包括⼀个我在数
据溯源那个研讨会上碰到的教授。尽管我得到了不少有帮助的反馈,我还
是没能找到⼈作我案例研究或者部署的实验对象。
那天晚上我待在了 UC Davis,打算第⼆天早上回斯坦福。突然,我
有了个冲动的想法——给 Fernando 发封冷邮件,他是 UC Berkeley24 的⼀
个研究科学家,他⾮常热⼼于将 Python 投⼊到计算型研究中。⼏个⽉前,
⼀个来听我作报告的研究⽣同学给我发了封邮件,⾥⾯有⼀个 Fernando

23
UC Davis 是加州⼤学戴维斯分校(University of California, Davis)的简称。——译者

24
UC Berkeley 是加州⼤学伯克利分校(University of California, Berkeley)的简称,出
于习惯,下⽂将简称其为“伯克利”。——译者注
博⼠研磨 59

的⼀篇博客的链接,我当时就记下了⼀个备忘录,准备在将来某个时候联
系⼀下 Fernando。现在似乎正好是⼀个合适的时机:伯克利正好处于 UC
Davis 和斯坦福之间,我回学校的路上可以顺便去他办公室拜访他⼀下。我
给 Fernando 发了冷邮件,询问他明天早上是否有时间和我聊⼀聊。这是⼀
个不太会成功的尝试,不过他最终还是答应了和我见⼀⾯。我和 Fernando
欢快地聊了⼀个⼩时;有这么⼀位资深的⾼级科学家能⽀持我 IncPy 的想
法,我感到⾮常⾼兴。
第⼀次与 Fernando 会⾯最重要的⼀个收获就是他邀请我接下来这个
⽉回伯克利做⼀个有关 IncPy 的报告。他说我的听众中会有使⽤ Python
进⾏计算型研究实验的神经科学家。在我那个⼀⼩时报告的过程中,我被
三个研究员稍稍吓了⼀跳,他们⽼是打断我,反复纠缠⼀些 IncPy 在实际
中表现如何的细节问题。⼀开始,我觉得这⼏个⼈实在是太过追根究底了,
不过报告后他们过来向我表达了试⽤ IncPy 的强烈兴趣。他们抱怨的所遭
受的低效问题正好是我创造 IncPy 的初衷!看来他们并不是在我报告时添
乱;他们是真真正正想了解其中的细节,以此来评估将 IncPy 部署到他们
实验室的计算机上去是否真的可⾏。
拥有第⼀批⽤户的这种可能性让我很激动。我和他们邮件交流了⼏次,
还专门驱车去伯克利协助他们安装和设置 IncPy。我的第⼀封邮件采⽤了
⼀种谨慎乐观的语⽓:

⾮常感谢您有兴趣成为我的 IncPy 记忆式 Python 解释器的第


⼀个⽤户!我⾮常期待能将 IncPy 做成⼀个您能在⽇常⼯作流
中使⽤的⼯具。我觉得最⼤的问题应该是安装、设置、配置中恼
⼈的⼯作,我会很乐意解决这些问题,从⽽给您最流畅的⽤户
体验。

在我尝试给伯克利这些神经科学家的电脑上安装 IncPy 之前,我已经


搭建和测试了⼏个⽉,所以我很⾃信也能给他们安装成功。然⽽,安装之
后没⼀会⼉,我们就发现 IncPy 与这些科学家天天都在使⽤的很多第三⽅
60 第四年:卷⼟重来

Python 插件(称为拓展模块)并不相容。我⾃⼰测试的时候,只测试了⼀
些基本⽤例,⽽没有考虑到这些扩展模块。这给了我⼀个关于现实部署的
深刻教训:失败可能以你没有料到的形式出现,⽽⼀旦给⽤户留下⼀个不
好的第⼀印象,就全完了!就像绝⼤多数研究者只在象⽛塔⾥闭门造车做
原型⼯具⼀样,我绝不会想到这个不可预见且不起眼的拓展模块问题,会
让我在第⼀次部署的尝试中出局。
但我并没有放弃。我花了接下来⼏个星期的时间重新设计和实现了
IncPy 中⼀个关键部分的代码,使它能够与任何 Python 拓展模块⼀起完美
⼯作。我又给伯克利那⼏位神经科学家发了封邮件,希望他们再给我⼀次
机会,但我没有得到任何回复。唉,我曾经有⼀个绝佳的机会,可我却挥
霍了它。

这个惨痛的经历驱使我不断地从实际的⾓度出发来不断完善 IncPy:
⼀边修补了⼏个不明显的漏洞,⼀边我还制作了⼀个IncPy 的项⽬⽹站,上
⾯包含⼀个短短的演⽰视频,⽂档以及新⼿教程。做这些东西的⼏百个⼩
时对我原本的研究没有丝毫贡献,但这对我获得实际⽤户的事例,从⽽在
将来投稿时完成论⽂的评估章节来说却是必须的。
⼏个⽉以后,来⾃世界不同地⽅的三个陌⽣⼈通过这个⽹站发现了
IncPy,他们下载了 IncPy,并将其⽤来提升他们研究中⼀些编程⼯作的速
度。虽然三个⼈只是⼀个可怜的⽤户总数,但也总⽐零好,⽽⼤多数研究
型原型⼯具⽤户数就是零。IncPy 已经达到了⼀个打磨得还不错的状态,我
很满意——这多亏了我从伯克利回来之后的做的改进——这⼏个陌⽣⼈现
在可以不需要任何⼈⼯指导就能使⽤ IncPy 了。这三个⼈发邮件告诉了我
IncPy 是如何在他们的⼀些⼯作中起到帮助的。这些事迹虽然并不是 IncPy
⾼效性的强有⼒证据,但也聊胜于⽆。
2010 年 9 ⽉,在我的第四年博⼠⽣涯接近尾声的时候,我把我 IncPy
的论⽂投稿到了⼀个顶级会议,论⽂的评估章节包含了案例研究和三个简
博⼠研磨 61

要的部署实例。这个会议之前⼀年的接收率只有 14%。所以我知道我的论
⽂很有可能被拒收,既因为它极低的接收率,也因为我的 IncPy 并不能很
好的契合任何⼀个传统的⼦领域。尽管这样,先以顶级会议为⽬标,之后
有必要再重新投稿到⼆级会议仍是⼀个明智的选择,毕竟顶级会议的论⽂
发表在将来毕业的时候会占到更⼤的权重。
我仍然还没拥有⼀条通往毕业的康庄⼤道,但我⾄少能开始⾃我管理
⾃⼰的研究内容,⽽不是跟着别⼈⼀起做他们的研究项⽬了。我在过去这
⼀年还是挺开⼼的,我把脑海中灵光⼀现的 IncPy 想法变成了⼀个半实⽤
的⼯具,还让三个下载它的陌⽣⼈从中受益。虽然这只是⼀个很⼩的成就,
⽽且对我的毕业没有丝毫帮助——教授们更看重理论上的新颖性,⽽⾮实
际中的部署情况——但在我博⼠的第四年末尾时,这多少还是有⼀点让⼈
满意的。
62 第四年:卷⼟重来
第五年:峥嵘岁月

我的博⼠第五年(2010 年 9 ⽉)刚开始的时候,我还没有任何东西可
以放到我的(还未存在的)博⼠论⽂⾥去。这时,我的⼤多数同学都以第
⼀作者⾝份发表了⾄少⼀篇博⼠论⽂⽔准的会议论⽂。⽽我却⼀篇都还没
有(IncPy 的那篇论⽂当时还处于评审阶段),因此我很担⼼我将需要七⼋
年才能顺利毕业。
然⽽在接下来的⼗⼆个⽉中,我发表了四篇会议论⽂和⼀篇研讨会论
⽂(均为第⼀作者)
,这也铺平了我通往毕业的道路。毫⽆疑问,我的第五
年是博⼠⽣涯中最⾼产的⼀年,我不懈地保持着专注。

2010 年的夏天进⾏到⼀半的时候,IncPy 项⽬正按部就班的进⾏着,


我也正准备着在九⽉的截⽌⽇期前投⼀篇论⽂。但我知道对于博⼠论⽂来
说,IncPy 还不算是⼀个实质性的⼯作。所以除了继续努⼒准备投稿⽽外,
我也花了⼀下时间想了想下⼀个项⽬要做什么。
我希望可以把我的头脑风暴说成是受纯粹的学术精神所激励,但事实
上我是受⽇益增长的恐惧所驱使:我担⼼我不能在⼀个能接受的时间内顺
利毕业,所以我逼迫我⾃⼰去想⼀些有希望发表出来的新想法。我也知道
⼀篇论⽂被接收发表可能会花两到三年,因此我要是想在第六年结束时毕
业,就得在今年提交⼏篇论⽂,并祈祷其中有⾄少两篇会被接收。我感到了
⼀种紧迫感,因为我的外源奖学⾦只持续到这⼀年结束。等我的经费⼀到

63
64 第五年:峥嵘岁月

期,要么我就得去从教授那⾥获取经费⽀持并⾯对⼀些强制性的限制(例
如再⼀次在 Klee 上投⼊⼯作),要么我就得长期地担任助教,⽽这会更加
推迟我的毕业期限。时间真的不多了。
2010 年 7 ⽉ 29 ⽇,⼏乎就是我想出 IncPy 的初始创意正好⼀年之后,
我又有了⼀个相关的想法,同样也是受计算型研究者分析数据时碰到的实
际问题的启发。我注意到由于研究者们经常以⼀种⾃发的“马虎”的⽅式写
程序,他们的程序就会常常由于⼀些低级错误⽽崩溃,没能产⽣任何⼀点
分析结果,让⼈垂头丧⽓。我的想法就是通过改变 Python 语⾔的运⾏时环
境(解释器),我可以消除掉这种崩溃,让这些马虎的程序能产⽣出⼀部分
的结果,⽽不是什么结果都没有。我把这个 Python 解释器的修改版命名为
“SlopPy”,代表 Sloppy Python25 。
虽然 SlopPy 和 IncPy 是⾮常不同的两个想法,但我都是通过改变
Python 解释器的⾏为来实现它们的。过去⼀年为了做 IncPy,我花了近⼀
千个⼩时来研究(修改)Python 的解释器,这让我有信⼼能够轻易地实现
出 SlopPy。只⽤了两个⽉,我就做出了⼀个能⼯作的基本版原型⼯具,跑
了⼀些初始的实验,并提交了⼀篇论⽂到⼀个⼆级会议。我以那个会议为
⽬标,既是因为它的截⽌时间⽐较合适,也是因为我觉得 SlopPy 这个想法
还不⾜够“⼤”来让它被顶级会议接收。

到了 2010 年 10 ⽉的时候,我有两篇论⽂都处于评审中。这时,我已
经放弃了找⼀份⼤学教授⼯作的想法,毕竟我连⼀篇能⽤到博⼠论⽂⾥的
论⽂都还没发出来;有竞争⼒的计算机教职候选⼈在博⼠⽣涯的这个时候
都已经发了很多篇饱受赞誉的第⼀作者论⽂了。所以除⾮奇迹发⽣,要不
然我是找不到⼀个⼀流⼤学的研究⼯作了,因此我把完成⼯作够得上毕业
定为了我的⽬标,都不再去担⼼我的简历字⾯上好不好看了。
25
“sloppy’’ ⼀词意为马虎、不谨慎的,所以作者的项⽬全称是“马虎的 Python”,⽽缩写
也是“马虎的”。——译者注
博⼠研磨 65

我收到的结果是奇迹的反⾯:我 IncPy 和 SlopPy 的论⽂都被拒收了。


我感到有点失落但也并不震惊,因为在这之前我已经习惯了论⽂被拒。对
我论⽂的批评意见都是合情合理的,所以解决这些问题可以强化我之后的
投稿。
最值得注意的是,我介绍 IncPy 时采⽤了⼀种不太明智地包装策略,
这使得我的论⽂被安排给⼀些来⾃对我的研究理念不太“友好”的⼦领域的
学者来审阅。理论上来说,专业论⽂应该只基于它的内容来评判,但实际
上,审稿⼈有着⾃⼰不同的主观品味和理念差异。所以我彻底地重写了开
头⽤来⾃我推销的部分,希望获得更多友善的审稿⼈的赞同,我还将它重
新投稿到了⼀个⼆级会议,以此来进⼀步增加它被接收的机率。我的计划
奏效了,2011 年年初,我IncPy 的那篇会议论⽂的第⼆次投稿被接收了,尽
管评审意见有点冷淡。
后来我又修改并重新提交了 SlopPy 的那篇论⽂到⼀个研讨会,这个研
讨会正好和我要作报告介绍 IncPy 的那个会议在⼀起举⾏。这个策略很有
效,因为想让⼀篇论⽂被⼀个研讨会接收⽐被⼀个会议接收实在是容易太
多了。⽽且,Dawson 也不⽤花额外的钱让我去参加这个研讨会,因为我本
来也是要去同期举⾏的那个会议上做 IncPy 的报告的。SlopPy 的论⽂和我
料想中的⼀样被接收了,尽管它不“作数”,只能算作我博⼠论⽂外的额外成
果,但⾄少也⽐没有论⽂发表好;我希望能把这篇论⽂吸收到我的博⼠论
⽂中去作⼀个⼩章节,以此作为那些来⾃会议论⽂的更重要章节的补充。

2010 年 10 ⽉,我刚把 IncPy 和 SlopPy 两篇论⽂投出去的时候,我


问了 Dawson 我要毕业的话需要达到什么条件。不出所料,他回答我说我
需要发表⼀些论⽂来证明我⼯作的合理性。不过他还有⼀个更为具体的建
议:另⼀个能到达博⼠论⽂⽔准的项⽬,就是能够把我对 Python 的兴趣
以及他所喜爱的类似 Klee 的想法结合起来,从⽽做出⼀个能够⾃动查找
Python 程序中漏洞的⼯具。由于我对回到任何形式的 Klee 项⽬都不太感
66 第五年:峥嵘岁月

兴趣,所以我没采纳他的建议,⽽是继续思考 IncPy 和 SlopPy 还有没有什


么可拓展的东西,可以形成⼀篇后续论⽂提交出去。
这时,我博⼠论⽂主题的初期构想已经开始在我脑中萌芽:IncPy 和
SlopPy 都是提升计算型研究者⽣产⼒的软件⼯具。因此,思考接下来⼀个
项⽬要做什么的时候,我仍接着去寻找计算型研究者在⼯作中会碰到什么
样的问题,然后设计新的⼯具来解决这些问题。
具体来说,我注意到研究者们每天运⾏计算实验时,都要编辑并执⾏
他们的 Python 程序⼏⼗上百次;在有⼀个重⼤发现之前,他们往往要重
复这个过程⼏周或者⼏个⽉。我觉得把每⼀次程序执⾏之间的变化记录下
来并进⾏⽐较,会对调试程序和获得思路有帮助。为了便于进⾏这种⽐较,
我打算拓展 IncPy,使之能够记录下当⼀个 Python 程序执⾏时,哪部分代
码和数据被存取了的细节,从⽽维护⼀个计算型实验的详尽历史记录。我
也觉得如果研究者之间能够共享这种实验历史记录的话那就太棒了,这样
他们就能够从中知道哪些实验尝试是奏效的,哪些是不⾏的。
我的直觉告诉我按这个思路发展出来的想法肯定是新颖的,⽽且能够
发表出来,但我还没有形成⼀个清晰的研究亮点;我的思路还都是模糊的
⼀团。我觉得思维有点被卡住了,于是我又寻求和 Fernando 见⼀次⾯,就
是我博⼠第四年在伯克利⼀个实验室的组会上作报告介绍 IncPy 时见过⼀
次⾯的那位研究科学家。Fernando 把与我的会⾯排⼊了⽇程,我们这个⼩
时的交谈为我的下⼀个项⽬播撒下了种⼦。

我 ⼀ 把 我 拓 展 IncPy 来 记 录 基 于 Python 的 实 验 历 史 的 想 法 告 诉
Fernando,他⽴马饶有兴致地给我介绍起了⼀个我从没听过但却很吸引我
的话题:可重复性研究。
实验科学的根基之⼀就是任何⼀个⼈的研究发现应该能够让同⾏验证、
⽐较,并且以此为基础继续发展。在过去的⼗年中,来⾃不同领域越来越多
的科学家都在通过编写计算机程序来分析数据和获得科学发现。每年都有
博⼠研磨 67

⼏千篇充斥着以数据、图像、表格作⽀撑的定性结果发表出来。然⽽,现代
科学中⼤家都⼼知肚明的⼀个令⼈遗憾的事实就是,想重复或者验证他⼈
的发现⼏乎是不可能的,因为他们的原始代码和⽤来产⽣结果的数据集⼏
乎很难得到。这造成的结果就是,⼤量论⽂中包含的触⽬惊⼼的错误——
有的的确是⽆⼼之失,但有的却是公然造假——变得⽆法被检验,有的甚
⾄变成了导致⼈员丧命的科学论断。最近⼏年,诸如 Fernando 这样的改⾰
派科学家们正竭尽全⼒唤起⼤家对计算科学中可重复性研究重要性的重视。
为什么可重复性在实际中如此难以实现呢?⼀部分有很强竞争⼒的科
学家故意不公开他们的代码和数据,以此来避免潜在的竞争,但⼤多数⼈
还是愿意在别⼈有需要时分享给他们代码和数据的。然⽽,主要的技术壁
垒还是仅仅获得了别⼈的代码和数据,还是不⾜以重新运⾏和产⽣他们的
实验。每个⼈的代码都需要⼀个⾼度特殊化的环境来运⾏,任意两台计算
机上的环境——即使它们有相同的操作系统——还是会有⼀些细微且互不
兼容的差别。所以,如果你把你的代码和数据发给你的同⾏们,他们还是
有可能没法重新运⾏你的实验。
Fernando 很喜欢我 IncPy 的记录实验历史的想法,因为这样可以记录
下⼀个实验最初出现时,有关其软件环境的信息。之后,使⽤ Python 的研
究者就可以把他们的代码、数据和环境发给想要重复他实验的同⾏。会谈
出来以后我感到⾮常振奋,我找到了我想法的⼀个具体应⽤。可重复性研
究的这个动机似乎也⾜够吸引⼈,可以组成我第⼆篇基于 IncPy 论⽂的故
事情节,还能成为我博⼠论⽂的⼀部分。
正当我把更多的细节草记下来的时候,⼀个极为清晰的念头瞬间袭来:
为什么只把实验记录限制在 Python 程序上呢?有了我头脑中的⼀些想法,
我可以做出⼀个⼯具,能够轻松重复任何语⾔写的计算型实验。头脑还⼗
分混乱的我草拟了⼀个计划,我准备设计⼀个新⼯具,名字就叫“CDE”,也
就是 Code, Data, and Environment26 的意思。

26
意为“代码,数据,环境”。
——译者注
68 第五年:峥嵘岁月

当我把我的想法告诉 Dawson 时,他⾮常⽀持,还⿎励我再想得⼤胆


⼀点:为什么只把 CDE 瞄准在科学家的代码上?为何不做⼀个针对所有种
类软件程序的多用途⼯具包?这的确是字字珠玑。⼀⼤批软件的创建⼈和
贡献者——不只是科学家——都遇到过让别⼈运⾏⾃⼰的程序时,由于同
样的环境不兼容问题带来的烦恼,这⼀现象被亲切地称为“依赖地狱”。依赖
地狱问题在基于 Linux 的操作系统中尤为⼴泛,因为⽤户使⽤的不同变种
的 Linux 之间存在⼤范围的不完全兼容现象。在⼀个⽤户的 Linux 计算机
上能运⾏的程序不⼀定也能在另⼀个⽤户的稍有不同的 Linux 计算机上运
⾏。只要把我的原始想法稍加改进,CDE 就能帮⽤户打包他们的程序,从
⽽让其他⽤户能够成功运⾏,⽽不再⽤担⼼环境不⼀致的问题。我感到⼗
分激动,因为 CDE 有可能缓解 Linux ⾥存在了⼗余年的依赖地狱问题。
按惯例要进⾏实际调研,于是我在⽹上搜索了相关⼯作,看看有没有
什么研究型原型⼯具和成熟产品级别的⼯具有着类似的功能。让我欣慰的
是,已有的⼯作并不算多,⽽且 CDE 在这个宽松的竞争环境中有两⽅⾯显
得尤为突出:⾸先,我将 CDE 设计得⽐类似的⼯具更容易上⼿使⽤。作为
⽤户⽽⾔,你要新建⼀个⾃洽的代码、数据和运⾏环境的包,就只需要运
⾏你希望打包的程序就可以了。因此,如果你在 Linux 计算机上运⾏了⼀
套程序,那么 CDE 就能让其他⼈在他们各⾃的计算机上都能返回到这⼀
相同的程序,⽽不需要其他的安装或者配置。第⼆,CDE 所采取的的技术
机制——⼀种叫系统调用重定向的技术——使它在各种各样复杂的实际情
况中,⽐其他相关的⼯具更为可靠。
这时,CDE 还只是以⼀堆笔记和设计提纲的形式存在,但当我意识到
它⽐所有现存的⼯具概念上都更简单,更易于使⽤,且更为可靠时,我还
是感受到了它的巨⼤潜⼒。我⾝体⾥的⼀部分感到震惊和激动:居然之前
没有⼈实现过这个东西?!回想起来这个想法这么显⽽易见!⼀个令我惧怕
的之前没⼈做类似 CDE ⼯具的原因可能就是,要搞清楚所有的细节并让
其在实际中⾼效⼯作⼏乎是不可能的。可能 CDE 也是⼀种论⽂上看起来
博⼠研磨 69

不错但却实际中不可⾏的创意。我于是觉得除了⾃⼰亲⾃实现⼀遍 CDE
这条路⽽外,没有其他更好的办法把这件事弄清楚了。
在横跨 2010 年 10 ⽉到 11 ⽉那紧张的三个星期中,我都在为创建出
CDE 的第⼀个版本⽽⾼度研磨。正如我所怀疑的那样,虽然 CDE 背后的
研究创意是很直截了当的,但要让 CDE 在真正的 Linux 程序上⼯作,还
有很多编程相关的脏活累活要⼲。那⼏个星期我与 CDE ⽣活甚⾄呼吸都
是在⼀起,⽣活中的其他事都被我抛之脑后。我夜以继⽇地编写程序,还
常常在梦⾥思考我需要解决的代码中错综复杂的细节问题。每天早上,我
刚醒来就跳起来编程,⽣怕今天我会遇到⼀个难以逾越的障碍,最终证明
让 CDE 在实际中⼯作是不可能的。不过这⼀天迟迟没有到来,我也离我的
第⼀个⾥程碑越来越近:证明 CDE 是如何能让我在两台 Linux 计算机之
间毫不⿇烦地传递⼀个复杂的科学程序,并重复⼀个实验的。
在经过三周靠咖啡驱动的⾼强度研磨之后,我感到狂喜,我终于让
CDE 在我的⼀个科学程序演⽰样本上正常⼯作了。这时,我知道如果我继
续测试并不断改进代码,那么 CDE 有在多种实际的 Linux 程序上起作⽤
的潜⼒。我制作了⼀个⼗分钟的介绍 CDE 的演⽰视频,搭建了⼀个包含视
频和 CDE 下载拷贝的项⽬⽹站,并把⽹址发给了我的⼏个朋友。我不知道
的是,有⼀个朋友还在著名的计算机极客论坛 Slashdot 上帮我发了这么⼀
个⼴告:

斯坦福的研究者 Philip Guo 开发了⼀个名叫 CDE 的⼯具,可


以⾃动将 Linux 程序及其所有依赖环境(包括系统级的库,字
体等等)打包,并能直接在另⼀台 Linux 计算机上运⾏,⽽不
需要做设置库和程序版本,或者解决版本依赖地狱问题这些⼯
作。他已经上传了⼆进制⽂件、源代码和视频截图。看起来应
该对集群/云部署和程序共享有很⼤帮助。

还不到 24 ⼩时,Slashdot 论坛上的那个帖⼦就有⼏百个回复了,我也开始


收到⼏⼗封邮件,都是来⾃世界各地下载并试⽤了 CDE 的 Linux 热衷者
70 第五年:峥嵘岁月

的。其中有⼀些珍贵的来信,⽐如:“我就是想说你太棒了!这个创意能够
实际起作⽤实在是令我折服。我会在我们墨西哥提华纳哲理27 的 Linux 社
区⾥推荐使⽤这个⼯具。”这些来⾃实际⽤户的未经修饰的、随感⽽发的赞
誉,⽐起那些来⾃研究同⾏们对我之前创意或者论⽂的表扬,对我⽽⾔意
味着更多。

从科研的⾓度来看,我的使命现在已经完成了:我成功地创建了 CDE
的⼀个初始原型⼯具,并证明它在⼀个实际⽤例上是可⾏的。⼤多数应⽤
⼯程领域⾥的通常观念认为,像 CDE 这样的研究型原型⼯具就只是⽤来
证明新颖想法的可⾏性的。研究者的⼯作就是创建出原型⼯具,实验性地
评估它们的效率,写论⽂,然后开始又⼀个项⽬。作为研究者,期待⼈们
像使⽤真实产品⼀样使⽤你的原型⼯具其实是很天真的事情;如果你的创
意很好,那门专业的⼯程师⾃然会适当地修改它,形成他们公司未来的产
品。最好的情况是,其他⼀些研究组可能会把你的原型⼯具作为基础,搭建
出他们⾃⼰的原型⼯具然后撰写论⽂并引⽤你的论⽂(例如,有⼗⼏个其
他⼤学的研究组拓展了 Klee ⼯具,并将他们改进的地⽅写成了论⽂)。但
却⼏乎很少听到⾮科研⼯作者在他们的⽇常⼯作中会使⽤原型⼯具。总之,
学术研究的⽬的是做出被验证了的想法,⽽不是精美的产品。
所以,当时正确的⾏动路线应该是提交⼀篇关于 CDE 的论⽂,然后开
始想⼀个新想法,实现出⼀个新原型⼯具,提交⼀篇新的论⽂,再如此反
复直到我有⾜够的内容来组成我的博⼠论⽂。我也确实提交并发表了两篇
关于 CDE 的会议论⽂(⼀篇介绍性的短论⽂和⼀篇后续的长论⽂)。但我
之后并没有像⼀个深谋远虑的研究者那样开始⼀个新项⽬,⽽是将我博⼠
第五年的⼤部分时间都投⼊到将 CDE 转变成⼀个有产品质量级别的软件
这⼀⼯作上去了。
27
邮件原⽂为 “hear’’,是 “here’’(这⾥)的常见混淆词,两者发⾳相同,故翻译采⽤了
“这⾥”类似发⾳的“哲理”。——译者注
博⼠研磨 71

我有很强烈的意愿让 CDE 使尽可能多的⼈受益。我并不愿意让 CDE


就此没落下去,沦为又⼀个刚够得上发论⽂的劣质原型⼯具。我知道改善
CDE 所付出的汗⽔将不会在科研界得到任何好处,甚⾄还有可能令我延期
毕业,毕竟我本可以⽤这些时间来开发⼀个博⼠论⽂⾥的新想法。但我不
在意,因为这⼀年剩下的时间我仍然有外源奖学⾦⽀持,拥有绝对的⾃由
去花时间做⼀个公益性质的软件维护者,⽽不是⼀个被研究基⾦所累的传
统型研究者。
回看我的第四年,我极度渴望地想让⼈们使⽤ IncPy,这也是为什么只
有可怜的三个⽤户时我还是很激动。尽管最终⼏乎没⼈接着使⽤ IncPy,我
想把它做成⼀个实际世界中⼯具的不理智愿望还是促使我接触到了伯克利
的 Fernando,⽽且也正是 Fernando 启发我做出了 CDE。现如今,在 2010
年 11 ⽉,我第五年开头的时候——在我的演⽰视频出现在 Slashdot ⽹站
上的⼏天内——CDE 就已经有了⼏⼗个⽤户,⽽且还可能拥有得更多。从
之前的反馈邮件来看,我意识到我做出了⼀个⼈们在多种我未曾预料到的
情况下都想使⽤的东西。⼀⾔以蔽之,CDE 引起了各种被依赖地狱所折磨
的 Linux ⽤户的共鸣。

我把第五年中的⼤部分时间都花在了修复 CDE 的漏洞上,使其能够


在纷繁复杂的 Linux 程序上顺利⼯作;润⾊说明⽂档、⽤户⼿册,以及常见
问题,使得它更易⽤;与世界各地的⽤户们邮件交流甚⾄是电话沟通;还
做了不少报告,并发了些“营销”邮件来吸引新⽤户。
这时(2012 年夏),CDE 已经被超过 10000 ⼈下载和使⽤了。我收到
了⽤户们的上百封邮件,⾥⾯包括反馈、新特性要求、漏洞报告,还有⼀
些有趣的轶事。尽管对商业软件产品来说,这并不是⼀个很⼤的数字,但
对仅由⼀个研究⽣维护的免费开源软件来说,这已经是⼀个很⼤的数字了。
给我发了邮件道谢,并述说他们是如何在⽇常⼯作中利⽤ CDE 消除
Linux 的依赖地狱问题的轶事的⽤户有以下这么⼏类:
72 第五年:峥嵘岁月

• NASA28 研究员(Ames 和 JPL 研究中⼼29 )

• 来⾃诸如植物⽣物学和医学信息学这些领域的科学家

• 将计算型实验部署到欧洲⽹格分布式计算架构30 中的科学家

• 软件公司进⾏实验代码原型设计的⼯程师

• 开源软件创建⼈和贡献者

• Linux 计算机系统管理员

• 在各种基于 Linux 的⾮兼容操作系统变种上运⾏程序的 Linux 爱好


• ⼤型反病毒软件公司的计算机安全分析师

• ⾮营利性技术项⽬“每个孩⼦⼀台笔记本电脑”中的程序员志愿者

• 需要发布他们的研究原型⼯具的计算机系的博⼠⽣

• ⼤学⾥开发诸如医学可视化和蛋⽩质结晶软件的程序员

• ⼤学⾥需要打包编程作业的助教

那⼏个⽉是到那时为⽌我博⼠⽣涯最愉快的⼀段时光,即使我知道我维护
软件的这些⼯作对我的博⼠论⽂不会有⼀点贡献。CDE 取得了初步成功之
后,我不再在意我是否会因为没有更多的论⽂,⽽延期⼀年或者⼏年才能
毕业;得知了我发明的软件提升了这么多⼈的计算体验,我感到⾮常满意。
28
NASA,即美国国家航空航天局(National Aeronautics and Space Administration)的
简称,是美国联邦政府的⼀个⾏政机构,负责制定、实施美国的民⽤太空计划与开展航空
科学及太空科学的研究。 ——译者注
29
NASA 华盛顿指挥部为 NASA 的最⾼管理机构,此外 NASA 还下设多个研究中⼼,
Ames 和 JPL 分别为埃姆斯研究中⼼(NASA-ARC),和喷⽓推进实验室(NASA-JPL)。—
—译者注
30
欧洲⽹格架构(European Grid Infrastructure)这⼀计划致⼒于利⽤⽹格计算技术在
欧洲提供⾼通量计算资源。——译者注
博⼠研磨 73

CDE 还让我实现了我长期以来的⼀个书呆⼦梦想:在⾕歌做⼀个由
YouTube 在线直播的科技报告31 。因为从读研究⽣⼀开始,我就喜欢在线
看有关各种学科的 Google 科技报告。我梦想着有⼀天我也能做这么⼀个报
告,但我也没抱太⼤希望,因为⾕歌似乎只会邀请⼀些知名的教授或者⼯
程师——⽽不是不知名的研究⽣——来做报告。
有⼀天我正在⽹上搜索和 CDE 相关的项⽬时,偶然发现我 2007 年暑
假在⾕歌实习时的实习经理最近在⼀个可重复性研究研讨会上发了⼀篇论
⽂。我给他发了封邮件,把 CDE 作为⼀个使可重复性研究变得⽅便的⼯具
推荐给了他,并询问他的同事们是否有兴趣试⽤⼀下。让我惊喜的是,他
给了我⼀个以眨眼笑脸结尾的回复,并邀请我去做⼀个报告:“我看了看你
的这个⼯具。看起来很有意思啊!你有兴趣来⾕歌做⼀个科技报告吗?我
会帮忙组织和宣传。不过不知道会有多少⼈来听,可能有 100 个,也可能
⼀个都没有;-)”
⽐起先前的报告,我花了更多的时间来准备在⾕歌的科技报告,因为
我知道这次报告会被录像。我的报告进展得很顺利,⽽且讲完以后⾕歌的
⼀个⼯程经理(我之前从未与他谋⾯过)还把我拉到⼀边,问了⼀些更细
节的后续问题。看得出他对缓解公司内部的 Linux 依赖地狱问题很感兴趣,
这也是为什么他喜欢我的报告的原因。他还给我提供了⼀个实习⽣职位,
我可以在即将来临的这个暑假来⾕歌开展有关 CDE 的⼯作。
我很⾼兴他能给我提供这个实习职位,也花时间深思熟虑了⼀番。我
们系的教授通常不⿎励博⼠后半期的学⽣去实习,因为他们希望学⽣们能
更专注于完成他们的毕业论⽂。并且,获得这个实习职位时,我还没有发
表过哪怕⼀篇能够⽤到博⼠论⽂中的第⼀作者论⽂(有⼏篇论⽂正处于审
稿阶段),所以我有点担⼼暑假离开斯坦福会给 Dawson 留下⼀个我并没
有认真对待发表论⽂和毕业的印象。然⽽,我内⼼的直觉又认为这是⼀个
31
⾕歌科技报告(Google Tech Talks)是⾕歌在视频⽹站 YouTube 上的⼀个草根节⽬,
⽤来向技术社区分享有趣的信息。
——译者注
74 第五年:峥嵘岁月

我不能拒绝的绝⽆仅有的合适时机:我可以获得⼀份很不错的薪⽔,在暑
假⾥继续开展我⾃⼰的开源项⽬⼯作。相反,⼏乎所有的实习⽣——包括
我 2007 年实习时——都只能在经理分派的公司内部项⽬上开展⼯作。我和
Dawson 聊了聊我这⼀左右为难的感受,他很⽀持我去实习,于是我接受了
这个实习邀请。
我在⾕歌度过了很棒的 2011 年暑假,把我⼏乎所有的⼯作⽇都投⼊到
提升 CDE、获得新⽤户、找到 Google 内的⼀些独创性的⽤途上去了。那个
暑假的部分时间,我还和⼀个⾕歌⼯程师开展了紧密的合作,他觉得 CDE
对他的⽇常⼯作很有帮助,这也是我修复新漏洞、改善⽂档的⼀⼤动⼒。
这时,我也没再继续想和 CDE 相关的新研究想法了:我只是研究细节并
继续改善 CDE。在暑期实习结束、我博⼠第六年开始时,我最终停⽌了在
CDE 上的全职⼯作。
在构成我博⼠论⽂的五个项⽬当中,CDE 是我最喜爱的,因为这⼀简
单优雅的创意最终变成了⼀个拥有超过 10000 个⽤户的实⽤⼯具。它是⽬
前为⽌从科研⾓度来说最不复杂的⼀个研究想法,但却是⼯作起来最令⼈
满意的⼀个,因为它和实际世界有着紧密联系。

回到我第五年开始时——那时距我 IncPy、SlopPy 和 CDE 的论⽂发


表还有很长⼀段时间——我计划了⼀个备份⽅案,以防我⾃⼰的项⽬失败。
我给我们系⾥的⼀个和我研究兴趣相仿的新任助理教授 Jeff 发了封冷邮件,
询问他是否愿意和我合作⼀个能够⽤到我博⼠论⽂⾥去的项⽬。我提到的
两个关键“卖点”是我有⾃⼰的资⾦⽀持,⽽且也愿意把投论⽂到他喜欢的
顶级会议作为⾃⼰的⽬标。⽽作为交换,他需要担任我的论⽂委员会的成
员。
和料想中的⼀样,他接受了我的提议。对他来说这是⼀个极佳的协议,
毕竟我们的出发点⼗分契合:我是⼀个需要发表论⽂来毕业的⾼年级学⽣,
⽽他是⼀个需要发表论⽂来获得终⾝教职的助理教授。更好的是,他不需
博⼠研磨 75

要使⽤他的研究经费来负担我的开销。⽽最好的⼀点则是我愿意做任何他
想要我做的项⽬,因为我原来的那些个⼈项⽬已经给了我⼀直渴望的研究
独⽴性。
我⽤这个计划来规避赌博的风险:如果我 IncPy、SlopPy 和 CDE 的
想法不能得以发表的话,那我⾄少还有论⽂委员会成员 Jeff 批准的⼀个“正
当”项⽬。Jeff 和我认为对我来说最好的策略就是,以他的另⼀位学⽣去年
创建的交互式数据格式重建⼯具 Wrangler 为基础,继续开展⼯作。
在第五年的末尾,我停⽌了在 CDE 上的⼯作,并花了两个半⽉来新
做了⼀些 Wrangler 的拓展功能。我的这个增强版本叫做“ProWrangler”,代
表 Proactive Wrangler。在实现了 ProWrangler,并请同学来做控制性的
⽤户测试从⽽评估了它的效率之后,我在 Jeff 和原始版 Wrangler ⼯具的
⼏个原创者的帮助下,写了⼀篇论⽂并投稿到了⼀个⼈机交互的顶级会议。
在 2011 年暑假进⾏到⼀半的时候,我收到了我们ProWrangler 的论
⽂被接收且审稿意见很不错的好消息。到这时为⽌,这个成果最⼤的贡献
者就是 Jeff 在论⽂中引⾔和评估结果解释部分的撰写⼯作。我们的⽤户测
试其实并没有展⽰出我们原本所期待的⽣产⼒提升效果。但不可思议的是,
Jeff 的专业写作和议论的谋篇布局技巧把这个⼏乎失败的⼯作变成了⼀个
惊喜的胜利。审稿⼈们很欣赏我们诚实地承认了评估环节的缺陷,并从中
提取出了有价值的东西的这⼀做法。毫⽆疑问,如果没有 Jeff 在写作修辞
⽅⾯的⽼练,我们的论⽂绝不会被接收。他有很多实践经验,在还是⼀个
博⼠⽣的时候,他就发表了 19 篇基本全都是顶级会议的论⽂,这是⼀个普
通博⼠⽣发表数的五到⼗倍。这也是获得⼀个像斯坦福这样⼀流⼤学的教
职所需要的硬性条件。

在我的整个第五年中,我⼀直得为四个项⽬——IncPy、SlopPy、CDE
和 ProWrangler——来仔细地分割时间来发展思路、实现原型⼯具、提交
论⽂、修改论⽂、再次提交论⽂,这四个项⽬的相关会议的论⽂提交截⽌
76 第五年:峥嵘岁月

时间遍布于整个这⼀年中。虽然我花了不少时间来培育 CDE 项⽬,但当


论⽂提交截⽌⽇期来临的时候,我还是得转⽽专注到其他项⽬的⼯作上去。
2011 年暑假时,这四个项⽬的论⽂都成功发表了,它们⼤都经过了好⼏轮
的论⽂修改。我也终于松了⼜⽓,因为我复杂的计划终于有了回报,⽽且
⼀个完整的毕业论⽂也似乎触⼿可及了。
第六年:尘埃落定

在我第五年快结束时——我去⾕歌夏季实习之前——我和 Dawson 见
了⼀⾯并问了问如果我想在接下来这⼀年毕业需要些什么。那时,IncPy 和
CDE 都作为⼆级会议论⽂发表了,SlopPy 是⼀篇研讨会论⽂,ProWrangler
的论⽂还在审稿中。Dawson 表达了担忧,他认为我的论⽂发表记录还不
⾜以毕业,所以我需要⼀个或者多个更实质性的贡献来形成我的博⼠论⽂。
他的期待似乎也是合理的,所以我的计划是在秋季回到斯坦福,花⼏个⽉
来做⼀些能够完成我的博⼠论⽂的新研究。但我担忧的是我已经在过去⼏
年的⾼度研磨中变得精疲⼒尽,再没有新的创意萌芽了。所以我又回到了
计划模式,想想有什么⽅法能完成最后这未知的、能使我毕业的⼯作。
作为我策略的⼀部分,我还需要找到第三个(也是最后⼀个)能够为
我的毕业做强有⼒担保的的论⽂委员会成员。我们系⼤多数的博⼠⽣不⽤
计划这么多,因为他们做的都是教授批准的项⽬。他们不⽤为其他两个论
⽂委员会成员是谁⽽感到压⼒,因为他们的导师会为他们的毕业担保,⽽
其他委员会成员通常也是会同意的。然⽽,我的情况却很特殊,因为我并
没有做 Dawson 有热情的项⽬,所以我也不可能指望他能由衷地认可我的
⼯作。有 Jeff 在我的委员会⾥能起到⼀点帮助,毕竟他个⼈也参与到了我
们 ProWrangler 的项⽬中,并且可以为它的合格性负责。但我仍然还需要
⼀名同意我毕业的委员会成员。
我最先给我之前在 MSR 的经理 Tom 发了邮件,向他提出了我的想法,
希望在 2011 年秋季到 MSR 实习⼏个⽉,做⼀个能够放到我的博⼠论⽂⾥

77
78 第六年:尘埃落定

去的新项⽬。我希望他加⼊我的论⽂委员会,这样我就可以把 2009 年暑假


实习时和他发表的三篇论⽂也放到我的博⼠论⽂⾥去。可惜他似乎对我的
这个想法不太感兴趣,我也就没有再进⼀步劝他了。
之后我又想了想将 SlopPy 从⼀篇研讨会论⽂拓展成⼀篇完整的会议
论⽂的可能性,这样它就“算得上”是我博⼠论⽂⾥的⼀个实质性贡献了。
之前在我第五年的时候,我和 MIT 的教授 Martin 聊过⼀次,正是 Martin
有影响⼒的论⽂直接启发了 SlopPy 这个创意,我和他谈了谈关于⼀起合
作把 SlopPy 拓展成⼀篇会议论⽂的事。他对这个合作很感兴趣,但是当
时我们并没有安排出时间表,因为我在这⼀年的末尾⼀直忙于 CDE 和
ProWrangler 的⼯作。不过现在,我发现如果我能利⽤第六年开始的⼏个⽉
时间和 Martin 合作,并让他加⼊我的论⽂委员会的话,这也许可以成为我
毕业的通⾏证。Dawson 也喜欢这个计划,因为(意料中的)他也曾经想过
如何把 Klee 之类的想法和 SlopPy 结合起来。我准备在暑假中期给 Martin
发邮件提出这个合作建议,不过在此之前,另⼀个更好的机会出现了,于
是我也没再继续这个计划。
当我在⾕歌开始我最后⼀次暑期实习时,我期望我可以在这⽆忧⽆虑
的三个⽉⾥完善 CDE,但我还是感到了⼀丝担忧,因为回到学校以后我的
毕业问题还是没有保证。我需要再有⼀个灵感的爆发,⽽这个灵感最后来
源于⼀个意想不到的地⽅。

2011 年夏天,我最终决定了毕业后就从学术界“退休”:我并不知道我
会选什么来作为⾃⼰的职业,但我并不打算在接下来这⼀年申请终⽣制的
⼤学教职⼯作。
我做出这个决定有两个原因:⾸先,我感觉我当前的论⽂发表记录还
不够令⼈印象深刻来让我获得⼀份不错的终⽣制教职⼯作。⼏个⽉之后当
我悲伤地看到⼏个发表记录⽐我更胜⼀筹的同学竟然都没有获得任何⼯作
时,我的这种感觉更为坚定了。当然,我还是可以试着做⼏年博⼠后(博
博⼠研磨 79

⼠之后的临时研究员),发更多的⽂章,然后再次申请教职⼯作。
但第⼆个、也是更为重要的⼀个原因让做博⼠后也对我毫⽆意义:我
特别有热情的那⼏类研究主题并不那么容易获得研究基⾦,因为它们不太
被现在的学术机构所认可。没有经费,就不可能给学⽣付⼯资。没有上进
的学⽣来在艰苦的苦⼒劳动中研磨,就不可能获得被认可的论⽂。⽽每年
没有⾜够量的发表数量,就不可能获得终⽣教职。就算是我获得了终⾝教
职,我还是需要新的经费来给新的学⽣发⼯资,来让他们帮助我实现出我
的想法;申请经费的这个循环永⽆⽌境。考虑到我的研究兴趣,我内⼼并
没有准备好在这些硬战中作⽃争,来让经费机构认真考虑我的提案。为了
说服同⾏审稿⼈接收我的论⽂,我已经度过了⾜够困难的⼀段时间;⽽经
费审查⼈会更严苛,因为他们掌管着⼏百万美元,也更愿意把钱拨给那些
做计算机科学科研中主流研究的同⾏们。
⼏年来我⼀直在思考离开学术界,⽽现在我觉得我有了合理的原因来
这样做:我领教了计算机科学中的“学术游戏”是怎么玩的,也知道我并不
想再继续玩下去了。在⼀封发给我的⼀位即将履新的助理教授朋友的邮件
中,我总结了⼀下我的感受:“通过过去的五年,我发现我更愿意做⼀个科
研的旁观者,作为⼀个新研究的持续不断的⽣产者的负担对我来说实在是
太重了。”
因为我的母亲是⼀位极其成功的教授,我的⽗亲也⾮常认同学术界,
所以告诉他们我的这个决定还是有些困难的。我觉得他们不能真正理解我
的想法;我怕他们觉得我是在现实中放弃⾃⼰,低估⾃⼰;我不把当⼀个
教授作为⼀个实际⽬标也有⼏年了。经常说到的学术界⼀⼤好处就是创造
性⾃由的诱惑,但我离开学术界的决定却实际上也在博⼠最后⼀年和找⼯
作时解放了我的思想,让我能在追寻我真正的职业热情时更富有创造性。

决定离开学术界后,随之⽽来的⼀个影响就是,在夏季我要出席做报
告介绍 IncPy、SlopPy 和 CDE 的三个学术会议上,我不⽤再忧愁该如何
80 第六年:尘埃落定

去“交际”。学术会议上⾼年级博⼠⽣、博⼠后,还有即将获得终⾝教职的教
授都会争相攀谈,以此来给资历深的同事们留下⼀个好印象。对这些资历
较浅的研究者来说,会议上的职业交际也是⼀个需要认真对待的全职⼯作,
因为他们初期的职业⽣涯和学术声誉都依赖于在这⽅⾯的良好表现。但由
于我已经从这种学术游戏中脱⾝,我也就不⽤再在意这些事,可以尽情享
受⾃我,不⽤再紧张和圆滑。
在其中⼀个会议的中间休息时,我发现 Margo 独⾃坐在那⾥,在她的
笔记本电脑上做些什么。读者可能还记得,我博⼠第四年的时候去圣何塞
的研讨会做报告,介绍我最初的 IncPy 论⽂时,第⼀次遇见了 Margo。我
内⼼辩论了⼀下要不要过去和她打个招呼,并重新⾃我介绍⼀下。我内⼼
有些担⼼她已经不记得我是谁了,况且我也没有什么有意思的东西告诉她。
但由于我马上就要从学术界“退休”了,我也没有什么闲谈的议程,所以就
算这个对话最后搞砸了,我也没有什么损失。于是我⾛了过去打了个招呼。
我提醒了她⼀下我们之前是如何见过⾯的,她也似乎还记得我。我简要地
告诉她我马上就要去做⼀个报告介绍我新的 CDE 项⽬,然后就要赶⼀班
飞机飞回加利福利亚。我们简短地花五分钟聊了聊 CDE,然后我就跑去做
我的报告去了。当天晚上到家之后,我给她发了封后续邮件,⾥⾯附了⼀
个CDE 项⽬⽹页的链接,因为想到可能她的学⽣会有兴趣在科研中使⽤
CDE。这只是我向同⾏们推荐 CDE 时常规的礼貌性邮件,因此我其实并
没期待她的后续关注。
两周之后,我惊喜地收到了⼀封来⾃ Margo 的邮件,她说她和她的学
⽣ Elaine 聊了⼀下我。他们两个都希望我博⼠毕业以后到哈佛⼤学去,以
博⼠后⾝份和他们⼀起⼯作⼏年。围绕 IncPy 和 CDE 项⽬的宽泛研究主
题,正好与 Margo 创建帮助计算型研究者更⾼产的⼯具的兴趣相⼀致。我
很⾼兴她给我提供这个职位,但这个机会对我来说没有多⼤意义,因为我
已经决定要离开学术界。再做⼀个博⼠后对我来说也没什么⽤,因为做博
⼠后的主要⽬的⼀般都是提升个⼈简历,以此增加获得⼤学教职⼯作的⼏
率的。
博⼠研磨 81

这时灵感又来了。由于我毕业前正迫切需要⼀个更实质性的项⽬和⼀
个论⽂委员会成员,我向 Margo 提出了这个反转提议:我询问我是否可以
在 2011 年秋季访问哈佛四个⽉,与她⼀起在⼀个项⽬上开展⼯作,⽽不是
博⼠毕业后去做博⼠后。我和她可以在 2012 年 1 ⽉提交⼀篇论⽂到⼀个
会议,并把这个项⽬作为我博⼠论⽂的最后⼀个组成部分。我还问了她是
否可以担任我论⽂委员会的最后⼀个成员。Margo 很喜欢这个想法,但她
已经没有⾜够的经费来⽀持我了,因为她还需要⽤经费⽀持她⾃⼰的学⽣。
我和 Dawson 聊了下,他很⼤度地愿意出经费⽀持我这⼏个⽉,即使我没
有在 Klee 上开展⼯作(我的外源奖学⾦那时已经到期了)。Margo 很⾼兴
地同意了这个安排,于是在 2011 年 9 ⽉我结束暑期实习之后,我就去了马
塞诸塞州的波⼠顿,开始了我研究⽣的第六年、同时也是最后⼀年的⽣活。
如果我没有积极地抓住幸运地降临在我⾝上的这些机会的话,研究⽣
最后的这段征途也不会变成可能。如果两年前 Robert 没有告诉我圣何塞的
那个研讨会,如果我没有投稿并做报告介绍了 IncPy 的论⽂,如果 Margo
不喜欢我的论⽂并且也没有把我介绍给 Elaine,如果我没有⼀直和 Elaine
保持联系,如果我在上个夏季介绍 CDE 的会议上没有主动和 Margo 再⼀
次打招呼,如果她没有给我发⼀封亲切的后续邮件,⽽我也没有冒险向她
提出不寻常的反转提议的话,那么我现在还在斯坦福,挣扎着四处寻找最
后⼀个项⽬和论⽂委员会的成员。

作为⼀个访问研究员,我在波⼠顿度过了⾮常快乐和⾼产的四个⽉。
景⾊的改变很提神:我可以⾼强度地专注于科研,回到家后也没有那些通
常的⽣活杂事。Elaine 帮我找到了⼀处绝佳的⼀居室公寓住宅,距离我的
办公室只有五分钟的步⾏距离,我还可以很容易地在校园⾥或者哈佛⼴场
买到⾷物。这个完美的起居安排让我得以全神贯注于我的⼯作,不受任何
的打扰。
我的第⼀个⽉基本都⽤来和⽼同学⽼朋友们社交了,因为我的母校
82 第六年:尘埃落定

MIT 就在哈佛附近。我还和 Margo 会⾯了⼏次,讨论了可能的研究想法。


她对我在她宽松的指导氛围下做⾃⼰的项⽬持开放态度,所以我也得到了
⼏乎全部的思考⾃由。然⽽,我也在头脑风暴中采取了⼀个务实的⽅式,因
为我想让她对我的项⽬感到兴奋,并强有⼒地⽀持我把它放到我的博⼠论
⽂中去。因此,我也读了她最近的⼀些论⽂和资⾦申请书来了解她的科研
理念,从⽽我可以让我的想法去迎合她的品味。这时,我已经懂得了保持
与⽼资历的合作者(以及论⽂审稿⼈)的主观偏好相⼀致的重要性,即使
我是在⼀个所谓客观的技术领域内做科研。
想了⼏个创意之后,我提出了个 Margo 喜欢的东西:⼀个⽤来监视
研究⼈员基于计算机活动并帮助他们组织实验和记录实验笔记的⼯具。这
是传统型电⼦实验室笔记本的⼀个创新性转折。Margo 开玩笑地建议到把
“BurritoBook”作为临时的研发代号来描述我们计划的这个⼯具,因为它⽆
缝地覆盖到了对⽤户常规⼯作流的活动监视中的很多层32 。后来 Elaine 把
它简称为“Burrito”,我也渐渐习惯这个简称,最终它也成为了官⽅的项⽬名
称。
当时,我还以为我 Burrito 的创意⾃发地来源于对⾃⼰的想法和 Margo
的偏好这⼆者的结合,但当我回顾了我之前的⼀些笔记后,我意识到类似
的创意其实已经在我脑⾥酝酿⼏年了。早在研究⽣⼆年级,当我想监控⼈
们是如何编程时,我就最初想到了类似 Burrito 的创意,后来在第五年⼀
开始我想拓展 IncPy 来记录基于 Python 的编程历史时,我又有了更为具
体的想法。我的研究⽣从始⾄终,我都⼀直以多种专门的形式记着研究
实验的笔记,来记录搭建原型⼯具和运⾏试验的过程,因此我个⼈也体
会到了和笔记记录相关的低效问题带来的痛苦。最后,虽然我并不是⼀
个 HCI(Human-Computer Interaction,⼈机交互) 研究者,但我第⼆年与
Scott 和 Joel、第五年与 Jeff ⼯作时的⼈机交互训练给了我对于⽤户需求
的敏锐敏感性,这对我对 Burrito 的设计也影响深远。
32
“Burrito’’ 意为墨西哥卷饼,是⼀种将⾁、⾖、⽣菜、碎奶酪等⾷品和各种酱料放在墨
西哥薄饼上,并把饼卷起来完全包紧的⾷物。Margo 取名的含义应该是⽐喻这个项⽬涵盖
了⽤户⼯作流中很多不同的⽅⾯,正像卷饼中包含了各种⾷材⼀样。——译者注
博⼠研磨 83

我花了⼏个星期拟出了 Burrito 的⾼层⾯计划,并与 Margo 讨论了下


初期的设计细节。很多对初始想法的改进来⾃于我对计算型研究者⼯作时
的观察,和对他们管理各种各样的实验笔记、代码,以及数据⽂件时所⾯
临挑战的采访;我⼤多数的观察样本都是 Elaine 在 MIT 和哈佛的多个科
学实验室的朋友。在 Rob 领导的实验室组会上做了⼀个关于 Burrito ⽅案
的报告之后,我还获得了⼀些有⽤的早期反馈,这位 Rob 就是在我博⼠⼆
年级刚开始时⿎励我去和 Scott 与 Joel ⼯作,追寻我的⼈机交互兴趣的那
个 MIT 教授。

社交时间结束之后,就是研磨的时间了。在 2011 年 11 ⽉初,我在研


究⽣阶段最后⼀次转变成编程的野兽,来把我 Burrito 的想法实现成⼀个
能⼯作的原型⼯具。我连续 72 天进⾏了编程⼯作,在这两个半⽉中只间
歇性地休息了 5 天。这是迄今为⽌我所承受的最长的、⼏乎是痛苦级别的、
不停歇的、⾼强度⼯作。我第五年时初始时 CDE 的爆发式⼯作也才是 21
天的研磨⽽已,⽽这次却⼏乎是那次的三倍。我⼯作⼀直贯穿了感恩节、圣
诞节、新年夜,不顾⼀切地专注于让 Burrito ⼯作得⾜够好的⽬标,从⽽能
在 2012 年 1 ⽉之前提交⼀篇会议论⽂。
这⼏个⽉⾥,我变成了⼀个反社会、坏脾⽓的⼈,躲避⼀切纷扰,深深
地沉浸在⾃⼰的⼯作中。我所思考的⼀切就只有计算机代码;除了每周与
Margo 会⾯报告进展时,我⼏乎不说连贯的英⽂句⼦。虽然我的外表和动
作都像⼀个准⼈类(即,不修边幅、⾐冠不整)
,我的内⼼状态却是欣喜若
狂的。我每天都要编程和调试⼗余个⼩时,但我的脑⼦还是很放松的,因
为我的技术技艺应付所⾯对的挑战已经是游刃有余了。这时我已经积累了
⾜够多的经验来设计、实现和“营销”研究型原型⼯具了,我也有信⼼我的能
⼒能让这个项⽬成功⼯作。⼀路上我都获得了 Margo 的极好反馈和⽀持,
因此我觉得她会强烈⽀持我把 Burrito 放到我的博⼠论⽂中去。经历了研
究⽣早期在不确定并且失败的项⽬上数年的研磨之后,我现在感到精⼒充
沛,并朝⼀个我知道能够实现的⽬标紧张地⼯作着。
84 第六年:尘埃落定

2012 年 1 ⽉中旬前,Burrito 原型⼯具已经具有了个良好的状态,于


是我进⾏了⼀个⾮正式的评估,撰写了⼀篇论⽂,并按计划将其投稿到了
⼀个会议。我休息了⼏天,重回正常⼈的状态,与波⼠顿的朋友们告别,然
后飞回到加利福利亚,迎接我博⼠⽣涯的尾声。

关于⼀篇博⼠论⽂是如何形成的普遍观念是,⼀个学⽣灵光⼀现,受
到启发,提出了某个有洞察⼒的聪明的想法,然后就花⼏年时间,边啜饮
上百杯的拿铁和卡布奇诺,边撰写鸿篇巨著。在众多科学和⼯程领域,这
种看法是完全不准确的:“撰写”⼯作仅仅是把⼀个⼈已发表的论⽂合辑成⼀
个单独的⽂档,并填充⼀些引导性和总结性的章节内容。在⼀个学⽣坐下
来“写”毕业论⽂之前,所有的挥洒汗⽔的⾟苦劳动其实都已经做完了。
在我们系,⼀个博⼠⽣⽣涯最重要的⾥程碑就是他们的导师向他们竖
起拇指、让他们开始撰写论⽂的那⼀刻。这个⼿势代表这个学⽣已经做了
⾜够的⼯作——通常是发表了主题⼀致的两到四篇会议论⽂——并且有资
格在⼏个⽉内毕业了。
当我 2012 年 1 ⽉回到斯坦福时,我的⽬标就是尽快获得 Dawson 那
⾄关重要的竖起的拇指。我写了⼀个短⽂档,列举了⼀些证据表明为什么
我觉得我做的⼯作够得上毕业了。我的论据很简单:我创建了五个新颖
的软件⼯具来改善计算型研究程序员的⼯作流——IncPy、SlopPy、CDE、
ProWrangler 和 Burrito——并从我的⾝体⼒⾏的⼯作中发表了 1 篇顶级会
议论⽂,3 篇⼆级会议论⽂,以及 3 篇研讨会论⽂(Burrito 的那篇会议论
⽂投稿最终被拒收了,所以我们重新投稿并发表在了⼀个研讨会上)
。还有
⼀个额外的收获就是,我的另外两个论⽂委员会成员,Jeff 和 Margo,都会
认可我的毕业,因为我和他们⼀起成功地完成了项⽬(分别为 ProWrangler
和 Burrito)。我把这个⽂档通过邮件发给了 Dawson,然后焦急地等待这他
的回复。我觉得我的理由还算挺充分的,但我还是不确定他会不会希望我
再多做⼀些⼯作才同意我毕业。让我⼤松⼀⼜⽓的是,他很快就向我竖起
博⼠研磨 85

拇指,也是这时我知道我已经实质上完成研究⽣的学业了。
我花了接下来两个⽉的时间把我的论⽂合并成⼀个 230 页的题为促进
研究型编程的软件⼯具的⽂档。以下是我博⼠论⽂第⼀页的摘要(总结):

研究型编程是⼀种编写程序,以期对数据进⾏深⼊理解为⽬标
的编程活动。上百万名科学、⼯程、商业、⾦融、公共政策以及
新闻业的从业⼈员,还有众多的学⽣和计算机爱好者,都在⽇
常的⼯作中进⾏着研究型编程。

我的论⽂即是,理解了研究型编程中所⾯临的独特挑战后,就
有可能应⽤动态程序分析,混合主导推荐系统,和操作系统级
别的追踪技术来使研究型编程更⾼产。

本论⽂刻画了研究性编程的过程,描述了研究型编程所⾯临的
典型挑战,并提出了五个我所开发来解决⼀些关键挑战的软件
⼯具。1)ProWrangler 是⼀个交互式的图形⼯具,可以帮助研
究型程序员在分析前对数据进⾏格式重置和清洗。2)IncPy 是
⼀个 Python 解释器,可⽤来加速数据分析脚本循环,并帮助程
序员管理代码和数据的依赖。3)SlopPy 是⼀个 Python 脚本,
可以⾃动地使已有脚本容错,从⽽也使数据分析脚本循环提速。
4)Burrito 是⼀个基于 Linux 的系统,可以帮助程序员组织、标
注和回顾之前实验中的洞察⼒。5)CDE 是⼀个软件打包⼯具,
它使得部署、存档和代码共享更加容易。综上所述,这五个⼯
具使得研究型程序员能够通过减轻计算机数据管理和数据起源
⽅⾯的负担,来更快地迭代和发现可能的洞察⼒。

我花了很多精⼒来增添⼀些导⼊性和总结性的章节,让我的论⽂不仅仅是
五个我前⼏年搭建的单独⼯具的说明。在我的撰写过程中,Jeff 和 Margo
都给了我很好的反馈,告诉我应该如何以⼀个更实质性的知识⾓度来搭建
叙述我研究贡献的框架。尽管我知道最终不会有什么⼈来读我的博⼠论⽂
——构成博⼠论⽂的那些单独的论⽂共容易获得——我还是很满意能将我
86 第六年:尘埃落定

所有的创意、洞察⼒、⼯具说明和评估结果聚集在⼀起,形成⼀篇紧密结
合在⼀起的⽂档。

我把我的⼜头答辩安排在了 2012 年 4 ⽉ 23 ⽇。最⼤的挑战是找到⼀


个五位教授(我的三个论⽂委员会成员和另外两个答辩委员会成员)都有
时间的两⼩时。Margo 那⼀周正好来加利福利亚参加⼀个会议,所以我围
绕她的⽇程来安排答辩。在我们系,⼜头答辩的形式是学⽣先做⼀个⼩时
的公开报告,总结他的毕业论⽂研究,接着的⼀个⼩时是私下会议环节,由
委员会询问测试性的问题。之后,委员会投票决定是否通过这个学⽣的毕
业论⽂。实际上,⼏乎没有⼈的答辩会不通过,除⾮他的表现实在是太差
了:委员会通常会先通读⼀遍学⽣的毕业论⽂,同意之后才让会学⽣参加
答辩,所以这应该不会有什么意外。
在⼜头答辩上我没有⾜够的时间介绍全部五个项⽬,因此我选择介绍
三个项⽬,其中每⼀个都是和论⽂委员会中的⼀个成员合作的:与 Dawson
合作的 IncPy,与 Jeff 合作的 ProWrangler,还有与 Margo 合作的 Burrito。
⼤多数博⼠⽣都只和他们的导师合作发表⽂章,所以能够展⽰和所有三位
委员会成员合作的研究是⼀份难得的荣幸。我也很⾼兴很多朋友和之前的
同学——包括 Scott、Joel、Peter、Robert、Greg 和 Fernando——都来出
席了我的答辩。
尽管我研究⽣期间已经做过了⼗⼏个学术报告,我答辩时还是⽐以往
更紧张,因为我认识听众⾥的每⼀个⼈。很奇怪,当⼀个房间⾥都是陌⽣
⼈⽽不是熟悉的⾯孔时,我反⽽感觉更轻松⼀些。私下会议环节没有我预
想中的那么累⼈,但我的委员会确实提出了⼀些最终帮助我改善了毕业论
⽂的问题和建议。
我通过了答辩以后,我的委员会成员和朋友们都很有礼节地以⼀个亲
切也是预想中的⽅式向我表⽰了祝贺。我最为珍视道贺来⾃于⼀个我只和
他说过⼀次话的资深教授。他出现在我的答辩会上时我还有⼀丝惊讶,因
博⼠研磨 87

为我觉得他不会对这个主题感兴趣。答辩之后,他发邮件赞扬了我的报
告:“我想说我⾮常喜欢你的答辩,⼀部分是因为这个⼯作的创造性,⼀部
分是因为这是⼀个准备充分的报告,还有⼀部分是因为我前⼀年都在做研
究型编程⼯作。”

从科研的⾓度来看,在我那⼀年的 26 个斯坦福计算机系的博⼠毕业
⽣中,我觉得我是极其平庸的⼀个,因为我⼤多数的论⽂都只是⼆级会议,
也没有很好地被学术圈所认可。我的博⼠论⽂也是尴尬地横跨了⼏个计算
机⼦领域——编程语⾔、⼈机交互和操作系统——因此我的⼯作也没有被
其中任⼀领域的顶级学者认真对待。
尽管没有得到主流的认可,我还是觉得我的博⼠⽣涯画上了圆满的句
号,因为我成功地让我的创意结出了果实,并且以⼀个我⼗分引以为豪的
博⼠论⽂成功毕业。我的博⼠采取的是⼀个⾼度创业型的路线——伺机地
寻找项⽬和合作者,在⾮传统和遵守惯例⼆者中间又辟出了⼀条路使得我
的论⽂得以发表。我感到⾮常幸运能够以⼀种富有创造性的⽅式来安排我
的博⼠⽣涯;如果没有在斯坦福六年中前五年的外源奖学⾦⽀持,我不会
有如此多的⾃由。
最终,我的博⼠论⽂也像⼤多数博⼠论⽂那样,将⼈类知识的边界向
外拓宽了⾮常⾮常⼩的⼀点。我做的这五个原型⼯具包含了⼀些有意思的
想法,可以被将来的研究者们加以改进。其实,如果将来的研究⼈员能够
引⽤我的论⽂作为粗糙的初始研究的例⼦,并以此说明为什么他们的技术
更⾼端,那么我将⾮常荣幸。这也是科学研究是如何⼀步⼀步向前推动的:
后⼀代总是在前⼀代想法的基础上建造⾃⼰的⼯作。
然⽽对我来说,我论⽂最重要的贡献不是那五个特殊的原型⼯具,⽽
是我发现了⼀个普遍的问题——迎合⼤量且⽇益增长的计算型研究程序员
的需求的软件⼯具⾮常缺乏——并提出了⼀些⼈们可以⽤来提升⽣产⼒的
早期原型解决⽅案,据我所知,我是第⼀批这样做的计算机科学专业的博
88 第六年:尘埃落定

⼠⽣之⼀。我相信这些思路在接下来的⼗年会变得尤为重要,但由于我要
从学术界退休了,我也就不再致⼒于直接推销它们了。
因为我的博⼠论⽂主题离成为主流还有很长⼀段距离,所以想以它⾥
⾯的想法为基础,继续发展⾃⼰学术⽣涯的初级教授或者科学家需要奋⼒
拼搏,来获得资⾦会机构的认可,因为这些⼈是新项⽬⽴项的把关⼈,还需
要获得他们⽼资历同⾏的认可,因为这些⼈是论⽂发表和终⾝制审核的把
关⼈。如果有任何⼈想投⼊到这个荣耀的战役中去,我很愿意帮助他,但
我却不够勇敢把我⾃⼰的⽣涯放到这上⾯去。相反,我现在计划去追求⼀
个完全不同的职业热情,可能某⼀天它会成为我另⼀本书的主题:-)

在准备撰写本书的过程中,我翻阅了很多原来的研究笔记。有⼀天,我
发现了如下这个关于⼀个我有兴趣深⼊研究的话题的⼩⽚段:

研究⼀下开发⼀些⼯具来提供给⾮软件⼯程师,或者说是⼯作
中需要编程的科学家、⼯程师和研究⼈员——他们不会在意参
数、模型检验等等——他们只需要实⽤、轻量级、并且概念上简
单的⼯具,能够随时就能拿来⽤。

让我吃惊的是这个笔记是我六年前写的,也就是 2006 年夏天我即将要开始


我在斯坦福的博⼠⽣项⽬的时候。这是⼀段漫长、迂回、⽽且不可预料的
旅程,但我还是由衷地⾼兴我能够把这⼀宽泛的话题——这⼏年来吸引我
的若⼲话题中的⼀个——变成了我的博⼠毕业论⽂。如果没有罕见的各种
好运组合在⼀起,没有我个⼈的主动性,没有来⾃慷慨的朋友们那些富有
洞察⼒的推动,以及接近⼀万个⼩时的研磨,这个成就不可能变为现实。
结语

如果你不打算做⼀个教授,那为什么还要受累读⼀个博⼠呢?这个常
见问题⾮常重要,因为⼤多数博⼠⽣都不能获得⼀份像他们⼤学⾥的指导
者以及⾏为榜样——终⾝制教授——⼀样的⼯作。空缺的教职职位并不多,
因此⼤多数博⼠⽣是在为⼀份他们永远不会得到的⼯作⽽训练。(想象⼀
下,如果医学院或者法学院的毕业⽣不能分别得到医⽣和律师的⼯作,那
该多令⼈惶恐。

那么为什么会有⼈在不打算做教授的情况下,还花六年甚⾄更多的时
间来攻读⼀个博⼠学位呢?每个⼈的动机不尽相同,但⼀个可能的答案是,
博⼠⽣项⽬给某种类型的⼈提供了⼀个安全的环境,驱使他们超越他们精
神上的极限,最终变得更强。⽐如,我六年的博⼠训练让我⽐起还是⼀个
研究⽣新⽣时,变得更加智慧、有悟性、坚韧、刚毅、专注、有创造⼒、有
⼜才、感觉敏锐,并且专业地⾼效。(两个明显的警⽰:不是每⼀个博⼠⽣
都能如此受益——很多⼈也因挣扎⽽变得厌倦、疲惫不堪。当然,也有很
多⼈在没有读博⼠的情况下,同样培养出了这些积极的品质。)
有个不太恰当的类⽐:为什么有⼈会花数年的时间训练,来在类似铁
⼈三项这样的比赛中超过他⼈——铁⼈三项是⼀项极度折磨⼈的比赛,包
括 2.4 英里的游泳,112 英里的自⾏车骑⾏,以及 26.2 英里的长跑——⽽
却不打算成为⼀个职业的运动员?简⽽⾔之,这种经验驱使⼈们突破他们
⾝体上的极限,最终变得更强。从某种意义上来说,读博⼠就是智⼒上的
⾼强度体育训练。

89
90 结语

下⾯是我博⼠⽣涯中学到了最值得记住的⼆⼗条经验。我分享出来的
原因不是为了主动给学⽣们提供⼀些建议,毕竟每个博⼠⽣的经历都有很
⼤的不同;也不是因为要⿎励⼤家去读博⼠,毕竟这些经验可以来⾃多种
地⽅。这个章节其实是作为我读博⼠过程中收获的总结。

1. 结果胜过目的:如果⼀个⼈做出了很好的结果,那么没有⼈会去问他
⼀开始的⽬的是什么。我研究⽣阶段从来没有过所谓的纯粹知识上的
动机:我开始读博⼠是因为我对⼯业界⼯作的不满意,给⾃⼰施压来
想出项⽬是出于对不能按时毕业的忧惧,帮助 Scott、Joel 以及 Jeff
做⼈机交互的项⽬是为了对冲我赌博的风险。但我最终成功了,因为
我做出了结果:五个原型⼯具和若⼲篇论⽂。在这个过程中,我培养
起了我对项⽬的热情,并为我的项⽬感到⾃豪。相反,我知道⼀些有
着最理想主义⽬的的学⽣——梦想着并热切地希望彻底变⾰他们的领
域——但他们没做出什么结果,最终他们的幻想也破灭了。

2. 输出胜过输入:获得博⼠学位的唯⼀途径就是成功地产⽣科研输出
(例如,发表的论⽂),⽽不仅仅是靠上课或者读他⼈的论⽂这些吸收
来输⼊。当然,⼀个⼈能产出成果之前的吸收也是有必要的,但也很
容易过分吸收。我第⼀年时就曾掉⼊过这种陷阱,我漫⽆⽬的地读了
⼏百篇论⽂——⼀种狂欢式的吸收——却未从这⼀没有⽅向的阅读中
综合出任何有⽤的东西。相反,对毕业论⽂项⽬的相关⼯作⽂献的搜
索则有效得多了,因为我的阅读是紧紧朝着⼀个清晰的⽬标的:找出
竞争者,以及可以修改加到我⾃⼰的项⽬中的好创意。

3. 找到相关的信息:我的博⼠训练教给了我如何在每⼀个时刻,⾼效地
找到我所需要的最相关的信息。与传统的课堂学习不同,当我做科研
的时候,我并没有教材,没有课堂笔记,没有授课教师提供给我的标
准答案。有时候我⼯作所需要的东西会在⼀篇研究论⽂⾥,有时候会
博⼠研磨 91

在⼀段陈旧的计算机代码⾥,有时候会在⼀个隐蔽的⽹站上,有时候
又会在某个需要我找到并寻求帮助的⼈的⼤脑⾥。

4. 创造幸运的机会:整个研究⽣阶段,我获得了好⼏次不可思议的好运,
最后⼀年我得以到哈佛和 Margo ⼀起⼯作时,是我好运的顶点。但
如果我没有反复地把我⾃⼰和我的⼯作展⽰给他⼈的话——作报告,
和同⾏们交流,寻求并提供帮助,表达谢意,这些幸运的机会也并不
会出现。其实我的⼤多数努⼒最终都没有变成意外的收获,但如果我
没有持续尝试,那么我可能也不会这么幸运。

5. 博弈游戏:作为⼀个博⼠⽣,我处于社会等级的底层,没有能⼒去改
变这个“学术游戏”。具体⽽⾔,尽管我惧怕我的论⽂⼀次又⼀次地被
拒,我也没有其他办法,只能继续学着怎么尽⾃⼰所能去玩发表论⽂
的游戏。然⽽,我很⾼兴我在我研究⽣的后半期,⽤⾃⼰独特且有创
造⼒的⽅式来玩这个游戏,从事着很多⾮传统的项⽬,与此同时也很
好地遵守着发表和毕业的“规则”。

6. 从底层做起:在了解了年长博⼠⽣、教授以及其他⽼资历同事们的动
机和个性之后,我也能够把我⾃⼰的研究动机提上他们的⽇程了。例
如,当我通过阅读 Margo 的论⽂和资⾦申请书,知道了她的研究品
味之后,我想出了⼀个我和她都很有热情的项⽬创意(Burrito)
。如
果我对她的兴趣⼀⽆所知,那么想出⼀个她也喜欢的创意就会困难得
多了。

7. 教授也是人:尽管这⼀点听起来⼗分显然,但⼤家却很容易忘记教授
并不是⽆情的科研⽣产机器这⼀点。他们也是正常⼈类,有着⾃⼰的
品味、偏好、兴趣、动机、不⾜和恐惧。即使是备受尊敬的科学智者
也有他们主观的、不理性的怪癖。从⼀个学⽣的⾓度来说,由于教授
是学⽣发表论⽂、毕业和未来⼯作的把关⼈,因此对教授既是专家也
是⼈类这⼀点⼼领神会很重要。
92 结语

8. 争取受人欢迎:当我和喜欢我的⼈⼀起⼯作时,我更⾼兴也更⾼产。
当然,让所有同事都喜欢⾃⼰是不可能的,因为⼤家的个性不可避免
的有着差异。总的来说,我努⼒地找出天性就和我相处融洽的那些⼈,
然后再花时间来培养这份关系。

9. 尽一些义务:作为⼀个资历较浅的实验室成员,尽⼀些义务、做⼀个
“好⼠兵”是很有必要的,⽽不是从第⼀天就开始提⼀些蛮横的要求。
当还是 MIT 的本科⽣和硕⼠⽣的时候,我就履⾏了我的义务,我在
⼀个教授同意的、有资⾦⽀持的项⽬上⼯作了两年半,⽽不是尝试创
建⾃⼰的项⽬;我得到了满意的回报,被排名最⾼的⼏个博⼠⽣项⽬
录取,还获得了两个外源奖学⾦,可以⽤来⽀付我五年的研究⽣费⽤。
后来,当我刚来到斯坦福时,我也履⾏了义务,在 Klee 项⽬上⼯作
了相当长的⼀段时间,直到最后退出。我也花了⼏年时间来弄清楚什
么时候要听从权威⼈⼠安排,什么时候可以稍稍⾃私地推进⾃⼰的议
程。

10. 拒绝不好的默认安排:默认安排通常没有为底层⼈员(例如博⼠学⽣)
的最⼤利益考虑,所以知道什么时候拒绝,并请求换⼀个不同的安排
是很重要的。当然,并不会有针对学⽣的邪恶阴谋;默认的安排只是
⾃然地设定下来使当权者收益。举个例⼦,像 Dawson 这样的知名终
⾝教授,很轻松就可以获得为期数年的资⾦来⽀持学⽣,让他们在类
似 Klee 的“默认”项⽬上开展⼯作。只要不时的有论⽂发表出来,那么
这个教授和他的项⽬都会被认为是成功的,⽽不会有⼈在意有多少学
⽣在路途中摔倒和失败。学⽣们必须⾃我判断他们被默认安排的项⽬
是否有前景,如果没有的话,就需要想办法以⼀种合适的⽅式退出这
个默认项⽬。

11. 知道什么时候该退出:在第三年结束时退出 Klee 项⽬是我研究⽣阶


段最关键的⼀个决定。如果我没有退出 Klee,那么就不会有 IncPy,不
会有 SlopPy,不会有 CDE,不会有 ProWrangler,也不会有 Burrito;
博⼠研磨 93

有的只会是三年或者更长时间的痛苦的增量式进展,以及随之⽽来的
⼀个“勉强的毕业”。

12. 从失败中站起来:失败在研究⽣阶段是不可避免的。我前三年所做的
东西都没有被放到我的毕业论⽂中去,并且我后三年尝试的很多⽅向
也都是死路⼀条。研究⽣院是⼀个锻炼从失败中重新站起的安全环
境,因为⽐起实际⼯作中的失败,研究⽣阶段失败带来的风险是⽐较
低的。在博⼠阶段的前⼏年,我经常因科研失败⽽忧虑、⼼烦意乱、
失去勇⽓。但当我变得成熟后,我学会了化悲愤为⼒量,也就是我所
说的想要做出结果的狂怒。每⼀次被拒、怀疑和批评都鞭策我更加努
⼒地⼯作来证明那些否定我的⼈是错误的。研究⽣头⼏年的失败是我
后⼏年的成功之母。例如,第⼆年时我没能在⼀旁观察专业程序员的
经历教会我应该向谁、且如何寻求这⽅⾯的帮助,所以我后来就成功
地观察了计算型研究者的⼯作,这也对我的博⼠论⽂⼯作有所启发;
还有,我没能获得⼤批⽤户来使⽤ IncPy 的失败经历也教会我应该如
何更好地设计和推荐⾃⼰的软件,因此我才获得了 10000 个 CDE 的
⽤户。

13. 与圈内人结盟:当我与专业的圈内⼈合作时,我发表论⽂变得更为容
易了,⽐如我第⼆年时与 Scott 和 Joel 的合作,在 MSR 实习时与
Tom 的合作,还有第五年时与 Jeff 的合作。他们知道在各⾃的⼦领
域发表论⽂所要求的各种交易技巧;我和这⼏位圈内⼈共同撰写的五
篇论⽂全都是第⼀次投稿就被接收了。然⽽,作为⼀个圈外⼈奋⼒拼
搏——第⼆年与 Dawson 的经验性软件衡量研究,和之后我独⾃的毕
业论⽂项⽬——也是很有收获的,尽管也更令⼈沮丧,因为论⽂总是
⼀次又⼀次地被拒收。

14. 多做报告:在整个博⼠阶段中,我做了⼆⼗余个科研报告,从在⼤学
实验室组会上的⾮正式报告,到⼤型酒店舞会厅的会议报告。例如我
在 IncPy 的项⽬初期的⾮正式报告,就有助于我获得设计灵感和意见
反馈;我在提交论⽂前做的报告,有助于我发现需要在论⽂中修改的
94 结语

公认的缺陷。此外,每次报告也是个绝佳锻炼机会,有助于我提升我
的公共演讲技巧,和应对偶尔带有敌意的提问的技巧。最后⼀点,作
报告有时候还能点燃⼀些后续讨论的⽕花,进⼀步获得⼀些意外的收
获:⽐如,听了我关于 IncPy 的第⼀个报告之后,⼀个研究⽣同学通
过邮件发给我了⼀个 Fernando ⼀篇有关科学中的 Python 的博⽂链
接;那封邮件⿎励我去接触⼀下 Fernando,也正是 Fernando 后来启
发了我改进 IncPy,然后又创造出了 CDE。过了⼀年之后,我介绍
CDE 的⾕歌科技报告直接给我带来了⾮常棒的 2011 年暑期实习机
会。

15. 推销,推销,再推销:我把⼤部分研究⽣⽣活的时间都花在了埋头苦
⼲、⾟苦研磨、实现出研究创意上,但我意识到令⼈信服地将⾃⼰的
⼯作推销出去才是发表、获得任何、顺利毕业的关键。因为论⽂发表
这⼀游戏中有着⽩热化竞争的天性,将接收和拒收区分开来的因素往
往就是⼀篇论⽂的“营销技巧”是如何吸引审稿⼈的品味的。因此,如
果没能将⾃⼰研究重要性的蓝图适当地推荐给⽬标听众——资历深的
学术界同⾏,那么上千个⼩时的研磨就可能会付之东流。更为普遍的
是,⼀个领域中有很多⼈都有好多想法,⽽更好的推销者会更有可能
让他们的创意被现有圈⼦所接受。作为⼀个地位较低的学⽣,将我的
想法“推销”出去的⼀种最⾏之有效的⽅法,就是让有影响⼒的⼈(⽐
如像 Margo 这样的知名教授)对我的项⽬⾜够有热情,让后让他代
表我去宣传提升它们。

16. 慷慨地提供帮助:博⼠⽣经历中我最喜欢的⼀个特征就是我并没有⼀
直处于和同学们的竞争中;并不是他们做得越好,我就会做得越差,
反之亦然。因此,我们中的⼤多数都慷慨地互相帮助,尤其是在遭受
外部审稿⼈严厉的批评之前,就互相给予关于想法和论⽂草稿的反
馈。

17. 寻求帮助:在过去的六年⾥,我变得善于决定何时、找谁、以及如何
来寻求帮助。具体地说,每当感觉受困时,我就会去寻找能够帮我脱
博⼠研磨 95

离困境的专家。寻求帮助可能只需要简单地找⼀个系⾥的朋友,也可
能需要有⼈介绍,或者甚⾄需要发冷邮件给陌⽣⼈。

18. 表达诚挚的感谢:这些年来,我学会了向给予过我帮助的⼈表达感谢。
尽管获得博⼠学位⼏乎是⼀个⼈的战⽃,但没有其他⼗多个同学的慷
慨帮助,我也不能完成这⼀任务。⼈们发现他们的建议或者反馈带来
了具体的益处之后会感到很⾼兴,因此只要可能,我都会努⼒答谢每
⼀个⼈具体的贡献。甚⾄⼀个简短的感谢邮件也会很有帮助。

19. 想法唤起想法:正如我第⼀年结束时发现的那样,凭空想出⼀个实质
性的想法⼏乎是不可能的。想法总是构建在其他想法之上,所以找到
⼀个坚实的起点很重要。⽐如,IncPy 和 SlopPy 的动机都来⾃于我
2009 年在 MSR 实习时所碰到的恼⼈的和编程相关的低效问题。⼀年
之后,我的⼀部分拓展 IncPy 的想法,再加上 Fernando 对可重复性
研究的洞察⼒,还有 Dawson 对 Linux 依赖地狱的点拨,⼀起促成了
CDE 的创建。当然,创意有时候也需要数年时间才会开花,通常是在
经过了⼏次错误的开端之后:我在第⼆年期间和第四年末尾时都考虑
过类似 Burrito 的想法,但直到第六年我才得以把这些模糊的想法固
化起来,形成⼀个真正的项⽬。

20. 辛苦且聪明地研磨:这本书的书名叫博⼠研磨,因为没有哪个博⼠⽣
未经过上万⼩时单调乏味、讲究实际的研磨。这段旅程让我明⽩,如
果没有极端的努⼒来将创意变成现实,那么富有创造⼒的想法也毫⽆
意义:出现在办公室,⼀屁股坐在位置上,开始⾟苦地研磨,保持不
⼤但是持续的进展,休息⼀下来反思和恢复精神,接着又⼀天天地循
环往复,连续超过两千天。然⽽,聪明地研磨和⾟苦地研磨同等重要。
看见有的学⽣盲⽬地拼命完成不会得到有利结果的任务真令⼈悲伤:
从⼀个错误的⾓度切⼊⼀个科研问题,使⽤错误的⼯具,或者做着⽆
⽤的差事。聪明地研磨需要有感知⼒、直觉和⼀种乐于寻求帮助的意
愿。
96 结语

我回答⼀个含 F 开头单词的问题来结束这⼀章:读博⼠有趣(fun)
吗?
博⼠⽣经历的某些⽅⾯⾮常有趣:提出新的想法很有趣;在⽩板上写
下软件设计的草稿很有趣;和同事⼀起喝咖啡、探讨想法很有趣;会议期
间和有意思的⼈⼀起聊天很有趣;作报告并激起热烈的讨论很有趣;收到
来⾃世界各地 CDE ⽤户的热情洋溢的邮件很有趣。但我可能六年中只花
了⼏百个⼩时在这些活动上,还占不到我全部⼯作时间的百分之五。
相⽐之下,我花了近万个⼩时独⾃在计算机前研磨——编程,调试,运
⾏实验,琢磨软件⼯具,查找相关信息,以及撰写、修改和重写研究论⽂。
任何经历过开创性⼯作的⼈都知道⽇复⼀⽇的研磨基本没什么乐趣:它需
要⾼度集中的注意⼒,严格的纪律性,对细节的敏锐注意⼒,⾼度的耐受
性,还有对做出伟⼤⼯作的执着追求。
那么,这有趣吗?
我⽤另⼀个含 F 开头的单词来回答:它有时候是有趣的,但更重要的
是,它是充实的(fulfilling)。有趣通常是琐碎、短暂,并且易得的,但是充
实却只有在克服了巨⼤且有意义的挑战后才会获得。攻读博⼠学位是我⽣
命中最充实的体验之⼀,我也感到很幸运有机会能在这期间变得富有创造
⼒。
后记

⾃发布的第⼀个⽉(2012 年 7 ⽉)开始,有上万个⼈阅读了博⼠研磨,
还有⼏百个读者给我发了有关本书的个⼈邮件。最吸引⼈的是,读者们根
据他们⾃⼰的⽣活体验,对这本书有着不同的解读。正如⼀句⽼话所说,仁
者见仁,智者见智。例如:

• 本科生知道了博⼠⽣活会包含什么,这帮助他们调整了内⼼对博⼠⽣
活的期待。⼀个学⽣通过邮件写信给我:“我必须得说,尽管我是⼀个
考虑明年申请博⼠的本科⽣,但你还是让我明⽩了我接下来⼏年的⽣
活中会发⽣什么。我待在实验室实习做项⽬(其实我做的⼯作就是读
了你的书),以及在有关博⼠的⼀些漫想中变得迷茫,但这些时间都
是值得的。”另⼀个读者提到博⼠研磨是“⼀个让普通⼈也可以深⼊了
解攻读博⼠这件事的优质资源 · · · · · · 这本书中导师的选择、资⾦等等
博弈,带有些‘政治’意味游戏的视⾓是很难得的。”

• 已经工作而没有攻读博士的人们感谢我让他们更加坚信,他们当初没
有选择读研究⽣是⼀个⽆⽐正确的决定。⼀位刚毕业、马上就要成为
⼯程师的读者写道:“当选择我这⼀⽣要做什么时,我只有两个选项:
成为⼀名教授,或者是成为⼀名专业⼯作者。考虑到⼀些综合因素,
我最终选择了后者,但最重要的原因是,我觉得我不能牺牲掉我⽣活
中⽇常交际和⾮学术的那⼀部分,来投⼊到科研所必须的奉献上。我
⼀直在想我的选择是否正确。你的书让我知道了要是读博⼠我的⽣活
会是怎样⼀番景象,我想我当时做出了正确的决定。”

97
98 后记

• 博士早期的学生⼤都涉及我研究⽣头⼏年不得不经受的那些⽆聊且不
需动脑的研磨⼯作。有些学⽣很振奋,因为他们发现如果在接下来⼏
年⾟苦且聪明地研磨的话,他们的未来看起来还是很光明的。⼀个⼀
年级的博⼠⽣告诉我:“你的意志⼒真强。我刚刚经历了⼀年的博⼠研
磨,就觉得永⽆出头之⽇了。你的⼯作真的让我感到振奋,我现在感
到⾮常有激情和决⼼。(⾄少在我读了你书的那⼀天是这样!
)”⼀个⼆
年级博⼠⽣给我说:“我在今天这⼀博⼠的关键阶段发现了你的书。我
的博⼠⽣资格考试33 就要来了,但我觉得我的⼯作缺乏实质性,所以
当我开始读了你的书后,我准备扔掉我先前的⼯作。我不知道博⼠⽣
活会是什么样,但我很喜欢它。这正是我需要的那种驱动⼒,哥们。”

• 博士中期的学生对中间章节描述的那种“炼狱”般的精神状态很有共
鸣。⼀个读者给我说:“我看见过许多其他领域所共有的事情。看到你
描述的第三年时对项⽬的冷漠我不由失笑 · · · · · · 我花了更多时间才
到达这个阶段。我有资⾦⽀持,但我的导师并不怎么管我,所以我有
时候也和你⼀样,四处寻找灵感,因为⼩幅的改进并不能解决根本问
题。”

• 成功退出博士的学生通过我研究⽣的整个经历也间接地体验了⼀番研
究⽣⽣活,并从中获得验证,他们提前退出博⼠⽣涯的选择是正确
的。例如,⼀位第⼀年就离开博⼠学习的斯坦福计算机科学的博⼠⽣
写道:“感谢你让我确信做博⼠时选择退出是我做过的最好的决定。”

• 博士后期的学生对我因学术界的论⽂发表游戏⽽受挫很有共鸣,因为
他们也⼀次又⼀次地⾯对过论⽂被拒,⽽被拒的原因似乎都是他们不
可控制的。有个读者说:“持续回归到发表论⽂这⼀主题——或者更确
切地说,迎合⼦领域中⼀⼩部分专家的⼜味来发表⽂章——真正切中
了要害。”其他博⼠后期的学⽣希望想办法为下⼀代的学⽣减轻⼀点这
个过程中的痛苦:“有时候,我为你所经历的⼀些事感到⽣⽓,或者说
33
博⼠⽣资格考试:准备攻读博⼠学位的学⽣通常需要在研究⽣的第⼀年或者第⼆年参
加的资格考试,通过了这个考试后,才会被允许继续攻读博⼠学位。——译者注
博⼠研磨 99

沮丧,因为其中⼤多数都是不必要的,然⽽我也同样经历过这些事。
我们可以探讨⼀下,如何才能让博⼠头⼏年的经历变得不那么令⼈沮
丧,然后告诉将来的研究⽣,我觉得这会很有意思。”

• 教授们很欣赏我故事中的努⼒拼搏和最终胜利的喜悦⼼情,因为他们
在研究⽣阶段都获得了成功。斯坦福⼀个资历较深的教授在 Twitter
上说:“我们班的⼤多数⼈(包括我)都想在第⼆年退出博⼠学习!读
博⼠很苦,但也很值得!”另⼀个年轻的教授写到:“最终,博⼠学习对
我来说是⼀个收获颇丰的旅程,他帮助我成长了许多,我⼯作更加努
⼒,更执着、强⼤和⾃信。这个转变才是博⼠⽣项⽬的真正产出,⽽
不是那⼀堆发表的论⽂。”最后,我还想分享选择性阅读本书的读者⾥
最为直接的⼀个代表,⼀个教授⾼度赞扬了我的整本书,说他如何如
何喜欢我的这本书,并且⾮常⾼兴我最终还是决定去做⼀个⼤学教
授!不过⾄少可以这样说,她对最后⼏个章节的理解是极其有创造性
的。

• 普通读者们也很乐于看⼀看他们读博⼠的朋友或家庭成员的⽣活可能
是什么样的。⼀位母亲写道:“我不是⼀个博⼠⽣,但我却对书中的很
多事情产⽣了共鸣,因为我的⼥⼉也是⼀个博⼠⽣,她现在已经是⼀
个终⾝制系列的教授了。要是你早点写出这本书来就好了!”还有⼀位
同学告诉我:“我把这本书发给了我的奶奶,她很喜欢。我是我们家第
⼀个获得博⼠学位的⼈,所以她对这个过程有着很多问题,⽽你的回
忆录可以回答她的疑问,这样我就不⽤再回答她了:)”

我也收到了⼀些读者的常问到的问题,我在这⼀⼩节⾥做⼀个回答。
问:为什么你⼀直执着于发表论⽂?我 Z 时期在 Y ⼤学读了 X 专业,
并且在没有发表任何论⽂的情况下成功毕业了。
我专注于发表论⽂这个话题,是因为努⼒发表论⽂⼏乎占据了我还有
我们系的同学们博⼠⽣活的⼤部分。2012 年前后,斯坦福计算机系的学⽣
100 后记

需要在毕业前发表⼆到四篇论⽂。甚⾄我的导师也给我说了很多次,我⾄
少得发表两篇被认可的论⽂,他才会让我毕业。读者朋友们也告诉我,在
其他领域,发表论⽂对博⼠⽣⽽⾔没这么重要;其实在过去,就算是计算
机科学的博⼠⽣也没有⾯临这么⼤的发表压⼒。然⽽,对我和我的同学们
⽽⾔,我们的感觉就是“要么发论⽂,要么⾛向灭亡”。这并不代表我赞同这
种强烈地由论⽂驱动的研究风格(它有正⾯也有负⾯的影响)
,可它就是我
获得博⼠学位必须要玩的游戏。
问:我是⼀个计算机科学教授,我想指出,你关于获得教职⼯作和资⾦
项目所需条件的观点是有⼀些误导性的。为什么不提供更精确的信息呢?
我完全承认我的观点是短浅和⽚⾯的,因为我从来没有在教师招聘委
员会和资⾦审查委员会⾥⼯作过。然⽽,我基于我六年博⼠⽣阶段所看到
的,把我认为这些过程是如何进⾏的最诚实的解释写了出来。
问:我是⼀名学⽣,需要⼀些建议。我应该攻读博⼠学位吗?我该退
出我的博⼠项目吗?我要不要换导师?我该不该试着当⼀个教授?
博⼠研磨是⼀本描述我⾃⼰经历的回忆录,⽽不是给⼴⼤学⽣的⼀般
性建议。由于你所处的环境可能和我的有很⼤不同,我觉得我没有资格给
你提供建议。欢迎你以任何合理的⽅式来理解我的话,然后⽤你最好的判
断⼒来决定。祝你好运!
问:你本书的目的是对学术界的批判,或者是对学术界改⾰的呼唤吗?
绝对不是。除了尽可能诚实地讲述我⾃⼰的故事⽽外,我别⽆其他⽤
意。
你为什么要离开学术界?你的科研视野和发表记录也很优秀,所以你
应该能获得⼀份体面的教职⼯作,⽽且如果你⾜够努⼒⼯作的话,还能获
得终身职位。
这本回忆录的⽬的是讲述我博⼠阶段的故事,⽽不是解释我为什么决
定离开学术界。我不追求学术⼯作的完整原因已经超出了这本书的范围。
但是,如果⾮要我给出⼀个⼀句话的答案的话,那么可以这样说:我就是
博⼠研磨 101

非常不想做教职⼯作。
问:那么你讨厌学术界吗?你觉得学术研究是不是⼀个⽆用的游戏?
不,恰恰相反,我很敬重学术界,⽽且深刻地理解它在推进创新的过
程中所扮演的⾓⾊。尽管同⾏评议的发表规则是⼀个不甚完美的游戏,我
也没有⼀个能够控制质量的更好的解决⽅案。正如我在研究⽣最后⼀年发
给⼀位教授的邮件中总结的那样:“通过过去的五年,我发现我更愿意做⼀
个科研的旁观者,作为⼀个新研究的持续不断的⽣产者的负担对我来说实
在是太重了。”
问:我认为博⼠⽣要上课,教课,经历磨⼈的资格考试,还要做很多
和科研⽆关的事。为什么你没有描述其中任何⼀个呢?
因为这些是都和获得博⼠学位⽆关的活动。我选择排他性地把我的回
忆录聚焦在做科研的过程上,因为这才是博⼠经历的核⼼。
问:你在研究⽣六年期间交了朋友吗,或者参加社交活动了吗?
答案是肯定的,不过你可能对我个⼈⽣活的细节不太感兴趣。再次说
明,我排他性地把我的回忆录聚焦在做科研的过程上。
问:这本书里的其他⼈物都是单⼀维度的。为什么你不把他们的背景
介绍得更细⼀点呢?
因为我觉得代表别⼈发表观点不太好。我可以⾃信地谈论我⾃⼰的感
受。我的同事可以写他们⾃⼰对博⼠研磨的理解和响应,我也很乐意到时
候给出他们⽂章的链接。
问:你怎么知道你博⼠阶段研磨超过了⼀万个小时?
我采取了⼀个⾮常保守的估算⽅式,每天研磨 5 个⼩时,乘以每年⼯
作的 335 天(有 30 天是“假期”),再乘以 6 年,⼤约就是 10000 个⼩时。不
过⼤多数博⼠⽣可能⼯作得⽐这个数⽬还要长。
感谢阅读,欢迎给我发邮件告诉我更多的反馈和问题!

You might also like