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

时间:2008-09-01 18:16:42

标签: physics scientific-computing collaboration

背景

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

现在,实际上事情确实令人惊讶,但自然科学界的人们如何进行软件开发呢?

问题

一些具体问题:

  • 您使用哪些语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)
  • 对于没有任何重要编程背景的人进行过培训吗?
  • 您是否有类似版本控制和错误跟踪的内容?
  • 你怎么会尝试为编程创造一个体面的环境,而不会让个别科学家受到太多影响(特别是物理学家是顽固的人!)。

到目前为止的答案摘要

到目前为止的答案(或我对它们的解释):( 2008-10-11)

  • 似乎使用最广泛的语言/包:
  • 几乎所有受访者都使用版本控制;错误跟踪和其他过程不太常见。
  • 软件木工课程是向科学家教授编程和开发技术的好方法。
  • 如何改善事物?
    • 不要强迫人们遵守严格的协议。
    • 自己设置一个环境,并向他人展示好处。帮助他们自己开始使用版本控制,错误跟踪等。
    • 查看其他人的代码可能会有所帮助,但要注意并非所有人都能理解这一点。

20 个答案:

答案 0 :(得分:27)

您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)

我曾经为Enthought的主要企业赞助商SciPy工作。我们与签约Enthought的公司的科学家合作进行定制软件开发。 Python / SciPy对科学家来说似乎是一个舒适的环境。如果你是没有软件背景的科学家,那么开始使用C ++或Java就不那么令人生畏了。

Enthought Python Distribution附带所有科学计算库,包括分析,绘图,3D视觉等。

是否有针对没有任何重要编程背景的人的培训?

Enthought提供SciPy training,Sci​​Py社区非常善于回答邮件列表中的问题。

您是否有类似版本控制,错误跟踪的内容?

是的,是的(Subversion和Trac)。由于我们与科学家合作(通常远程与他们合作),因此版本控制和错误跟踪至关重要。需要一些指导才能让一些科学家将版本控制的好处内化。

你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)

确保他们熟悉工具链。它需要预先投资,但这会使他们不再倾向于拒绝它而更倾向于更熟悉的东西(Excel)。当工具失败时(他们会),确保他们有一个可以寻求帮助的地方 - 邮件列表,用户组,组织中的其他科学家和软件开发人员。让他们回到做物理学的帮助越多越好。

答案 1 :(得分:20)

课程Software Carpentry专门针对进行科学计算的人员,旨在教授软件工程的基础知识和课程,以及如何最好地将其应用于项目。

它涵盖了版本控制,调试,测试,脚本和各种其他问题。

我已经听了大约8或9个讲座,并认为这是强烈推荐的。

编辑:讲座的MP3也是available

答案 2 :(得分:16)

这里的核/粒子物理学。

  • 主要的编程工作过去主要在Fortran使用CERNLIB(PAW,MINUIT,...)和GEANT3完成,最近它主要是在C ++中使用{{ROOT完成的。 3}}和Geant4。还有许多其他专门使用的库和工具,LabVIEW在这里和那里看到了一些用途。
  • 在我的业务结束时,数据获取通常意味着相当低水平的工作。通常在C中,有时甚至在组装中,但随着硬件变得更强大,这种情况会逐渐消失。另一方面,许多电路板现在都是用FPGA构建的,这需要门捻......
  • 一次性,图形界面等几乎可以使用任何东西(Tcl/Tk曾经很大,我最近看到过更多的Perl / Tk和Python / Tk),包括一些主要存在的软件包在粒子物理学界。
  • 许多编写代码的人很少或根本没有接受过正式培训,而且流程在口头传统上传播得非常不均衡,但是大多数软件组领导都认真对待过程并尽可能多地阅读以弥补他们在这方面的不足。 / LI>
  • 主要工具的版本控制无处不在。但是许多个体程序员忽略了它的小任务。正式的错误跟踪工具不常见,夜间构建,单元测试和回归测试也是如此。

改进:

  1. 获得本地软件领导者的好评
  2. 实施您想要在自己的区域中使用的流程,并鼓励您允许的人使用它。
  3. 等待。物理学家是经验主义者。如果有帮助,他们会(最终!)注意到。

  4. 还有一项改善建议的建议。

    1. 花一点时间帮助你直接工作的人。检查他们的代码。告诉他们有关算法复杂性/代码生成/ DRY或他们从未学过的任何基本知识,因为有些教授曾向他们扔过一本Fortran书,并说“让它工作”。在过程问题上灌输他们。他们是聪明人,如果你给他们机会,他们就会学习。

答案 3 :(得分:11)

这可能略显相关,但希望是相关的。

我曾经在National Instruments,R& D工作,在那里我为NI RF& amp;通讯工具包。我们使用了相当多的LabVIEW,以下是我们遵循的实践:

  1. 来源控制。 NI使用Perforce。我们做了常规的事情 - 开发/主干分支,持续集成,工作。
  2. 我们编写了自动化测试套件。
  3. 我们有一些人具有信号处理和通信方面的背景。我们曾经有过常规的代码审查和最佳实践文档,以确保他们的代码符合标准。
  4. 尽管有代码审查,但有些情况下像我这样的“软件人员”必须重写一些代码以提高效率。
  5. 我确切地知道你对顽固的人的意思!我们曾经有人认为指出他们的代码中潜在的性能提升是直接的个人侮辱!不言而喻,这需要良好的管理。我认为与这些人打交道的最好办法就是慢慢来,不要努力改变,必要时做好准备去做肮脏的工作。 [示例:为其代码编写测试套件]。

答案 4 :(得分:9)

我不是一个'自然'科学家(我学习交通工具),但我是一名学者,他编写了很多我自己的软件进行数据分析。我尝试尽可能多地在Python中编写,但有时我在扩展或自定义现有软件工具时不得不使用其他语言。我的领域很少有编程培训。大多数人要么自学成才,要么从以前或以外学过的课程中学习他们的编程技巧。

我是版本控制的忠实粉丝。我在我的家庭服务器上使用Vault运行我论文的所有代码。现在我正试图让部门设置一个Subversion服务器,但我的猜测是我将是唯一一个使用它的人,至少在开始时。我和FogBugs玩了很多,但与版本控制不同的是,我认为这对单人团队来说几乎没用。

至于鼓励他人使用版本控制等,这才是我现在面临的问题。我打算强迫我的研究生将它用于他们为我做的研究项目,并鼓励他们将它用于自己的研究。如果我教一个涉及编程的课程,我可能会强迫学生在那里使用版本控制(将它们放在存储库中的内容中)。就我的同事和他们的研究生而言,我所能做的就是提供服务器,并依靠温和的说服力并树立一个好榜样。坦率地说,在这一点上,我认为让他们进行定期备份比让他们进行源代码控制更重要(有些人在USB闪存驱动器上携带他们研究数据的唯一副本)。

答案 5 :(得分:7)

1。)由于更好的硬件,脚本语言现在很流行。 Perl / Python / Lisp在轻量级应用程序(自动化,光计算)中很流行;因为我们喜欢Unix / Linux,所以我在工作中看到了很多Perl(计算EM)。对于性能,通常使用C / C ++ / Fortran。对于并行计算,我们通常手动并行化EM中的运行,而不是让程序隐式执行(即在计算雷达截面时通过视角分割作业)。

2。)我们只是把人们放在这里混合。我们拥有的许多代码都非常混乱,但科学家通常是一群散乱的人,不介意那种事情。不理想,但我们有事情需要交付,而且我们的人员严重不足。我们正在慢慢好起来。

3.)我们使用SVN;但是,我们没有错误跟踪软件。关于它对我们来说最好的是一个txt文件,告诉你特定错误的bug在哪里。

4。)我建议为科学家实施最佳实践:慢慢地进行。作为科学家,我们通常不会发货。 科学界没有人通过干净,可维护的代码为自己命名。他们通常会从该代码的结果中获得认可。他们需要看到花时间学习软件实践的理由。慢慢地介绍新概念并尝试让它们遵循;他们是科学家,所以在他们自己的经验证据确认了版本控制之类的有用之后,他们就会开始一直使用它!

答案 6 :(得分:6)

我强烈建议您阅读"What Every Computer Scientist Should Know About Floating-Point Arithmetic"。我经常遇到的很多问题都来自浮点编程问题。

答案 7 :(得分:5)

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

语言

  • C ++ - 用途广泛:可用于任何事物,速度快,但在MPI
  • 时可能会有点不方便
  • Octave - 适合一些补充计算,非常方便和高效

<强>库:

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

<强>图形:

  • GNUPlot - 它有非常干净整洁的输出,但有时不那么高效
  • Origin - 非常方便绘图

开发工具:

  • Vim +插件 - 它对我很有用
  • GDB - 使用C / C ++时的一个很棒的调试工具
  • Code::Blocks - 我用了一段时间后觉得很舒服,但在我看来,Vim还是比较好的。

答案 8 :(得分:4)

  

您使用哪些语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)

Python,NumPy和pylab(绘图)。

  

对没有任何重要编程背景的人进行过培训吗?

不,但我在多媒体研究实验室工作,所以几乎每个人都有计算机科学背景。

  

你有没有像版本控制,错误跟踪这样的东西?

是,Subversion用于版本控制,Trac用于错误跟踪和wiki。如果他们http://www.assembla.com/适合您的项目,您可以从TOS获得免费的错误跟踪器/版本控制托管。

  

你如何努力为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)。

确保基础架构的设置和维护良好,并尝试销售源代码管理的好处。

答案 9 :(得分:4)

前学术物理学家和现在的工业物理学家英国:

您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)

这些天我主要使用MATLAB(易于访问可视化功能和数学)。我过去常常使用FortranIDL。我曾经使用过C(但我更像读者而不是C的作者),Excel宏(丑陋且令人困惑)。我目前需要能够阅读Java和C ++(但我不能真正编写它们)并且我也攻击了Python。为了我自己的娱乐,我现在正在用C#进行一些编程(主要是为了获得可移植性/低成本/漂亮的接口)。我可以用几乎任何我提出的语言写Fortran; - )

是否有针对没有任何重要编程背景的人的培训?

大多数(全部?)本科物理课程通常会在C,Fortran或MATLAB上开设一个小编程课程,但这是真正的基础知识。我真的很想在某些时候接受过软件工程方面的培训(修订控制/测试/设计中等规模系统)

您是否有类似版本控制,错误跟踪的内容?

我最近开始使用Subversion / TortoiseSVN。我过去曾与之合作的小组都使用了版本控制。我不认识任何使用正式错误跟踪软件的学术团体。我仍然没有使用任何系统的测试。

你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)

我会尝试在本科阶段介绍一些软件工程理念,然后通过在研究生阶段的实践加强它们,同时提供指向上述软件木工课程等资源的指南。

我希望相当一部分学术物理学家能够编写软件(不一定是全部),他们至少需要对软件工程中的想法进行介绍。

答案 10 :(得分:4)

我是一所英国大学的物理学家。

也许我应该强调,不同的研究领域对编程有不同的侧重点。粒子物理学家(如dmckee)几乎专门进行计算建模,并且可以在大型软件项目上进行协作,而像我自己(凝聚态物质)这样的领域的人们相对不经常地编写代码。我怀疑大多数科学家都属于后一阵营。我会说编码技巧通常被认为在物理学中很有用,但并不重要,就像物理/数学技能被认为对程序员有用但不是必不可少的。考虑到这一点......

  • 您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)

通常,数据分析和绘图是使用通用数据分析软件包完成的,例如IGOR ProORIGINKaleidegraph,可以将其视为“Excel plus”。这些包通常具有可用于自动化的脚本语言。更专业的分析可能会有一个专门的工作,通常很久以前就已经写好了,没有人有源,而且非常多。一些技术人员可能会使用已经提到的语言(Python,R,MatLab和Gnuplot用于绘图)。

控制软件通常在LabVIEW中完成,虽然我们实际上使用的Delphi有点不寻常。

  • 对于没有任何重要编程背景的人进行过培训吗?

我去过两所大学的网格计算,三维可视化,学习提升等研讨会。作为一名本科生,我们学习了VBA for Excel和MatLab,但C / MatLab / LabVIEW更为常见。

  • 你有没有像版本控制,错误跟踪这样的东西?

不,虽然人们确实有个人开发设置。我们的代码库位于“服务器”上的共享文件夹中,该文件夹与同步工具保持同步。

  • 你怎么会尝试为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)

一次一步!我试图用一些更加可靠的东西替换共享文件夹,也许找到一个模仿当前同步工具行为会有所帮助的SVN客户端。

总的来说,对大多数自然科学项目而言,时间通常更好地用于研究!

答案 11 :(得分:3)

我是英国一所大学的统计学家。一般来说,这里的人使用R进行数据分析,如果你知道C / Perl就很容易学习。它的真正力量在于您可以交互方式导入和修改数据。可以很容易地获取大量的CSV(或Excel)文件并将它们合并,根据其他文件创建新列,然后将其放入GLM,GAM或其他模型中。绘图也是微不足道的,不需要知道一种全新的语言(如PGPLOT或GNUPLOT)。当然,你也有一堆内置功能的优势(来自简单的东西,如平均值,标准偏差等等)神经网络,样条曲线和GL绘图的方法。)

说完这个,有几个问题。对于非常大的数据集,R可能变得非常慢(我只是用&gt; 50,000x30数据集才真正看到它),并且因为它被解释为你在这方面没有得到Fortran / C的优势。但是,你可以(非常容易地)让R调用C和Fortran共享库(从netlib或者你自己写的那些)。所以,通常的工作流程是:

  • 找出要做的事情。
  • 原型R中的代码。
  • 进行一些初步分析。
  • 将慢速代码重写为C或Fortran,然后从R。
  • 调用

对我来说效果很好。

我是我部门(> 100人)中唯一一个使用版本控制的人(在我的情况下使用git与githuib.com一起使用。)这是相当令人担忧的,但他们似乎并不是热衷于尝试,并满足于传递zip文件(哎呀。)

我的建议是继续使用LabView进行收购(并且可能试图让您的同事就收购和制作的工具集达成一致意见),然后将数据导出为CSV(或者在R中进行分析。在这方面重新发明轮子真的很少。

答案 12 :(得分:2)

当然,使用Subversion来保留源代码的当前,正在进行和稳定的快照副本。这包括用于本土软件工具的C ++,Java等,以及用于一次性处理的快速脚本。

随着科学和应用工程对“孤独的牛仔”开发方法的强烈倾向,将存储库组织成树干,标签和其他任何东西的通常做法 - 不要打扰!科学家和他们的实验室技术人员喜欢旋转旋钮,摆动电极并追逐真空泄漏。这足以让每个人都同意,比如说Python / NumPy或遵循一些命名惯例;忘了试图让他们遵循神秘的软件开发者实践和惯例。

答案 13 :(得分:2)

对于源代码管理,由于明确的单点事实(SPOT),Subversion等集中式系统在科学用途方面具有优势。记录变更和恢复任何文件版本的能力,而无需追查找到的东西,具有巨大的记录保持优势。像GitMonotone这样的工具:哦,天哪,我可以想象会出现的混乱!当希格斯玻色子经过或超新星爆炸时,清楚地记录了使用新传感器时使用的黑客作业脚本版本的记录,将带来快乐。

答案 14 :(得分:2)

您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)

我的本​​科物理系教授LabVIEW课程并在其研究项目中广泛使用它。

另一种选择是MATLAB,我没有经验。这两种产品都有营地;每个都有自己的优点/缺点。根据您需要解决的问题类型,一个包可能比另一个更优选。

关于数据分析,您可以使用任何类型的数字计算器。理想情况下,您可以在语言X中进行硬计算,并将输出格式化为Excel,MathcadMathematica或任何风格的绘图系统。不要指望标准化。

您是否有类似版本控制,错误跟踪的内容?

回想起来,我们没有,如果我们这样做,对我们所有人来说都会更容易。没有什么比打破一切并挣扎数小时来修复它的了!

绝对使用任何公共代码的源代码控制。鼓励个人以可以更通用的方式编写代码。这实际上只是编写最佳实践。真的,你应该让他们教授(或参加)计算机科学课程,这样他们才能掌握基础知识。

你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)

数据采集(DAQ)和数据分析之间存在明显的分歧。这意味着,可以对DAQ进行标准化,然后让科学家们在他们选择的程序中使用数据。

答案 15 :(得分:2)

另一个不错的选择是Scilab。它有图形模块àlaLabVIEW,它有自己的编程语言,你也可以嵌入Fortran和C代码。它被用于公共和私营部门,包括大型工业公司。它是免费的。

关于版本控制,有些人更喜欢Mercurial,因为它提供了更多的自由来管理和定义存储库。但是,我没有经验。

为了绘图我使用Matplotlib。我很快就会制作动画,并且使用 MEncoder 看到了很好的效果。这是一个包含音轨的example

最后,我建议使用模块化,这是尝试将主要代码保存在不同的文件中,因此代码修改,理解,维护和改进将更容易。例如,我编写了一个用于文件完整性测试的Python模块,另一个用于图像处理序列的软件等。

您还应该考虑使用一个调试器进行开发,该调试器允许您在代码中的可设置断点处检查变量内容,而不是使用打印行。 我已经使用Eclipse进行Python和Fortran开发(虽然我有一个错误的bug用它来编译Fortran短程序,但它可能是一个糟糕的配置)并且我开始使用Eric IDE用于Python。它允许你使用SVN调试,管理版本控制,它有一个嵌入式控制台,它可以使用Bicycle Repair Man进行重构(它也可以使用另一个),你有Unittest等。更轻的Python替代品是IDLE,自2.3版本开始包含在Python中。

作为一些提示,我也建议:

  • 不使用单字符变量。当您想要搜索外观时,您将在任何地方获得结果。有人认为一个体面的IDE使这更容易,但是你将依赖于永久访问IDE。即使使用ii,jj和kk也足够了,尽管这个选择取决于你的语言。 (如果代码注释是用爱沙尼亚语制作的,那么双元音就不​​那么有用了。)

  • 从一开始就评论代码。

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

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

答案 16 :(得分:2)

  

您拥有哪些语言/环境   用于发展科学   软件,尤其是数据分析?什么   库? (例如,你用什么   绘图?)

语言我用于数字和sicentific相关的东西:

  • C(开发速度慢,调试太多,几乎不可能编写可重用的代码)
  • C ++(我学会了讨厌它 - 开发并不像C那么慢,但可能会很痛苦。模板和课程最初很酷,但过了一段时间后我才意识到我一直在和它们作斗争找到语言设计问题的解决方法
  • Common Lisp,这是好的,但没有广泛用于Sci计算。不容易与C集成(如果与其他语言相比),但工作
  • 方案。这个人成了我个人的选择。

我的编辑器是Emacs,虽然我使用vim来编辑配置文件等快速的东西。

对于绘图,我通常会生成一个文本文件并将其输入到gnuplot中。

对于数据分析,我通常会生成一个文本文件并使用GNU R.

我看到很多人在这里使用FORTRAN(大多数是77,但大约有90个),很多Java和一些Python。我不喜欢那些,所以我不使用它们。

  

有人接受过培训吗?   没有任何重要背景   编程?

我认为这不适用于我,因为我毕业于CS - 但我工作的地方没有正式的培训,但是人(工程师,物理学家,数学家)互相帮助。

  

你有没有像版本一样的东西   控制,错误跟踪?

版本控制绝对重要!我将我的代码和数据保存在三个不同的机器中,在世界的两个不同的方面 - 在Git存储库中。我一直在同步它们(所以我有版本控制备份!)我不做bug控制,虽然我可能会开始这样做。 但我的同事根本没有BTS或VCS。

  

你会怎样尝试   为...创造一个体面的环境   编程,没有太多   在个人的方式   科学家(特别是物理学家)   固执的人!)

首先,我尽可能多地给予他们自由。 (在我工作的大学,我可以选择安装Ubuntu或Windows,或安装我自己的操作系统 - 我选择自己安装。我没有得到他们的支持,我对任何发生的事情负责我的机器,包括安全问题,但我用机器做任何我想做的事。)

其次,我会看到他们习惯了什么,并让它工作(需要FORTRAN?我们会设置它。需要C ++?没问题.Mathematica?好的,我们会购买许可证)。然后看看他们中有多少人想要学习“额外的工具”来帮助他们提高工作效率(不要说“不同”的工具。说“额外的”,所以似乎没有人会“失去”或“让去“或其他什么”。从编辑开始,看看是否有团体希望使用VCS来同步他们的工作(嘿,你可以待在家里并通过SVN或GIT发送你的代码 - 那不是很好吗?)等等。 不要强加 - 展示这些工具有多酷。使用R进行数据分析,并向他们展示它是多么容易。显示漂亮的图形,并解释你是如何创建它们的(但是从简单的例子开始,所以你可以快速解释它们)。

答案 17 :(得分:2)

我建议F#作为与科学相关的操作的潜在候选者,因为它与数学结构有很强的语义联系。

此外,它对称量单位的支持,如here所述,对于确保数学模型和实现源代码之间的正确转换非常有意义。

答案 18 :(得分:1)

首先,我肯定会使用脚本语言来避免解释许多额外的事情(例如,手动内存管理 - 大多数情况下 - 如果您正在编写低级,性能敏感的东西,但是对于有人只想用一台电脑作为升级的科学计算器,这绝对是一种过度杀伤力。另外,请查看您的域名是否有特定内容(统计信息为R)。这样做的好处是可以使用用户熟悉的概念,并为特定情况提供专门的代码(例如,计算标准差,在R的情况下应用统计测试等)。

如果您希望使用更通用的脚本语言,我会使用Python。它有两件事:

  • 您可以在其中进行实验的交互式shell
  • 明确(虽然有时冗长)语法

作为一个额外的优势,它拥有大多数你想要用它做的事情的库。

答案 19 :(得分:1)

我不是这方面的专家,但我一直都知道这就是为MATLAB创建的。还有a way to integrate MATLAB with SVN for source control