专栏名称: 数学人生
欢迎关注数学人生。这里为大家提供江湖八卦,数学秘籍,科研经验,留学总结,转行咨询等各类信息。————读完博士之后,有人问我当年读博士期间一个人夜晚从办公室回宿舍的心情,我想起的不是孤单和路长,而是波澜壮阔的大海和天空闪耀的星光。
目录
相关文章推荐
超级数学建模  ·  限时领 | ... ·  昨天  
超级数学建模  ·  限时领 | ... ·  2 天前  
51好读  ›  专栏  ›  数学人生

博士磨难(The Ph.D. Grind)--- 一个Stanford PHD的回忆录

数学人生  · 公众号  · 数学  · 2017-11-03 14:31

正文

http://www.pgbovine.net/PhD-memoir/pguo-PhD-grind.pdf

pguo-PhD-grind

博士磨难(The Ph.D. Grind)是一本很火的书,作者Philip是MIT的本科和硕士,Stanford的PhD。他读博的历程并非一帆风顺,也经历过不少迷茫和痛苦。想读博或正在读博的人可以借鉴吸取经验。仁者见仁智者见智。

链接:

http://pgbovine.net/PhD-memoir.htm

pdf文件: http://pgbovine.net/PhD-memoir/pguo-PhD-grind.pdf

网上也有一些评论文章,如

宝剑锋从磨砺出——《博士磨难》读后感:

http://blog.sciencenet.cn/blog-379672-599410.html

网上也有其他人翻译了这本书(翻译了一部分):

《博士磨砺》 http://blog.sciencenet.cn/home.php?mod=space&uid=659466&do=blog&view=me&from=space

我也还没翻译全,英语好的可以直接去看英语原文,有兴趣的看看中文可能更方便直接,不过我翻译的语言可能比较生硬。

我翻译一方面是可以让此书更加普及,另一方面是自己下次再看的时候可以直接看亲切的中文(看英语真是让人头痛啊),还锻炼了一下自己的翻译能力。

我对这方面的文章比较感兴趣,还有几部同系列很火的文章,友情推荐:

上交博士的《博士这条船》

小说《博士后老张归国记》

有兴趣的可以自行网络搜索。

翻译开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

博士磨难

一个博士生的回忆录

Philip J. Guo

[email protected]

http://www.pgbovine.net/PhD-memoir.htm

当前版本:2012年7月16日

最初版本:2012年6月29日

献给所有志在创造的人。

目录

序言

第一年:失落

第二年:开端

第三年:故态复萌

中断

第四年:重启

第五年:创造

第六年:尾声

结语

后记

前言

这本书记录了我从2006年到2012年六年期间攻读斯坦福大学计算机博士的工作。很多人都能从中受益,包括:

1 对追求博士学位可能感兴趣的本科生

2 当前正在寻求指导或鼓舞的博士生

3 想更好地理解博士生们的教授

4 聘用和管理有博士学位的人的雇佣者

5 工作在任何强烈需要自我驱动的创造性、竞争性领域的专家

6 对学术研究的过程好奇的受过教育的成年人(或早熟的孩子)

博士磨难不同于以往那些写与博士相关的文字,原因在于其独特的风格、及时和语调。

风格:《博士磨难》是一本为受过良好教育的人读的传记,并不是去指导当前的博士生怎样攻读博士。尽管博士生们能从我的经历中有所收获,但我的目标不是直接提供建议。已经有太多指导和建议博士生的文章可读,我对于这方面没兴趣去争辩。这些文章充满了概括性的文字,比如说“要坚持不懈”、“每天都有所进步”。但传记的好处是我能够细致而详细,因为那是我自己的故事。

及时:我一完成博士学位就写了《博士磨难》,这是个很理想的时间点。相比之下,当前正在读博的学生不能像我一样反映读博经历的全貌,那些年纪比我大的研究者们回忆他们的博士生涯时难免会有做选择事后聪明的偏狭。

语调:尽管不可能完全没有偏见,我在《博士磨难》中尽量维持平衡的语调。相反,很多写博士相关的文章的人是:

成功的教授或科学家:他们武断地宣称一些庄重的建议:“研究可能艰难,但那是愉快的智力旅程,你们会得到享受的,并做出最大的···因为我就是这样过来的!”

或者是苦逼的博士生(或中途退学的博士生):他们曾备受他们研究经历的煎熬,他们用醒悟、悔恨的语气说道:“啊啊啊,我的世界简直就是地狱,我的大好青春我都用来干啥了?!”

庄重的建议能鼓舞一部分学生,那些读博的苦水使苦恼的学生相互宽慰,但对于普通的读者这两种极端都不大容易接受。

最后,在我开始我的故事之前,我想强调的是有各种各样的博士生经历,那依赖于其学校、院系、研究领域、资金资助状况。我很幸运我能在我的博士期间有很大的自由和自主权;我认识不少学生,他们博士期间受的限制比我多得多。我的故事只是多种博士生活中的一种,所以我的经历不能去概括推广。然而,我会尽我最大努力避免过于细节具体化。读得快乐!

Philip Guo,2012年6月

序言

因为我大学里主修电子工程和计算机,所以我的大多数同学在本科或硕士毕业后都立马找到了工程类的工作。然而我选择攻读博士学位,这是因为父母潜移默化的影响以及我自己大学期间在工程类企业实习的消极经历等等诸多因素的综合。

我的父母从没有强迫我去读博,但我知道他们最尊重的工作就是大学里的终身教授,而那必须要去读博。为什么当一个教授是他们理想的工作?那并不是因为对于纯粹的学术追求的崇高敬意。尽管我的父母尊重知识分子,但他们是务实的移民,终身教职能提供的终身工作保障所带来的安全感更加吸引他们。

我父母的很多朋友是在企业里当工程师的中国移民。由于他们的英语比较弱,而且缺乏对美国文化的理解,他们大多数在工程职业里混得都不大好,尤其他们变老了之后。在节假日的聚会上,我常听到人们那些让人厌倦的故事诸如受到领导的压迫、遭到年龄歧视、天花板效应、失业等等。尽管我父亲不是工程师,但他工作在高技术产业且有相似的遭遇,他与管理、官僚主义作抗争,但在相对年轻的45岁时就下岗了。

我的母亲是唯一一个例外。她很喜欢她在UCLA任终身社会学教授的工作。不像她的大多数中国移民朋友,她喜欢终身工作带来的安全感,并且不需要向领导汇报,可以有很大自由地去追求自己喜欢的科研工作,而且她在她的研究领域很有名气。看到母亲顺利的工作轨迹和父亲及其朋友们的螺旋式衰落,我在高中和大学时留下了深刻的印象。

当然,仅仅出于非理智的童年时的恐惧就去读博是愚蠢的。为了验证公司的工作生活,我大学期间的每个暑假都去工程类公司实习。由于我恰巧在只有我一个实习生的办公室上班,我承担起了小工程师的职责,那是罕有的荣耀。尽管我学习了很多技术上的技巧,但我发现这样一天天的工作麻木了我的心智。我的同事们对他们的工作也提不起热情,职业发展之路很难看到什么希望。当然,我并不是说所有的工程类工作都是麻木枯燥的;只是说恰巧我实习的公司不是一流的。我大学里的很多朋友去了如微软、谷歌等一流公司实习,他们很喜欢他们的实习经历并且在毕业后就全职加入了这些公司。

由于我对我的实习经历感到无聊且我比较享受本科时当教学和研究助理的时光,我就把大学里的教学和学术研究当作我未来的职业目标。我在MIT第三年中期的时候,我已经下定决心去读博因为那是未来目标的必经之路。我打算就待在MIT读5年本硕连读的项目,这样在我申请博士时就有更多的研究经历从而有更大的机会进入排名前列的牛校。

我找到我的硕士论文导师并且如一个雄心壮志的孩子向老师提出了我自己的准研究方案的想法。导师耐心地迁就我但最终还是劝我在跟他研究兴趣匹配的主流方向做研究,最重要的是因为他的研究资金在那个方向。由于我硕士项目的学费部分由导师从美国政府那儿申来的基金里出,我不得不为那个资助项目工作。后来,我还是听取了导师的建议并且花了两年半的时间创造了一种新的用来分析用C和C++语言编写的计算机程序的运行时间行为的工具。

尽管我不是很喜欢硕士导师的项目,结果证明遵从导师的研究兴趣不失为一个明智的选择:在他的指导下,我发出了两篇论文,一篇一作和一篇二作,并且我的硕士论文赢得了年度院系里的最佳论文奖。这些成就以及导师的帮忙使我有机会进入一些排名前列的计算机博士项目。由于斯坦福大学是我的第一选择,我感到非常喜悦以致我收到录取通取通知书的那天晚上我竟失眠了。

我很幸运拿到了美国国家科学基金会和国防科技教育的奖学金,每个都是只奖励申请者中最优秀的5%。这两项奖学金付了我六年博士生活中的五年的全额学费生活费。这使我不必局限于导师的特定资金资助项目。相比之下,大多数在我这领域的博士生的奖学金都是导师资助加教学助理的结合。奖学金除了能覆盖大学学费之外,还能给予一月1800美元的补助来覆盖生活费。(在我这领域,几乎没有人愿意花自己的钱去读博,因为经济上不划算。)由于我有不少研究经历和论文写作经历,在我2006年9月来到斯坦福我感到准备良好,轻松去迎接博士水平的研究。然而,那时我远没想到我博士第一年竟是最低落的一年,是我生命中最沮丧的一段时光。

第一年:失落

在2006年夏天,在我将要去斯坦福求学之前几个月,我设想了一些我很有兴趣的研究主题。概括来说,我想创造一些革新的工具来帮助人们更加高效地编程。这种兴趣起源于我暑期实习时的编程经历:分配给我的一天天的工作枯燥乏味,我浪费了大量时间在编程的无效率上。我想致力于研究怎样减少这种无效率。更广泛地,我也有兴趣研究如何帮所有电脑用户提高效率,而不仅仅是程序员。比如说,我想设计新的工具去帮助科学家分析数据和画图,去帮助系统管理员定制一些配置,去帮助新手学习新软件。尽管我模糊地定下了这些高目标,但还是很多年之后我才把它变成切实可行的项目并收录到了我的论文集中去。要想从斯坦福计算机系博士毕业,学生需得以第一作者身份发表2到4篇相关论文。然后将这些论文收录到一起装订成一本书,称为论文集。只要由三个教授组成的论文评定委员会同意通过学生的论文集,学生就可以马上毕业了。我这个系的大部分学生要花4年到8年时间才能博士毕业,主要依赖于发表论文的快慢。2006年9月的新生定位中,我们系的教授鼓励博士新生尽快找到自己的导师。于是我和同学们花了数月去和各位教授们聊天,以便选择适合的导师。导师是学生论文评定委员会里最重要的一员,在允许学生顺利毕业中有着最终的发言权。在我这个领域,导师有责任给学生提供奖学金(通常通过研究助理形式发放)和与学生一起工作以发展想法并发论文。我见了不少的教授,并且有一位教授的研究兴趣和风格与我最相似,所以我选了他当我的导师,他的名字是Dawson。当我到校园时,Dawson最近刚评上终身教授,他已经在斯坦福待八年了。如果教授在他们工作后的第一个7年里发表了足够多有影响力的论文,他们才能被评为终身教授。Dawson的主要研究兴趣在创建一种创新的工具,以便能够自动查找复杂软件的代码漏洞。在过去的十年里,Dawson和他的学生创建了一些能比同行查找更多代码漏洞的工具。他们的技术很有效,继而他们成功地启动了一个基于这些技术的公司去卖漏洞查找服务。虽然我比较喜欢Dawson的项目,不过更吸引我的是他的研究哲学与我自己的相匹配:他是一个热忱的实用主义者,相比于展示看起来学术的理论有趣性,他更关注那功能的结果。在我与Dawson的第一次会面中,他似乎对我那使电脑使用和编程更高效的广阔目标感兴趣。然而他明确指出他想招新生致力于他的自动漏洞查找项目Klee——他的研究资金就在于此。(这工具有几个名字,为了简便起见,我称之为Klee。)从和我系其他几位教授和高年级博士生的谈话中,我意识到新生加入到已经存在的项目中而不是马上弄自己的项目是一种默认的规范。 我劝服自己自动查找漏洞也算是一种间接的方式来促使编程更高效,于是我决定加入Klee这个项目。2006年12月当我开始在Klee项目里工作的时候,Dawson同时在指导其他5位已经在组里工作了一段时间的学生。项目的领导是Cristi,一个三年级博士生,他与Dawson一起创建了Klee的原始版本。Dawson、Cristi和其他几位共事者最近已经合发了他们的第一篇关于Klee的论文,描述了基础的Klee系统并展示了在查找新型漏洞方面的有效性。那篇论文已经被学术界良好地接受,所以Dawson想继续保持势头接下来再发几篇后续的论文。一般在一个特定的研究项目里发表多篇论文是很有可能的,只要每篇论文都有新的想法,结果比以前有所改善。下一次相关的高层次会议论文提交截止日期是2007年3月,所以Klee团队还有四个月来进行相对原始版本的创新和改进。 ~ 在我继续我的故事之前,我想简要介绍一下学术论文是怎样被同行评审和发表的。在计算机科学领域,最有威望的发表地点是会议上。在许多其他学科领域,杂志是最权威的发表地点。计算机科学会议发表过程大致如下:1 每次会议发出一些大家有兴趣的论文主题列表和特定的提交截止日期。2 研究者在截止日期前提交论文。每次会议一般能收到100到300份论文提交,每篇论文大约有三四十页(隔行打印)。3 会议程序委员会(PC)包含有约20位专家研究员,分开评审这些提交的论文。每篇论文会被3到5个人评审。评审工作要花3个月左右的时间。4 PC里的每个人评审完毕后,就可以决定出哪些论文被接收哪些论文被拒,尽管这里面含有评审人的偏好因素在里面。5 PC向所有作者发邮件告知他们的论文是被接收还是被拒了,并附上评论意见。6 被接收的论文的作者参加会议并做一个30分钟的研究报告。所有被接收的论文都会在网上发布并作档案保存。

一个有威望的顶层会议会接收8%到16%的提交论文,次一级的会议会接收20%到30%的提交论文。由于低接收率,一篇论文被拒-修改-再提交多次的现象很常见。有些甚至会花上几年才能完成发表。(一篇论文一次只能提交给一个会议。)

~

Dawson明确表示希望赶在2007年3月截止日期前提交那个顶层会议论文。他告诉我其他五位学生正在做什么,并且给了我一些任务选项让我从中选一个。我选择用Klee查找Linux设备驱动的新漏洞。设备驱动是使得操作系统可以与周边硬件设备如鼠标、键盘等进行通信的一个软件组。Linux操作系统包含成千上万的设备驱动用以和各种不同的周边硬件通信。设备驱动程序里的漏洞很难用传统方法找出来,并且有着潜在的危险性,因为它们能引起操作系统冻结或者崩掉。

Dawson相信Klee能够找出以往从未被发现的数千种Linux设备驱动程序里的漏洞。我记得考虑过尽管在论文中展示找到的Linux设备驱动程序里的漏洞会很酷,但我仍然不清楚这些结果怎么会对整个研究有实际的贡献。从我自己的理解来看,我将用Klee去查找新漏洞——已经存在的研究成果的应用——而不是想着怎样创新性地改善Klee。而且,我不知道我的工作会如何与其他五位的工作集到一起以能在3月交掉论文。然和,我相信Dawson应该胸有成竹并且有高超的论文写作策略。我只是参加了这个项目,我不想马上去问导师的想法。既然我被分配了一个具体的任务,那我只想一心一意完成属于自己的分工。

~

我花了我博士生涯的前四个月勤勉地用Klee去分析数千种Linux设备驱动程序,努力查找新的漏洞。虽然我的工作表面上看起来很容易,但在使Klee运行在各种设备驱动程序上时,我被大量繁琐的细节问题搞得疲惫不堪。我经常花费数小时去搭建合适的环境以使Klee能够分析一个特定的设备驱动,却无助地看到Klee因自身代码的漏洞而引起的崩溃。当我把这些漏洞报告给Cristi时,他会尽力去修复它们,但Klee十分复杂导致很难诊断并修复它自身的很多漏洞。我不是仅仅说Klee这样一个例子,各种用来做研究的软件雏形总是会遇到各种各样难以预见的漏洞。我的工作本来是用Klee去查找Linux设备驱动程序里的漏洞,但讽刺的是,第一个月的最后我一直是在查找Klee自身的漏洞。(Klee不能自动查找自身代码里的漏洞真是太遗憾了!)随着时间流逝,我越来越感到沮丧,我觉得我所做的只是纯粹的体力劳动——只是让Klee能够工作——没有任何技术含量。

这是我生命中第一次感到如此绝望。在过去,我的暑期实习项目总是能完成。大学里的很多作业虽然很有挑战性,但总有一个正确答案在等你。如果在课堂上我没有理解某些知识,我可以去请教助教或一些高材生。即便在我本科做研究时,我也可以让我的导师帮助我,因为那时我是在处理一些相对简单的问题并且他通常知道如果解决。本科阶段做研究赌注也小得多,因为研究只是我日常生活学习的一小部分。如果我在某个研究问题上卡住了,我大可以转移注意力到功课上或者和朋友们去闲逛。本科毕业并不要求要做出什么研究成果出来。然而,既然我已是一个博士生,研究就是我的本职工作,如果我做不好,我就不能拿到学位。我的心情总是不可避免地与每天的研究进展相挂钩。这些月,进展十分缓慢,让人十分痛苦。

我正走在大家都不熟悉的领域上,所以寻求帮助很困难。不像本科时,所有答案都是清楚了然的。因为我是唯一一个在用Klee分析设备驱动程序的人,所以师兄们也帮不了我。Dawson不时地给我一些高层次的策略性建议,但跟所有终身教授一样,他不能与自己的学生在同一个战壕里并肩战斗。里面的各种复杂细节还是得我们自己去搞懂并最终得出结果。在我的例子中,那就是——找到前人从未发现过的Linux设备驱动里的新漏洞。导师喜欢经常说,“如果它以前被做过,那它就算不得是学术研究。”现在我第一次发自内心地理解了这句话的含义。

尽管我每天都很绝望,但我时常告诫自己:我的研究才刚刚开始,所以我应该更加耐心。我不想在我的导师和师兄们面前显得很弱,因为我是Dawson组里年纪最小的学生。我吃力地跋涉着,连续一百多天,修复了一个问题,另一个更加恶心的问题又出现了,我一直在苦苦查找着层出不穷的漏洞···

在所有醒着的时间中,我要么是在工作、思考问题,要么就是饱受思索被各种问题卡住的不明原因的折磨。不像常规的朝九晚五的工作(比如我的暑期实习)——有时间撇下自己的工作,晚上可以看看电视,研究消耗了我的全部心智。我发现想让头脑静一静放松一下几乎不可能。后来我了解到这是折磨博士生的通病。有时我甚至因焦虑而睡不着觉,分配的任务停滞不前让我压力巨大。甚至都没有机会去小憩一下,因为3月的截止日期快到了,还有很多任务没有完成。

在这些体力劳动的中期,我试着提出了一种半自动的方法可以稍减我每日的痛苦。我与Dawson讨论了一下我初步的想法,但我们最后下定结论:如果想让Klee查找出Linux设备驱动上的漏洞,那就没有任何方法可以避免这极其消耗时间的体力劳动。我不得不又咬牙坚持了几个月,直到最后我们终于提交了论文。

我理解了科学和工程领域的实验研究通常意味着超大量的乏味的、脏乱的劳动。博士生,尤其是一年级和二年级的博士生,必须得承担大多数乏味劳动的压力;既然我们拿到了奖学金,我们就必须付出劳动。在一个典型的研究组里面,导师和高年级博士生设定出高水平的研究计划,然后将具体的活分配给低年级的博士生去做,让这些细节性的工作最后能付诸实践。一年级和二年级的博士生很少能影响研究组的整体方向。即使我完全接受这种等级次序,感性上对于前几个月的体力劳动我依旧感到委屈,因为这活真是太苦了,真不值!

~

在两个个月之后,我开始有一些回报了。Klee能够在最小的设备驱动上运行并能自动查找出漏洞。为了验证这些漏洞是否真实,我向编写Linux设备驱动的程序员发送了一些邮件告知他们这些潜在的漏洞。一些驱动编写者回信确认了我确实发现了他们代码里的漏洞。我很兴奋,因为这是我第一次受到外界的肯定。尽管我不是做什么突破性的研究,但我仍然感到满足,因为是我的努力导致了一些很难被发现的漏洞被Klee查找出来。

在受到外界的肯定之后,我的士气提高了不少,我就想让Klee能运行在更复杂的驱动上。然而接下来的几周出现的各种技术性难题又让我崩溃了。这些难题有:Klee仅能在少于3000行代码(C语言编写)的程序上运行。最小的设备驱动程序仅有100行代码,所以Klee能在上面很好地运行。大一些的驱动有1000行代码但与Linux操作系统其它部分的一两万代码错综复杂地连接起来。这样就远远超出了Klee的分析能力,因为我们不能将驱动的代码孤立地提取出来去仅仅分析那1000行。我试过各种方法去减少驱动与外部的联系,但这样做又要很多天针对不同的驱动做出不同的复杂修改。

我与Dawson见了一面并表达了我所面对的这令人畏惧的任务中的种种苦恼。针对每个不同的驱动都要去花数日去调整Klee,这显得很荒唐。不仅这会把我折磨死,而且它丫的算哪门子学术研究!在我们的论文上我的工作如何描述——花了近1000个小时进行调整Klee在驱动上工作的体力劳动还没有任何实质性的见解?那不是研究贡献;光听起来就显得很愚笨。我依旧很恐慌,因为离论文提交截止日期只剩5周了,而且Dawson也没提任何论文写作策略方面的事。通常至少得4周时间去写一篇比较好的提交论文,尤其是像我们组里这情况——组里的六个学生的方向需要相互协调并最后结合起来。

从上次与导师的会面后过了一些天,Dawson提出了一个计划去改善Klee克服我所面临的依赖性问题。他发明的这种新技术被称为非限定执行(简称UC),从而使得Klee能将驱动代码单独提取出来进行孤立的分析。他和组里一高年级博士生合作将UC技术加入到了Klee里面。他们称改善的版本为Klee-UC。虽然我被弄得筋疲力尽,我还是感到欣慰,毕竟是我让Dawson向Klee里加入了新功能,这好像有一些能算作真正有价值的研究贡献的意味。

Dawson和其他学生几周时间都在用Klee-UC工作。同时,他们让我继续用老方法查漏洞。他们计划用Klee-UC重查我用Klee手工查的漏洞以展示Klee-UC的有效性。在提交论文上,他们主要说的是Klee-UC能够几分钟内就完成自动查错而不需要任何调试工作,而不是曾经有一个苦逼的博士生(我!)日日单调乏味地调整Klee手动查错。

又苦逼地过了几个星期后,我终于能让Klee分析937个Linux设备驱动并发现了55个新漏洞(其中32个是由驱动编写者邮件确认)。然后我再新装上Klee-UC这工具自动分析这937个驱动。还好Klee-UC确实能发现大多数漏洞,这样我们至少可以算有些研究贡献了。

然而还是存在很多问题。离论文提交截止日期只有三天了,还没人开始写论文呢。那么短的时间,我们基本不可能写完论文、修改论文、润色论文还让论文被顶层会议接收。但我们还是努力尝试了。在最后的72个小时里,Dawson和我们中的五个学生(因为有一个退出了)一直通宵赶实验和论文。我们学生都清楚我们的论文肯定不会被接收的,但我们还是遵从了Dawson的领导一直在赶。







请到「今天看啥」查看全文