写点什么

1000 行 Python 代码脚本 bug,或影响上百篇学术论文

  • 2019-10-15
  • 本文字数:2621 字

    阅读完需:约 9 分钟

1000行Python代码脚本bug,或影响上百篇学术论文

《Nature》杂志 2014 年的一篇论文包含了一个 Python 脚本,其中有一个模块是根据文件的排序返回值,但 Python 并没有定义查询的文件顺序。这意味着在不同的操作系统上,该脚本返回的值是不同的。这个 bug 直到最近才被发现,而这篇论文被引用了 158 次,如果这些论文使用了相同的脚本那么文章的结果很可能是错误的。

藏在《Nature》论文里的脚本 Bug

《Nature》杂志 1869 年创刊于英国,是世界上最早的国际性科技期刊,涵盖生命科学、自然科学、临床医学、物理化学等领域。对于学者而言,论文能被《Nature》收录是一种荣耀。许多自然科学、物理化学等领域的学者,在论文创作中也会使用各种编程语言或工具进行数据收集、分析等工作。


2014 年,《Nature》上发布了一篇名为《A guide to small-molecule structure assignment through computation of (1H and 13C) NMR chemical shifts》的化学论文,该论文试图找到对癌症有效的化合物。论文中包含了一个使用 Python 语言构建的脚本。


最近,夏威夷大学的一位研究生 Yuheng Luo(中国人)发现该脚本中存在一个 Bug:脚本中有一个模块是根据文件的排序返回值,但 Python 并没有定义查询的文件顺序。他在导师 Rui Sun(中国人)的指导下使用该脚本验证结果,结果发现无法匹配论文作者的结果。在测试期间,他们发现在 Mac、Windows、Linux 等不同的操作系统上返回的结果是不同的。


他将研究报告写成了论文,发布在了《Organic Letters》期刊上。5 年时间过去了,这篇包含错误脚本的《Nature》论文已经被引用了 158 次,这意味着如果这些论文使用了相同的脚本那么文章的结果很可能同样是错误的。对于学术论文来说,这是影响很严重的 Bug 了。


Yuheng Luo 在论文中写道:


原始脚本中这个简单的小错误对大量论文的结论造成了影响,这些论文涉及的话题非常广泛,很难从已发表的信息中得出结论,因为研究人员很少会提及其所使用的操作系统。使用这些脚本的作者当然应该再次检查他们的结果,以及使用 [补充资料] 中修改过的脚本得出的任何相关结论。


目前尚不清楚这种故障可能会影响多少篇论文,研究人员通常不会公开他们用于分析的操作系统,因为它应该无关紧要。根据数据显示,2014 年的这篇论文已被浏览过 1,900 余次,并被其他 158 个研究所引用。但是,并非所有引用该论文的研究都可能使用该脚本。


新西兰惠灵顿维多利亚大学的化学讲师罗伯·凯泽斯(Rob Keyzers)在今年发表的一项研究中引用了该方案,他在一封电子邮件中说,他不知道该 Bug 的存在。他补充说,他并不“过度担心”自己的结果,因为他的团队没有使用包含小故障的脚本。他说:“我当然会仔细检查我们的数据,以确保我们不会提出任何不当的论述。”

学术界的代码问题大讨论

长久以来,学术界和工业界都是互相独立的两个世界。学术界更多钻研于技术的进步与面向未来的研究,而工业界则更多关注技术的落地与商业化。学术界和工业界一直以来都很少合作,此前 AI 大神 Yann LeCun 也曾呼吁学术界、工业界紧密合作以加快 AI 的发展。


但事实上,学术界跟工业界的区别依旧明显。此次事件在 Reddit 上也引起了广泛讨论,不少用户表达了对学术界代码问题的困惑,这也从侧面印证了两个世界之间的缺乏理解与互通。

学术论文中的代码缺乏同行评审吗?

“由于很少提及操作系统,因此无法从发布的信息中轻松解析”。


本文中 Python 脚本出现的 bug 背后,折射出了这样的问题。ID:compsky 的用户十分困惑,同行评审本应是学术论文发表前的一个重要因素,但他所看到的几篇论文很少有关于如何重现他们声称已运行的程序的说明。


ID:Objective_Mine 的用户跟帖评论道:


我读过许多 NLP 相关内容的论文,其中描述了一种算法,但未提供源代码。你还必须至少猜测一些细节,并且想要做到复制精确的实验是不可能的。任何依赖实验而不是形式证明的东西都应该真正具有可用的确切程序,这背后就是源代码和环境细节。

科学家是糟糕的程序员

代码质量通常不是学术界关注的重点。一般意义上,学术论文中的代码唯一消费者就是研究人员,所以诸如稳定性和易用性之类的东西并不比简单地完成工作更重要。此外,研究代码必然是实验性的,并且规范变化比其他类型的代码更加剧烈,所以最终的代码将会有许多变更移植到它上面。


但最重要的因素只是因为学者们不认为自己是专业程序员(确实也不是),编程只是他们工作的一小部分。因此,根本没有能够维持代码审查过程的护理或激情水平。


在这样的情况下,计算机学术界也好,其他学界需要使用计算机代码的学者也好,代码质量通常达不到工业级的标准,也常常因此为工业界的程序员所惊讶。

如何看待科技公司从学术界挖角现象?

从前,学术界的大牛们分布在各个知名的研究院里:微软亚洲研究院、贝尔实验室、雅虎研究院等等不一而足。研究院通常来说不差钱,比如贝尔实验室长期以来总是用不需为经费发愁这一条理由来吸引优秀的科学家到该实验室工作。


但在近两年,科技公司越来越多地开始从学术界挖角,并成立自己的实验室网罗天下英才为己用。比如吴恩达加入百度(已离职)、李飞飞加入谷歌(已离职)、Yann LeCun 加入 Facebook(已离职)、颜水成加入 360(已离职)、贾扬清加入阿里巴巴、贾佳亚加入腾讯等等。


2017 年 10 月云栖大会上,阿里巴巴高调宣布成立达摩院,进行基础科学和颠覆式技术创新研究,并将在未来 3 年投入 1000 亿元进行基础科学研发。而在阿里以外,腾讯也有自己的优图实验室、玄武实验室,360 也有自己的研究部门。


为什么科技公司纷纷从学术界挖来众多大牛,收归己用?理由可能有很多,但最共通的一点就是:利用知名学者的名人效应,打造公司的技术品牌,凭着多年在学术圈积累下来的名望与成绩,为公司招徕人才,组建一支技术强军。


但这背后存在一个悖论:研究院通常需要大量的经费支持,但科技公司却是以盈利为目的,如果研究院光有研究没有产出,其存在的地位会非常尴尬。阿里巴巴成立达摩院时,马云就曾直言:达摩院未来要自己挣钱,还要比阿里巴巴活得更久。


InfoQ 的一位消息人士给出的观点,更是工业界技术人的一个普遍观点:


腾讯某实验室在研究的东西,我们自己团队也在搞,而且我们造出来的轮子性能还比他们的更好。每年花那么多钱养这么多博士、教授,最后做出来的东西还不如工程团队自己的。


在你看来,科技公司和学术大牛之间的关系应该是怎样的呢?科技公司的研究部门地位尴尬吗?

作者介绍

小智,InfoQ 编辑。关注架构、开源、泛互联网科技领域,个人公众号小智的互联网观察,个人微信:ryantz,添加请备注来意。


2019-10-15 10:077040
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 390.8 次阅读, 收获喜欢 1982 次。

关注

评论 1 条评论

发布
用户头像
OMG
2019-10-21 10:09
回复
没有更多了
发现更多内容

深入理解持续测试:DevOps 流程中的重要一环

SoFlu-JavaAI开发助手

数字孪生的起源,从救宇航员回家开始

Meta 小元

数据可视化 智慧城市 数字孪生 元宇宙

改革开放启示录(14/100)

hackstoic

创新管理

注册中心

邱学喆

Eureka 注册中心 原理图

了解一下ProtoBuf

蜜糖的代码注释

protobuf 2月月更

51WORLD赋能数字孪生流域/工程建设,助力智慧水利创新发展

Meta 小元

可视化 数字孪生 智慧水利 元宇宙

看SparkSQL如何支撑企业级数仓

字节跳动数据平台

hive 字节跳动 Sparksql 数仓

多图|一文详解Nacos参数!

王磊

nacos

怎么说服领导,能让我用DDD架构肝项目?

小傅哥

DDD 小傅哥 技术架构 架构实践

突然发现,npm里request依赖包已经弃用,怎么办?

华为云开发者联盟

npm HTTP node,js Request request依赖包

大数据培训:构建Flink SQL流式计算平台

@零度

flink sql 大数据开发

前端培训:Vue3语法糖详解分享

@零度

Vue 前端开发

DDD实战(1):从需求到代码实现生鲜电商系统

深清秋

DDD 软件架构 生鲜电商系统

基于CC2530(ZigBee)设计的自动照明系统

DS小龙哥

2月月更 自动照明系统设计

福昕鲲鹏加入,龙蜥社区迎来版式文档技术服务新伙伴

OpenAnolis小助手

Linux 开源 社区 福昕

大画 Spark :: 网络(4)-Endpoint注册使用与网络环境的构建

dclar

大数据 spark 源代码 框架原理

15 行代码在 wangEditor v5 使用数学公式

CRMEB

一文带你了解 Java 的内存区域

宇宙之一粟

Java 内存 2月月更

阿里无影云桌面深度测评

乌龟哥哥

无影云电脑 2月月更

移动应用中的第三方SDK隐私合规检测,早知道

华为云开发者联盟

移动应用 安全 sdk 隐私 隐私合规

KubeVela v1.2 发布:你要的图形化操作控制台 VelaUX 终于来了!

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

2022年每个开发者必知的云原生趋势 | 社区征文

Geek_rze78a

容器 微服务 云原生 新春征文

外屏和宽屏浪费了?HarmonyOS折叠屏设计规范教你用起来

HarmonyOS开发者

HarmonyOS

学生管理系统的架构设计

Fingal

#架构实战营

Linux系统问题排查

AiDaddy

Linux 负载 系统问题

技术盘点:容器技术的演进路线是什么?未来有哪些想象空间?

阿里巴巴云原生

阿里云 容器 云原生

java培训:JVM 内存布局

@零度

JVM JAVA开发

“元认知”相关学习总结

panda

思维模型 阅读笔记 元认知

vivo 服务端监控架构设计与实践

vivo互联网技术

服务端 系统监控 构架

敏捷研发项目,我们该如何度量?

阿里云云效

阿里云 项目管理 云原生 度量 敏捷研发

DOM 精通了?请问 Node 和 Element 有何区别?

编程三昧

JavaScript 前端 DOM 2月月更

1000行Python代码脚本bug,或影响上百篇学术论文_文化 & 方法_小智_InfoQ精选文章