下载原文,即可读到英文原版文章。
第一年(一部分)
在2006年的夏天,也就是我攻读斯坦福大学博士学位的前几个月,我对一些激励我去追求的研究项目有过一些想法。总的来说,我想开发出一些具有创新性的工具来帮助人们,在进行计算机编程时,提高效率(比如:提高程序员的效率),这个兴趣点产生于我自己在暑期实习中的编程经历。由于我被安排从事日复一日的工作,没有任何心灵上的刺激,在我工作的公司里,我耗费了大量时间坐在小隔间里思考计算机编程过程的低效,我认为处理一些低效问题的研究工作是值当的。更加广泛地来说,我对研究能帮助其他类型的计算机用户,并不仅仅只是计算机编程人员,变得更有效率是感兴趣的,例如:我想设计一些新工具来帮助正在分析和绘制数据的科学家、正在定制服务器的系统管理员、或者是正在学习使用新软件的新手。
尽管我已经有了一个大致的关于这个兴趣点的整体轮廓,但仍然需要很多年才能转化成我合法的能够发表的研究项目论文。为了拿到斯坦福大学的博士学位,学生希望发表两篇到四篇以自己为第一作者的相关论文,然后将这些论文整理成一本书厚度的科技文档,称之为毕业论文。一个学生被允许毕业,需要一个由三名教授组成的学术委员会支持他们的毕业论文。在我们系的大部分学生耗费四年到八年的时间才能毕业,这依赖于他们发表论文的速度。
在2006年9月的时候,我们系的教授们鼓励所有新来的各个研究方向上的学生,尽可能快的找到自己的导师,所以我的同学和我开始发费几个月的时间和各个导师交流,为了寻找到一个更合适的导师,这个导师是学术委员会最重要的成员,对支持学生毕业拥有最后的发言权。在我的研究领域,导师们负责为他们的学生提供基金(通常通过研究奖励)。并且和他们一起工作,完善他们的论文主旨,并书写成可以发表的论文。我和一些教授见过面,Dawson是一个研究兴趣与类型都和我比较相关的导师,所以我选择他作为我的导师。
当我到达校园时,Dawson已经在斯坦福大学工作了八年,刚刚被评上了终身教授。如果一个老师在开始的七年时间里发表了足够有影响力的论文,通常他会获得终身教职(一生雇佣的保证),Dawson主要的研究兴趣在于创造新颖的工具,在复杂的现代软件行业中,它能自动的发现bug(软件代码中的错误)。在过去的十来年里,Dawson和他的学生们开发过远比其他竞争者发现更多的bug工具,这项研究是如此的高效,以至于他们基于这项技术成功地创办了一个以出售寻找软件bug服务的初创型公司。尽管某种意义上,我喜欢Dawson的项目,吸引我更多的地方在于他的研究哲学(理念)符合我:他是一个狂热的实用主义者,更多的注意力集中于实现引人注目的结果而不是为了申请基金才展现理论上的“兴趣”。
在我和Dawson第一次的座谈会上,它似乎含糊地关注了我这个是计算机变得更加有用和使编程更有效率的宏达目标。然而,他的观点却十分明确,他想要补充一个新学生从事一个称之为“Klee”的自动寻找bug的工具,这是他基金资助的项目(这个项目有好几个名字,但是我未来简化称其为“Klee”)。在我们部门里,我和其他导师、高年级的博士生沟通中,我意识到,所有的新学生都是参加到已获资助的项目研究中,而不是马上尝试申请一个新的项目,这是一个基本的规定。我说服我自己:自动寻找软件bug是一个间接提高软件编程人员效率的办法,所以我决定加入到Klee这一项目中。
当我在2006年12月开始从事于Klee这一项目时,Dawson也监督着其他5位已经开始这一项目的学生。这一项目的领导者Cristi,一个三年级的博士生,和Dawson一起开发了Klee的原始版本。Dawson、Cristi和其他几位同学一起执笔并发表了第一篇论文,基本地描述了Klee系统,并且证明了在寻找新bug类型方面的高效性。这篇论文完美地被学术委员会接受了,Dawson希望保持这个势头,接着发表后续的论文。注意:在某一特定研究项目出版更多的论文是可能的(例如:后续论文),只要任何一篇论文包含新注意,改进处,或不同于之前文章的结果。下一次相关的顶级会议,论文提交截止日期是2007年3月,所以Klee团队有4个月的时间创造一个新的发明点来保证一个新的提交方案超越原始论文。
在我继续我的故事之前,我想要简短的介绍一下学术论文是怎么样在各个领域专家之间相互评阅和出版的。在计算机科学领域,发表论文最有名望的地方是会议。注意:在很多其他学科中,杂志是发表论文最有名望的地方,会议意味着一些地方是不同的,计算机科学会议发表论文的过程简单的流程如下:
①任何一场会议会发出寻求论文的通知,包括一系列的主题和特定的截止日期;
②研究者在截止日期之前提交论文,任何一场会议通常会受到100~300到提交的论文,任何一篇论文包含相当于2倍行距的30~40页的文本文件;
③这个会议的编委会,是由20名左右的研究专家组成,分散这些提交的论文,并且审阅它们。任何一篇论文由3~5个人来审阅,它们可能是编委会成员或是其找来的志愿者,这个评审过程将耗费3个月的时间;
④编委会的每一个成员都完成他们各个的审阅工作之后,他们开会并决定那一篇论文被接受或被拒绝,依据审阅者的偏好;
⑤编委会给所有投稿的作者发邮件通知他们的论文是否被接受,并附带审阅人的意见;
⑥被接受论文的作者将参加这个会议,并就他们的论文发表30分钟的演讲,所有被接受的论文都将在存储在网上一个数据库里面;
一个有声誉的顶级会议,接受所提交论文的8%~16%,次一级的会议将接受20%~30%。由于这个低效率,一篇论文在被接受之前,被拒绝、重新修订、再投,这一过程反复几次并不是罕见的,整个接受过程可能会发费好几年时间(一篇论文在一段时间内,只能提交到一场会议)。在Dawson讲清他的目标,特别是顶级会议论文提交截止日期是2007年3月之后,他告诉我其他5个同学正在从事(进行)的工作,并且给了一些我可以尝试选择的任务,我最后选择在Linux设备驱动上使用Klee来寻找新的bug。一个设备驱动是一系列允许操作系统与外围硬件设备,如鼠标或键盘进行交互的代码。linux操作系统(类似于微软的Windows和苹果公司的Mac OS)包含数以千计与各种不同类型的外围硬件设备进行交互的设备驱动,设备驱动代码中的bug使用传统方法是很难发现的,并且具有潜在的危险性,因为他们能引起操作系统暂停服务或者死机。
Dawson相信Klee能够在数以千计的Linux设备驱动代码中找到新的bug,它是之前用非自动化工具或人工操作没有发现的。我记得当时的想法是这样的,即使新的Linux设备驱动bug能够顺利的产生一篇论文,但是对于我来说,这些结果怎么样组成毕业论文要求的实际贡献并不清晰。在我的理解中,我将使用Klee来发现新的bug--一个已经存在的研究应用,而不是用创造性的方法来提高Klee的性能。更近一步的,我就不能发现我的研究工作怎么与其他5位同学的工作一起组成一篇在明年3月份提交的论文。然而,我相信Dawson的大脑中拥有整体的论文写作策略。我才刚刚加入到这个项目中,所以我不想询问这些教授级别的决定,我被分配到一项特殊的任务,所以我想尽自己最大的努力去完成它。
我发费了博士生涯的前4个月,小心翼翼地使用Klee分析数以千计的Linux设备驱动代码,尝试着寻找新的bug。尽管我的任务在概念上是直接简易的,但是我被使用Klee来解决设备驱动的天量代码的杂乱细节所吞噬,我经常发费几个小时来配置运行Klee的必要的微妙环境用以分析特定设备驱动代码,尤其是无助地看着由于Klee自身的bug而导致的死机与失败。当我想Cristi报告Klee内部的bug,他会尽自己最大的努力来处理它们,但是这个Klee的复杂性使得其诊断并修理大多数bug变得很困难,我不能挑选出Klee的特别问题:任何以科研为目的的标准软件,在发展过程中,都会出现不可预知的bug,但是讽刺的是,在开始的第一个月,我停止了寻找Klee自身的bug(糟糕的是,Klee不能自动地寻找自身的bug代码)。随着日子一天天的过去,我变得越来越消沉,感觉自己做的是纯手工劳动---仅仅使用Klee工作起来,没有任何的智力成分。
这是我人生中第一次,关于工作安排,我从来都没有像这样的充满挫败感。在过去,我的暑期实习项目一直具备条理性,并且尽管学校里大量的工作充满挑战,但是一直存在一个准确的答案等待着被发现,如果我没有当堂理解一些知识点,教学助手和更多理解了的学生都可以用来寻求帮助。甚至当我以一个本科生做科研时,我能一直询问我的指导者(一个博士四年级的学生)来帮助我,因为我从事的是一些相关的简单问题,他通常知道怎么样去解决。成为一名本科研究助手,其风险也是最低的,因为研究生活仅仅只是日常生活安排的很小一部分。如果我迷恋于科研任务,我就不能集中精力从事班级工作或者与朋友出去闲逛,我的大学生活并不依赖科研。然而,现在我是一名博士研究生了,科研成了我唯一的工作,并且除非我能成功地完成它,否则我就不能获得博士学位,我的情绪和我每天的项目进展牢牢地绑在了一起。在这几月里,项目进展的异常缓慢。
我正在从事一个不熟悉的领域,所以与我之前本科时期相比,寻找帮助变得十分困难,那时的答案是轮廓清晰的。因为我是唯一的一个尝试在设备驱动代码中使用Klee,所以我的同事不能够提供任何帮助,Dawson时不时的给予方向上的指导与建议,但是和所有的终身教授一样,在他所有的学生中间,他的角色并不是“趴在战壕里打仗”,找出所有复杂的能产生结果的细节是我们的工作---于我而言,在Linux设备驱动中找到新的bug,之前从来都没有人发现的。教授们经常喜欢说的一句话:“如果在这之前已经存在了,那就不叫科研!”。尤其是第一次听到这句话,我本能的感受到这句话的深意。
尽管我每天都(充满挫败感)看不到希望,但是我仍然告诫自己:这仅仅刚开始,所以我应该耐心点。我不想在我的导师和同事面前表现出虚弱与颓废,特别是因为,我是Dawson团队中最年轻的博士。所以我连续爬山涉水日夜奋斗超过了100天,处理Klee出现的相关问题,接着不可避免地产生新的糟糕的障碍,如此反复,在解决问题中间去发现梦寐以求的Linux设备驱动bug。
在每一天疲惫不堪的时刻,我除了工作,还是工作,或者挣扎在怎么样解决工作中出现的模糊的技术问题。不像一些规则的朝九晚五的工作(例如:我的暑期实习),在那里我可以在办公时间放下手头的工作,每天晚上可以在电视机前放松欢乐,但是科研时精神与身体上的双重消耗,我发现自己在晚上不可能停止思考,去放松一下,后来,我发现其他的博士生也有相同的不安和内心的折磨,有时候因为这个被安排的任务止步不前而产生令人难以相信的压力,甚至在晚上睡觉的时候都会出现失眠,没有一点儿办法,甚至都已经看穿了睡觉,因为在论文提交的截止日期3月份之前有大量的工作要做。
在所有手动操作中间,我尝试着想出一些半自动的办法来减少日常工作的折磨,我和Dawson一起产生了一些基本想法,但最终我们得出结论:如果(我们)想要在Linux设备驱动中找到bug,我们没有办法去避免消耗这种折磨人的时光,我不得不苦苦的支撑着最后几个月,直到我们提交了论文。
我的理性思维告诉自己,在科学工程领域的试验性研究中,为了产生结果,经常涉及到极度的单调与低效的手工操作。博士生,特别是一年级与二年级的学生,是一群必须承受最苦闷的实验冲击的人,那是我们必须要经历的。在典型的研究团队中,教授和高年级的博士生创造整体的项目计划,然后分配我低年级的博士生在实验中艰难地探索所有的工作细节。一年级与二年级的博士生很少能够影响项目团队的整体方向,即使我已经完全接受了我处在整个人才梯队里最低级的一员,但在开始的几个月里,我的心灵依然受到了极大地伤害,因为这项工作是如此的艰难,并且没有收获。