在科学环境中编程的做法?

背景

去年,我在一所大学的物理研究小组实习。 在这个小组中,我们主要使用LabVIEW编写程序来控制我们的设置,进行数据采集和分析数据。 对于前两个目的来说,这个工作相当不错,但对于数据分析来说,这是一个真正的痛苦。 最重要的是,每个人都是自学成才的,所以编写的代码通常是相当混乱的(难怪每个博士都决定从头开始重写所有的东西)。 由于IT部门严格的软件和networking规定,版本控制是未知的,不可能build立。

现在,事情确实出乎意料地好,但是自然科学的人们如何做他们的软件开发呢?

问题

一些具体问题:

  • 你用什么语言/环境开发科学软件,尤其是数据分析? 什么库? (例如,你用什么绘图?)
  • 是否有没有任何重要的编程背景的人的培训?
  • 你有什么像版本控制和错误跟踪?
  • 你会如何去努力创造一个体面的编程环境,而不是在个别科学家的方式上太多(特别是物理学家是固执的人!)

到目前为止的答案总结

(或者我的解释)到目前为止:( 2008-10-11)

  • 似乎是使用最广泛的语言/软件包:
    • LabVIEW的
    • python
      • 与SciPy , NumPy , PyLab等(参见Brandon的答复下载和链接)
    • C / C ++
    • MATLAB
  • 几乎所有的受访者都使用版本控制; 错误跟踪和其他过程是非常不常见的。
  • 软件木工课程是向科学家教授编程和开发技术的好方法。
  • 如何改善事情?
    • 不要强迫人们遵守严格的协议。
    • build立一个自己的环境,并向他人展示好处。 帮助他们开始使用版本控制,错误跟踪等。
    • 回顾其他人的代码可以帮助,但请注意,不是每个人都可以欣赏这一点。

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

我曾经为SciPy的主要企业赞助商Enthought工作。 我们与收购Enthought的公司的科学家合作进行定制软件开发。 Python / SciPy似乎对科学家来说是一个舒适的环境。 如果你是一个没有软件背景的科学家,比起说C ++或者Java来说,开始的时候要less得多。

Enthought Python Distribution配备了所有的科学计算库,包括分析,绘图,3D视觉等。

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

Enthought确实提供了SciPy培训 ,SciPy社区在回答邮件列表上的问题方面相当不错。

你有什么像版本控制,错误跟踪?

是的,是的(Subversion和Trac)。 由于我们正在与科学家合作(通常远离他们),版本控制和错误跟踪是必不可less的。 需要一些辅导来让一些科学家内化版本控制的好处。

你将如何努力创造一个体面的编程环境,而不是过多的个人科学家(尤其是物理学家是固执的人!)

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

软件木工课程专门针对从事科学计算的人员,旨在教授软件工程的基础知识和经验教训,以及如何将其应用到项目中。

它涵盖了版本控制,debugging,testing,脚本等各种问题。

我听了大约8或9次的讲座,认为这是值得高度推荐的。

编辑:讲座的MP3也是可用的 。

核/粒子物理学在这里。

  • 主要使用CERNLIB (PAW,MINUIT,…)和GEANT3在Fortran中完成主要的编程工作,最近主要是用ROOT和Geant4在C ++中完成的。 还有一些专门用途的其他库和工具,而LabVIEW在这里和那里看到了一些用处。
  • 数据采集​​在我的这个业务结束往往意味着相当低水平的工作。 通常在C中,有时甚至是在汇编中,但是随着硬件function的增强,这种情况正在消失。 另一方面,现在许多电路板都是用FPGA来构build的,这些电路需要栅极切换…
  • 一次性,graphics界面等几乎所有的东西( Tcl / Tk曾经是很大的,我最近看到更多的Perl / Tk和Python / Tk),包括大量存在于粒子物理社区内的包。
  • 很多编写代码的人很less或没有接受过正式的培训,而且口头传统的stream程​​传播很不均衡,但是大部分软件组织领导都认真对待并仔细阅读,以弥补这方面的不足。
  • 主要工具的版本控制无处不在。 但是许多个人程序员忽略了它的小任务。 正式的错误跟踪工具不太常见,夜间构build,unit testing和回归testing也是如此。

改善事情:

  1. 获得本地软件领导者的好处
  2. 实施你想在自己的领域使用的过程,并鼓励那些你也愿意使用的过程。
  3. 等待。 物理学家是经验主义者。 如果有帮助,他们会(最终!)通知。

还有一个改善事情的build议。

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

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

我曾经为National Instruments,R&D工作,在那里我为NI RF&Communication工具包编写软件。 我们使用了相当多的LabVIEW,下面是我们遵循的做法:

  1. 来源控制。 NI使用Perforce。 我们做了常规的事情 – 开发/主干分支,不断整合,作品。
  2. 我们编写了自动testing套件。
  3. 我们有几个有信号处理和通信背景的人。 我们曾经有过定期的代码审查和最佳实践文档,以确保他们的代码达到标准。
  4. 尽pipe代码审查,有几次像我一样的“软件人”不得不重写一些代码的效率。
  5. 我确切地知道你对固执的人的意思! 我们曾经有人认为指出他们的代码在性能方面的改进是一种直接的个人侮辱! 不言而喻,这需要良好的pipe理。 我认为和这些人打交道的最好办法是慢下来,不要急于求变,必要时做好肮脏的工作。 [例如:为他们的代码编写testing套件]。

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

我是版本控制的忠实粉丝。 我使用我的家庭服务器上运行的Vault获取gradle论文的所有代码。 现在我试图让部门build立一个Subversion服务器,但我的猜测是,我将是唯一一个使用它的人,至less在一开始。 我曾经玩过FogBugs,但与版本控制不同,我认为这对于一个人来说不是那么有用。

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

1.)由于硬件更好,脚本语言在大多数情况下是stream行的。 Perl / Python / Lisp在轻量级应用(自动化,轻量计算)方面很stream行; 因为我们喜欢Unix / Linux,所以我在工作中看到很多Perl(计算EM)。 性能方面,通常使用C / C ++ / Fortran。 对于并行计算,好吧,我们通常手动并行运行在EM中,而不是让程序隐式地执行它(例如,在计算雷达截面时按照视angular分割工作)。

2.)我们只是在这里把人们混在一起。 我们有很多的代码是非常混乱的,但是科学家们通常是一群毫不在意的人。 不理想,但我们有事情要交付,我们人员严重不足。 我们正在慢慢变好。

3.)我们使用SVN; 但是,我们没有错误跟踪软件。 关于它为我们所得到的是一个txt文件,告诉你哪些bug是特定的错误。

4.)我对科学家实施最佳实践的build议: 慢慢做 。 作为科学家,我们通常不会运送产品。 没有一个科学家通过干净,可维护的代码为自己起名 。 通常,他们从该代码的结果中获得认可。 他们需要花时间学习软件实践。 慢慢地引入新的概念,并试图让他们遵循; 他们是科学家,所以在他们自己的经validation据证实了版本控制之类的东西的用处之后,他们会一直使用它!

我强烈推荐阅读“每个计算机科学家应该知道什么是浮点运算” 。 我经常遇到的很多问题都来自浮点编程的问题。

我是一位在凝聚态物理领域工作的物理学家,正在build立经典和量子模型。

语言:

  • C ++ – 非常全面:可以用于任何事情,速度很快,但是对于MPI来说可能有点不方便
  • 八度 – 适合一些补充计算,非常方便和生产力

图书馆:

  • Armadillo / Blitz ++ – 用于C ++的快速数组/matrix/多维数据集抽象
  • 本征/犰狳 – 线性代数
  • GSL – 与C一起使用
  • LAPACK / BLAS / ATLAS – 非常大又快,但不太方便(用FORTRAN编写)

显卡:

  • GNUPlot – 它有非常干净和整洁的输出,但有时并不那么高效
  • 起源 – 绘图非常方便

开发工具:

  • Vim +插件 – 它对我很好
  • GDB – 使用C / C ++时一个很好的debugging工具
  • 代码::块 – 我用了一段时间,发现它很舒服,但在我看来,Vim仍然更好。

我在英国一所大学当物理学家。

也许我应该强调,不同领域的研究对编程有不同的重视。 粒子物理学家(如dmckee)几乎完全可以进行计算build模,并且可以在大型软件项目上进行协作,而像我自己(缩写物)这样的领域的人员则相对较less编写代码。 我怀疑大多数科学家落入后者的阵营。 我会说编码技能通常被认为在物理学中是有用的,但并不是必不可less的,很像物理/math技能被认为对程序员有用,但不是必需的。 考虑到这一点…

  • 你用什么语言/环境来开发科学软件? 数据分析? 什么库? (例如,你用什么来绘图?)

通常数据分析和绘图是使用通用数据分析软件包,如IGOR Pro , ORIGIN , Kaleidegraph ,可以被认为是“Excel plus”。 这些软件包通常具有可用于自动化的脚本语言。 更多的专家分析可能有一个专门的工具,通常会写很久以前,没有人的来源和是很多的错误。 更多技术types可能会使用已经提到的语言(Python,R,MatLab和Gnuplot进行绘图)。

控制软件通常在LabVIEW中完成,但我们实际上使用了Delphi,这有些不寻常。

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

我去过两次大学的网格计算,三维可视化,Boost等学习。 作为一名大学生,我们曾经被教过VBA for Excel和MatLab,但是C / MatLab / LabVIEW更常见。

  • 你有什么像版本控制,错误跟踪?

不,虽然人们有个人发展的设置。 我们的代码库位于“服务器”上的共享文件夹中,该文件夹通过同步工具保持当前状态。

  • 你将如何努力创造一个体面的编程环境,而不是过多的个人科学家(尤其是物理学家是固执的人!)

一步一步来! 我试图用一些更稳固的东西replace共享文件夹,也许find一个模仿当前同步工具行为将有所帮助的SVN客户端。

总的来说,对于大多数自然科学项目来说,总的来说,研究时间通常会更好。

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

你用什么语言/环境来开发科学软件? 数据分析? 什么库? (例如,你用什么来绘图?)

我主要使用MATLAB这些天(容易访问可视化function和math)。 我过去常常使用Fortran和IDL 。 我已经使用C(但我更多的是一个读者而不是C的作者),Excelmacros(丑陋和混乱)。 我目前需要能够阅读Java和C ++(但我不能真正在其中编程),而且我也剽窃了Python。 对于我自己的娱乐,我现在正在做一些C#编程(主要是为了获得可移植性/低成本/漂亮的接口)。 我可以用几乎所有的语言来编写Fortran 😉

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

大多数(所有)本科物理课程将通常在C,Fortran或MATLAB上有一个小编程课程,但它是真正的基础知识。 我真的很想在某个时候对软件工程进行一些培训(修订控制/testing/devise中等规模的系统)

你有什么像版本控制,错误跟踪?

最近我开始使用Subversion / TortoiseSVN。 过去曾经使用过的组使用过版本控制。 我不知道任何使用正式的错误跟踪软件的学术团体。 我仍然不使用任何系统的testing。

你将如何努力创造一个体面的编程环境,而不是过多的个人科学家(尤其是物理学家是固执的人!)

我会尝试在本科阶段介绍一些软件工程的概念,然后通过在研究生阶段的实践加强它们,同时也提供了像上面提到的软件木工课程的资源的指针。

我希望有相当一部分学术物理学家会写软件(不一定都是这样),他们迫切需要至less一个软件工程思想的介绍。

你用什么语言/环境来开发科学软件? 数据分析? 什么库? (例如,你用什么来绘图?)

Python, NumPy和pylab(绘图)。

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

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

你有什么像版本控制,错误跟踪?

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

你将如何去努力创造一个体面的编程环境,而不会过多地影响个别科学家(特别是物理学家是固执的人!)。

确保基础设施build立和维护良好,并尝试销售源控制的好处。

我是英国一所大学的统计学家。 通常这里的人们使用R进行数据分析,如果你了解C / Perl,学习起来相当容易。 它的真正威力在于你可以交互地导入和修改数据。 采用CSV(或Excel)文件并合并它们,创build基于其他文件的新列,然后将其转换为GLM,GAM或其他模型非常简单。 绘图也是微不足道的,不需要知道一种全新的语言(比如PGPLOT或者GNUPLOT)。当然,你也拥有一堆内置的特性(从简单的事情,如平均值,标准差等所有neural network,样条和GL绘图的方法。)

话虽如此,有几个问题。 对于非常大的数据集,R可能会变得非常慢(我只是真正看过> 50,000 x 30数据集),并且由于它被解释为在这方面没有得到Fortran / C的优势。 但是,你可以(非常容易)让R调用C和Fortran共享库(从netlib或你自己编写的库)。所以,一个通常的工作stream程将是:

  • 弄清楚该怎么做。
  • 在R中原型代码
  • 进行一些初步的分析。
  • 将慢代码重新写入C或Fortran,并从R中调用该代码。

这对我来说效果很好。

我是使用版本控制(在我的情况下使用git和githuib.com)的部门中唯一一个拥有100多人的人员。这个问题相当令人担忧,但他们似乎并不热衷于尝试并满足于通过邮件(yuck)。

我的build议是继续使用LabView进行收购(也许试图让你的同事们就收购和制作的工具集达成一致),然后转向将数据导出为CSV(或类似的),在R中进行分析。在这方面重新发明车轮确实没什么意义。

你用什么语言/环境来开发科学软件? 数据分析? 什么库? (例如,你用什么来绘图?)

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

另一个select是MATLAB ,我没有经验。 有任何产品的营地; 各有其优点/缺点。 根据你需要解决什么样的问题,一个包可能比另一个更好。

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

你有什么像版本控制,错误跟踪?

回顾一下,我们没有,如果我们做到了,我们所有人都会更容易。 没有什么比打破一切,挣扎几个小时来解决它!

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

你将如何努力创造一个体面的编程环境,而不是过多的个人科学家(尤其是物理学家是固执的人!)

数据采集​​(DAQ)和数据分析之间有明确的分界。 这意味着,可以在DAQ上进行标准化,然后让科学家们根据自己select的程序来播放数据。

另一个好的select是Scilab 。 它具有LabVIEWgraphics模块,它有自己的编程语言,您也可以embeddedFortran和C代码。 它被用于公共和私营部门,包括大型工业公司。 它是免费的。

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

绘图我使用Matplotlib 。 我将很快制作animation,并且使用MEncoder已经看到了很好的效果。 这里是一个包括音轨的例子 。

最后,我build议去模块化,这是为了将主要代码保存在不同的文件中,所以代码的修改,理解,维护和改进会更容易。 例如,我写了一个用于文件完整性testing的Python模块,另一个用于image processing序列等。

您还应该考虑使用debugging器进行开发,该debugging器允许您在代码中的可设置断点处检查variables内容,而不是使用打印行。 我使用Eclipse进行Python和Fortran开发(虽然我得到了一个编译一个Fortran短程序的错误,但可能是一个错误的configuration),我开始使用Python的Python IDE 。 它允许你使用SVN进行debugging,pipe理版本控制,它具有embedded式控制台,可以使用自行车修理工具(也可以使用另一个)进行重构,还有Unittest等等。从2.3版本开始使用Python。

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

  • 不使用单字符variables。 当你想search外观时,你会得到无处不在的结果。 有人认为,一个体面的IDE使这更容易,但是你将依靠永久访问IDE。 即使使用ii,jj和kk也可以,尽pipe这个select取决于你的语言。 (例如,如果代码注释是爱沙尼亚语,则双元音将不太有用)。

  • 从一开始就评论代码。

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

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

当然,使用Subversion来保持源代码的当前,正在工作和稳定的快照拷贝。 这包括C ++,Java等本土软件工具,和quickie脚本一次性处理。

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

对于源代码pipe理,由于清晰的单点(SPOT), Subversion等集中式系统在科学应用方面更胜一筹。 logging变化和回忆任何文件版本的能力,而不追求在哪里find东西,具有巨大的logging保存优势。 像Git和Monotone这样的工具:哦,我的天哪混乱,我可以想象,随之而来! 当希格斯玻色子经过或超新星爆炸时,用新的传感器在使用什么版本的黑客作业脚本时有清晰的logging,这将导致快乐。

你用什么语言/环境来开发科学软件? 数据分析? 什么库? (例如,你用什么来绘图?)

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

  • C(开发慢,debugging太多,几乎不可能写可重用的代码)
  • C ++(而且我学会了憎恨它 – 开发速度不如C慢,但可能是一个痛苦。模板和类最初很酷,但是过了一段时间,我意识到我一直在和他们战斗,find解决方法语言devise问题
  • Common Lisp,可以,但是在科学计算中没有被广泛使用。 不容易与C(如果与其他语言相比)整合,但工程
  • scheme。 这个成了我个人的select。

我的编辑器是Emacs,尽pipe我使用vim来编辑configuration文件等快速的东西。

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

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

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

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

我认为这不适用于我,因为我gradle于CS – 但是我工作的地方没有正式的培训,但是人们(工程师,物理学家,math家)确实互相帮助。

你有什么像版本控制,错误跟踪?

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

你将如何努力创造一个体面的编程环境,而不是过多的个人科学家(尤其是物理学家是固执的人!)

首先,我会给他们尽可能多的自由。 (在我工作的大学里,我可以select安装Ubuntu或者Windows,或者安装我自己的操作系统 – 我select安装我自己的操作系统,我没有他们的支持,我负责发生任何事情我的机器,包括安全问题,但我做任何我想要的机器)。

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

由于与math结构有很强的语义联系,我build议F#作为进行科学相关操作的潜在候选者。

另外,对于这里所写的对度量单位的支持,对于确保math模型和实现源代码之间的正确转换有很大的意义。

首先,我肯定会用脚本语言来避免解释很多额外的东西(例如手动内存pipe理 – 大多数 – 如果你正在编写低级的,性能敏感的东西,但是对于那些只是想要使用电脑作为升级的科学计算器,这绝对是矫枉过正)。 另外,看看是否有什么特定的域名( R为统计)。 这样做的好处是已经能够处理用户所熟悉的概念,并针对特定情况(例如计算标准偏差,在R的情况下应用统计testing等)具有专门的代码。

如果你想使用更通用的脚本语言,我会用Python。 有两件事情是去做的:

  • 您可以在其中进行实验的交互式shell
  • 其清晰(尽pipe有时冗长)的语法

作为一个额外的好处,它有大部分你想要做的事情库。

我不是这方面的专家,但是我一直都明白这是MATLAB创build的。 有一种方法可以将MATLAB与SVN进行源代码控制 。