4956 字

科研软件

我本科阶段用过的能沾上边科研软件大概就是 Excel 外带 origin 7.0 的破解版,后者还是从学长学姐那边拷过来的,顺道附带了我们学校打印店的病毒全家桶。我记得我们那时候高数课本是附带3.5英寸软盘的,里面有Matlab的实验习题,我倒是跑到数学院机房做过一次,但印象用的电脑中软驱坏了就很愉快地去听看别人下载在重启不删文件夹下的电影了。至于说当时大学生技术基础课里教的 C 语言,刷完南开一百题过了三级后基本就再也没用过。曾经在专业课学过 MapInfo 跟 CAD,但我们学院那个破机房,几十台机子里不是中病毒就是压根开不了机,上了几次课也就学了个基本操作跟概念。我们作为一级学科的工科与二级学科的理科,课程设计里连环境系统分析这种对计算模型要求非常高的课都安排了,但作为基础的数理统计与概率论却没有,学起来全靠自己悟性。后来系主任知道了去查了记录才发现我们学院前几届跟后几届的课程培养计划里都有概率论,偏偏我们这级给略过去了,只学了高数跟线代。当时本科研究里拟合个污染物吸附曲线都得靠搜索引擎跟学长学姐时而靠谱,时而废柴的经验,命令行界面基本是能躲多远就躲多远。大四毕设时我接触了文献管理软件,主要看的是罗昭锋老师的课,有了一点软件辅助科研管理的概念。

真正接触科研软件还是去玉泉路读大五的时候,我说这是大五是因为中科院要求大部分研究生第一年都送到北京集中教学,第二年才回各自研究所开展科研工作。这一年有三个学期,课制则是上完一门就考一门的医学院体系,想读博的要一年修够博士阶段的学分,所以我第一年研究生忙得跟狗一样到处上课。玉泉路那边其实是科大的老校区,所以还有点校园生活相当于读了个大五,跟后面回所的日子天差地别。在玉泉路时,因为清楚自己要走科研的路,所以选了Matlab跟SPSS还有统计分析的课,当时就感觉原理懂不算懂,必须要掌握工具。那时候我也开始接触非 office 体系的排版软件并转向 Linux 系统,我记得当时有次交作业我是用 tex 文档编译的 PDF 文档,当时就为解决个中文输出及 bibtex 文献管理的编译就费了我一整天时间,最后搞出来的文档显示是中文,复制是乱码,相信很多朋友都有类似的折腾经历。我记得还用了 QtiPlot 这个软件一段时间来替代 origin,但其实也没太搞明白使用逻辑。那段时间感觉自己就是受虐狂还乐在其中,完全在盲人摸象中前进。

等到了所里真正开始科研,软件用的就多了,例如化学结构需要 chem3D,作图需要 sigmaplot,SPSS等,文献管理用 Endnote,这些软件无一例外都是要交钱的。但我就没这个问题,因为这些软件都没有适配 Linux 系统,那时我疯狂寻找一切在线数据分析的网站,说起来,美味书签这个应用也是那个时候流行,后来销声匿迹。这种打补丁的分析持续到我博士的第二个项目,做化学信息学数据分析使用了 e-dragon 算了几百个分子描述符(好像还用了 mopac 的分子动力学软件做构型优化,但高斯那种巨无霸的坑我是掉头就走的),然后要构建 QSPR 模型,其实就是个多元线性回归配合变量选择。这个活就不能用图形界面软件或在线应用来做了,基本都得死机,然后我就去东北大学的六维论坛上拖回了Matlab并给电脑装了个虚拟机来死磕。我当时其实不懂变量选择的方法,因为大五我就没学过多元分析,这时我自作聪明根据不同分类的分子描述符提取了主成分,然后用超过80%方差的各分类主成分作为新变量去做回归,其实就是重新发明了分组主成分回归还是半自动做的。然而,在使用过程中我深刻感受到Matlab在建模上的强大,想系统学习然后就搜到了吴恩达的机器学习公开课。

很多人机器学习的启蒙课就是吴恩达在C站上的机器学习,但我学的那会是字幕组翻译的课程录像,C站上线这个课大概是一年后的事。那时我每天中午会去半导体所边的小平房买份盒饭,回来就在办公室戴上耳机一边吃盒饭,一边看视频,一边记笔记。然而这门课确实给我打开了公开课的新大门,我开始到处找数据分析的公开课学,那个时候 来回切系统用 Matlab 非常不方便,而当时 Jeff Leek 在C站开了门数据分析的课(后来扩展成了C站最火的数据科学系列课程之一),使用了R作为工具。当时我对 IDE 不了解,那门课的作业全是在命令行里敲出来的,快结束时发现有款 RStudio 的IDE在课程论坛里被反复提及,所以就装上了而且几乎上手立刻就理解了项目管理对数据分析及科研项目的重要性。那时我基本圈定科研软件需要排版软件、文献管理与数据分析及制图软件,后面逐渐加入实验室管理软件与数据同步分享软件。

这里插一段关于科研笔记软件的回忆,一般来说文献管理软件都附带这个功能。本科结束时我 Endnote 里的文献也有三位数了且科学院国科图事实上也购买了正版给学生用,但后来我还是转到开源的 Zotero 。一个很直接的原因就是 Endnote 的题录是需要数据库支持的格式,那时不管摘要数据库还是全文数据库也都提供结果的导出但格式很不统一,Zotero 那时只是火狐浏览器的插件但实现了自动识别题录并保存的功能,我转到 Zotero 其实就看重这一个功能,当然后来主流文献管理软件都支持这个功能了。不过在实践中我发现在里面记的笔记是真的没有用,笔记是探索别人的思路去记录每个文献的知识点,而自己用的时候需要让自己的理论体系里存在这个知识点,如果我在每一篇文章里记录知识点,哪怕文章结构组织再好也始终是分散的。所以后期我是用 Evernote 来长期管理科研笔记的,在 Evernote 里知识是重整为我知识框架的工具,每个主题一篇笔记,里面有原文链接但写的时候就当成综述一样。其实 Evernote 也是我付费订阅的第一个软件服务,不过大概率今年到期后我就不再续费,因为后面改用了 bookdown 的在线电子书形态来记录整理,保证新文献要快速消化到已有知识体系里,前些日子也整理了 Evernote 里四位数的笔记导出到 joplin 里,算是正式退休。其实这里面有段时间我是在用思维导图整理主题的,但那个时候 doi 还不流行,直接插入的链接很丑且对 Evernote 不友好。现在其实很多痛点都已经被解决了,但基于习惯的顽固我也没有转回去,相信后浪们一定能基于自己的经历去选择对自己最合适的,而不是始终沉溺于工具的选择。

有意思的是,我这个软件工具的探索过程几乎都是始于付费破解软件,最后落脚到开源软件。一方面那个时候我实在是穷,但已经不太能接受去使用破解版软件了,最后的折衷就是来一整套开源软件,彻底远离那些破解与图形界面。另一方面则是当你真正使用一个软件,需求是放第一位的,如果开源能满足要求,我其实很反感一个大而全的界面而更喜欢一个软件或一个命令做一件简单的事。很多时候让我放弃商业软件,特别是图形界面的商业软件的最后一根稻草是因为功能界面搞的太繁杂,新功能我感觉用不上或者花钱(实际并没有)买了不需要的服务,你给我原料我来组装就可以了,你组装好了我还得适应你的组装思路就感觉花钱买罪受。不过最庆幸的是这一切都发生在我研究生涯的初期,软件选择是路径依赖问题,初期偷懒选破解,后面会有一屁股债要还,路越走越窄,会被商业公司牵着鼻子走。反之初期选了开源软件,了解更底层的需求,后面不论用开源还是用付费都得心应手,属于路越走越宽。时至今日,我对科研软件的选择原则基本是开源软件优先,在线应用补充的策略(也就是用关键词加 online 去搜索应用或直接在 GitHub 里搜索关键词或关键代码段)。而且我会尽量避免图形界面,这倒不是装腔,而是图形界面的参数设置很多论文里根本就不写,降低了可重复性,如果是脚本就很大程度避免了在数据操作阶段动手脚的风险。

其实,多数情况下我也不会真的去查源码,但一定要保留这个选项,因为也确实出现过好几次代码报错作者联系不上然后我只能自己 fork 了去填坑的情况。不过,开源不意味免费而更多意味信息透明,你知道自己在做什么,任何一个软件包维护起来都是有成本的,用爱发电出现的各个软件社区其实是间接烧的科研经费或个人兴趣。这里一个很神奇的异类就是前面提到的 RStudio ,做的是开源软件也没耽误赚钱,用开源来构建社区生态,用生态吸引对商业版的付费用户且提供更高级功能。其实这个商业模式在科研软件圈非常不常见但在开源社区似乎已经是很成熟了,Linux 基金会目前也是主要依赖软件咨询与培训来盈利。其实今后我感觉科研软件开发者可以走类似思路,软件不要收费且通过开源来吸收社区贡献,个人版免费并通过模块化来维护高级版独占功能,然后卖订阅服务就是了,软件脱实向虚保持开源会避免很多知识产权的麻烦且不耽误赚钱。独占的知识产权与盈利其实不是互相依存的,对于科研软件而言,原始算法其实都能追溯到发表的文章,软件公司对其的速度优化可以作为高级版卖点但得有个面向个人的免费基础版,否则用户群上不去。

说到底,科研软件有个不可能三角:源码开放度-用户群-学科习惯。如果软件闭源且用户群已经很大,就会导致产生僵化古板的学科习惯,新功能加不进去,例如 Endnot 的在线导入题录就落后 Zotero 很久;如果用户群大且学科对新功能需求高,就得依赖开源社区提供活力;如果闭源且学科对外开放,用户群很难做上去因为培训用户的成本很高。很多老牌科研软件的市场地位被前浪给锁定了,例如 SAS 在流行病学领域极为流行很大程度是整个学科很早期就形成了使用这个软件的传统,再比如 Matlab 在工科仿真几乎是行内通行标准。我们会看到新学科的科研软件例如基因组学、机器学习等基本是没有历史包袱而拥抱开源文化实现快速迭代升级,而老学科里开源软件的渗透就非常小众,积重难返,其实是挟持了行业标准来绑架用户。作为科研这种拼想法拼新意的领域,实现目的其实要优于对标准化的需求,简单粗暴的高级语言 REPL 最好,一行代码解决一个问题最好,如果要适配语言的复杂语法就可能让用户不爽。这个问题在 tidyverse 这个 R 语言的分支中已经有体现了,虽然出图漂亮,逻辑结构完整,但不断变动的语法框架会降低代码的可重复性,这对科研用户特别是前浪用户来说是无法接受的,如果新用户足够多倒也不用管前浪用户,但科研用户里具体到研究方向而言前浪用户的话语权就很重了,很多本身就是开发级用户而不是应用层的,天天为底层依赖的奇怪变动捉虫估计会有怨言。

最近 Matlab 跟 ChemOffice 都爆出了因为政策或商业原因而停用用户许可的新闻,这种政策风险对于科研用户而言其实非常高,就好比选了个“美国为啥抓不住萨达姆”的课题做研究,新闻一来,吃饭工具都给你没收了。国内科研软件到今天都有放任盗版与破解版的黑历史,很多科研人员被商业软件驯化良久,想改变最大的敌人不是没有备选项,而是高昂的再学习成本。这口锅其实自己得背至少一半,另一半就是各学科在制定教学大纲时需要考虑风险而更多提供底层、开源的科研软件工具,不过很明显这是正确的废话,大学教学本质是服务就业,脱离行业要求估计市场也不认,而很多行业其实已经被某一两款软件事实垄断了。但在研究生科研工具的引导上则可侧重于可重复性与开源优先,一方面即使就业,研究生层次培养的能力从开源软件转闭源软件属于降维打击;另一方面纳税人的钱要用来产生公共知识反馈社会而不是养肥个别公司。在这一点上有另一个类似的利益集团:学术出版行业,吃相也是相当不体面,利用开放获取与数据库订阅两头拿钱而学术审稿人都是免费劳动力,超额利润不是一般的高。

以后会怎么样呢?其实这次的停用许可对于公司与用户是双输,好不容易培养的付费习惯被强行中断,用户再学习成本也很高。如前面所说,这些老牌公司应考虑将基础功能开源化,不要去卖软件而是去卖服务与培训,把高级版功能作为咨询服务提供,脱实向虚,这样业务可持续性会好,砍掉销售聘用更多技术人员可以防止走传统行业拼营销而恶意竞争的老路。毕竟每年都有几百万的大学新生,这个市场撑得起头部好几个竞争者。如果固守软件本身的销售且不去建设开源社区,碰上懂王发飙就只能自认倒霉。这其实也是大趋势,Matlab 在科学计算上已经落后于 Julia 或 Python 了,ChemOffice 的基础功能我读研的时候就用在线应用替代了,开源后不仅能快速吸纳二次开发者回流,也能保持软件更新的活力,通过新功能定向咨询与基础功能培训就能维持可持续盈利,毕竟连微软都开始支持开源软件了。至于学术出版,我依旧看好预印本配合开放审稿的模式,学术期刊的运营也应该去公司化,类似统计之都主站模式,利用持续集成与容器技术将学术成果的运营开源化、社区化、公开化,用最少的维护成本实现最高效的学术交流。我不是说商业化效率低,而是商业化性价比太低,学术圈要是都搞不出一个自己用着顺手的开放交流体系,就只能掏纳税人的钱去养活这些养尊处优不思进取的行业。