论文写作的艺术

我的导师陈常嘉教授,还有我的师兄赵永祥教授,在分享论文的时候,总会说,一篇好论文的标志是,当读者读完它的导论后,会拍着桌子喊:这太酷了,我为什么没想到?!通常,他们说这句话的时候,会真地拍一下桌子。我很怀念和他们在一起的这种时刻。因此,我也想和同学们一起实现这一目标。这需要我们学习论文写作的艺术。我们来看看哈佛 Margo Seltzer 老师分享的这种艺术。

Margo Seltzer 老师是一位非常有趣的计算机系统领域的老师。她 1983 年哈佛计科系本科毕业,在各种技术公司任职 5 年后,1988 年进入伯克利大学攻读博士。1992 年博士毕业后,回到哈佛计科系,至 2018 年,16 年间,一直在哈佛任教,期间自 2006 年起还在 Oracle 公司担任架构师。2018 年,她的女儿高中毕业后,她离开哈佛,到加拿大英属哥伦比亚大学任教。我猜测这是因为哈佛对教职工子女上哈佛,有优惠政策,所以她等到女儿进入哈佛后,她才离开。她的主要研究领域是计算机系统,包括文件系统、事务系统、数据来源、图形分析引擎和数据库,同时也研究医疗保健信息学和教学方法,致力于促进计算机科学中女性的教育和事业发展。她教授操作系统和数据库系统方面的本科和研究生课程,还与哈佛商学院的教师合作,在校园内以及通过 EdX 作为 MOOC/SPOC 的组合教授医疗保健创新课程。

Margo 老师文笔非常好,又热爱分享。1988 年,她搬到伯克利后,坚持每月给波士顿的朋友们发送一份“通讯”。1993 年回到波士顿后,又坚持了大约五年,直到她有了孩子。每个通讯都包含从几篇类似博客的文章。2010年,女儿10岁了,她又重新写,这次是在她自己的博客上。对这次重开博客,她说:在过去十年左右的沉默中,我决定恢复这些活动。不要期望任何深刻的东西 —— 我倾向于写那些,我发现有娱乐性、趣味性,有时可能有一些信息量的(entertaining or amusing and perhaps sometimes informative)东西。博客于2020年又一次停更。最后一篇文章是疫情袭来,她在实验室探索架设 Discord 聊天服务器,用于指导学生。这个博客上的内容都很有意思,反映了哈佛老师的真实生活。比如其中一篇博客,是介绍她和学生第一次见面时会说的话,实验室前三次每周例会上和学生做的游戏,以建立一种开放、合作、积极、支持的实验室氛围(open, collaborative, positive, supportive),非常值得我学习。

Margo 老师 2012 年还在哈佛任教时,给学生写了一封如何写毕业论文的信。这封信非常形象,生动,特别是其中用的很多比喻让我非常喜欢。她首先强调“故事线(story line)”,论文要有这条线,把各种内容穿起来,确保没有冗余,符合逻辑。她说,我们甚至应该以童话的语言来写:“很久很久以前 …” 我觉得这个比喻能够释放很多同学面对写论文时的紧张感。然后,她强调,写作不是次要的,而且全部。对这点,我深有体会,因为这非常符合我对我接触过的大多数同学的认识。大家普遍认为:做实验是主要的,写作是次要的;以为实验做完后,写作就会行云流水,一周就能完成一篇2万字的论文。事实证明,这是一场灾难:一位最优秀的学长后来回忆说,这7天里基本上就没睡过。所以后来我就会要求同学们提前一个月交论文初稿,以免悲剧重演。

然后她介绍了引言的写法。她说:引言的目的是,引导读者接受你的“贡献”。这个说法很给我启发。她说,因此,我们可以找一个读者,或者评审人,从他们的知识背景出发,像对他们说话似的,一路写下来,把他们引导到我们的贡献。最后,当他们读到我们的贡献时,惊叹地说:哇,这太酷了,我为什么没有想到?我们就成功了。这个评审人,有可能不是我们这个专业的,所以,我们引导的过程中,就要注意术语的介绍、背景的铺垫、思想的提炼,确保让他能跟上。引言的最后,是逐章的论文内容简介(outline)。这个简介应该把各章穿起来,建立各章之间的逻辑关系,构成一个逻辑清晰的完整“故事线”。这样做会很方便读者和评审老师。

此后,她介绍相关工作的写作。这里她的一个比喻也很给我启发。她说:相关工作就像一副画,其中有几个空白部分,我们论文的工作就放在这里。这个比喻非常形象。很多同学的论文写很多相关工作,但写完之后,并不说我的工作和这些工作的关系。这就失去写作相关工作的意义了。她然后具体地说:要对这些相关工作进行分类,解释清楚我们的工作和它们的关系,介绍它们时也要具体介绍它们的内容。这些都是我觉得特别有用、具体的写作建议,一定要掌握。她还指出有两种相关工作:背景、上下文。前者应该在论文前面提,后者在后面提。这也给我很大启发。我原来没有意识到这一点。

然后,她介绍了算法的描述、证明语法的描述、对“为什么(Why)“的解释、图片设计、性能结果分析,这些正文的写作细节,也很实用。因为这些内容在我们的论文中也基本上是标配,所以,这些方法我们都可以用。最后,在结论中,应该讨论对后续工作的意义,而我们读论文时,也可以从论文的结论中,寻找研究课题。这都是很好的技巧。最后,写完后,要自己从头到尾读几遍,再顺顺逻辑(Proof Reading)。所有这些都体现了这是 Margo 老师热心指导很多学生后总结的经验,我觉得很可贵,因为这些经验不是随便谁都能想到的,至少需要两点:1)老师热心,愿意帮助学生;2)老师聪明,能够总结出办法。Margo 老师就有这两点。然后她的文笔还超好,让我读得如沐春风,不得不服。特别感谢 Margo 老师。

下面是她的原文:

我为学生写论文(thesis)提供建议。有时是我自己的学生;有时是哈佛其他教师的学生;有时是需要外部委员会成员指导的学生。我想,如果我写下我关于论文的哲学,那么这些学生在问我之前就会知道他们正在进入什么(what they are getting into)。也或许,其他人会发现这些很有用。

我相信是我以前的学生基思·史密斯(Keith Smith)首先向我介绍了每篇文章(paper)都是一个故事的想法。因此,这对每篇论文(thesis)也适用。因此,在你写下任何东西之前,你最好确保你知道故事的情节(story line)是什么。这个故事情节(story line)将帮助您选择章节(pick your chapters)、撰写介绍(introduction)、让您保持专注,并可能会让(entertain)您感到开心。有些学生觉得很难将他们非常严肃的研究视为一个故事。出于某种原因(Somehow),这对他们来说是一种贬低(demeaning)。好吧,我会让这种感觉变得更糟。我建议他们实际上以童话的语言(in fairy tale terms)来思考它 —— 没错,以“很久很久以前从前(Once upon a time,)”开始,以“从此幸福快乐(happily ever after.)”结束。这可能不是一个道德故事,但理想情况下它将是一个技术故事(technical tale)。所以,当一个学生邀请我加入他的论文指导委员会时,我可能会问的第一个问题就是:“你在讲什么故事?” 准备好回答这个问题。

除了是一个故事,一篇论文也是一篇写作(a piece of writing)。作为一篇写作,它在技术上应该是正确的。这意味着您应用语法的基本规则,进行拼写检查,努力使写作与研究一样优雅。这似乎很明显,但你会惊讶于有多少学生认为写作是次要的过程。最好的论文是那些允许我集中精力、思考论文中的想法(ideas)和故事情节(story line)的论文,不是我经常看到的,每一句话都让我想拔出我的红笔的论文。

这里有些东西将前两项联系在一起。避免重复,避免多次说同一件事(是的,必须有意识地这么去做)。我知道您只是想将 N 篇论文简单地装订在一起,就称其为论文,但作为一个读者,我不需要将同一篇相关工作阅读五遍。我也不需要被告知十二次,说你的系统是有史以来最美妙的技术。想想你的故事情节(story line)。大多数东西都会很好地嵌入(fit in)你的故事情节中一次;弄清楚这个地方在哪里。

现在让我们来看看细节(nitty gritty)。引言(introduction)往往是人们感到最难写的东西。如果你看到了这里,你会想知道为什么你会认为引言很难写。引言的唯一目的(sole purpose)是让你的读者,从一个站立的起点,顺利地来到你介绍中的这一部分:“这篇论文的贡献是……” 什么是站立的起点?我告诉我的学生,他们是在为“聪明的计算机科学家”写作。这意味着您可以假设算法、主存、处理器、文件系统、树、链表、数据库等术语是他们已经熟悉的(fair game)。但是,您不应假设诸如 inode、B+*link-Tree、Haskell 的语义、直接存储、传递 FUSE 文件系统等术语已被广泛理解。下面这样做往往很有用,那就是挑选出一个人,然后针对他进行写作。如果你是一个理论人士,或写的是形式语言类型的论文,你可以把我的照片钉在你的电脑上,把我当做你的读者(一帅注:因为这位老师不是做理论的,她偏系统设计。对于我们来说,我们应该想象是一位无线通信、光纤通信、轨道交通、自动控制的老师,是我们的读者);这会让你保持诚实(honest)。如果你是我的学生之一,那么请用我尊敬的从事理论的同事的照片:Salil Vadhan、Michael Rabin、Leslie Valiant、Harry Lewis(我省略了 Michael Mitzenmacher,因为他涉足(dabbles in)许多不同的领域,他很可能是一个伪装的(in disguise)做系统研究的人)。这些人都非常聪明,但可能在过去的十年里都没有深入 Linux vnode 层的内部(是的,vnode 是我建议在介绍中避免的另一个术语)(一帅注:对我们来说,CNN、Transformer 就是这样的术语)。

所以,你有一些非常聪明的读者,你想给他们关于你的研究的足够的背景和动机(motivation),这样当你把你的贡献描述(contribution statement)扔给他们时,他们会想,“哇,这太酷了。”而不是“我为什么要关心这个(Why should I care)?”或“这到底是什么意思?(What on earth does that mean?)”或者,“这有关系吗?(Does that even matter?)”

下面是我真正的坦白:我从未读过大多数论文中类似下面这样的段落,“在第 2 节中,我们给出了我们研究的动机。在第 3 节中,我们提供了解决我们问题的现有方法的背景。第 4 节详细介绍了我们的方法。第 5 节评估我们的方法并向您展示了它的美妙之处。第 6 节是结论,它结束了我们的论文。” 然而,在论文中,你可以用简短的形式(in short form)讲述你的故事。这种逐章介绍的介绍大纲(outline)实际上是你论文的五分钟概要(synopsis)。它告诉读者,你现在将如何引导他们走过你的研究(walk them through your research),以便他们现在不仅了解你做出了哪些贡献,而且了解你是如何做出的,为什么这样做,以及你在此过程中发现了哪些有趣的事情。你在这里有地方写这些内容 —— 每一章都有一个自己的段落。不要从你已经发表的论文的导论中剪切和粘贴段落,放到这里来。将第 N 章中介绍的工作的描述编织到你的故事情节(story line)中。

如果你做得很好,你就为你的读者提供了一个非常好的服务(done your reader an enormous service)。如果有人把你的读者的孩子当作人质,只愿意在读者总结完你的论文后才让孩子走,一个好的引言的读者就处于非常良好的状态(in good shape)。基于你的导论,他/她可以很容易地解释你在做什么,你为什么这样做,有什么大的结果(big results),以及你将如何让世界相信这些事情。因为有你的导论,这些现在不都很容易?(一帅注:这么做,评审老师也会非常感谢你。因为评审老师填评审表的时候,也需要总结论文的工作,所以,他非常需要有人帮他总结好,这样就能很容易地完成评审表,从而节省他宝贵的时间。评审老师轻松愉快,你的评审结果令你愉快的可能性也会更大一些。)

所以,让我们结束(wrap)导论这一章的讨论:它让你的读者从一个站立的起始点,顺利走到描述你具体贡献的段落,然后,继续引导读者阅读你论文的章节大纲(chapter level outline)。该大纲描述这些章节是如何交织在一起,展示你正在声明的你的贡献的(demonstrate the contributions that you are claiming)。

接下来说说相关工作。与流行的看法相反,相关工作章节的目的不是表明您已经阅读了很多论文。相反,我喜欢将相关工作部分视为一件艺术品。在这件艺术品里,您构造了一幅风景画(construct a landscape)。在这幅风景中,有几个空白的白色部分,而您的研究完美地填补了这些空白部分。一个很好的相关工作章节,让读者沿着一条花园小径往下走,最后,在它的尽头,读者会想,“哇 —— 这个问题怎么会一直悬而未决?”(Wow – how could this problem have remained open so long?)或“看来这项工作显然是一项值得做的工作。为什么我现在没有在干这个?(It seems that this work is so obviously the right thing to be working on. Why am I not working on it?)”

好的,这就是目标,你如何实现(accomplish)它?在大多数论文中,相关工作部分将分解为几个一般领域(general areas)。弄清楚(figure out)这些领域是什么。我倾向于从视觉上和层次上思考,这几乎总是导致我试图将学生的论文投射到一个多维的空间里进行描述。(是的,我自己的论文就是这么写的,所以也许这是我唯一知道的?)如果你可以将你的作品投射到某个空间中,这个空间让你可以把相关的工作放置在其中的一些特定点上,以展示其中存在的未探索的区域(region),而您的工作恰好落入这些区域,那么您就万事大吉了(all set)。如果你不能做到这一点,那么你需要弄清楚如何将你的工作置于一个上下文(context)中。你的作品来源于(grow out of)什么作品?这个作品的主体(body)是什么?什么工作启发(inspire)了你?您应该将您的算法、方法和实现与哪些工作进行比较?回答完这些问题后,您应该知道要讨论哪些工作,理想情况下,你也应该知道如何组织它们了。然后,在讨论这些工作时,不要忘记指出具体的相关的部分。也就是说,不要只是说,“彼得、保罗和玛丽表明排序最好在线性时间内完成。”而是解释这一事实与你自己的工作有何关系:“虽然 Peter、Paul 和 Mary 开创了(pioneer)线性时间排序,但我们比他们的工作更进一步,表明在这些特殊情况(special case)下,亚线性时间很容易获得。”你想避免一个读者这么想:“你为什么要告诉我这个相关工作?”您的文章(prose)需要完全清楚地说明,为什么读者要费力地阅读(wading through)对这些相关工作的讨论,它们并不是您论文中提出的工作。

你可能还在为相关工作而苦苦挣扎,因为你无法决定它是在你的论文中,是在一开始就早提,还是在接近结尾时才晚提。你有这种挣扎的原因是因为实际上有两种相关工作。一种工作可以让读者了解足够多的背景,以便理解你在做什么。比如,如果您正在撰写一篇关于文件系统的毕业论文,那么您可能需要向您的读者解释什么是 vnode 层或什么是 inode。我喜欢将这类相关工作视为背景。然后是第二种相关工作,我已经讨论过 —— 它们进行上下文的设置。如果你有大量的背景要讨论,那么我非常喜欢在论文的开头专门加一章,就讲第一种类型的背景相关工作,然后在后面再加一节(section)介绍第二种设置上下文的相关工作。我喜欢把这些设置上下文的相关工作放在后面的原因是,当你在你的工作和现有工作之间进行微妙(甚至不那么微妙)的比较时,读者一旦理解了这些相关工作,他就更容易知道你实际上在做什么。

对论文的内容丰富的正文章节,给出详细的建议,有点挑战性,因为这些章节会因领域的不同而有很大的差异。所以我将尝试专注于我似乎总是评论的一些事情,这些事情也似乎适用于范围更广泛的各种论文。

如果您的论文包含算法的描述,那么您在决定如何表达这些算法的描述时,常常会被卡住。有些人使用伪代码;其他人使用一种真正的编程语言来写。伪代码的问题在于它不精确。真实编程语言的问题在于读者可能不熟悉该语言的语法。例如,我最近阅读了一篇论文,其中包含许多用 Haskell 语言编写的代码示例,这是一种我真的无法理解的语言。所以,我要求学生包括一个简短的教程。这里没有一个单一的正确答案,但您希望您的论文能够为尽可能广泛的读者所接受(approchable)—— 请记住这一点(keep that in mind)。

同样,如果您需要提供证明(proof),您需要使用所有读者都能理解的语法。不要假设每个人都以相同的方式阅读每个证明语法;你要定义它们。这可能是您的学位论文与您提交的会议论文最不同的地方。在学术会议上,一般有一套大家都非常熟悉、通用的词汇。

你的学位论文与你以前发表过的小论文不同的另一个地方是你现在有足够的空间。这意味着你应该阐述(expound on)一些你在较短的论文中可能无法解释的“为什么(why)”的问题。为什么你的架构是这样的?你还考虑了其它什么内容?你为什么选择做你所做的这一切?(在一篇好的小论文中,很多这种内容,也至少需要简短地出现,但是在你的学位论文中,你现在有更多的空间来解释它们了。)

同样,因为没有页数限制,所以您无需将所有图形塞进单列的格式。把图表、表格和图片画得漂亮,大一点(nice and big),以便您可以对它们进行注释(annotate)以便于更容易地理解,这样您的老年读者就不必过多地眯着眼睛(squint)。

当你介绍性能结果时,一定要解释为什么结果是这样的。总的来说,我喜欢根据以下公式呈现性能结果:“由于某种原因,我们进行了这个实验并希望看到一些东西。图 X 显示了实际结果。正如预期的那样,我们在图表的这一部分,我们观察到了预期的结果,但令人惊讶的是,我们在其他地方看到了完全不同的结果。我们进行了额外的实验来帮助我们理解这些异常结果,并发现了一些非常有趣的东西。”你最有趣的结果往往是你的实验产生了意想不到的结果。(”We ran this experiment and expected to see something, because of some reason. Figure X shows the actual results. As expected, on one part of the graph we observe the results we expected, but surprisingly we see that somewhere else the results are quite different. We ran additional experiments to help us understand these anomalous results and discovered something really interesting.”)

在结束(wrapping up)之前,让我们谈谈结论(conclusion)。你的最后一章需要结束(wrap up)你的整个论文,回到你最初的贡献声明,现在更详细地解释它们,因为你的读者现在既有背景,也有对你是如何做某事的理解。在这里你可以谈论长期影响,或你的结果将如何优雅地引导这个方面未来的工作。你不仅需要谈论你可以做的工作,还需要谈论你的论文如何给其他领域的工作提供建议。我喜欢建议我的学生阅读论文的结论,以寻找好的研究项目。让你的论文写成是我希望我的学生阅读的。

最后,我将这么结尾:我要说明什么应该是明显要做的(obvious)。你一定要从头到尾阅读一遍你的论文,确保你在讨论一个东西之前,介绍过它;确保你不会同一件事情说四次;确保你的故事情节(story line)是流畅的。理想情况下,当您这样做时,您会对这个结果感到满意。如果你不是这么做的,也许你想在把它提交给审阅它的人之前修复这些问题!

小结

一篇论文的最高境界是:当读者读到它导论中对自己贡献的介绍时,会惊叹:这太酷了,我为什么没想到?!这时,我们就成功了。要达到这种效果,论文需要围绕论文”故事线“的内容组织、流畅的逻辑、引言中对读者的引导、相关工作对论文工作的衬托、对自己解决问题思路的”为什么“的解释,以及最后结论部分对未来的展望。这就是论文写作的艺术。从这篇文章中,也可以看出 Margo 老师的个性、风格和水平。我觉得她是女性从事计算机科学的典范,是哈佛通识教育培养效果的典范。她的求学、育儿、职业、教育之路,都非常值得我们学习。谢谢 Margo 老师。

参考文献


Index Previous Next