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


转自《知乎》如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文? 
问题: 
作为一个博士生,一直为写论文头疼,读过很多高质量论文,觉得写的真好,但是轮到自己写总是力不从心。 最讨厌的是活生生的把一个A级别的idea写成C质量的论文…..

在这里的高质量限于IEEE/ACM Transaction级别,或者同等级别的Conference, 例如SIGKDD,CVPR,STOC,CCS之类

看过很多如何写论文的文章或者视频, 但都面向的是如何写论文, 而不是如何写Transaction级别的论文, 希望得到一些指点

回答: 
作者:Terafer 
链接:https://www.zhihu.com/question/22790506/answer/81787300 
来源:知乎 
著作权归作者所有,转载请联系作者获得授权。

恭喜你已经有了一个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的期刊或者会议,那么可以先从这些着手,慢慢锻炼。

祝你好运!

利益相关:计算机博士刚毕业,期间3篇CCS一作,1篇PLDI一作。