当前位置: 首页 > 科技观察

Nature论文千行Python代码bug,或影响数百篇学术论文

时间:2023-03-15 20:54:23 科技观察

你的论文借用了Nature文章的代码?抱歉,论文可能需要重写。JayantiBhandariNeupane、YuhengLuo、RuiSun、PhilipWilliams等夏威夷大学的研究人员在10月8日发表在《ACS Publication》期刊上的一篇论文中表示,他们在《Nature》论文中发现了Python脚本中的一个编程错误,可能影响了150多篇已发表的化学论文。论文于10月8日发表在ACSPublication上。作者是夏威夷大学化学系的JayantiBhandariNeupane、YuhengLuo、RuiSun、PhilipWilliams等人。在这篇论文中,他们指出了《Nature》论文中的一个Python脚本错误。论文地址:https://pubs.acs.org/doi/full/10.1021/acs.orglett.9b03216论文中提到的脚本叫做“Willoughby-Hoye”,用于计算核的化学位移值磁共振谱。夏威夷大学的研究人员发现,在脚本中,有一个模块会根据文件的顺序返回值,但Python并没有定义查询的文件顺序。因此,系统会在不同的脚本上返回不同的值。在运行这些脚本时,罗在不同的操作系统上得到了不同的结果。他们在实验中使用了相同的核磁共振数据,但结果却截然不同。在macOSMavericks和Windows10上运行脚本都给出了正确的结果(173.2),但是在macOSMojave和Ubuntu上运行时,结果有所不同(分别为172.4和172.7),与正确结果相差近1个百分点。虽然这看起来可能没什么大区别,但在精确科学研究的世界中,差异可能很大。出现这种差异的原因是脚本使用Python的glob模块来查找符合特定规则的文件路径名——根据glob结果生成要读取的文件列表。但是glob的结果又取决于操作系统的文件返回值。那么脚本的计算结果会受到文件处理顺序的影响。夏威夷大学的RuiSun和PhillipWilliams编写了排序校正代码来解决这个问题以保证结果的一致性,代码量达到了数千行。2014年,《Nature》论文隐藏了五年的bug,在《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现为美国里彭学院化学系助理教授的PatrickWilloughby承认了夏威夷大学研究人员的发现,并在推特上发布了团队对剧本的更正:他还提醒说,“如果你正在做或依赖核磁共振化学位移研究,那么你必须阅读这篇论文。”脚本作者也在推特上表达了对这一发现的赞赏,但他表示在编写代码时,脚本运行良好。他说:“Rui和Williams教授的发现真的很酷。当我6年前写这个脚本时,操作系统已经能够处理排序问题。Rui和Williams添加了必要的排序代码和函数以确保计算是正确的。”排序一致,给予他们喜欢!”迄今为止,这篇2014年的论文已被浏览超过1,900次。威廉姆斯说,可能有150-160个研究项目受到该漏洞的影响。例如,如果Williams使用此脚本错误计算了样本中的成分,而一位化学家恰好使用该结果合成了一种新的分析方法来开发一种新药,那么他的研究可能从一开始就是错误的。虽然威廉姆斯等人。及时发现问题,避免bug对自己的研究造成影响,可能对其他研究起到举足轻重的作用。他希望这篇论文能引导科学家们更多地关注实验的计算部分。由于在已发表的论文中很少提及操作系统,因此很难得出此错误的影响。“学术原型代码”VS“工业级代码”一般来说,代码并不是学术论文中最关注的点。因此,计算机科学等领域的学术界往往不太重视代码质量。这也导致了无论是学术研究人员还是行业人士,“学术原型代码”与“工业级代码”的巨大差异。显然,研究人员暂时还不能成为精通代码的“程序员”。论文中的代码往往存在可读性差、注释不充分等问题,读者在没有相应技术手册的情况下往往会一头雾水。也有不少网友讨论过这个现象:“发表论文的代码一般都是又快又脏,如果一个方法不错,希望让整个代码健壮,一般要经过哪些步骤?”最常见的答案是:“重写”。还有一种类似于张无忌练太极剑法的实现方法:“把纸看一遍丢到一边,直到代码完全忘记,再根据记忆按照工业级标准重写。”不过,相对于工业界的代码,学术论文中代码bug的影响毕竟还是有限的。新西兰惠灵顿维多利亚大学的化学讲师RobKeyzers在今年的一项研究中引用了这篇论文,他说他当时并不知道这个漏洞。RobKeyzers并不太担心他的结果,因为该团队在他们的研究中没有使用有缺陷的脚本。同时,他补充说:“我们将仔细审查研究数据,以确保我们没有得出任何不准确的结论。”NatureProtocols的一位发言人在一份声明中回应称,他们正在调查夏威夷大学的研究。出于保密考虑,我们不会就所提出的问题发表评论。