致软件工程师的一封公开信,批评尼尔·弗格森的流行病模拟

2020-05-18 22:32:07

你们中的许多人看到尼尔·弗格森和他的团队为模拟流行病传播而编写的C++代码时都感到震惊。我和你感同身受。我没有您那么害怕的唯一原因是我以前见过很多类似的代码。事实上,这在科学计算中相当常见,特别是在已经运行多年的研究项目中。但和你们一样,我不太相信这个代码是它应该实施的流行病学模型的忠实和值得信赖的实现,我不想在科学上为糟糕的代码辩护。

然而,您的许多具体批评表明您对当今的学术研究并不熟悉。这一法规并不是纳税人资助的13年研究的唯一结果。研究的核心是构建和应用代码实现的模型,代码本身只是实现这一目的的一种手段。编写这种可怕代码的科学家很可能没有接受过软件工程方面的培训,也没有资金聘请软件工程师。而那些决定将纳税人的钱捐给这个研究小组的资深或前科学家可能更不知道代码对科学的重要性。否则,他们肯定会将资金用于软件开发,并验证最佳实践的应用。

但这封信的主要信息是不同的:它是关于你在这个故事中的角色。那当然是集体的你,而不是读这封信的你个人。是你,软件工程社区,负责像C++这样的工具,这些工具看起来就像是为了搬起石头砸自己的脚而设计的。也是您,软件工程社区,没有努力警告非专家公众这些工具的危险。当然,您已经在内部讨论了这些危险,甚至讨论了很多。但对于局外人来说,比如为他们的模型寻找实现工具的计算科学家,这些讨论很难找到,也很难理解。向初学者教授C++的教程有很多,但我还没有看到一本以明确警告危险开始的教程。你知道,每一本微波炉的使用手册都有这样的警告:洗澡后不要用这个来擦干你的狗。一条明确的信息说“除非你愿意接受多年的培训成为一名软件工程师,否则这个工具不适合你。”

正如你们社区的一位著名成员所说的那样,软件正在吞噬世界。亲爱的软件工程师们,这给了你们在现代社会很大的权力。但是权力伴随着责任而来。如果你希望科学家构建对公共卫生决策至关重要的模型的可靠实现,你能做的最好的事情就是为这项任务制造好的工具,但至少你必须做的是在你不想让科学家使用的工具上贴上明确的警告标志-永远记住,科学家不是软件工程师,既没有时间也没有成为软件工程师的动机。

考虑一下,作为客户,您对其他领域的工程师有什么期望。你希望任何有驾照的人都可以安全地使用汽车。粗略地浏览一下说明书,你就会认为家用电器对任何人来说都是安全的。那么,仅仅为了能够负责任地使用你的产品,就期望你的客户精通你的工作,这是合理的吗?更糟糕的是,默许这样的期望合理吗?

你们中的一些人已经帮助进行了第一轮代码清理,我认为这是您在短期内可以采取的最有建设性的态度。但对于未来来说,这不是一个可持续的方法。我们不能在每次做重要的事情时都请软件专家进行代码审查。我们计算科学家需要你们软件工程师来帮助我们为计算机辅助研究创造更美好的未来。这意味着几乎所有的研究,因为软件也已经吞噬科学有一段时间了。我们能指望你的帮助吗?