作为广大非CS理工科的学生,从我开始上大学后做pj做科研,之间见过的各种论文代码,师兄师姐代码、老师的代码都各有各的烂。我自己写工科课程项目作业时,整个流程也十分混乱,最后上交的代码也基本不能见人。每次在github上看到CS的朋友们五脏俱全又清晰明了的项目代码,我都十分羡慕。因此,我最近就稍微研究了下全球各地对于科学代码的实践标准。

首先我想说说我看到的工科代码烂的curated list:

  • 不开源。工程代码论文不开源,所以论文内容有没有问题无从考证,也使得科研代码写的毫无追求。科研代码没有开源氛围,所以学生身边开源氛围也不够。
  • 毫无标准流程,没有版本控制没有规范测试。由于不用开源,也没有人好好学习软件工程的流程,因此在做实验过程中不用版本控制,修改之后也没有规范测试。
  • 不遵从语言的实现标准。不同语言有各自的最佳实践标准,对语言特性不熟悉,代码奇慢无比。
  • 由于科学代码一般没有复用需求,因此都是写成一次性的,无论从可读性上还是鲁棒性上很难被人调用。

诸如此类种种,让我已经忍无可忍。因此好好调研了下「什么是最佳的科学代码最佳实践」。

UK 的 Software Sustainablity Inistitute

我在调研的时候首先发现了 UK 的software sustianablity inistitute的一篇文章,一位工程PhD抨击了一遍科学代码写的多么混乱,并给出了一些基本建议。这些建议在软件开发里已经可以算是基本标准了,但是在科学代码中并没有形成标准,没有形成科学代码的开发规范。如:

  • 版本控制
  • 测试
  • 文档和可读性
  • 部署与发布

Netherlands eScience Center 的 Best Software Practices

我在nature的一篇How to support open-source software and stay sane文章里发现了荷兰的这份为科学家科普软件开发标准的项目。

这个开源项目里事无巨细的介绍了各种软件演进过程中最重要的实践经验。包括:

  • 在有新想法时,如何先版本控制并做测试再做集
  • 发布代码过程中一些基本能力,如环境的打包,写文档,社区交流之类
  • 全体科研人员应该掌握的语言,如bash以及一些统计软件
  • 类似的开源项目还有数据届的turing way,介绍了各种进行 Reproducible Research 的关键步骤。

GSOC 今年让我动心的科学开源项目

Google code of summer 是一个google为鼓励学生参与开源项目而举办的非常大的活动,每年与200+著名开源项目合作而为学生提供3个月的有mentor指导的开源项目独立开发经历。

今年的申请马上就结束了,我看了一圈让我喜欢的开源项目。

  • Julia。为高性能科学计算开发的高级通用动态编程语言。经过我最近详细了解Julia,我非常非常喜欢,已经加入Julia中文贡献社区。Julia在最近几年的google code of summer 都有参与。
  • 几家做scientific open source的。如NumFOCUS(NumFOCUS supports and promotes open source scientific software),UC Santa Cruz的开源软件支持项目。
  • 各科研领域的专业软件。天文的openastronomy,地理信息学52°North GmbH,基因组Genome Assembly and Annotation、GeomScale,城市建设Mayor’s Office of New Urban Mechanics,机器人的Open Robotics,R。

多多接触科学界的开源软件,为之做贡献可以很快熟悉科学开源开放的标准流程。

结语

编写开放源代码软件的科学家通常缺乏软件工程方面的正规培训,这意味着他们可能从未学习过代码文档和测试的最佳实践。但是,维护不善的软件可能会浪费时间和精力,并影响可重复性。

由于最近和我合作的学长和老师都是做计算机理论和数学背景的,看到实现同样的算法,学长用julia优化写出来的比我用matlab写的快10倍不止,因此心里五味杂陈,整理成此文,鞭策自己能够吸取他山之玉化为我用。

最后放一个找到的荟萃gist https://gist.github.com/stared/9130888

comments powered by Disqus