软件bug也会导致撤稿?科学家教你如何应对|《自然》技术特写

原文作者:Jeffrey M. Perkel

软件bug很烦人。用一些简单的策略能帮你避开它们,即使出现也能更快修复。

Steven Weisberg做研究生的时候,曾经帮助开发了一座大学校园——不过,是虚拟的。这个叫做虚拟Silcton的软件可以测试空间导航能力,先把虚拟校园的布局教给人们,再测试他们能否答出通向特定地标的方向[1]。已经有十几家实验室用过这款软件了,Weisberg说。他现在是佛罗里达大学的一名认知神经科学家。

但是在2020年2月,测试这款软件的一名同事发现了一个问题:如果你的方向离目标差九十度以上,它的计算就不准确了。“我一开始想的是,‘好奇怪啊’。”Weisberg回忆道,但这是真的:他的软件里有错误,可能会导致计算结果和结论不正确。

“我们得撤回每样东西了。”他想。

软件bug也会导致撤稿?科学家教你如何应对|《自然》技术特写

绘图:Project Twins

谈到软件的时候,就免不了要出bug——特别是在学术界里,代码基本都是没接受过软件开发训练的研究生和博士后写的。但使用一些简单的策略就可以尽可能避免bug出现,并让修正bug变得更简单。

预防

卡尔顿学院的心理学家Julia Strand研究的是有什么方法能帮人们在比如嘈杂餐馆这类环境里能把注意力集中在对话上。2018年,她报告说如果视觉信号——比如电脑屏幕上闪耀的亮点——和对话一同出现的时候,就可以降低理解对话的认知难度[2]。这意味着一个简单的手机软件就能减少这种场合下的精神疲劳。

但这是错的。Strand写测试软件的时候不小心犯了错,两种条件下开始计时的时间不一致,用她2020年的说法就是“好像起跑之前就开始计时了一样”。

“我整个人都不好了。”她写道——这个错误可能会对她的学生、合作者、项目资金和职业都产生不好的影响。好在没有:她纠正了自己的论文,保住了项目,并获得了终身教职。但为了帮助其他人免遭这种事故,她制作了一套教学资源,叫做Error Tight[3]。

Error Tight里面有很多实用的建议,相当于一张计算可重复性的检查表,例如:使用版本控制,记录代码和工作流程,给文件使用标准的命名法和存储结构。

其他一些建议则是原则性的。Strand说,一个“少出错”的实验室,应当认识到即使是最细心的研究员也会出错。因此,她的团队采用了专业软件开发中常见的一项措施:代码审核。团队会让两个人审核自己的代码,主动寻找bug,而不是假设bug不存在。

阿威罗大学的心理学博士生Joana Grave也使用了代码审核。2021年,Grave发现她为心理测试编写的代码有问题,会显示错误的图片,因此撤回了一篇论文。现在,团队中有经验的程序员会为她的程序进行复查,她说,而Grave会重复编码任务,以保证得到的答案是一致的。

科学用软件的审核很难,加利福尼亚大学戴维斯分校的生物信息学家C. Titus Brown警告说,“如果我们研究的是最前沿的东西,可能只有一个人能理解代码。如果另一个人想理解代码可能需要花上很长时间。即使在他们理解之后,也可能问不出正确的问题。”

Weisberg在推特上分享了一些其他会有帮助的做法。例如,将代码、数据和计算环境分享到GitHub或Binder这样的网站上;保证计算结果和其他方法得到的结果吻合;尽可能用大家常用的软件库而不是自己写算法,因为那些软件库通常已经被大量科学家仔仔细细验证过了。

无论代码是从哪里来的,使用之前都要验证——然后定期再验证一遍,例如升级了操作系统之后,夏威夷大学的天然产物化学家Philip Williams说,“如果有任何东西改过,那最好的做法就是回过头确认所有东西都没问题,而不是假设这些黑箱总会自己吐出正确答案。”

在另一个科学家发布的代码中,Williams和同事们找到了一个他们所说的“故障”。这份代码是用来解释核磁共振数据的[4],但为排序集排序时,结果却会和用户的操作系统有关。要是他们把数据对照过一个有已知“正确”答案的模型数据集的话,可能就警觉到代码运行地有问题,他说。

修正

如果代码不可能不出错,人们至少应在开发方式上让bug更容易发现。乔治华盛顿大学的机械与航空工程师Lorena Barba说,当她和当时的研究生Natalia Clementi发现2019年发表的一篇论文[5]所使用的基础代码有错时,“往Slack上互传了几个小时的‘屎了’和一大堆尖叫表情包”。但两个人快速解决了这个问题,因为Barba的实验室里为所有发表过的论文都做了可重复性软件包(简称repro-pack)。

repro-pack是一个开放获取的档案包,其中包含了分析和重现论文内容所需要的所有脚本、数据集和配置文件。Barba的团队会把档案包上传到公开访问的数据知识库里,例如Zenodo和Figshare。一旦意识到代码中存在错误——他们不小心给一个方程少加了一项——Clementi取回了项目的retro-pack,修正了代码,重新跑了一遍计算,并比较了结果。要是没有repro-pack的话,她就得回忆那些数据到底是怎么处理的了。“可能需要花上几个月的时间测试这代码修好了没有。”她说。但实际上只花了两天。

Brown则花了长得多的时间才解决了bug。他在2020年尝试使用实验室的宏基因组搜索工具spacegraphcats来解决一个新的问题。软件中有一步过滤写得很糟糕,某些数据被忽略了。“我开始想,‘哦天,这可得让人怀疑原先那篇论文了。’”他不动声色地说。Brown修软件花了不到两周,但把所有东西重新计算一遍让项目延迟了好几个月。

为了减少解决时间,好的文档很重要。迈阿密大学的海洋学家Milan Curcic在2020年和其他人共同执笔了一篇论文[6],研究台风风速对海浪的影响。作为项目的一部分,Curcic和同事重复了同一个实验室2004年进行的计算,结果发现原始代码进行计算的时候使用了错误的数据文件,产生了大约30%的“误差”。

根据Google Scholar显示,那篇2004年的论文[7]被引用了800多次,论文中的预测结果直到现在仍然被用来进行台风预报,Curcic说。但它使用MATLAB写的代码从来没传到网上过。而且文档非常差,Curcic不得不一行一行读过去,才能理解它到底是怎么回事。当他找到错误的时候,他说,“问题是到底是我理解错了,还是代码本身就错了?”

Strand让组内成员互相读其他人的代码,一方面是有助于编程入门,另一方面也鼓励了他们好好写文档。“代码内应当有足够详细的说明,即使是不知道如何写代码的人也能理解代码在做什么,数据又是如何在每一步发生改变。”她说。

她还鼓励学生将错误视为科学的一部分,而不是个人的失败。“要是一个实验室里有‘聪明细心的人不犯错’的文化,那就容易变成不肯承认错误的实验室。”她说。

有bug不意味着一定会撤稿。Barba,Brown和Weisberg的错误对于结果只有很小的影响,并且都不需要修改论文。2016年,当时还是剑桥大学遗传学研究生的Marcos Gallego Llorente发现了自己写的代码中的一个错误。代码研究的是4500年前人类在非洲的迁徙模式。当他重新分析数据的时候,最终的结论没有变化,但是它的地理影响范围发生了变化,因此需要修改论文。

当时在明尼苏达大学任职的有机化学家Thomas Hoye和别人合写了一篇论文,其中使用的软件正是Williams发现bug的那一个。当Williams联系他的时候,Hoye说,他没有“特别激烈的反应”。他和同事修正了代码,更新了线上协议,然后继续工作。

“到最后我不禁感受到,‘这就是科学应有的方式’。”他说,“找到问题,回头,改进,修正,于是有了进步。”

参考文献:

1. Weisberg, S. M., Schinazi, V. R., Newcombe, N. S., Shipley, T. F. & Epstein, R. A.J. Exp. Psychol. Learn. Mem. Cogn.40, 669–682 (2014).

2. Strand, J. F., Brown, V. A. & Barbour, D. L.Psychon. Bull. Rev.26, 291–297 (2019).

3. Strand, J. F. Preprint at PsyArXiv https://doi.org/10.31234/osf.io/rsn5y (2021).

4. Neupane, J. B.et al. Org. Lett.21, 8449–8453 (2019).

5. Clementi, N. C., Cooper, C. D. & Barba, L. A.Phys. Rev. E100, 063305 (2019).

6. Curcic, M. & Haus, B. K.Geophys. Res. Lett.47, e2020GL087647 (2020).

7. Donelan, M. A.et al. Geophys. Res. Lett.31, L18306 (2004).

原文以How to fix your scientific coding errors为标题发表在2022年1月31日《自然》的技术特写版块上

nature

doi: 10.1038/d41586-022-00217-0

点击阅读原文查看英文原文

自然科研论文编辑服务

《自然》旗下优质、高标准的文稿编辑服务

authorservices.springernature.cn

语言润色

母语为英语的编辑纠正文稿中的语言错误,调整句式表达,提升行文流畅度;提供质量保证和编辑证书。

科学编辑

拥有特定领域研究背景的编辑专家对文稿进行全面检查,包括:贯穿全文的评论、新颖度及影响力评估、策略性报告、语言润色和投稿期刊建议。

其他服务

★ 学术翻译 ☆ 文稿格式排版 ★ 图表服务

【团体优惠】

欢迎科研团体(机构、实验室、协会等)为团体成员购买自然科研论文编辑服务,享受团体优惠和专业售后服务支持。联系邮箱:naturecn@nature.com

▲ 欢迎扫码进入施普林格·自然作者服务官网查看各项服务详情和报价

natureportfolio

版权声明:

本文由施普林格·自然上海办公室负责翻译。中文内容仅供参考,一切内容以英文原版为准。欢迎转发至朋友圈,如需转载,请邮件China@nature.com。未经授权的翻译是侵权行为,版权方将保留追究法律责任的权利。

2022 Springer Nature Limited. All Rights Reserved

星标我们,记得点赞、在看+转发哦!

来源:NaturePortfolio

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月27日
下一篇 2022年4月27日

相关推荐