分享

如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?

 mynotebook 2022-07-06 发布于湖南


恭喜你已经有了一个A类别的idea和相应的实现以及数据,那么接下来就是写文章的问题了。计算机论文写作还是有一定的规律可以遵循的。

首先,你需要判断自己的文章是投往哪个A类期刊或者会议,是IEEE的还是ACM的。通常IEEE会议的格式和ACM会议的文章格式要求有所不同,我建议你在投论文之前先把该会议的Call For Papers好好研读一番,弄清楚文章长度,需要使用的Latex或者Word模板以及匿名方式等一系列非技术性问题,然后再开始写作。

在写作之前,先问问自己如果这篇文章写好以后给整个领域(community)的贡献是什么,这实际上是整个文章的灵魂,也就是你解决某个问题(problem)的方案(idea)。想清楚以后把它(们)按照重要性顺序写下来,这些就是你在Introduction里面告诉读者包括审稿人的contributions。贡献可能是新算法,新架构,新实现或者是前人没有的insights。你在写contributions的时候面向的读者很有可能是自己,所以可能忽略了problem背景和定义,这些就可以慢慢在Introduction里面填充。

这样Introduction就写好了,比如说:某某问题是实际中存在的一个问题,这个问题重要性是blah,blah,blah。之前发表的论文针对这个问题提出了三个有代表性的解决方案(此处引用可能至少三篇论文)。第一个解决方案甲大概做了一二三,但是没做四;第二个解决方案乙做了一四,但是没做二三;第三个解决方案丙做了一二三四,但是性能比较差。在这篇文章中,我们提出一个性能比较好并且同时做一二三四的解决方案。接下来写我们这个解决方案是如何实现同时支持一二三四的情况下提升性能的。比如说用了新算法,新架构或者新的实现,都可以。讲完基本技术创新点以后就是contributions,把之前想好的贴上去就可以了。最后在Intro里面加上后续内容组织,比如说第二章是相关工作,第三章是综述,。。。

一般来说Intro写完以后会写一章相关工作(Related Work)。从最Related的论文开始写起,比如说以上提到的三篇。这里需要着重讲的是,Related Work不是记流水账(e.g.,甲用了idea A,乙用了idea B,丙用了idea C),而是要比较这些论文,阐述她们各自的优缺点。

Related Work写完后,你需要写一个Overview来总括你的问题和解决方案。我的经验是最好想一个最最简单的例子(Running Example),然后使用这个例子引出你要解决的问题。接着再把之前在Intro中提到的现有解决方案挨个说一遍,并且用那个案例表明三个解决方案的不足(这里最好用实际数据)。最后把你的解决方案介绍一下,重点是与前人做的相比较。如果你用了一种新的算法,你可以大概提一下这个算法的思路以及实验数据;如果是新架构,最好放一张架构图上去,然后阐述一下新架构的优势(以及劣势)。在这一章介绍自己的idea的时候,你只需要概略描述即可,凡是涉及到技术细节的东西均可以引用后面的章节来节省页面空间。

后面这一章就完全是技术细节了。如果是自己做的的话,这一章是最好写的,因为你只需要把code/算法/架构在纸上还原出来即可。注意由于页面限制,一般来说这一章不可能包括所有细节,按重要性取舍吧。注意有些corner cases,如果很重要的话,千万别省略。
技术细节讲完了,如果页面允许,你还可以大致讲一讲你的实现情况。比如说新的系统是在Linux上实现的,新加了20000行C代码,1500行Python以及300行Bash script。C代码主要干什么,Python主要干什么以及Bash script干什么,最好能与技术细节里面所讲的呼应。
自然地,技术细节和实现讲完了就该讲你是如何用实验验证你的解决方案支持你的contributions啦。根据上面的例子,你需要写的是如何从实验数据中展示你的解决方案支持一二三四并且性能不错。支持一二三四这种是或否的问题比较容易说,但是性能不错就需要和前人作品做大量比较了。柱状图,折线图,表格等等数据展示手段,只要能说明问题都可以采用。这里需要注意的是,只要你写在论文里面的文字或者是图表,你都要想清楚背后的原因,最好能在论文里做充分的解释。比方说,你采用了新的算法,性能见表1,原因是复杂度降低了;你采用了新架构,性能提升见图3,原因是新架构节省了内存拷贝。通常来说,新算法或者架构会总体上提升性能,但也可能会有异常情况,即新方案比不过老方案的地方。这时需要格外注意,因为这是你的weaknesses,你需要用令人信服的说法向读者展示这些异常情况存在的可能性较低,或者可以通过某种简单方式避免。
如果写到这里你还有充足页面可用,你可以试图写一个discussion章节来讨论你的方案的缺点,以及未来有可能的改进情况。不要怕展示缺点,你越诚恳审稿人对你印象越好。如果你是故意遗漏新方法的一个很显然的缺点,这会给审稿人非常不好的印象。你也可以提一些你的方案的其他应用等等。
最后就是结论啦,用一两个段落概括一下解决的问题,解决思路以及贡献就可以了,比较好写。
如果你需要写一些附录,比如说文章里有几个定理没有给出证明,那可以在后面的Appendix章节中加入。通常Appendix审稿人不太会读。

我还有一些小建议,希望能对你有所帮助:

1. 找到会议程序委员会(Program Committee,也就是审稿人)的页面,然后看看哪些审稿人做得和你做的相关。如果有的话你应该在Related Work中引用他们的作品,因为大家都希望自己的论文被别人引用。不要怕有礼貌得指出他们的论文缺点,如果你说得对,审稿人看到会很高兴的。

2. 论文提交前用你能找到的任何有效的书写检查软件检查一下拼写错误或者简单的语法错误,我知道有些审稿人会对这种小问题过敏,如果一篇论文中此类错误过多可能会导致直接悲剧。有条件的话,找一个英语为母语的人帮你最后把把关。这里我推荐你如果可能的话找一个美国教授合作写论文,可以节省很多时间。

3. 如果你之前没中过2-tier或者3-tier的期刊或者会议,那么可以先从这些着手,慢慢锻炼。

我18年博士毕业之后去互联网公司做码农,和题目下面的老师们肯定没得比。我paper写的算不上好,但是主笔过几篇architecture & system (MICRO/HPCA/VLDB/TCAD)的论文,算上有些经验。下面是我的google scholar截图,证明我确实可以回答这个问题。
图片
首先你要搞明白一个事实,对于绝大多数计算机的方向,会议比论文重要。大部分的重要研究成果都是发表在会议上,会议的难度也比期刊高很多,而且research community的人基本都会看会议,看期刊文章比较少。一般期刊允许已经发表在会议上的论文、再加30%的内容就可以去投期刊了,这一点可以在各个期刊的主页上看到。而如何界定“30%”,花样就很多了。我个人的经验是这“30%“对质量的要求不高,不信你可以看看我之前发过的期刊,然后再对比下之前的会议文章就知道了。因为国内很多地方在评职称、评奖项的时候很重视期刊,因此发完会议文章之后再水篇期刊是很划算的。

然后写paper要从战略上藐视敌人。十年前我刚读本科的时候,学校里面哪个老师发个好点的会议,都能成为新闻。现在在CCF-A类会议上已经可以经常见到国内的本科生了。难道这十年大家的科研水平突飞猛进了吗?大家的智商突飞猛进了吗?大家的英语突飞猛进了吗?没有!只是因为这几年国内高校挖了很多海归,以及国内国外的交流越来越多,大家开始学习国外写paper的方式以及做research的方式,当然也学到了很多骚套路。所以,不要觉得写paper是已经很难的事情。

还要搞明白一个问题,发paper不是为了显得谁厉害,而是大家把研究成果贡献出来分享给社区。因此,你不能只是去吹你的成果多厉害,而是要把背后你要解决什么问题、这个问题有哪些难点、你是怎么解决的、你的方法的核心点在哪里,都要说清楚(而且还要让人看得懂),最后的实验来给出更为详实的证据,加深大家的理解。别人读完你的论文,对某个领域有了新的理解、学到了新的知识或者解决问题的方法。想明白这个设定,你已经在学会写论文的路上迈出了坚实的一大步。下面进入正题。

第一点:你要学会构思一篇论文的结构,有了结构之后再去填内容。 结构是一篇论文的灵魂!论文不是流水账,也不是秀肌肉,而是一篇结构清晰、内容详实、证据充足的推理文章。结构不清晰直接就GG了。一篇论文由摘要、Introduction、正文三部分组成。个人经验摘要不太重要。Introduction是需要介绍整篇论文的框架。然后正文由几章组成,按照顺序依次介绍Introduction中的每个环节。论文的框架,就是将何种背景、如何发现问题、分析问题、解决问题、做出贡献的,下图展示了论文框架的五个部分。

图片
背景介绍部分是introduction里最简单的部分了,就是介绍下这个话题的一些背景知识,,只要不是抄来的就行。问题介绍部分,就是要在一个大背景之下,限定这篇论文要解决的问题,并且说明这个问题的重要性,可能需要放一些自己的实验数据或者引用别人的论文作为佐证。
一般来说,背景介绍、问题介绍部分不会有太多技术含量很高、原创性强的东西。接下来问题剖析部分,就要开始有很多你自己的东西了。比如你发明了A方法解决B问题。如果B问题是已知的问题, 你就要解释为什么现在的解决方案都不好或者为什么还没有解决方案。如果B问题是未知问题、你自己发现的新问题,那么你就要解释这个问题有多重要。这一阶段,你并没有提出任何解决方案,但是一定要有自己对问题的insight。注意这个词,insight! 如果你被拒稿多次,你一定被审稿人批判过没有insight。对要解决的问题有深刻的认知并且有自己独特的见解,是一篇论文的基本要求,有时候指出问题比解决问题还要重要。
解决方案就是对自己的解决问题的方法的一个简介,这个阶段也需要一些原创性。比如自己提出了那些原创性的方法、或者引入了别人没引入的技术,都算你原创。最后是核心贡献,核心贡献其实就是对你的问题剖析、解决方案的提炼,一般是3-4点,比如你指出了某个别人没指出的问题、你提出了别人没提出过的新方法、你的方法效果有多好等等等。
框架的构思, 注意十二个字: 环环相扣、步步坚实、逻辑严密。上面我讲的5步,必须每一步是环环相扣的,前有伏笔、后有填坑。比如在问题介绍部分,你指出某个领域有A、B、C三个重要问题,但是你后文只打算解决问题A,那么在问题介绍部分你就需要解释为什么不解决B、C。如果你有证据证明B和C不太重要,是可以的。或者解决问题A的贡献足够构成一篇论文,那么你可以明确表示本文只解决A,B/C以后再说。
反正就是不要前面挖了坑,后面不填,要不然你连基本的论文写作标准都达不到,很可能直接就GG了。还有就是必须要保证每一步的证明都是能说服审稿人的。比如问题介绍阶段,你一定要让审稿人相信你要解决的问题是很重要的(虽然实际上可能没有用),旁证左引、引经据典。比如问题剖析阶段,一定让审稿人觉得听完你分析,好像非常有道理、好像对这个问题有了新的认识。总之就是一步踏空,审稿人可能就不打算继续看了。逻辑严密就不多说了,每一环之间都要是自然的递进关系,不要强行扯上关系。写论文的时候,我和其他作者的讨论,大部分都是在讨论整个框架的推理过程够不够有说服力。
第二点,学会写每一章。从第二章开始,每一章都是更为详细的解释introduction中的内容。已我自己写论文的经验,第二章可以是背景介绍,把Introduction中的问题介绍和问题剖析更为详细的展示出来,该引用论文就引用、该放实验结果就放实验结果。如果太长可以拆成两章,总之要把问题的重要性、你的分析、你的insight、你对前人论文的不足之处的解释都写清楚。第三章可以是一个解决方案的概述。然后可以把解决方案分成两章分别介绍(第四章、第五章)。第六章讲实验,一般是1-2个大实验让审稿人相信你的方案确实可以,然后3-4个小实验作为佐证或者分析一下分支问题。注意!这里每个实验也都是和前面的问题分析、提出的解决方案要对应起来的,前面有铺垫、后面要填坑!论文中的每一段都要师出有名!第七章介绍下related work,第八章再总结一下。关于Related work,在我自己的写作风格里,不是特别重要。因为在问题的分析阶段,我肯定是要把非常相关的前人的论文并且逐一批判的,一般五六篇到十来篇吧。一般是把一些不是特别相关的论文放到related work里面再分类讨论下,不会对整篇文章的逻辑构成很大的影响
第三点,多看论文,总结经验。写论文一定要多看别人的论文、多反思自己的论文。看的时候要带着思考,想想别人为什么这么写、想想审稿人为什么拒绝你。比如,有些会议喜欢在introduction中放大量的实验,把核心内容都讲清楚,光intro都有两页纸,有些回忆则是点到为止,具体的证据可以后面放,这都是要通过总结经验才能发现的。比如,我投稿被批过论文仅仅是实现了一些算法、只是engineering 没有学术贡献,为了解决这个问题,我学会了在问题分析阶段,把自己要解决的每个具体问题升华成一类问题,证明我的解决方案对于很多重要问题都是有非常大的价值的,而且我发现我最擅长的就是把某个dirty work描述的好像很有理论价值。
另外有一个经验就是,不要高估审稿人的耐心值,也不要让审稿人帮你总结contribution。一篇computer architecture论文长达12-14页,即使是大概看一遍也要两三个小时。好的会议录用率可能只有20%,也就是说审稿人花10个小时才能看到一篇比较好的文章。审稿人(实际上是他学生在看)又都很忙,不会真的花两三个小时去看一篇垃圾论文的。所以,写论文要学会总结。我比较喜欢在每一章的开头处用3-4句话总结这一章要说什么、把我的核心contribution列出来。对于每一章的每一段,都在开头或者结尾点下题。这样的话,审稿人只需要花很少的时间,就能知道我要表达什么,极大地减轻了审稿人的负担。如果他对这一章很感兴趣,可以仔细看看,不感兴趣的话直接略过也没关系,反正get到我的点了。这样审稿人既可以了解到你的核心贡献,也可以更快的读完你的论文。
最后,你花了10分钟看完这篇文章,但是什么长进也没有。因为写论文真的是一件很辛苦的事情,里面的很多思想、很多细节都是需要大量的练习和经验的积累的,而且我没见过有谁无师自通。比如最近在公司参与一些system论文的写作,通常是一个有经验的作者负责主笔,3-4个有经验的人深度参与(每个人20小时以上),贡献自己的意见,最终才能完成一篇高质量的论文。所以学写论文最好的方法,是找个人带你写,比如导师、实习的mentor、大师兄之类的。如果你是个苦于不知道怎么写论文的博士,很可能说明你现在的环境,没有人能够教你写,想办法换个环境吧,比如来我们组实习。
作为一个被拒稿几十次,有着丰富被虐经验的科研工作者,我对这个问题非常感兴趣,也来凑凑热闹说说我的体会吧。从我博一开始,就被导师忽悠着投ieee tit,从博一到博五一共被tit拒过六次,其中有五次是直接拒,说我做的东西太差。印象最深的是有一一位以色列副主编直接说我做的东西也就是硕士生的水平,还有一位香农奖副主编说我做的东西是在毁了这个学科。所以这里我想说的第一个准则就是,想中最高水平的trans,文章里的干货是最重要的前提。干货不行,大罗金仙也救不了你的文章。

文章的干货包含三种,第一种是针对一类新问题提出了一种新颖的解决问题的方法,并用此新方法得到了该新问题一个好的结果,这是最顶级的干货,也是学术界顶级大佬的成名作中最常见的成果。第二种是方法并没有创新,无非是把前人的若干方法结合了起来,然后解决了一系列问题,并得到了较好的结果。这种类型的干货也是目前绝大多数trans论文中的成果。第三种是针对一个没有解决的ooen problem,提出了新的方法把该问题向前推进了一步,这种类型的干货也是非常棒的,足以在任何档次的trans上发表。

在我看来,一般的博士生不太可能有第一种干货和第三种干货 ,都是集中在第二种干货。但是只要好好写,第二种干货足以在绝大多数trans上发表了,如果想在最顶级的期刊上发表,则需要在工作的系统性上下功夫,即把所有这类问题全部做完。另外,还需要得到大牛的支持和挂名。

说到论文写作上,我认为越好的trans越注重干货,越差的trans越注重语言问题,这是由于顶尖trans的审稿人都非常了解论文的工作,能看穿论文的本质,而差些的trans的审稿人很多都不是所评审论文的小同行,不能看穿论文本质,故只能拿语言说事了。

若觉得还不错的话,请点个 “赞” 或 “在看” 吧

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多