如何閱讀研究論文

遙想當年,曾有一段時間經常下載國內論文來閱讀,主要是關於漏洞挖掘相關方向的,但最後發現,天下文章一大抄,從本科到博士的研究論文有很多如此,另外有些只是做完作業,對研究結果完全無視,此風尤以畢業論文見長。這種情況導致我很長時間內不再看國內的研究論文,尤其是中文寫的論文。 近兩年,隨着Fuzzing技術的崛起,四大頂級學術會議上經常出現Fuzzing技術相關的研究論文,於是常下載閱讀,對於長論文還會打印出來。剛好昨晚看到一篇來自滑鐵盧大學的文章叫"How to Read a Paper"(點擊「閱讀原文」獲取)其中一些觀點跟鄙人的一些閱讀習慣相同,但也有一些方式不太認同,請讀者自行依據個人習慣取捨。本文更多地是分享計算機相關研究論文的個人閱讀方式,特別是那些習慣把論文就從頭到尾閱讀完的人更該看看。

135編輯器

三步閱讀法

以前拿到論文經常從頭到尾看,有時看了幾頁才發現並不是自己想要的,比較浪費時間。所以"How to Read a Paper"作者提倡「三步閱讀法」(The Three-Pass Approach),雖然我的閱讀順序和方法與之不同,但也可以分為三步:

  • 第一步:了解論文大意,主要還是看自己是否感興趣,是否有繼續讀下去的必要;
  • 第二步:了解論文主要內容,不求理解各個細節;
  • 第三步:深入理解論文內容,必要時動手驗證。

第一步

先看標題,是否屬於自己感興趣的內容。

今年OffensiveCon大會有個個議題叫「can't grep this",如果你不看目錄根本不知道對方是要講CodeQL代碼審計,所以接下來,依次閱讀摘要、關鍵詞、目錄、結論,以了解論文大意,決定是否需要繼續閱讀。

個人覺得這裡引言、參考文獻是可以先不用看的,因為你看了上面幾部分之後覺得沒興趣就可以扔掉論文了。引言更多是講研究背景、價值和必要性,一般不涉及技術細節,對於理解論文的內容沒多大幫助,常常是吹噓成分居多。

閱讀摘要和關鍵詞,是為了判斷論文講述的技術方向、水平。結論是為了驗證最終的效果以及該項研究的主要貢獻,很多國內的畢業論文就經常經不住這種考驗,最多驗證下1day,有些甚至沒效果沒結論,這點着實令人對前面各種花哨的技術內容失去信心和興趣了。

若是決定繼續閱讀,對於需要仔細閱讀的長論文,我一般會打印出來,方便對比看和作筆記。比如Project Zero的Samuel公布的研究論文"FuzzIL: Coverage Guided Fuzzing for JavaScript Engines",無論是技術水平,還是寫作格式,絕對是學術與工業結合的佳作。

第二步

第二步主要是圖片、表格、引言、算法、參考文獻。比如研發相關係統的論文,都會附上系統架構圖,這對於幫助你理解論文的研究內容有個大體的認識,還有算法實現,多數為偽代碼,比較好理解,可以進一步了解對方的技術實現相對前人有何不同,判斷其主要貢獻,效果驗證部分經常也會提供對比表格、圖片,方便判斷此論文的技術價值有多大。若是貼大段真實代碼、各種複雜公式的,可以先忽略,到第三步再細究

在這一步,可以幫助你判斷自己的技術背景知識是否足夠來理解該論文,除搜索引擎外,以及末尾的參考文獻也是一份不錯的學習資料,可以先標註一些你感興趣且未讀過的參考文獻,在讀完論文之後再去閱讀參考文獻。閱讀參考文獻可以看有沒有自己閱讀過的優秀論文,同時也可以主題閱讀的方式,去找到更多優秀的論文進行學習。對於感興趣但不足以理解論文內容的,該補的知識還是得先補下。

第三步

第三步仔細閱讀正文,掌握論文中的技術細節,必要的話作筆記,電子版的可以在pdf上編輯標註,比如印象筆記,個人是習慣在紙質版上標記。最後就是根據論文價值和個人興趣決定是否需要自己動手實現一遍,一來驗證作者思路的準確性,二來幫助提升個人的技術能力。

"FuzzIL: Coverage Guided Fuzzing for JavaScript Engines"為例,我看論文花了一天,內容全英文且很長,看完之後搭建環境跑通FuzzIL又花了一天,然後閱讀FuzzIL源碼又花了一天,原本還想二次開發或者重寫一個,最後還是沒搞。不過,圈內已有人二次開發並發現Chrome 0day,也有一位認識的朋友直接用Python重寫了一遍。

總結

本文主要總結了一些閱讀研究論文的方法,個人更多的是閱讀漏洞挖掘相關的論文,所以在閱讀方式上可能會與其它論文類型的閱讀略有不同,這僅代表個人閱讀習慣,大家自行取捨。最後,總結一下本文分享的論文閱讀順序: