在科学环境中编程的实践方法?

92

背景

去年,我在一所大学的物理研究组中做实习。在这个小组中,我们主要使用LabVIEW编写程序来控制我们的装置、进行数据采集和分析。对于前两个目的,这很好用,但对于数据分析来说,它真的很难用,而且每个人都是自学成才,因此编写的代码通常很混乱(难怪每个博士生都迅速决定从头开始重写所有东西)。版本控制是未知的,也无法设置,因为IT部门有严格的软件和网络规定。

现在,事情实际上进展得出奇地顺利,但自然科学领域的人们如何开发他们的软件呢?

问题

一些具体的问题:

  • 您使用过哪些语言/环境来开发科学软件,特别是数据分析?使用了哪些库?(例如,您用什么来绘图?)
  • 是否有针对没有编程背景的人的任何培训课程?
  • 您是否拥有类似版本控制和 bug 跟踪的功能?
  • 如果要创建一个良好的编程环境,而不会妨碍个人科学家(特别是物理学家非常固执!),您会怎样做?

迄今为止的答案摘要

迄今为止的答案(或者我对它们的解释):(2008-10-11)

  • 似乎最广泛使用的语言/软件包:
    • LabVIEW
    • Python
      • 使用SciPyNumPyPyLab等(有关下载和链接,请参见Brandon的回复)
    • C/C++
    • MATLAB(矩阵实验室)是一种常用的数学软件。
    • 几乎所有受访者都使用版本控制,而漏洞跟踪和其他过程则不太常见。
    • Software Carpentry课程是向科学家教授编程和开发技术的好方法。
    • 如何改进呢?
      • 不要强制人们遵循严格的协议。
      • 自己建立一个环境,并向他人展示其好处。帮助他们开始使用版本控制、漏洞跟踪等。
      • 审查其他人的代码可能会有所帮助,但请注意并非每个人都会欣赏这样做。

2
相关阅读:http://www.nature.com/news/2010/101013/full/467775a.html - Tobias Kienzler
20个回答

4
你用过哪些语言/环境来开发科学软件,特别是数据分析方面?使用了哪些库?(例如,你用什么来绘图?) Python,NumPy和pylab(绘图)。
有没有为没有编程背景的人提供培训? 没有,但我在一个多媒体研究实验室工作,几乎每个人都有计算机科学背景。
你有类似版本控制、缺陷跟踪的东西吗? 是的,Subversion用于版本控制,Trac用于缺陷跟踪和wiki。如果他们的TOS适合你的项目,你可以从http://www.assembla.com/获得免费的缺陷跟踪/版本控制托管服务。
“如何在不过多干涉个体科学家(尤其是物理学家这样固执的人)的情况下,为编程创建一个良好的环境?”请确保基础设施设置得当并得到良好维护,并尝试推销源代码控制的好处。

3
我是英国一所大学的统计学家。通常这里使用R进行数据分析,如果您了解C/Perl,则相当容易学习。它的真正优势在于您可以交互地导入和修改数据。非常容易合并多个CSV(或Excel)文件,基于其他列创建新列,然后将其输入到GLM、GAM或其他模型中。绘图也很简单,不需要掌握整个新语言(如PGPLOT或GNUPLOT)。当然,您还有内置功能的优势(从简单事物如平均值、标准偏差等到神经网络、样条和GL绘图等)。
话虽如此,还有一些问题。对于非常大的数据集,R可能会变得非常慢(我只在>50,000x30数据集中看到过这种情况),而且由于它是解释性的,在这方面您无法获得Fortran/C的优势。但是,您可以(非常容易地)让R调用C和Fortran共享库(来自类似netlib的东西或您自己编写的共享库)。因此,通常的工作流程是:
- 了解要做什么。 - 在R中原型代码。 - 运行一些初步分析。 - 将缓慢的代码重写为C或Fortran,并从R中调用。
这对我来说非常有效。
在我的系里(超过100人),我是为数不多的使用版本控制的人之一(在我的情况下是使用git和githuib.com)。这令人非常担忧,但他们似乎并不想尝试它,并且满足于传递zip文件(呕吐声)。
我的建议是继续使用LabView进行数据采集(也许尝试让您的同事们同意工具集用于采集并使其对所有人都可用),然后将数据导出为CSV(或类似格式)并在R中进行分析。在这方面重新发明轮子真的没有什么意义。

2
我建议使用F#来进行与科学相关的操作,因为它与数学构造有很强的语义联系。此外,它支持度量单位,如这里所述,对于确保数学模型和实现源代码之间的正确转换非常有意义。

2
您用于开发科学软件(特别是数据分析)的语言/环境有哪些?使用了哪些库?(例如,您用什么来绘图?)
我用于数字和科学相关内容的语言有:
- C(开发缓慢,调试过多,几乎不可能编写可重用代码) - C ++(我开始讨厌它 - 开发速度不如C慢,但可能很痛苦。模板和类最初很酷,但过一段时间后我意识到我一直在与它们斗争,并为语言设计问题寻找解决方法) - Common Lisp,还可以,但不广泛用于Sci计算。与C集成不容易(与其他语言相比),但可行 - Scheme。这个成为了我的个人首选。
我的编辑器是Emacs,虽然我会用vim快速处理像编辑配置文件之类的东西。
对于绘图,我通常生成一个文本文件并将其输入gnuplot。
对于数据分析,我通常生成一个文本文件并使用GNU R。
我看到这里有很多人使用FORTRAN(主要是77,但也有一些90),很多Java和一些Python。我不喜欢这些,所以我不使用它们。
没有任何显著编程背景的人是否接受过培训?
我认为这不适用于我,因为我是CS毕业生 - 但在我工作的地方没有正式培训,但人们(工程师、物理学家、数学家)会互相帮助。
您是否有类似版本控制、缺陷跟踪这样的东西?
版本控制绝对重要!我将我的代码和数据保存在三台不同的机器上,在世界两端的Git存储库中。我一直同步它们(所以我有版本控制和备份!)我不进行缺陷控制,尽管我可能会开始这样做。 但是我的同事根本不使用BTS或VCS。
如果您想创建一个适合编程的良好环境,而不会太过干扰个体科学家(特别是物理学家很顽固!),您会怎么做?
首先,我会尽可能给他们自由。(在我工作的大学里,我可以选择让某人安装Ubuntu或Windows,或者安装自己的操作系统 - 我选择安装自己的操作系统。我没有他们的支持,我对任何发生在我的机器上的事情负责,包括安全问题,但我可以随意使用这台机器)。
其次,我会了解他们习惯使用的工具,并使它们正常工作(需要FORTRAN?我们会设置好。需要C++?没问题。Mathematica?好的,我们会购买许可证)。然后看看有多少人愿意学习“附加工具”来提高工作效率(不要说“不同”的工具,说“附加”的,这样就不会让任何人感觉到“失去”或“放弃”什么)。从编辑器开始,看看是否有组员想要使用版本控制系统来同步他们的工作(嘿,你可以呆在家里通过SVN或GIT发送代码--这不是很棒吗?)等等。
不要强制使用--展示这些工具的酷炫之处。使用R进行数据分析,并展示它们有多容易。展示漂亮的图形,并解释如何创建它们(但先从简单的例子开始,这样你可以快速地向他们解释)。

2
另一个不错的选择是Scilab。它拥有类似于LabVIEW的图形模块,有自己的编程语言,你还可以嵌入Fortran和C代码等。它被广泛应用于公共和私营部门,包括大型工业公司。而且它是免费的。
关于版本控制,一些人更喜欢Mercurial,因为它在管理和定义存储库方面更加灵活。然而,我没有使用过它。
对于绘图,我使用Matplotlib。我很快就要制作动画了,我看到使用MEncoder可以得到很好的效果。这里有一个示例,包括音轨。
最后,我建议采用模块化的方式,即尝试将主要代码块保存在不同的文件中,这样代码的修订、理解、维护和改进会更容易。例如,我编写了一个Python模块用于文件完整性测试,另一个用于图像处理序列等。
您还应该考虑使用调试器,在代码中设置可检查变量内容的断点,而不是使用打印行。我曾经在Python和Fortran开发中使用过Eclipse(尽管在编译Fortran短程序时出现了假错误,但可能是配置不当),现在开始使用Eric IDE进行Python开发。它可以进行调试,使用SVN进行版本管理,具有嵌入式控制台,可以使用Bicycle Repair Man进行重构(也可以使用其他工具),还有Unittest等功能。Python的一个轻量级替代品是自Python 2.3版本起包含的IDLE
作为一些提示,我还建议:
  • 不要使用单字符变量。当你想要搜索出现时,你会在各个地方得到结果。一些人认为一个好的 IDE 使这更容易,但那样你就会依赖于永久访问 IDE。即使使用 ii、jj 和 kk 可以足够,尽管这个选择将取决于你的语言。(如果代码注释是用爱沙尼亚语编写的,双元音将不太有用)。

  • 从一开始就对代码进行注释。

  • 对于关键应用程序,有时候最好依赖于较旧的语言/编译器版本(主要版本),这些版本更稳定,调试更好。当然,你可以在后续版本中拥有更优化的代码,修复了错误等等,但我所说的是使用 Fortran 95 而不是 2003,Python 2.5.4 而不是 3.0 等等。(特别是当新版本破坏向后兼容性时)。许多改进通常会引入许多错误。然而,这将取决于具体的应用情况!请注意,这是个人的选择,很多人可能会反对这种做法。

  • 使用冗余和自动备份!(带版本控制)。


2
肯定地,使用Subversion来保持当前、正在进行的工作和稳定的源代码快照副本。这包括自制软件工具的C++、Java等语言以及一次性处理的快速脚本。
在科学和应用工程领域,倾向于“孤独牛仔”式的开发方法,通常将存储库组织为主干、标记和其他内容 - 不要费心了!科学家和他们的实验室技术人员喜欢旋钮、电极和追逐真空泄漏。让每个人同意使用Python/NumPy或遵循某些命名约定已经足够困难了,更不用说试图让他们遵循晦涩的软件开发者实践和惯例。

2
对于源代码管理,像Subversion这样的集中式系统由于具有明确的单一真相(SPOT)而在科学使用中更为优越。记录更改并能够回忆任何文件的版本,而不必追踪找到某个东西,具有巨大的记录优势。像GitMonotone这样的工具:哦天啊,我可以想象随之而来的混乱!清晰地记录玩弄新传感器时使用了哪个版本的hack-job脚本,当希格斯玻色子经过或超新星爆炸时,将会带来幸福感。

你有没有尝试过使用分布式版本控制系统? - Andrew Grimm
1
几乎所有的分布式系统与集中式系统一样容易操作。你只需要记录提交ID(Git术语)而不是修订号(SVN中的)。 - Phil Miller

2
你用过哪些语言/环境来开发科学软件,特别是数据分析?使用了什么库?(例如,你用什么来绘图?)
我的本科物理系教授LabVIEW课程,并在其研究项目中广泛使用它。
另一个选择是MATLAB,我没有使用过。有支持这两种产品的阵营;每个都有自己的优缺点。根据你需要解决的问题类型,一个软件包可能比另一个更可取。
关于数据分析,你可以使用任何类型的数字计算器。理想情况下,你可以在X语言中进行复杂的计算,并将输出格式化以在Excel、MathcadMathematica或其他流行的绘图系统中漂亮地绘制。不要指望在这里达成标准化。
你们有像版本控制、缺陷追踪这样的工具吗?
回顾过去,我们没有这些工具,如果有的话会更容易。 不要让一切都崩溃并费尽心思地去修复它!
任何公共代码都应该使用源代码控制。鼓励个人以更通用的方式编写他们的代码。这真的只是编码最佳实践。事实上,你应该让他们教(或学习)计算机科学课程,这样他们就可以掌握基本技能。
在不妨碍个别科学家(特别是物理学家固执己见)的情况下,如何创建一个良好的编程环境呢?
数据采集(DAQ)和数据分析之间存在明显的分离。也就是说,可以在DAQ上进行标准化,然后允许科学家在他们选择的程序中处理数据。

1

1
首先,我肯定会选择一种脚本语言,以避免不必要的解释(例如手动内存管理对于编写低级别、性能敏感的代码来说大多数情况下是可以接受的,但对于只想将计算机用作升级版科学计算器的人来说绝对是过度杀伤力)。此外,如果有针对您领域的特定语言(如统计学中的R),也请四处寻找。这样做的好处是已经使用用户熟悉的概念,并且具有特定情况的专业代码(例如在R中计算标准差、应用统计测试等)。
如果您希望使用更通用的脚本语言,我会选择Python。它有两个优点:
  • 交互式 shell,您可以进行实验
  • 其清晰(尽管有时很冗长)的语法
作为额外的优势,它还具有大多数您想要执行的操作的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接