现代科学就是开源软件

作者主张:在计算机化的世界里,开源软件是做科学的必要条件——可复现意味着可执行且可修改,而科学结果依赖软件,软件错了科学就错了。文末给出四条具体建议(分享代码、用 NixOS、别重复造工具、晋升计入软件贡献)。

中文
复制

一句话结论:我认为现代科学与开源软件是同义的。这篇文章说明为什么、为什么这很重要,以及你接下来可以(也应该)做什么。


你为什么在意(开源)软件?——所有人

我在软件上花了大量时间。被问「软件为什么重要」的次数我已经记不清了。人们会说,软件不是科学。它是个时间黑洞,是为了追求真正重要的东西——结果(在学术界则是论文)——而要匆匆略过的东西。不发论文就出局。

好吧。我认为软件很重要。事实上,我认为开源软件就是科学。或者说,至少计算科学是如此。这篇文章会告诉你为什么:为什么我们作为科学家必须坚持科学方法,以及为什么这意味做开放、可复现的软件。这篇文章不好写。它挑战了学术界当下的许多潮流,但它是一个朝向更好科学的重要举动,而且不至于让我们全都发疯

什么是科学?

如果你去查维基百科的「科学」词条,会看到:

科学是一门系统性的学科,以关于宇宙的可检验假说和预测的形式来构建与组织知识。——维基百科

现在,随手抓一篇 arXiv 论文。它显然以某种形式包含「知识」。但,这篇论文是否贡献了可检验、可被系统化的预测?你能检验它吗?你能把它系统化吗?

答案从来不是干脆的「不能」,但很难。你很少能直接接触那份知识。

好的解释:内在模型

如果有机体在头脑中携带一个关于外部现实及自身可能行动的「小尺度模型」,它就能试演各种替代方案……并能以更充实、更安全、更胜任的方式应对它所面临的突发情况。

在其出色的著作《解释的本质》中,Kenneth James Williams Craik 提出,我们用对现实的小型模拟来解释和预测外部世界。

这个观点今天看来显而易见,但它指明了从事科学的首要目标:你作为一个行动主体,不断改进自己的内在模型,直到能做出比之前更好的预测。这里的内在模型是关键:如果一篇 arXiv 论文不能帮助读者预测世界,它就不是科学。这也是计算可复现性重要的原因——软件正是我们编码并分享预测模型的方式。

什么是可复现性?

回想一下,按维基百科的说法,仅有结果是不够的。结果必须是(1)系统性的,且(2)可检验的。

完全有可能某篇论文太难理解,或因为其他原因对读者来说不可及。这并不意味着其中没有科学洞见——读者也许在读第二、第三遍时能找到将其系统化的方法。不是的,它的意思是:你个人无法把这个想法据为己有、检验它,并用它改进你的世界模型。

在这个语境下,可复现性不只是结果的重复。它是把一个科学想法纳入自己的内在模型、改编它、在其上继续构建——或者因为它降低了可预测性而丢弃它的能力。

如果某个想法不可复现,发现就无法被扩展。因此也就毫无用处。

如果我们做个快速思想实验,把「软件模型」换成「数学模型」,这一点就很清楚:正如我们不会接受一篇物理论文说「我们的方程预测了 X,但数学不展示给你」,我们也不应该接受隐藏其方法的(计算)科学。

有多少领域被拖了后腿,有多少人的职业生涯因一个有 bug 的程序而被搅乱?——Greg Wilson

软件在现代科学中无处不在。从新冠模型到搜索算法再到实验室流程,一切都建立在别人构建的软件之上。研究者都很忙。他们不会去翻遍所有软件依赖来验证正确性、理解实现细节,或检查可能导致结果失效的潜在错误。

由此推出:科学结果依赖软件。如果软件是错的,科学就是错的。(软件缺陷已经导致大量撤稿,例如这里这里这里,以及这里的若干处。)

这本身没什么问题,因为在某些时刻我们必须信任并依赖他人的工作。而要这样,软件就需要可靠。

为什么要开源?

我们发现软件必须:

  1. 可复现,即可执行、也可修改;
  2. 可靠,即结果可以被稳定地信任。

可修改性对科学很重要,理由与方程对科学预测很重要相同。可靠性至关重要,因为我们想要的是知识的系统性改进,而不是偶尔才奏效的、碎片化的结果。

这正是开源软件给我们的东西。我们可以修改代码、改造它以适应需求(想想 Hugging Face 上的模型),也可以在其上迭代、持续改进。它已经创造了数万亿的价值,并且还有远远更大的空间。

当然,开源软件不是万能药。存在知识产权与安全问题,bug 依然会出现,稳定性也可能是问题。但至少这些不完美是公开记录在案的。它们可以被修正和改进,正如我们的科学理解一样。从这个角度看,可以说开源软件就是科学方法——只是在模拟中运行。

对未来科学的设想

如果我们接受这些前提,就可以问:真正开放的(计算)科学会是什么样?

每个结果都即时可复现。 当你读到一篇论文声称某种新药让症状减少 30%,你点一个链接,就能在浏览器里看着完全相同的分析跑起来。数据处理、统计检验、可视化,都用作者当时使用的同一个环境在几秒内执行——通过可复现的容器被完整保存下来。

科学软件像维基百科一样演进。 气候模型不再由单个实验室孤立开发,而由全球社区共同维护。当一位肯尼亚的研究者在大气湍流计算中发现一个 bug,修复会即时传播到全世界的气候模拟中。模型持续改进,而不是在学术孤岛里停滞。

发现的速度加快。 不再让每个研究者从零开始,我们站在巨人的肩上——他们的工作不仅可读,而且可运行、可修改。科学进展以前所未有的速度复利增长。

对科学的信任增强。 当气候模型、经济预测和医学建议都建立在透明、可审计的代码之上,公众信心会增长。科学传播会改善,因为模型本身也成了对话的一部分——而不只是它们的结论。

这不是乌托邦幻想。每一个部件都已经存在——开源社区、可复现环境、协作开发平台。我们只需把它们整合成一个连贯的愿景:数字时代的科学应当如何运作。

问题不是这个未来是否可能。问题是:我们能多快把它建起来?

现在做什么?

我主张:在一个计算机化的世界里,如果我们还想做科学,开源软件就是一个必要条件。软件是可执行的数学模型,我们应当把它放到高得多的优先级上。

我们还有工作要做,以下是你可以出力之处:

  • 分享并记录你的代码
    • 没有代码的论文科学性更弱,因为更难在其洞见上继续构建。在理想世界里,任何主张都应当有可复现的代码支撑。从第一天起就用代码,并且始终分享它。
  • 写稳定的代码,用 NixOS
    • 代码应当可靠、并能永久运行。这意味着要确保依赖与环境保持不变。最好的办法是使用可复现环境。NixOS 正迅速成为规模最大、最好的工具。它保证你的代码完全以同样的方式运行,哪怕在一百年后。Docker、Conda 之类更好一些,但 NixOS 给出更全面的保证。
  • 在既有工具上构建,而不是自己造一套
  • 支持做软件的学术人晋升
    • 鉴于代码的极端重要性,学术晋升应当把软件贡献计入价值。

科学革命之所以成功,是因为它坚持透明、可复现与持续的审视。开源运动为软件体现了同样的原则,但还有远多得多的工作要做。

你愿意帮忙让软件变得科学吗?

来源: jepedersen.dk← 返回首页