Nature論文爆出千行Python代碼Bug,或影響百篇學術論文
你的論文借鑒了 Nature 文章的代碼?對不起,論文可能要重新寫了。
在 10 月 8 日發表于《ACS Publication》期刊的一篇論文中,來自夏威夷大學的 Jayanti Bhandari Neupane、Yuheng Luo、Rui Sun、Philip Williams 等研究者表示,他們發現了一個《Nature》論文中的 Python 腳本編程錯誤,這個錯誤可能會對 150 多篇已經發表的化學論文產生影響。
10 月 8 日發表于「ACS Publication」的論文。作者是來自夏威夷大學化學系的 Jayanti Bhandari Neupane、Yuheng Luo、Rui Sun、Philip Williams 等人。他們在這篇論文中指出了《Nature》論文中的 Python 腳本 bug。
論文地址:https://pubs.acs.org/doi/full/10.1021/acs.orglett.9b03216
論文中提到的腳本名為「Willoughby-Hoye」,用來計算核磁共振圖譜的化學位移值。夏威夷大學的研究者發現,在該腳本中,有一個模塊是根據文件的排序返回值,但 Python 并沒有定義查詢的文件順序。因此,該系統在不同的腳本上會有不同的返回值。
在運行這些腳本的時候,Luo 在不同的操作系統上得到了不同的結果。
他們在實驗中使用了相同的核磁共振數據,但結果卻出現了顯著差異。在 macOS Mavericks 和 Windows 10 上運行該腳本都能得到正確的結果(173.2),但在 macOS Mojave 和 Ubuntu 上運行時,結果卻出現了差異(分別是 172.4 和 172.7),與正確結果相差近 1 個百分點。雖然看起來相差不大,但在精確的科研世界里,這一差別就很嚴重了。
產生這種差異的原因是該腳本使用 Python 的 glob 模塊來查找符合特定規則的文件路徑名——基于 glob 的結果去生成讀取文件列表。但是 glob 的結果又取決于操作系統的文件返回值。于是腳本的計算結果會受到文件處理順序的影響。夏威夷大學的 Rui Sun 和 Phillip Williams 編寫了用來解決這個問題的排序較正代碼以保證結果的一致性,代碼量達到上千行。
在《Nature》論文中藏身五年的 Bug
2014 年,《Nature》子刊上發布了一篇名為《A guide to small-molecule structure assignment through computation of (1H and 13C) NMR chemical shifts》的化學論文,論文中包含了上文中提到的使用 Python 語言構建的腳本。
2014 年發表于「Nature」的那篇論文。
論文地址:https://www.nature.com/articles/nprot.2014.042
論文中的 Python 腳本下載地址:https://media.nature.com/original/nature-assets/nprot/journal/v9/n3/extref/nprot.2014.042-S2.zip
現任美國里彭學院化學系助理教授的 Patrick Willoughby 認可了夏威夷大學研究者的發現,并且在推特上展示了該團隊對腳本所做的更正:
他還提醒道,「如果你在做或依賴核磁共振化學位移方面的研究,那你一定要讀一下這篇論文?!?/p>
腳本的作者也在 twitter 上表示了對這一發現的贊賞,但他表示,當年寫代碼的時候,腳本是運行良好的。
他說,「Rui 和 Williams 教授的發現真的非常棒。6 年前我寫這個腳本的時候,操作系統能夠處理排序問題。Rui 和 Williams 添加了必要的排序代碼和函數來確保計算排序一致,給他們點贊!」
這篇 2014 年的論文至今已經被瀏覽過 1900 多次。Williams 表示,可能有 150-160 項研究項目受到了該 bug 的影響。例如,如果 Williams 用這個腳本錯誤地計算了樣本中的成分,而化學家剛好要用這一結果合成新的分析來研發新藥,那他的研究可能從開始就是錯的。
雖然 Williams 等人及時發現了這個問題,避免了該 bug 對自己的研究造成的影響,但它可能對其他研究舉足輕重。他希望這篇論文能夠讓科學家們更加關注實驗的計算部分。由于已發表的論文中很少提及操作系統,所以這一 bug 產生的影響目前還很難得出定論。
「學術原型代碼」VS「工業級別代碼」
一般來說,代碼并不是一篇學術論文中最被關注的點。所以說,計算機學界及其他領域學界往往不會對代碼質量過分深究。這也導致,不管是學術研究者還是業界人士,都能感覺到「學術原型代碼」和「工業級別代碼」之間的巨大差異。
顯然,科研人員們暫時未能成為精于代碼的「程序員」。論文中的代碼往往存在易讀性差、注釋量不足等問題,在沒有對應技術手冊的情況下也常常讓讀者摸不著頭腦。
許多網友也對這一現象進行過討論:「發 paper 的代碼一般多是 quick and dirty, 如果說一個方法很好,希望把整個代碼做好做魯棒,一般要經歷哪些步驟?」
最多的回答是:「重寫。」
還有一種類似張無忌演習太極劍法的實現方式:「把 paper 看完然后丟在一邊,直到完全忘卻代碼,然后根據記憶,按照工業級標準重寫一遍?!?/p>
不過相比于工業界的代碼,學術論文中代碼 bug 的影響畢竟還是有限的。
新西蘭惠靈頓維多利亞大學化學系講師 Rob Keyzers 在今年的一項研究中引用了這篇論文,他表示自己當時確實并不知曉這個 bug。
Rob Keyzers 沒有太過擔心自己的成果,因為團隊在研究中沒有使用這項有 bug 的腳本。同時他也補充說:「我們會仔細檢查研究數據,以確保沒有得出任何不嚴謹的結論?!?/p>
「Nature Protocols」的發言人在一份聲明中回應道,他們正在調查夏威夷大學這項研究中所提出的問題,目前處于保密方面的考慮暫不發表評論。