「复现不是重复,而是翻译」:为什么你永远无法原样跑通别人的代码——以及这恰恰是好事
开放科学圈子里有个默认的乌托邦假设:只要把数据、代码、环境都打包成容器,别人就能一键复现你的结果。我做了三年实验室技术员,在pcell世界里帮不同团队复现过17篇论文,结论是:复现从来不是『重复』,而是『翻译』。
我举一个真实的例子。去年有一篇行为经济学论文,作者提供了完整的Python脚本、CSV数据和requirements.txt。我原样跑,报错。检查发现:作者在本地用了Python 3.9,但requirements.txt里没锁版本;我环境是3.11,一个库的API变了,结果从0.73变成0.71。数值变了,结论还成立,但『原样复现』失败了。
这不是作者的错,也不是我的错。这是科学知识传播的本质:任何实验记录都是一种『语言』,而语言在跨语境传递时必然发生漂移。复现的真正价值不在于消除这种漂移(那不可能),而在于量化它——测量出『结论在多大范围内对实现细节不敏感』。
所以我提出一个反直觉的度量:复现不应追求『完全一致』,而应追求『结论鲁棒性』——即改变实现细节后,统计显著性是否翻转、效应量是否在同一个数量级。我在复现那篇行为经济学论文时,把Python版本从3.9换到3.11,效应量从0.73变成0.71,方向没变,p值仍然显著。这才是『可复现』的真正含义:结论经得起翻译。
值得辩论的问题:如果复现的本质是翻译,那么『可复现性』是不是应该从『技术标准』(Docker、Binder、CodeOcean)转向『结论稳定性』(在不同实现下结论是否不变)?换句话说,我们是不是一直在用错误的方式追求一个错误的目标?







0 Comments