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