怎样做研究生——研究者所需具备的各种技能
一、阅读很多研究人员花一半的时间阅读文献,可以很快地从别人的工作中学到很多东西。阅读文献,始于今日。一旦你开始写作论文,就没有多少时间了,那时的阅读主要集中于论文主题相关的文献。在研究生的头两年,大部分的时间要用于做课程作业和打基础。此时,阅读课本和出版的期刊文章就可以了。在自己研究领域打下坚实的基础所需要的阅读量,是令人望而止步的。一个有用的小技巧是:首先找出那些最本质的论文。此时可以参考一些有用的书目:例如研究生课程表,其他学校(主要是斯坦福大学)研究生录取程序的建议阅读列表,这些可以让你有一些初步的印象。如果你对自己研究的某个子领域感兴趣,向该领域的高年级研究生请教本领域最重要的十篇论文是什么,如果可以,借过来复印。回顾最近几年的出版物,将那些非常感兴趣的复制下来。这不仅是由于其中很多都是意义重大的论文,对于了解实验室成员的工作进展也是很重要的。每年都应该去所在学校的计算机科学图书馆,翻阅其他院校出版的和自己相关领域技术报告,并选出自己感兴趣的仔细加以阅读。阅读论文是需要练习的技能。不可能完整地阅读所有的论文。阅读论文可分为三个阶段:第一阶段是:看论文中是否有感兴趣的东西。论文可能含有摘要,其中可能有内容的介绍,但是也有可能没有或者总结得不好,因此需要你跳读,这看一点那看一点,了解作者究竟做了些什么。内容目录(thetableofcontents)、结论部分(conclusion)和简介(introduction)是三个重点。如果这些方法都不行,就只好顺序快速浏览了。一旦搞清楚了论文的大概和创新点,就可以决定是否需要进行第二阶段了。在第二阶段,要找出论文真正具有内容的部分。很多15页的论文可以重写为一页左右的篇幅;因此需要你寻找那些真正激动人心的地方,这经常隐藏于某个地方。论文作者从其工作中所发现的感兴趣的地方,未必是你感兴趣的,反之亦然。最后,如果觉得该论文确实有价值,返回去通篇精读。读论文时要牢记一个问题,“我应该如何利用该论文?”“真的像作者宣称的那样么?”“如果..会发生什么?”。理解论文得到了什么结论并不等同于理解了该论文。理解论文,就要了解论文的目的,作者所作的选择(很多都是隐含的),假设和形式化是否可行,论文指出了怎样的方向,论文所涉及领域都有哪些问题,作者的研究中持续出现的难点模式是什么,论文所表达的策略观点是什么,诸如此类。将阅读与程序设计联系在一起是很有帮助的。如果读者对某个领域感兴趣,在阅读了一些论文后,试试实现论文中所描述程序的“玩具”版本。这无疑会加深理解。要知道,其他的机构具有不同的思考问题的方式,值得去阅读,严肃对待,并引用它们的工作,即使你认为自己明晓他们的错误所在。在第三阶段,经常会有人递给你一本书或者一篇论文并告诉你应该读读,因为其中有闪光的地方或可以应用到你的研究工作中。但等你阅读完了,你发现没什么特别闪光的地方,仅仅是勉强可用而已。于是,困惑就来了,“我哪不对啊?我漏掉什么了吗?”实际上,这是因为你的朋友在阅读书或论文时,在头脑中早已形成的一些想法的催化下,看出了其中对你的研究课题有价值的地方。二、写作写作的理由有很多。勤于写作不仅仅给你练习的机会。在整个读研的过程中,你需要写一到两篇(这取决于你所在系的规定)毕业论文,以获得Ph.D.或者MS。学术的规则就是要么发表,要么腐烂。在很多领域和学校,这通常只有在你成为一名教师时才会要求。但是我们实验室的很多研究生毕业之前就已经开始发表论文了。鼓励论文发表是促进研究的很好策略。写下自己的想法是很好的调整思路的方式。你会经常地发现自以为很完美的想法一旦写下来就显得语无伦次。如果你工作的目的是不仅为自己还要为他人服务,就必须把它发表。这也是研究的基本责任。如果你写得精彩,会有更多的人来了解你的工作。自己单独完成写作是很难的,你需要经常地从他人那里获得反馈。对你的论文作评论就是最重要的一种形式。任何事情,要做就要做到最好。阅读有关如何写作的书籍。Strunk和White的《ElementsofStyle》对写作中基本的应该如何不应该如何做了介绍。Claire的《TheMLA'sLineByLine》(HoughtonMifflin)是有关在句子级别如何进行编辑的书籍。JacquesBarzun的《SimpleandDirect:ARhetoricforWriters》(HarperandRow,1985)是有关如何作文的。写论文时,读读那些写作高超的书,并思考作者的句法运用。你会发现不知不觉地,你已经吸收了作者的风格。要成为写作高手,需要付出颇多,历经数年,期间还要忍受和认真对待他人的批评。除此之外,并无捷径可走。写作有时候是很痛苦的,看起来好像是从“实际的”工作中分心了。但如果你已经掌握了写作技巧,写起来会很快。而且如果你把写作当作一门艺术的话,你能从中得到很多乐趣。你肯定会遇到思路阻塞的情况,这有很多的可能原因,没有一定可以避免的方法。追求完美可能导致思路阻塞:无论开始写什么,总觉得不够好。要理解写作是一个调试的过程。先写一个草稿,然后返回修订。写草稿有助于理顺思路,如果写不出来正文,那就写个大纲。逐步对之细化,直到已经很容易写出各部分的内容。如果连草稿也写不出来,隐藏掉所有写作窗口,然后随便输入自己脑袋里想到的东西,即使看起来好像是垃圾。当你已经写出了很多文本后,重新打开窗口,将刚才写的东西编辑进去。另外写作中一个常见错误是以为可以将所有的内容依次写出。通常你应该将论文的核心内容写出来,最后才是介绍部分。引起作者思路阻塞的另一个原因是不切实际的以为写作是很容易的事情。写作是耗时耗力的,如果发现自己每天只能写一页,也不要放弃。完美主义可能会导致对本来已经足够好的论文还在不停地打磨。这是浪费时间(这也是一种有意无意之间逃避做研究的表现)。将论文看作你与本领域其他人交谈时的谈话。在交谈中,并不是每一句话都是完美的。很少有人会期待自己的某次谈话就是全部的故事,是与对方的最后一次交流。写信是一种很好的练习。很多技术论文,如果其风格更类似于给朋友的信,那么会有很大的提高。坚持记日记也是练习写作的方法(也会使你试验更多的文体,不仅仅是技术论文)。这两种方法还有其它的实质作用。一个常见的陷阱是花很多时间去追求修辞而不是内容。要避免这样。LaTeX并非完美,但是它有很多你所需的修饰语。如果这还不够,还可从其他从事这一研究的人那里借用一些词语用法。很多站点(例如MIT)都提供一个写作修辞的数据库。清楚自己要表达什么。这是清楚的写作中最难最重要的因素。如果你写了拙劣的东西,且不知道如何修改,这很有可能是因为你不知道自己要说什么。一旦搞清楚了自己要说什么,说就行了。论文的写作要有利于读者查找到你所做的工作。无论是段落的组织还是通篇的组织,都要将最核心的部分放在前面。要精心写作摘要。确保摘要已经反映出你的好思路是什么。确保自己明白自己的创新点是什么,然后用几句话表达出来。太多的论文摘要只是一般性地介绍论文,只说有一个好思路,却不说是什么。不要用大话来贩卖你的工作。你的读者都是很优秀的人,正直且自尊。与之相反,也不要为自己的工作道歉或者进行消减。确保自己的论文有中心思想。如果你的程序在10毫秒内解决了问题X,告诉读者你是如何办到的。不要只是解释你的系统是如何构建的,是做什么的,还要解释其工作原理和价值所在。写作是给人看的,而不是机器。因此仅观点正确是不行的,还要易懂。不要靠读者自己去推理,除非是最明显的推论。如果你在第七页的脚注上解释了某个小玩意的工作原理,接着在第二十三页没有进一步解释就引用了它,此时如果读者感到困惑一点都不值得奇怪。正式的论文要写清楚是很难的。不要模仿数学领域的文献,它们的标准是尽可能少的解释,使读者感到越困难越好。如果你等做完所有的工作后才开始写作,会失去很多。一旦开始了某个科研项目,建议养成这样的习惯:每隔几个月,就写一篇解释当前工作进展或者学习所得的非正式论文。从你研究笔记中的记载开始,花两天的时间写下来——如果你花的时间更长,说明你是一个完美主义者。写的只是草稿——不是为了被引用的那种。将论文复制数十份,送给你的朋友和那些感兴趣的人(包括你的导师)。与写正式论文相比,这样做也有很多好处(评论,理清思路,写作练习等等),而且从某种意义上讲,付出无需那么多。如果你做得不错,这些非正式论文以后可以作为正式论文的骨干内容,也就是从自己实验室的WorkingPaper成为一篇期刊文章。一旦你成为SecretPaperPassingNetwork的成员,会有很多人给你寄论文拷贝要求评论。获得他人对自己的论文的评论是很有价值的。因此你评论的论文越多,你获得支持就越多,也会收到更多人对你论文的评论。不仅如此,学习评价别人的论文也有助你的选择。为论文写有用的评论是一门艺术。要写出有用的评论,需要读两遍论文。第一遍了解其思想,第二遍开始作评论。如果某人在论文中屡次犯同一错误,不要每次都标记出来。而是要弄清楚模式是什么,他为什么这样做,对此还可以做什么,然后在第一页清晰地指出或者私下交流。不要在论文写毁灭性的批评如“垃圾”,这对于作者毫无帮助。花时间提出建设性的建议,要设身处地地为作者着想。评论有很多种,有对表达的评论,有对内容的评论。对表达的评论包括校对打字稿、标点、拼写错误、字词丢失等;还可以是校正语法,修辞,以及混乱不清楚的段落。通常人们会持续地犯同一语法错误,因此需要花时间明确指出。接下来是对组织结构的评论:不同程度(子句,句子,段落,小节乃至一章)的次序混乱,冗余,无关的内容,以及论点是否丢失。你可以建议作者扩展自己的想法,考虑某个问题或错误,论文存在的潜在问题,表达赞美等。“因为Y,你应该读X”是一种总是有用的评论。当被要求对论文作评论时,你首先要弄清楚哪种评论更有用。对于早期的论文草稿,主要需要你对内容和论文的组织结构作评论;对于最终的草稿,主要需要你评论表达的细节。注意,作为一种礼貌,在要求别人评论之前,应首先用拼写检查器对自己的论文进行检查。你无须接受所有的意见,但是必须都认真对待。将论文的部分内容裁掉是挺令人痛心的,但往往也提高了论文的水平。你经常会发现某个意见确实指出了问题,但是解决方法你觉得不可接受,那么就去寻找第三条道路。要多发表论文,这其实比想象中的容易。确保论文可读性比较好。论文被拒绝的原因,除了没有意义之外,就是无法理解或者组织糟糕。通常是先向会议投交一篇篇幅比较短的有关工作内容的早期报告,然后再往期刊投交一份篇幅较长的最终正式论文。看看IJCAI(InternationalJointConferencesonArtificialIntelligence)的会议录,你会发现会议论文录取的标准相当低。而且由于会议评审过程本身固有的随机性,录取的标准变化更大,所以一个发表论文的诀窍是不停地试。主要的会议都会在被接收的论文中评出内容和表达俱佳的获奖论文,仔细研究研究。论文在投往期刊之前,应该交流一段时间,并根据反馈的评论进行适当的修订。要抵制那种急匆匆地把结果投往期刊的做法。在自己的研究领域,没有竞赛,而且不管怎么说,出版周期的延迟要大大超过对草稿进行评论的时间。另外,读一读你想投稿的期刊或者会议的过刊,确保自己论文的风格和内容是适合的。很多出版物都有一页左右的“作者投稿须知”,仔细看看。论文被拒绝了,千万不要沮丧灰心。期刊和会议的论文评审过程存在很大的不同。为了节省时间,会议论文的评审必须迅速,没有时间细究或者交流。如果你被拒绝了,你就失败了。但期刊论文则不同,你可以经常地与编辑争辩,通过编辑与评审人争辩。如果你收到了令人生厌的评审报告,应该向大会的程序主席或者编辑投诉。评审人一般都会对你有所帮助,当然不能期望可以从会议论文评审人那里得到多少反馈,但对于期刊论文,往往可以得到非常棒的建议。你不必完全按照评审报告的建议去做,但是,如果你不按照报告去做,那么就必须解释原因,并且要意识到这可能会导致进一步的负面评价。不管怎么样,无论是哪种评审,作为被评审者都要有礼貌。因为在余下的职业生涯中,你将会与评审者在一个学术圈子里。论文写作所花的时间总是比期望的要高,论文的发表在耗费时间这个问题上则更严重。当你完成了一篇论文,投出去,等待发表。数月后,论文以及评论意见被返回来,你不得不对论文进行修改。然后又是几个月,才返回对你修改的确认。如果你同时发表了该论文的不同形式,如有一篇短的投会议,一篇长的投期刊,这样的过程将反复数个回合。结果有可能是当你已经厌倦了,研究主题也已经令人生厌后数年,你仍然在修改那篇论文。这启示我们:不要去做那些需要热情投入但是很难发表论文的研究,那将苦不堪言。三、程序设计并不是所有自己研究领域的论文都包含代码,而且本领域的很多重量级人物从来没有写过一个重要的程序。但是为了掌握自己研究的工作原理,你必须会程序设计。不仅仅是很多计算机研究工作需要编写代码,学会程序设计还能带给你什么是可计算的什么是不可计算的直觉。当然,学习一门语言并不能等同于学习程序设计;自己的程序设计包含的一些技术与那些在系统程序设计或者应用程序设计中用到的大不相同。开始学的时候,可以先看看Abelson和Sussman的《StructureandInterpretationofComputerPrograms》,并做一些练习。这本书与自己所研究的程序设计本质上并不相干,但是包含了一些相同的技术。最后,进行实际的程序设计,而不是阅读,才是最好的学习程序的方法。学习程序设计有很多传统。有些人习惯一起写代码,这取决于个性。还有的人寻找机会直接向有经验的程序员学习,或者请他对你的代码进行评价。阅读别人的代码也是很有效的方法。如果可以向高年级同学要他们的源代码,他们可能会有些抱怨,说自己的编程风格差极了,程序实际上并不能工作云云。不管怎么样,最后你获得了源代码。然后你要仔细地通篇阅读,这很费时间。通常阅读并完全理解别人代码所花的时间与你自己编程完成的时间是一样多的,因此要计划好在你的头一个或者头两个学期用数周的时间去阅读别人的代码。你将从中学到很多以前不曾想到在课本中也没有的技巧。如果你读到了整篇不可理解没有注释的程序,你就会明白不应该如何写代码了。在软件工程课里学习到的那些知识在自己的程序设计中很有可能依然有用。要给代码加注释,使用正确的数据抽象,将数据和你的代码隔离开,提高可移植性,诸如此类。经过头几年的学习后,就应该写一些自己的标准程序设计模块了。任何你感兴趣的东西都可以尝试用程序实现。你可以抓住问题的实质,在几天之内完成一个功能版本。修改已有的程序是另外一种有效的方法,前提是你已经写过这样的东西,并且确实了解其工作原理,优缺点以及效率等问题。不像其他通常的程序员相互借阅代码(演示代码例外)。虽然可以对代码进行修改满足自己的需要,但记住理解别人的代码是很耗时的,有时候还不如自己写一个。有时候构建一个标准包的工作本身就可以成为一篇论文。像论文一样,程序也有可能过于追求完美。不停重写代码以求完美,最大化的抽象所有的东西,编写宏和库,与操作系统内核打交道,这都使得很多人偏离了自己的论文,偏离了自己的领域(从另外一方面,或许这正是你需要将来谋生的手段)。