那些年,我们一起踩过的开源坑:科研成果背后的技术应用实录
先说个事儿——上周,我那个做计算化学的朋友又崩溃了。他花三个月跑出来的数据,因为依赖的一个开源 Python 库悄没声地升了个小版本,结果全盘作废。气得他想砸电脑。说实话,这种事儿我见太多了。开源,啧啧,真是让人又爱又恨。
科研界的“抄作业”利器?
现在的科研,离了开源软件,你试试看?从数据采集、清洗、建模到可视化,哪一步没有开源工具?比如做生物信息的,谁还没用过 Bioconductor?那个庞大的 R 包集合,几乎成了组学数据分析的标配。我刚开始接触的时候,震惊了——这么多包,全是全球科学家们无偿贡献的。还有高能物理领域,CERN 搞的那个 ROOT 框架,几十年来支撑了多少论文!有时候想想,这简直是人类知识的共产主义啊。可是……免费的馅饼吃多了,牙疼。
R语言Bioconductor基因组分析工具链示意图
科研人员用开源,本质上是在“站在巨人肩膀上抄作业”。这没什么可耻的——我自己也抄。但抄着抄着,问题就来了:作业本突然被人抽走怎么办?
代码开源了,然后呢?
大概三年前,我参与过一个脑电信号处理的项目,核心算法依赖一个博士生毕业后扔在那儿的 MATLAB 工具箱。名字就不提了。那玩意写得……怎么说呢,能用,但文档烂得像天书。我们硬着头皮改,好不容易跑通了。前阵子想起来去看看它 GitHub 页面,好嘛,最后提交是 2019 年,Issues 堆了四十多个,作者再没出现过。这就是开源界的“遗弃孤儿”现象。学术圈的开源,往往靠一两个博士生或者博士后搭个原型,论文发了,人走了,代码就死在那了。你指望他们维护?没经费,没义务,拿爱发电啊?
不过话说回来,也有聪明的家伙——比如 Databricks,把 Spark 包装得那么漂亮,商业版卖得飞起。Red Hat 也是,给企业卖 Linux 保障服务,赚得盆满钵满。这算是给开源续了命,但有时候也变味儿了。有次我们团队想用某个开源 NLP 库的新版本,结果发现关键优化全锁在云服务商的付费版里,开源版给你留个残废的接口。气得我在群里骂了一句:“这算什么开源,这是钓鱼呢!”
废弃的GitHub仓库未解决issues堆积截图
更头疼的是依赖链断裂。就像我那位计算化学朋友,底层一个 numpy 版本变化,或者某个冷门库的维护者删库跑路——这种事少吗?去年 colors.js 和 faker.js 的作者故意破坏自己的包,导致无数项目构建失败。那一刻,整个前端圈都抖了抖。科研环境更脆弱,很多实验室的代码重跑一遍比考古还难。
开源的“潘多拉魔盒”
安全?别提了。Log4j 漏洞爆出来的时候,我组里小师弟慌慌张张来问:“师兄,咱们用的那个数据处理平台是不是也……” 我一查,得,其中一个小工具链里果然嵌着有漏洞的版本。在学术界,安全意识淡薄得可怕。很多跑模拟的服务器,万年不更新系统,开源库也是能跑就不动。去年有个针对科研机构的勒索病毒,就是利用一个老旧开源 FTP 组件的漏洞打进去的。唉,开源像一扇没锁的门,方便了自己,也方便了不速之客。
许可证也是个坑。你用了 GPL 协议的代码,你衍生出来的研究代码就得开源;你用了 AGPL,哪怕只通过网络提供服务,用户都能要求你公开源码。我见过一个创业团队,产品都快上市了,才发现核心模块无意中用了 AGPL 的库,被迫全部重写,差点没倒闭。学术圈里大家经常随便复制粘贴,根本不管 LICENSE 文件里写了啥。这能不出事吗?
最后说个吊诡的事儿:现在很多顶会论文,宣称代码开源,结果你去 github 一看,仓库是空的——这叫“占坑式开源”。要么就给你一个不明所以的 readme,连个环境配置文件都没有。这真是把开源当成一种学术表演了。开源的初衷是分享和协作,现在却掺杂了太多作秀和功利。技术很纯粹,人心复杂。
唉,不说了。回到开头那个朋友——他最后还是花了整整一周,把环境降级,锁死依赖版本,还专门写了个 dockerfile。他苦笑着说:“以后,我信开源,但只信 docker 镜像里的开源。” 你品品这话。