有人在社交媒体上问过我一个非常实在的问题:论文投出去之前,到底要不要把代码和数据开源?这个问题近几年在学术圈里被反复讨论,但很多人的认知还停留在“开源是情分,不开源是本分”的阶段。我自己早些年也是这么想的——实验做完了,论文写好了,代码和数据往硬盘里一扔,觉得只要论文里把方法讲清楚就够了。直到后来审稿审得多了,自己也中过几篇因为“可复现性不足”被拒的稿子,才意识到这个想法已经过时了。
现在的情况是,代码与数据开源正在从“加分项”变成“隐形要求”。所谓隐形,就是大部分期刊的投稿须知里不会用加粗字体写“你必须开源”,但评审人和编辑心里都有一杆秤。这杆秤直接挂钩接收率和引用率。这篇文章不打算讲大道理,就结合我自己做研究、审稿和日常折腾代码数据的一点经验,聊聊为什么这件事这么重要,以及到底怎么开源才算真正有效。无论你是刚入门的研究生,还是已经写了十几年论文的“老油条”,这篇文章应该都能给你一些参考。
1. 为什么“隐形要求”真实存在:期刊、评审人与学术生态的三方博弈
1.1 期刊政策的转向:从鼓励到半强制
先看一个最简单也最硬的指标:政策。我大概梳理过计算机、生物医学、统计这几个领域的几十个主流期刊,发现一个明显的趋势——十年前你在投稿系统里勾选“是否提供代码和数据”,那是一个可选项,不填也不会有人说什么。现在再看,很多期刊在投稿第一步就把“数据可用性声明”作为必填字段,甚至专门设置了“代码可用性声明”这一栏,不填根本进不了审稿流程。
以Nature系列和Science系列为代表的高影响力期刊,早就把“代码和数据在合理请求下可得”写进了审稿规则。更狠的是PLOS ONE和Royal Society Open Science这类期刊,直接把“完整数据和代码必须随论文一起提交”写成了硬性要求。我自己投过几次稿,明显感觉到那些设置了“开放数据徽章”的期刊,在审稿意见里往往会专门让评审人评估数据和代码的可用性。换句话说,期刊层面已经开始用制度倒逼作者开源。
为什么期刊要这么做?站在编辑的角度想一下:一本期刊的声誉建立在论文结果的可信度上。如果刊出去的文章连作者自己都复现不了,那期刊的公信力就会崩。尤其是近些年爆出的学术造假和“不可复现危机”,让编辑部不得不把审核关口前移。我现在审稿的时候,编辑部给的审稿指南里明确写着“如果作者声称代码可得,请验证其可访问性”。这已经不是潜规则了,是明规则。
1.2 评审人视角:代码与数据是审稿人的“信任锚点”
我自己做审稿人也有五六年了,审过大概四五十篇论文。说实话,接到一篇论文,我最先看的是摘要和图表,但真正让我下决心给“Major Revision”还是“Accept”的,往往是补充材料里有没有代码和数据。
举一个非常典型的例子。有一次我审一篇深度学习相关的论文,作者声称自己提出的模型在某个数据集上比基线高了三个百分点。我看了方法部分,网络结构写得很模糊,只说“我们用了一个类似Transformer的架构”,训练细节一笔带过。我花了一个下午按论文里的描述去复现,结果在数据预处理这一步就卡住了——论文里没说特征归一化怎么做的,代码也没给。这种情况下,哪怕我认为方法可能有价值,也只能在审稿意见里建议拒稿或者大修,原因很简单:我无法验证你的结果是真的。
反过来,如果作者把代码和数据一起放上来,我通常会花两三个小时跑一遍。跑通了,且结果和论文里的表对得上,我的信任度会一下子拉满。这种信任是会直接写进审稿意见的:我会明确写“作者提供了完整的可复现代码,实验结果可信”。这样正面的意见对编辑的最终决定影响极大。
还有一个很多人没意识到的点:审稿人也是人,也会“偷懒”。如果代码和数据都齐全,很多严格审查就可以跳过,稿件的处理速度会加快,编辑也更倾向于接受。毕竟编辑最终的目标是手里的稿子能顺利走完流程,而不是卡在某个审稿人的手里反复拉锯。
1.3 学术生态的连锁反应:你的开源是别人信任你的理由
再往大了说,这是整个学术生态的问题。我平时写论文、做实验,经常会用到别人开源的数据集和代码。说实话,每用一次,我对原作者的好感就多一分。反过来也一样。你开源的东西被别人用了,别人在你的基础上做了新研究,引用了你的论文,这就是学术影响力的自然扩散。
现在的学术评价体系里,引用量依然是硬指标。而代码和数据开源,恰恰是提升引用量最划算的一种方式。后面我会详细展开这个观点,但这里先记住一个关键逻辑:引用量不是凭空冒出来的,它建立在别人能复现你工作的基础上。真正读过你的论文并且觉得有用的人,才会引你。
2. 开源提升接收率与引用率的底层逻辑
2.1 接收率提升:一篇“可以跑”的论文胜过“看起来美”的论文
关于接收率的提升,很多人有个误解,觉得开源只是锦上添花。但现实中,开源直接影响论文的命运。
先拿我自己的一次经历说事。有一篇论文,我和合作者打磨了大概八个月。实验做了三组对比,结果都挺理想,方法也自认为有创新性。投稿前,合作者建议我们把代码整理一下放出来,我当时还觉得没必要——论文里方法写得够详细了,代码这种东西以后再说吧。但合作者比较坚持,我们花了一周把代码整理好,附带了README和一个小规模的示例数据集。
结果那篇论文中了CCF-B类期刊,审稿意见里有这么一句话:“作者提供了完整代码,虽然数据集因版权限制未完全公开,但示例数据已足以验证核心流程”。后来我仔细想了想,如果没有这些代码,审稿人面对一个复杂算法,大概率会质疑“这个方法的细节是否足以复现”。有了代码,这个最致命的质疑点就消失了。
再说一个反例。我有个师弟,做生物信息方向的,论文的实验部分写了三四页,参数设置密密麻麻,看起来非常严谨。但他把代码和数据压在自己的移动硬盘里,投稿时只提交了论文和图表。结果两个审稿人都不约而同地在意见里写“数据可得性存疑”。其中一个甚至直接说“在缺少数据与代码的情况下,无法判断分析流程是否正确”。那篇论文在Reviewer手里拖了大半年,最终被拒。后来师弟补了代码和数据重新投稿,才勉强中了。这就是开源对接收率最直接的影响:它消除了评审人心中“你是否隐瞒了什么”的疑虑。
再往深一层讲,开源代码还能帮你挡掉一些“方法层面的误伤”。有些审稿人对某些算法的理解和你不一样,看了论文的描述后可能觉得你的方法有漏洞。但如果他能直接看到并运行你的代码,很多“以为的漏洞”其实是误解。代码就是方法最忠实的说明书,没有比直接跑一遍更能证明方法可行性的方式了。
2.2 引用率的增长机制:开源带来的“三次曝光”
引用率这件事,很多人只把它当成“论文被别人引用了”,但从实际操作来看,开源和引用率之间有一条非常清晰的链条。我把这条链条总结成“三次曝光”:
第一次曝光发生在研究过程中。别人做文献调研的时候,搜到你的论文,发现你提供了数据和代码,下载下来试试。如果试验成功,他大概率会在自己的论文里引用你,并且在相关工作部分给你一句正面评价:“该方法已在XX数据集上开源验证”。
第二次曝光发生在代码库被持续关注的时候。比如你在GitHub上放了一个人气还不错的项目,会有不少人来提issue、提PR、问问题。这些互动会让你的项目持续保持可见度,而每一次互动,都是一次潜在的引用机会。
第三次曝光最微妙,但也最被忽视:很多学者会把开源的代码引用到自己的论文里,不是引你的论文,而是直接在参考文献里写“某某, GitHub Repository”。这在部分学科已经是非常标准的做法了。你的代码库被单独引用,等于你多了一篇“论文”的被引记录。
我自己做过一个实验:同一套方法,我在两个项目中分别发布,一个有完整代码,一个只有论文。三年后对比引用量,有代码的论文比没有代码的论文高了将近一倍。当然这个实验不够严谨,变量没控制好,但趋势是明显的。而且这不是个案,很多大型研究会统计显示开放数据论文的引用优势普遍在20%到50%之间。你想想,什么科研手段能让你免费提升三分之一的引用量?开源,就是性价比最高的一种。
3. 做好代码与数据开源的具体操作
3.1 让代码“拿得出手”的整理标准
很多研究者不开源代码,最大的障碍是“羞耻感”——代码太丑了,不好意思见人。我自己也有过这个阶段。但说实话,审稿人和使用者对代码的容忍度远比你想象的高。大家在意的是能不能跑通,而不是代码风格是否优雅。
不过,这并不意味着你可以直接把原始实验代码打包扔上去。想让开源真正产生价值,至少得做三件事:
第一,删掉死代码。从事科研的人都有过这种体验:实验过程中写了十几个调试脚本,有些是测试用的,有些是废弃方案。开源前花半小时把没用的脚本清掉。这个动作极其重要,因为使用者下载一个仓库后最先做的,就是看目录结构。一大堆乱七八糟的文件会直接劝退潜在用户。
第二,写一个真正能用的README。README不是让你写长篇大论,而是要回答三个问题:这段代码是做什么的?需要什么环境?最快怎么跑出一个结果?我把这三件事称为“三分钟法则”——一个陌生人花三分钟读完README,能不能知道怎么把你的代码跑起来。如果你的README超过五分钟还讲不清楚,那就重写。
第三,给一个“最小可运行示例”。这一点我踩过很多坑。有时候为了把实验复现完整,我把数据加载、预处理、模型训练、评测、画图全部打包在一个文件里。结果使用者跑起来之前的依赖安装就要半小时。后来我学乖了,每次开源都会单独维护一个quickstart.py或者demo.ipynb,只跑一小段数据,几十秒就能出结果。别小看这个细节,“快速上手”这个体验决定了你的项目是被人收藏还是被人遗忘。
3.2 数据开源:从格式化到文档化的全流程
数据开源比代码开源更麻烦,因为涉及隐私、版权、格式和体量等问题。但是数据的价值往往比代码更高。我认识的一些做NLP的朋友,他们的论文引用量主要就是靠数据集撑起来的。一个高质量的数据集被同行反复使用,引用量自然就上去了。
数据开源的第一步是去除敏感信息。如果是涉及人的数据,必须做匿名化和脱敏处理。这里我踩过一个很深刻的坑:有一年我开源了一个问卷数据,自认为已经删除了所有姓名和联系方式。结果过了一周,有同行告诉我,数据里有几行能通过组合变量推断出特定个体。当时冷汗都下来了。后来我学乖了,在开源之前会专门用“重识别风险评估”的思路检查数据,把所有可能通过组合定位到个人的字段全部删除或泛化。这事关学术伦理,不能心存侥幸。
第二步是数据格式规范化。我见过太多开源数据是“能读就行”的状态——列名是乱的,缺失值处理逻辑没说清,文件编码还是GBK。这种数据集基本没人敢用。说实话,做数据就像做菜,处理得干净,别人才愿意下筷子。我把数据格式化的标准总结成几条:列名清晰且有含义、统一的编码(UTF-8)、缺失值有明确标注(NA还是-1)、分类变量有对应的码表或字典。
第三步是数据文档化。很多人只发布数据文件本身,完全不写说明文档。这是大忌。我建议至少提供一个data_description.md,里面写明每个字段的含义、数据采集方式、样本筛选逻辑、预处理步骤。如果数据集涉及多个文件,还要说明文件之间的关系。你可能会觉得这些信息论文里都写了,但实际问题在于论文篇幅有限,很多细节只存在于背景信息里,别人拿到数据根本对不上号。
3.3 选对发布平台:GitHub、Figshare与期刊附录的搭配策略
代码和数据到底放哪,这也有讲究。根据我的经验,代码优先放GitHub,数据集优先放专门的学术数据仓库,如Figshare、Zenodo、Dryad。这两类平台各有侧重,搭配使用效果最好。
GitHub适合放代码仓库,因为它天然支持版本管理,方便协作。但要注意一个问题:GitHub仓库不等于永久存档。你的仓库可能因为各种原因被删掉,或者学术期刊要求提供DOI作为永久标识符。所以,我的标准做法是:代码放GitHub,提交时同时把仓库打包上传到Zenodo,利用GitHub和Zenodo的联动自动生成DOI。这样既保证了代码的可交互性,又保证了长期可存档性。
数据集的选择稍有不同。如果你的数据量很大(比如几百GB的影像数据),图数据库和图存储服务更合适;如果是中小规模的结构化数据,Figshare或者Zenodo就够了。我以前犯过一个错误——把几十GB的数据直接上传到GitHub仓库,结果GitHub直接警告超限,最后还是靠三方平台解决的。现在我的策略是:大数据集用平台托管,GitHub仓库里只放一个下载脚本,脚本会自动从Zenodo或者Figshare拉取数据。这个方案既能保证数据可控,又不会让代码仓库变得臃肿。
还有一个配套选项,就是期刊的补充材料。很多人忽略这一步,觉得有了GitHub就够了。但期刊的补充材料有一个不可替代的优势:它和论文绑定,永远存在期刊官网上。即使你的GitHub仓库被删了、你的个人主页下线了,补充材料里的代码包还能被下载。我现在每次投稿,都会在补充材料里放一个精简版的代码包(去掉依赖环境,保留核心代码),同时在GitHub放完整版。这样双保险,审稿人无论从哪个渠道都能拿到代码。
4. 实操中的常见问题与避坑指南
4.1 许可证选错,代码等于白开源
这一节我想重点强调许可证的问题。很多人对许可证的态度是“无所谓”、“随便选一个MIT就行”,但这是开源领域最容易埋雷的地方。
先理清基本概念:代码的开源许可证决定了他人的使用权限。常见的几种:MIT、Apache 2.0允许商用和自由修改,GPL要求衍生作品保持同样许可证开源,BSD系相对宽松。如果你希望别人能方便地用你的代码做任何事,MIT或者Apache 2.0是稳妥的选择;如果你希望代码的“开源属性”被强制传递下去,选GPL。
数据集则有另一套授权逻辑。常用的有CC-BY(允许使用但必须署名)、CC-BY-SA(强制相同方式共享)、CC0(放弃所有权利,相当于公共领域)。我建议研究人员仔细阅读不同许可证的条款之后再做选择,尤其注意“商用条款”和“修改条款”的区别。以前我见过一个研究组开源了数据后,被商业公司直接拿去用,还做了产品,团队想维权却没辙,因为上传时选的是“Author’s own work without restrictions”,等同于放弃了一切权利。
还有一个小细节:如果你在实验中使用了别人的代码或者数据集,在开源自己作品时,需要一并保留原作者的许可证声明和版权声明。别只看当前需求就忽略了这个点,因为这是合规问题,不是道德问题。我经手过的项目里,至少有两次因为某个第三方组件的许可证是GPL,不得不把整个仓库的许可证从MIT改成GPL才能联动开源。这种坑,提前排查可以省下大量时间。
4.2 数据与代码版本的匹配:确保“复现”不成空话
再一个我见过的高频翻车点:代码和数据版本对不上。
我审稿时遇到过一篇论文,作者在GitHub上放了数据,也在正文里写了“数据可用”,但我下载后发现数据结构和论文中的描述不一致。论文里说训练集有两万条样本,而实际数据只有一万八千条。跟作者邮件沟通后才知道,他在实验过程中对数据做过一次清洗,忘了更新仓库。这种“版本对不上”是最伤信任的,因为它会让人怀疑整篇论文的严谨性。
为避免这种情况,我现在养成了一个习惯:论文定稿之前,会从零开始完整跑一遍复现流程,严格按照README的步骤走,确认代码和数据都能匹配。这个习惯相当于给开源内容做了一次“可用性测试”。跑通之后,给仓库打个版本标签(比如v1.0),再把这个版本号和DOI绑定起来。将来任何时候有人下载,拿到的都是经过验证的版本。
还有一个相关但是经常被忽视的问题:代码依赖环境的版本锁定。比如你用的是PyTorch 1.9写的代码,但环境里装了PyTorch 2.0,结果可能就是某些API变了导致复现失败。解决方案很简单,在仓库里提供一个requirements.txt或者environment.yml,把依赖包的版本号写死。更进一步,可以附上一个Dockerfile或者conda环境的导出文件,保证别人启动的环境和你的开发环境尽量一致。
4.3 单变量视角的误区:开源之后引用量不升反降?
我也见过一些朋友吐槽:“我都开源了,引用量怎么没涨?”这种吐槽往往忽略了一个基本事实:开源是必要条件,不是充分条件。
开源对引用量的带动,就像开了个餐馆但不打广告,客人少很正常。想让开源真正发挥作用,还需要配套的推广和维护:你的项目在GitHub上有没有一个让人一眼看明白的简介?有没有及时回答issue?有没有持续更新?如果你的仓库躺在那里两年没人管,别人看到了也会对你的科研活跃度产生负面印象。
推广渠道的选择,也要根据你的目标群体来定。我一般会在论文里、学术会议上、个人主页和社交平台上同步放出开源链接。研究型的内容适合在学术会议上通过海报或口头报告宣传;教程性质的内容可以放在技术社区;数据集可以在知乎、公众号等平台写一篇简短的使用指南。这样多渠道展示才能形成“开源—发现—使用—引用”的闭环。
还有一个比较容易被忽略的问题:“可用”和“易用”完全是两个级别。你的代码只是能用,但使用门槛极高,别人可能跑完一次就再也不碰了。如果能写一个简单的API接口,或者在README里附一个十分钟的示例视频,用户的二次使用率会大幅提升。使用率提升的背后,就是引用量的保障。
5. 一些真实的复盘与长期收益思考
5.1 从“被拒稿”到“获得引用”:三个案例的三个阶段
案例一来自我自己的课题组。有位同事在做交通流预测,他的一篇论文刚开始被拒了,原因是审稿人认为模型复杂但“无比较优势”。后来他调整策略,重新做了一轮对照实验,把数据和训练代码完整地放到GitHub上,并在论文里提供详细的可复现步骤。复投后,一位审稿人直接跑通了他的代码,在意见里写了一句“实验可以复现,结果可信”。这篇论文最终被接收,上线三个月内就被引用了6次。复盘下来,开源的作用是给了审稿人验证结果的机会,等于为自己争取到了一个“实证辩护”的通道。
案例二来自一个我们合作较多的高校团队。他们在做医学影像分析时,开放了一个包含标注的数据集。这个数据集上线后,被三十多个研究组下载使用,一年内为原论文带来了四十多次引用,比他们同期所有发表的论文引用量总和还多。这件事给我们的启示很直观:在医学领域,稀缺且高质量的数据集本身就是研究的核心资产,开放数据集,相当于持续产生影响力的“指数资产”。
案例三更值得一提,它揭示了开源在“长期曝光”上的作用:有个开源项目管理者在GitHub上维护了一个“推荐系统评估框架”,最初只是自己在做实验时顺手建设的工具。后来陆续有同行提交PR、提issue,项目慢慢有了社区氛围。虽然这个项目对应的论文在发表后两年里只被引用了十来次,但项目本身在GitHub上已经积累了三千多星。最近又有新的论文把他们的框架作为标准评估工具集进行引用。这就是一个典型的“代码本身成为被引对象”的案例,影响力能持续很多年。
这三个案例放在一起看,开源的回报不是线性的“立竿见影”,而是一个滚雪球的过程。前期投入成本可能很高,但只要项目能用、有人用,后续的收益是持续增值的。
5.2 时间投入与精力分配:避免“开源焦虑”
开源虽好,但也不能过犹不及。我见过一些年轻学者,花费大量时间把代码写得像商业软件一样花哨——写了精美的注释、完善了单元测试、配了自动CI流程,结果正儿八经的课题研究反而被耽误了。开源是为了辅助发表,而不是替代发表。我的建议是:开源投入占总研究时间的5%到10%较为合理。
以一篇常规论文为例,完整的开源工作大概包括:代码整理(1~2天)、数据脱敏与格式化(0.5~1天)、README和文档编写(0.5天)、许可证与版权排查(0.5~1天)、最终可复现性验证(1天)。加起来大致是4到6天的工作量。对比一下,这大约占一篇论文总工时的5%左右。这笔投入换来的是评审人信任度的明显提升和引用量的隐形增长,性价比非常高。
另外还要提醒一下,科研中某些类型的数据确实不适合开源。比如涉及个人隐私的医疗数据、涉及商业秘密的企业数据、或者受版权保护的第三方数据。不能开源的时候,不要硬扛。常见做法是在论文里写清楚“数据可从作者处获取”,并提供数据获取的申请流程;代码也可以做部分开源,把关键模块的接口留出来,核心实现用私有仓库保存。学术诚信要求的是“透明”,而不是“无私”。
5.3 不妨把开源看作是对自己研究成果的一次“长期投资”
讲了这么多,我发现最核心的观点其实很简单:开源不止是给别人看的,更是给自己的一种长期投资。当你的代码和数据被他人使用、验证、引用,你研究的可信度会持续积累。即使将来你换了方向、离开了某个领域,那些你开源的东西还会继续替你创造学术影响力。
我自己现在做课题规划时,会把“这个研究有没有可能沉淀出一个可复用的数据集或工具库”作为一项评价标准。如果答案是肯定的,就算论文本身被拒了,代码和数据未来依然有可能孵化出新的合作和交流。机会总是留给有准备的人,而开源,就是那个能让你被看见的窗口。
我刚才提到过的那句话,在这里再强调一遍:开源提升的是“被看见”的概率。评审人是人,读者是人,引用你论文的人也是人。人天然更信任那些公开、透明、经得起检验的工作。一个能跑通的代码库、一份干净的数据集,就是你能给这些人最好的“见面礼”。所以,下次投稿之前,请先问自己一个问题:我的代码整理好了吗?数据能公开吗?如果答案是“还没整理完”,那么恭喜你,你刚刚找到了提升论文接收率与引用率最值得投入的一环。