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

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个回答

27

您用过哪些语言/环境来开发科学软件,特别是数据分析方面?使用了哪些库?(例如,您用什么来绘制图形?)

我曾在Enthought工作,这是SciPy的主要企业赞助商。我们与为定制软件开发与Enthought签约的公司的科学家进行合作。对于科学家来说,Python/SciPy似乎是一个舒适的环境。如果你是没有软件背景的科学家,与C++或Java相比,使用它们更容易入门。

Enthought Python Distribution包含所有科学计算库,包括分析、绘图、三维可视化等。

针对那些没有编程背景的人会提供培训吗?

Enthought确实提供SciPy培训,而且SciPy社区在邮件列表上回答问题方面非常好。

您是否有像版本控制和错误跟踪这样的东西?

有,而且是(Subversion和Trac)。由于我们与科学家合作(通常远程合作),版本控制和错误跟踪非常重要。需要进行一些辅导,让一些科学家内化版本控制的好处。

如果您尝试创建一个适合编程的良好环境,又不会过多干涉个体科学家(尤其是物理学家很固执!),您会怎么做?

确保他们熟悉工具链。这需要一开始的投资,但这将使他们感到不太倾向于放弃它而选择更熟悉的东西(如Excel)。当工具失败时(它们会失败),确保他们有一个寻求帮助的地方—邮件列表、用户组、组织中的其他科学家和软件开发人员。有更多的帮助来将他们带回到从事物理学的状态,就越好。


22

这门课程“软件工程”专为从事科学计算的人员设计,旨在教授软件工程的基础和经验,并介绍如何最好地将它们应用于项目中。

它涵盖了版本控制、调试、测试、脚本编写以及其它一些问题。

我听了大约8至9节课,认为它值得强烈推荐。

编辑:这些课程的MP3文件也可以下载


16

这里是核/粒子物理相关的内容。

  • 以前大部分编程工作都是用FortranCERNLIB(PAW,MINUIT等)以及GEANT3完成的,最近则主要使用带有ROOTGeant4的C ++。还有许多专业工具和库在使用,LabVIEW也有所应用。
  • 在我的业务领域中,数据采集通常意味着相当低层次的工作。通常使用C语言,有时甚至使用汇编语言,但随着硬件处理能力的提高,这种情况正在消失。另一方面,现在许多板卡都采用FPGA ,需要进行门电路调整…
  • 一次性任务、图形界面等几乎可以使用任何东西(Tcl/Tk曾经很受欢迎,我最近看到更多的是Perl/Tk和Python/Tk),包括许多只在粒子物理社区中存在的软件包。
  • 许多编写代码的人没有系统的培训,传统主要依靠口头传授,因此对于过程掌握不均,但大部分软件组组长会认真对待过程控制,并阅读尽可能多的资料来弥补他们在这方面的不足。
  • 主要工具的版本控制是普遍的。但是,许多个人程序员忽略了它们较小的任务。正式的缺陷跟踪工具不太常见,夜间建构、单元测试和回归测试也一样。

为了改善情况:

  1. 赢得当地软件领袖的好感。
  2. 在自己的领域实施你想使用的流程,并鼓励那些参与的人也使用它。
  3. 等待。物理学家是以经验为主的人。如果有帮助,他们最终会注意到。
  4. 花点时间帮助直接合作的人。检查他们的代码。告诉他们关于算法复杂度/代码生成/DRY或其他基本事项,因为某些教授曾经向他们投掷Fortran书并说“让它工作”。将他们灌输流程问题的观念。他们很聪明,如果你给他们一个机会,他们就会学习。

11

这可能有点离题,但希望相关。

我曾在National Instruments R&D工作,为NI RF & Communication 工具包编写软件。我们经常使用LabVIEW,并遵循以下做法:

  1. 源代码控制。NI 使用 Perforce。我们采用了常规方法-开发/主干分支、持续集成等等。
  2. 我们编写了自动化测试套件。
  3. 我们有几个人具备信号处理和通信背景。我们定期进行代码审查,并制定最佳实践文件以确保他们的代码达到标准。
  4. 尽管进行了代码审查,但有时“软件人员”(例如我)也不得不重写一些代码以提高效率。
  5. 我明白你所说的固执的人是什么意思!我们曾经有人认为指出他们代码中潜在的性能改进就是直接人身攻击!毫无疑问,这需要良好的管理。我认为处理这些人的最佳方式是慢慢来,不要过于强调变化,必要时准备做脏活 [例如:为他们的代码编写测试套件]。

9
我并不是一个天生的科学家(我研究交通),但我是一名学者,为数据分析编写了大量自己的软件。我尽力用Python编写尽可能多的代码,但有时在扩展或定制现有软件工具时,我被迫使用其他语言。我的领域几乎没有编程培训。大多数人要么是自学,要么是从先前或专业之外的课程中学到编程技能。
我非常喜欢版本控制。我在家庭服务器上运行Vault来管理论文的所有代码。现在我正在努力让部门建立一个Subversion服务器,但我猜起初只有我会使用它。我已经稍微尝试过FogBugs,但与版本控制不同,我认为对于单人团队来说,它没有那么有用。
至于鼓励他人使用版本控制等工具,这真的是我现在面临的问题。我计划强制我的研究生在为我做的研究项目中使用它,并鼓励他们在自己的研究中使用它。如果我教授涉及编程的课程,我可能也会强制学生在那里使用版本控制(根据存储库中的内容进行评分)。至于我的同事和他们的研究生,我所能做的就是提供一个服务器,并依靠温和的说服力和树立良好的榜样。坦白地说,在这一点上,我认为让他们定期备份比让他们使用源代码控制更重要(有些人正在携带其研究数据的唯一副本的USB闪存驱动器)。

7
1.) 脚本语言由于更好的硬件性能而变得流行,Perl/Python/Lisp在轻量级应用(自动化,轻量级计算)方面很常见;在我工作的领域(计算电磁学)中,我们喜欢Unix/Linux系统,因此经常使用Perl。对于性能方面的任务,通常使用C/C++/Fortran来完成。对于并行计算,我们通常手动并行化运行,而不是让程序隐式地进行分割作业(例如在计算雷达散射截面时按观察角度划分任务)。
2.) 我们这里的情况有点混乱。很多代码非常杂乱无章,但科学家通常比较心散,不太在意这方面。虽然这不是理想状态,但我们需要交付成果,而且缺乏足够的员工支持。我们正在逐步改善。
3.) 我们使用SVN进行版本控制,但没有Bug跟踪软件。我们的最佳方案就是一个文本文件,告诉你特定的Bug在哪里。
4.) 对于实施最佳实践的建议是:慢慢来。作为科学家,我们通常不会推出产品。没有人因为编写了干净、易维护的代码而成名。他们通常因为代码的结果而受到认可。他们需要看到有理由花时间学习软件实践。慢慢引入新概念,并尝试让他们遵循;作为科学家,一旦他们自己的经验证实了诸如版本控制这类工具的有用性,他们就会开始全面使用!

6

5

我是一名物理学家,从事凝聚态物理领域的工作,建立经典和量子模型。

编程语言:

  • C++ -- 非常通用:可用于任何事情,速度很快,但在处理MPI时可能有些不便
  • Octave -- 适用于某些补充计算,非常方便和高效

库:

  • Armadillo/Blitz++ -- 用于C++的快速数组/矩阵/立方体抽象
  • Eigen/Armadillo -- 线性代数
  • GSL -- 用于C的库
  • LAPACK/BLAS/ATLAS -- 极大且快速,但不太方便(并使用FORTRAN编写)

图形:

  • GNUPlot -- 输出非常清晰整洁,但有时不太高效
  • Origin -- 绘图非常方便

开发工具:

  • Vim + 插件 -- 对我来说非常有效
  • GDB -- 在使用C/C++时进行调试的好工具
  • Code::Blocks -- 我用了一段时间,觉得相当舒适,但我认为Vim仍然更好。

如果你的C++比C运行得慢,那么你使用它的方式可能是错误的。当然,这很容易发生,但这又是另一回事了。我已经使用C++约7年了,仍然在不断学习新的东西。 - dmckee --- ex-moderator kitten
我并不是C++的铁粉,但很难想象它怎么会比C或Fortran“慢得多”。除非你包括HPC的C变体,如UPC和CUDA的C。 - Suugaku

4

我是一名英国的前学术物理学家,现在从事工业物理学:

您用过哪些语言/环境来开发科学软件,特别是数据分析?使用了哪些库?(例如,您用什么来绘图?)

我现在主要使用 MATLAB(易于访问可视化功能和数学函数)。我曾经经常使用 FortranIDL。我也使用过 C(但我更多地是阅读 C 代码而不是编写),Excel 宏(丑陋且令人困惑)。我目前需要能够阅读 Java 和 C++(但我实际上不能在这些语言中编程),我也尝试过 Python。为了自己的娱乐,我现在正在使用 C# 进行一些编程(主要是为了获得可移植性/低成本/漂亮的界面)。无论我遇到什么语言,我都可以用 Fortran 编写。

是否有为没有编程背景的人提供的培训?

大多数(全部?)本科物理课程通常会有一些关于 C、Fortran 或 MATLAB 的基础编程课程。但这只是最基础的。我真的很希望在某个时候能接受一些软件工程方面的培训(修订控制/测试/设计中等规模的系统)。

您是否使用过版本控制、缺陷跟踪等工具?

我最近开始使用 Subversion / TortoiseSVN。我曾经与之合作过的团队都使用版本控制。我不知道任何学术团队使用正式的缺陷跟踪软件。我仍然没有使用任何形式的系统测试。

如果要创建一个适合编程的良好环境,而不会干扰个体科学家(特别是物理学家是顽固的人!),您会怎么做?

我会尝试在本科阶段引入一些软件工程思想,然后通过研究生阶段的实践加以强化,并提供指向上述软件 Carpentry 课程等资源的指针。

我预计,相当一部分学术物理学家将编写软件(不一定全部),他们迫切需要至少介绍一些软件工程思想。


4

我在英国的一所大学担任物理学家。

也许我应该强调不同的研究领域在编程方面有不同的重点。粒子物理学家(例如dmckee)几乎完全进行计算建模,并可能参与大型软件项目的合作,而像我自己所在的领域(凝聚态物理学)的人相对较少编写代码。我怀疑大多数科学家都属于后者。我会说,在物理学中,编码技能通常被视为有用但不是必要的,就像程序员需要物理/数学技能一样。考虑到这一点...

  • 你使用过哪些语言/环境来开发科学软件,尤其是数据分析?使用了哪些库?(例如,你用什么来绘图?)
通常情况下,数据分析和绘图是使用通用的数据分析软件包进行的,例如 IGOR Pro, ORIGIN, Kaleidegraph,可以将其视为“Excel加强版”。这些软件包通常具有可用于自动化的脚本语言。更专业的分析可能会有一个专门的实用程序来完成工作,通常已经编写了很长时间,没有人拥有源代码并且存在许多错误。一些更技术型的人可能会使用已经提到的语言(Python、R、MatLab及Gnuplot进行绘图)。
控制软件通常使用LabVIEW完成,尽管我们实际上使用Delphi,这有些不寻常。
  • 对于没有任何编程背景的人是否有培训?
我曾参加过由我所在的两个大学举办的网格计算、三维可视化、学习Boost等研讨会。在本科阶段,我们学习了Excel和MatLab的VBA,但C/MatLab/LabVIEW更为常见。
  • 您是否有类似版本控制、错误跟踪的东西?
不是的,尽管人们有个人发展设置。我们的代码库位于一个“服务器”上的共享文件夹中,该文件夹通过同步工具保持最新。
你将如何尝试创建一个适合编程的良好环境,而不会过多干扰个体科学家(特别是物理学家很固执)?
一步一步来!我正在努力用更稳定的东西替换共享文件夹,也许找到一个模仿当前同步工具行为的SVN客户端会有所帮助。
但总的来说,对于大多数自然科学项目来说,时间通常更好地花在研究上!

感谢您分享您的想法!我同意“时间通常更好地用于研究”,但是考虑到由于缺乏版本控制和编程基础培训等因素而经常浪费的时间有多少,我认为科学家们低估了这个问题。 - onnodb

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