大家可能都遇到过类似的情况:论文里写了“数据可应要求提供”,结果审稿人真的来信要数据,你翻遍移动硬盘才找到当年的原始文件,打开一看——变量名缩写早就看不懂了;或者合作者问起你那篇论文的代码在哪儿,你说“在旧电脑里,等我找找”,然后就没有然后了。
我这些年参与和推动过不少open-science相关的工作,越来越笃定一件事:开放科学不是一项多余的行政要求,也不只是期刊的“面子工程”。它是一套能让科研流程更顺、成果复用率更高、甚至能减少扯皮的工作方法。这篇文章我想用一个普通研究者的视角,把open-science的核心构成、落地工具、实操流程和常见坑位一次说清楚。不喊口号,只讲怎么把事情做出来。
适合谁看?正在被导师或基金方要求“公开数据/代码”的研究生和青年学者,想了解预印本和开放评审机制的科研人员,以及任何一个想让自己未来的科研产出更规范、更经得起追问的人。
1. 内容整体设计与思路拆解
1.1 别把open-science理解成“强制开源”
你如果去查各类定义,会看到开放获取、开放数据、开放代码、开放同行评议等等一堆术语。但说白了,open-science要解决的只有一个问题:研究成果的产出过程,能不能让外人看得懂、查得到、用得上?
传统科研模式下,论文是唯一的“正式成果”。数据存在实验室硬盘里,代码存在个人电脑里,实验设计思路只在Methods部分写个大概,审稿过程全部保密。结果就是,别人想复现你的工作,光靠一篇文章根本做不到。很多领域的经典实验,独立小组复现出来的效果远不如原论文那么好——这不一定是造假,很可能是原始条件、样本处理细节、参数选择这些东西在文章里根本写不下,或者压根没打算写。
Open-science的逻辑是:论文只是“成果面”,数据、代码、文档、评审记录这些“过程面”也应该以合理的方式开放出来。于是就有了预印本(提前发布论文草稿)、开放数据(原始数据或最小数据集上线)、开放代码(把分析脚本、软件工具放上GitHub)、开放评审(公开审稿意见和作者回复)。
我做项目的时候,习惯先把开放科学拆成一个一个具体动作,而不是当成一个宏大概念。比如这个阶段我要不要写数据管理计划?论文投出去之前要不要先挂预印本?代码仓库里的许可证选哪一种?数据集要不要配README?把这些小问题一个个解决,开放科学自然就落地了。
1.2 为什么这两年必须重视这件事
以前开放科学是“锦上添花”,现在慢慢变成了“硬性要求”。我见过不少真实案例:
- 有些国际期刊已经明确要求投稿时必须提交数据可用性声明(Data Availability Statement),甚至要求把原始数据放在指定仓库。
- 很多国家级科研基金在申报时开始要求附数据管理计划,结题时要检查数据是否按计划归档。
- 越来越多的机构在职称评审或成果评估里,不再只看论文数量和期刊影响因子,也开始看数据集的引用、代码仓库的复用情况。
这背后的推力我理解是“科研可重复性危机”倒逼出来的。心理学、医学、经济学这些领域,早年大规模重复实验发现很多经典结论经不起复现。Open-science就是用来缓解这个信任危机的。咱们普通研究者可以不把自己当成“开放科学运动家”,但必须适应这套规则——否则可能面临论文补充材料被要求重做、数据复审不通过、甚至因为“数据不可获得”被撤稿的风险。
1.3 我的总体设计思路:一个普通项目的开放科学闭环
如果让我给一个典型科研项目设计开放科学路径,我会画这么一条线(脑补即可,不用画图):
项目启动时写数据管理计划 → 研究过程中用版本控制管理代码和数据 → 论文写完后第一时间挂预印本 → 投稿时声明数据和代码可得性 → 修改阶段补全匿名仓库 → 文章接收后把数据和代码归档到长期仓库并生成DOI → 把DOI反填进文章。
这套路径看上去繁琐,实际上每个环节都有现成工具,你不用一次全部做到位,但越早考虑越省力。接下来的内容我会分两块讲:先讲清楚五个核心零件的来龙去脉,再给你一套可以直接照着操作的完整实践流程。
2. 核心细节解析与实操要点
2.1 预印本:最快建立“首发权”的方式
很多人一听到预印本,第一反应是“不是正规发表,能算成果吗?”我一开始也有这个顾虑,后来彻底被使用体验说服了。
预印本就是把还没经过同行评审的论文草稿,传到公开平台上。它的核心价值有三条:
第一,抢时间。传统期刊从投稿到见刊,动不动半年到一年。预印本平台从上传到公开,快的只要一两天。你做完研究、写好文章,立刻挂出去,全世界都能看到。后面就算期刊审稿拖了很久,你的工作早就被别人看见了,不怕“撞车”。
第二,抢首发权。学术圈最怕的就是“明明是我先做出来的,结果别人先发了”。预印本平台有严格的上传时间记录,这就是很有效的首发凭证。我之前有个朋友做计算化学,论文写好后正好赶上竞争对手发了篇类似主题,他马上把预印本挂了出去,后续投稿的时候引用自己的预印本,把时间线摆得很清楚,问题就化解了。
第三,提前获取反馈。论文在正式见刊前,如果能在预印本阶段收到同行评论,你就可以在正式投稿前把硬伤修掉。我自己就遇到过,预印本挂出去后,有位素不相识的同行帮我指出了一个统计方法的隐患,我赶在投稿前改完了,避开了评审阶段的重大翻车。
实操要点来了。不同学科用不同平台:物理学、数学、计算机基本都在arXiv;生物学有bioRxiv和medRxiv;社科有SocArXiv;化学有ChemRxiv。国内也有ChinaXiv这样的预印本平台。上传前记得检查期刊政策,绝大多数期刊都接受预印本先行,但个别期刊有不同规定,可以到Sherpa Romeo上查清楚。
上传的文章版本要选对。我建议上传“投稿版”或者“被接收后未排版版”,不要上传最终排版版,因为很多期刊对最终版的版权有要求。另外一个细节:一定要在预印本里写清楚“本文尚未经过同行评审”,让别人看的时候知道这是早期版本。
2.2 开放代码:从“能跑”到“能复现”之间差一个README
开放代码这件事,很多人有个误区,以为把代码传到GitHub上点个Public就算开放了。但其实代码开放的核心不是“被看到”,而是“能被别的人拿到之后跑起来”。
我自己早期吃过亏。有次我把一个分析脚本传到GitHub,文件名是analysis_final_v2.py——懂的都懂,这种文件名一看就是改了很多轮的。没有README,没有环境说明,没有输入输出样例。过了半年,我自己打开那个仓库都一头雾水。你想,连作者自己都看不懂,别人怎么可能复现?
后来我总结出一套代码开放的最低标准,只要能做到这几点,基本就能算“有效开放”:
- 仓库里有README.md,写明这个项目是干什么的、怎么安装依赖、怎么运行、输入输出长什么样。
- 提供环境配置文件。Python项目用requirements.txt或environment.yml,R项目用renv或者写明sessionInfo(),这样别人可以复现你的计算环境。
- 代码里写清楚运行参数。哪怕是你自己的论文结果,也要能通过一套固定的参数命令复现出论文里的图。
- 数据和代码分开。原始数据如果不是特别大,可以放在数据仓库(比如Zenodo、figshare)里,代码仓库里只放处理好的中间数据或示例数据。
- 选择宽松的开源许可证。最常用的代码许可证是MIT和Apache 2.0。没有许可证,别人在法律上根本不能合法使用你的代码。
这里单独说一句许可证的问题。我在实际过程中发现很多人完全不Care许可证,觉得“我都公开了,谁还用不了”。其实不是的,没有许可证的代码,按照版权法默认条款,其他人只能看,不能复制、不能修改、不能使用。这跟你开放代码的初衷正好相反。所以不管代码多简单,一定在根目录放一个LICENSE文件。
2.3 开放数据:最小数据集是个折中方案
很多研究者一听到开放数据,第一反应就是“我的数据涉密/涉及隐私/涉及未发表后续工作,不能公开”。这些顾虑是真实的,但开放科学也有弹性的做法。
如果你心里有这个纠结,我最推荐的方式是公开“最小数据集”。什么意思?就是把支撑论文结论所必需的那部分数据公开,而不是把所有的实验记录、原始访谈、全部被试信息都摊开来。比如你做了1000人的问卷调查,论文里用了其中500人,你可以公开这500人经过匿名化处理后的数据,以及问卷题目和编码说明。至于另外500人的原始数据,或者包含个人身份标识的字段,完全可以不公开,在数据可用性声明里写清楚“涉及隐私,按合理要求提供”就行。
数据集开放不只是传个Excel上去。你必须同时提供数据字典或README,说明每个变量叫什么、代表什么、取值区间是什么、缺失值怎么编码。我见过很多数据集,变量名全是MEAN_1、TOTAL_2这种,你根本没法猜它们是什么意思。所以我的建议是,把数据集开放当成写一份“给陌生人的说明书”,而不是把文件丢上去就完事。
数据许可证方面,我一般用CC0,也就是放弃所有权利,任何人都可以自由使用。如果你希望别人使用你的数据时注明出处,那可以用CC-BY 4.0。注意这是数据/文档的许可证,和代码的MIT/Apache别混了。
2.4 开放同行评议与注册报告:走在前面的新玩法
这部分目前还算“少数人的实践”,但趋势已经很明显了。
传统同行评审是匿名的、关起门来的。评审意见只有编辑、作者和审稿人能看到。开放同行评议的做法是,把审稿意见和作者的回复一起公开出来,读者看论文的时候能同时看到这篇文章是怎么被质疑、怎么被修改的。这个价值在于,它把“评审过程”本身变成了学术资源。
如果你还是愿意走传统去投,我建议你可以主动在学术社区(比如Publons)记录自己的审稿工作,这本身也算是开放科学的一部分。另外有些期刊已经在尝试“注册报告”模式:你先提交研究方案和数据分析计划,先审方案,方案通过了再去做实验、分析数据。这种方式能有效降低“结果不好看就不发”“P值凑不出就不发”这类问题。
我倒不建议每个人都去追求最激进的开放形式,但你至少要了解期刊在做什么。很多时候,期刊的新政策就写在投稿指南里,花十分钟读一读,能帮你避开不少坑。
2.5 作者标识与数据可用性声明
开放科学时代,辨识度是很重要的。我强烈建议大家去注册一个ORCID,它是一个学术版“身份证号”,可以把你所有的论文、数据集、审稿记录关联在一起。现在投稿的时候,ORCID基本是标配了,你没注册的话编辑都不好处理。
另一个容易被忽略的细节是数据可用性声明。这不是“数据在补充材料里”一句话就完了。期刊的标准格式一般是:“本研究的原始数据已上传至[仓库名],可通过[DOI或链接]获取;分析代码可在[GitHub链接]找到。”写清楚放置位置和获取方式,方便审稿人核对,也方便读者复用。这里体现的是对读者的尊重,让人觉得你的成果经得起验证。
3. 实操过程与核心环节实现
3.1 第一步:立项阶段就把数据管理计划写清楚
很多人在项目开始的时候根本不会想“数据以后怎么办”,等到论文即将投稿了才开始四处找文件。这个习惯一定要改。数据管理计划(Data Management Plan,DMP)就是解决这个问题的。
DMP不需要多复杂,但我认为至少要回答这些问题:
- 这个项目会产生哪些类型的数据?(原始数据、中间数据、分析输出、代码、文档等)
- 数据格式是什么?(CSV、NetCDF、SPSS、JSON等)
- 哪些数据需要公开,哪些不能公开?不能公开的理由是什么?
- 数据存储和备份方案是什么?(本地+网盘+实验室NAS?)
- 项目结束后数据存放在哪里?托管在哪个仓库?
- 数据如何组织和命名?谁负责维护?
写DMP的时候可以用公共模板,比如DMPTool上有很多机构定制的模板,节省不少时间。这个阶段的投入,到项目后期能省下好几倍的精力。
我把这个过程比作装修。你装修前不做水电布局图,住进去之后想加个插座,就得砸墙。数据管理计划就是科研项目的“水电布局图”,前期画好,后面省心。
3.2 第二步:研究过程里的版本控制习惯
我做研究的时候,最怕听到的一句话是“最终版最终版真的最终版”。文件命名混乱、版本覆盖错误,本质上是没有用版本控制工具。
代码层面的习惯很简单:所有代码、文档、分析脚本全部纳入Git仓库。用Git不是为了开源,而是为了给自己留一条“后悔药”。你每改一个版本都能看到差异,出了问题可以直接回滚。
数据层面的版本控制就更有讲究了。原始数据永远是不可修改的,任何清洗、转换操作都生成新文件,不要在原文件上覆盖。我习惯按照“01_raw_data”“02_processed_data”“03_analysis_output”这样的目录结构组织项目,每层文件命名带上日期和版本号。比如survey_data_20240601_v1.csv,后面再改就是v2,而不是“最终版”。
这套习惯让我受益很大。后来有次审稿人要求“把某次分析的中间结果补充到附录”,我直接到对应目录把当时的文件翻出来,十分钟搞定。要是在以前,我可能得花半天时间回忆,还不一定能找对版本。
3.3 第三步:论文写完后先挂预印本再投稿
论文初稿完成,在正式提交期刊之前,我强烈建议先上传预印本。这个顺序能给你带来三重保障:时间戳保护首发权、提前暴露问题、让合作者确认最终版本。
上传预印本的步骤,以arXiv或bioRxiv为例:
- 注册账号。
- 上传论文PDF或源文件(LaTeX或Word)。
- 填写题目、作者、摘要、学科分类。
- 选择是否允许预印本平台上的评论。
- 确认所有作者都已知晓并同意上传。
这里有一个非常重要的细节:上传预印本前一定要征得所有作者的同意。有些合作者可能担心预印本影响后续期刊发表,虽然绝大多数期刊不介意,但你最好先沟通清楚。我就是有一次差点直接传了预印本,结果一位资深合作者强烈反对,说他们学圈有期刊明确不接受预印本,吓得我赶紧取消。这种问题提前沟通比事后解释容易多了。
预印本平台对论文格式要求不高,但有几个硬性要求:PDF能正常显示、参考文献完整、图表清晰。有些平台需要你确认没有在其他地方发表过,所以上传前最好先看一遍平台条款。
3.4 第四步:构建可复现的代码仓库
这是我最看重的环节。你想想看,审稿人拿到你的论文,想看看你的分析有没有问题,如果他连代码都跑不起来,他只能靠猜。反过来,如果你把代码和环境配置都给全了,审稿人在自己电脑上一跑,结果和论文一致,那他对你工作的信任度会高非常多。
我的代码仓库标准结构是这样的:
project_name/ ├── README.md ├── LICENSE ├── requirements.txt (或者 environment.yml) ├── data/ │ ├── raw/ (原始数据,通常不传Git,只是留结构) │ └── processed/ (处理后的数据,小文件可以传) ├── scripts/ │ ├── 01_clean_data.py │ ├── 02_run_analysis.py │ └── 03_make_figures.py ├── results/ │ ├── figures/ │ └── tables/ └── docs/ ├── data_dictionary.md └── analysis_log.mdREADME.md我一般会包含这些内容:项目一句话简介、系统依赖(Python/R/Julia版本)、安装步骤、运行顺序、每个脚本的输入输出说明、复现论文图表的具体命令、如何引用本代码。写README的时候,请用“一个素未谋面的同行”的视角来检查:你写的指令,对方拿到后能不能一步步走通?
我当时就把自己的README当“实验报告”来写,每个命令都自己跑一遍,确保从零开始也能复现。写完后发给一个不同研究方向的师弟试跑,他成功跑通了。这个过程虽然费时间,但很有成就感。
代码仓库要不要在投稿前匿名?如果期刊实行双盲评审(审稿人不知道作者是谁),那么GitHub仓库里带有你的姓名邮箱就可能暴露身份。解决办法是:把仓库复制一份,去掉所有作者信息,在投稿系统的补充材料里提供匿名仓库的链接;正式被接收后再把公开仓库的链接写进文章。GitHub上新建一个匿名账号就行,也可以用一些在线匿名工具把仓库“复制并转换身份”。这个操作不复杂,但确实容易忘,需要提前做。
3.5 第五步:利用Zenodo生成DOI,完成数据归档
GitHub仓库本身不提供DOI,学术引用必须要DOI。Zenodo(欧洲核子研究中心开发的一个通用开放数据仓库)和GitHub有官方集成,每次你在GitHub上创建一个Release,Zenodo就会自动抓取版本快照并生成一个新的DOI。
操作步骤其实挺简单:
- 登录Zenodo,用GitHub账号授权。
- 在Zenodo“GitHub”页面,把你要归档的仓库设置为开启。
- 在GitHub仓库创建一个Release,并填写版本号,比如v1.0.0。
- Zenodo自动生成一个DOI,并显示在仓库页面上。
这个DOI要填入论文里,作为代码和数据的引用标识。以后别人引用你的数据和代码,可以直接引用这个DOI,引用量是可以纳入学术影响力统计的。
如果你有数据集需要单独归档(比如原始数据文件比较大),也可以直接上传到Zenodo,填好题目、作者、关键词、许可证,提交后同样会生成DOI。figshare和Dryad是常见替代品,具体选哪个有时候取决于学科惯例或期刊要求。
还有一点,版本号和DOI的关系。你更新代码后,GitHub上发新Release,Zenodo会给新版本分配新的DOI,但原来的DOI仍然有效,永远指向旧版本。这意味着你可以放心迭代,不用担心老版本“消失”导致引用失效。这个机制是我喜欢Zenodo的原因之一。
3.6 第六步:投稿、返修和接收后的开放动作
投稿的时候,正文里一定要写数据可用性声明。这个声明可长可短,但必须具体。一般放在正文结尾、参考文献之前。
返修阶段,审稿人可能会要求补充数据或代码。这时候你开放仓库的好处就体现出来了,你可以直接在回复信里贴链接、说明路径。如果审稿人要求匿名,记得用匿名仓库;如果审稿人不要求匿名,直接用带个人信息的公开仓库反而能积累曝光。
文章接收后,还有几个动作别漏掉:把预印本更新为“已被XX期刊接收”的状态;把最终版DOI和引用信息回填到预印本页面;在个人主页、学术社交平台(比如ResearchGate、LinkedIn)同步放链接。
如果你所在机构有自己的成果库(Institutional Repository),也建议把论文的最终接受版上传一份。这能帮你锁定“合法开放获取”版本,即使在付费期刊发表的论文,也能让读者免费看到你的“作者接受版本”。
4. 常见问题与排查技巧实录
4.1 担心“被抢发”怎么办?
前文说了,预印本的时间戳就是你的防御武器。但这里还有一层心理博弈:你的数据公开后,别人会不会拿着你的思路抢先做下一步研究?
我的观点是,这个问题要分阶段看。预印本只开放论文文字,通常不强制要求同时开放数据。你可以先挂预印本占住首发权,数据和代码等论文接收后再开放。这样你既保住了后续研究空间,又满足期刊的数据可用性要求。
如果你确实要提前公开数据(有些期刊要求在投稿阶段就提供数据给审稿人),那可以考虑设置数据仓库的“embargo”机制。Zenodo支持设置一个访问延迟期,比如论文接收前数据集不公开,接收后自动公开。这样既让审稿人通过私密链接查看,又不会提前泄露给所有同行。
4.2 数据太大了,传不上去怎么办?
这是一个非常现实的问题。有些领域的数据集动辄几百GB甚至TB级,显然不能直接传到Zenodo或figshare上。
我的建议是“分层公开”:论文的核心图、表对应的最小数据集,严格来说不会太大,一般几MB到几GB都传得上去;真正的大规模原始数据,可以放在你所在机构的服务器或专门的大数据存储平台,然后在论文里写清楚获取方式。有些领域还有自己的专用数据库,比如基因组学有NCBI的SRA、气象气候有专门的再分析数据集存储平台,这类领域通常会要求“原始测序数据上传到SRA并获得访问号”,这也是开放科学的一种形式。
如果你的代码仓库用到Git LFS(Large File Storage)来跟踪大文件,注意Zenodo归档时默认可能不包含LFS文件,所以大文件最好还是走数据库托管平台,代码仓库里只放路径描述。
4.3 老板不支持、同组不配合怎么处理?
很多时候你想做开放科学,但实验室的管理者担心“还没发表就泄密”“学生辛辛苦苦整理的数据凭什么给别人用”。说实话,这种担忧很难三言两语打消,但我有几个操作性比较强的建议:
第一,从小范围做起。不用一上来就把所有项目都开放。选一个已经投稿或已经接收的项目,按开放科学的流程重新整理一遍,给大家做个样板,让大家看到“开放之后没有坏事情发生,反而多了一些引用”。
第二,把开放数据变成“正式成果”。数据集的DOI是可以写进简历、基金结题报告的。很多单位现在认可数据集、代码、预印本作为科研产出。你可以在年终总结时把公开数据集和开源软件列进去,让领导和同事意识到这是资产而不是负担。
第三,跟合作者谈清楚规则。比如明确“数据公开不影响第一作者的主权”“后续项目使用数据需要引注”“敏感数据匿名化后再公开”。把这些规则写到项目数据管理计划里,大家都按规则办,争议自然就少。
4.4 论文初期代码写得太乱,还有救吗?
有救,但需要一定时间的整理。我在上面强调过,研究过程中的版本控制是最佳方案,但如果错过了那个阶段,也不是世界末日。
你至少可以做这样几件事:
- 把“能跑”的那个版本的代码找出来,单独建一个干净仓库。
- 删掉所有临时文件和测试输出。
- 写一个README,把所有运行步骤记录下来。
- 在README里忘写环境依赖的地方补上。
- 把你使用的软件版本、库版本记下来。如果是Python,用pip freeze或conda list把全部依赖输出到requirements.txt或environment.yml。
只要这些做到位,别人就能大致复现你的结果了。如果你连代码都找不全,那只能把能做的分析步骤写成详细的文字说明,放到补充材料里。这虽然不完美,但总比完全没有好。
4.5 常见问题速查表
| 问题 | 解决方案 |
|---|---|
| 不知道期刊是否接受预印本 | 使用Sherpa Romeo查询期刊政策 |
| 代码没有许可证 | 在仓库添加LICENSE,Python/R项目常用MIT、Apache-2.0 |
| 数据集变量含义不清楚 | 写数据字典(data dictionary),说明每个变量名、类型、取值范围、缺失值编码 |
| 双盲评审怕暴露身份 | 创建匿名GitHub仓库,去除个人信息,提交给期刊的补充材料 |
| 大文件无法放入代码仓库 | 原始数据放专用平台(如SRA、机构存储),代码仓库只放示例数据和路径说明 |
| 数据涉及隐私不能公开 | 匿名化后公开最小数据集,隐私敏感字段不公开并在声明中说明 |
| 审稿人要求复现结果但环境不同 | 提供Dockerfile或环境配置文件,写明运行平台和依赖版本 |
| 担心成果被引用不到 | 在题目和README中写明“Official implementation”,并鼓励引用DOI |
| 合作者不同意公开 | 先沟通,用最小数据集方案代替全部公开,必要时写清数据使用协议 |
| 不知道从哪里开始 | 选择一个已接收项目,先补README和许可证,再上传到Zenodo生成DOI |
4.6 一个完整流程的时间成本预估
很多人不做开放科学,本质原因是觉得“太费时间”。我根据自己的经验列一个粗略的时间成本表:
- 写DMP:1个小时以内,用模板更快。
- 整理代码仓库+写README+配环境:半天到一天。这个时间取决于你的项目复杂度和代码质量。
- 数据整理+写数据字典:半天到一天。
- 挂预印本:30分钟到2小时,主要是上传和格式检查。
- Zenodo归档+生成DOI:30分钟以内。
- 写数据可用性声明:10分钟。
也就是说,从一个“啥都没整理”的普通项目,到具备基本开放科学素养的归档项目,满打满算不超过三天。而这三天的投入可以给你后续工作带来非常多的便利。我自己的经验是,开放流程带来的好处——比如审稿人更信任、合作者沟通更顺畅、自己以后找文件更容易——远超这几天的投入。
我个人在做这些实践时最深的体会是:开放科学与其说是一个理念,不如说是一种“你以后一定会感谢现在自己”的好习惯。它没有你想的那么贵,也没有你怕的那么危险。从一个小项目开始,哪怕只是一份写清楚的README、一个带DOI的数据集,你都会发现科研这件事变得更透彻、更可靠了。