在科学环境中进行编程的实践?[关闭]


91

背景

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

现在,事情实际上出乎意料地好了,但是自然科学界的人们如何进行软件开发?

问题

一些具体的问题:

  • 您用于开发科学软件(尤其是数据分析)的语言/环境是什么?什么图书馆?(例如,您使用什么作图?)
  • 是否对没有编程背景的人进行了培训?
  • 您是否有版本控制和错误跟踪之类的东西?
  • 您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

到目前为止的答案摘要

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

  • 似乎使用最广泛的语言/软件包:
  • 几乎所有受访者都使用版本控制。错误跟踪和其他过程要少得多。
  • “软件木工”课程是向科学家教授编程和开发技术的好方法。
  • 如何改善事情?
    • 不要强迫人们遵循严格的协议。
    • 自己设置环境,并向他人展示收益。帮助他们自己开始使用版本控制,错误跟踪等。
    • 查看其他人的代码可以有所帮助,但请注意,并非所有人都可能会对此表示赞赏。

Answers:


27

特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

我曾经为SciPy的主要公司赞助商Enthought工作。我们与签约Enthought的公司的科学家合作进行了定制软件开发。对于科学家来说,Python / SciPy似乎是一个舒适的环境。如果您是一位没有软件背景的科学家,那么起步要比说C ++或Java少得多。

Enthought Python的分布与所有的科学计算库,包括分析,绘图,3D visualation等。

是否对没有编程背景的人进行了培训?

Enthought确实提供了SciPy培训,并且SciPy社区非常擅长回答邮件列表中的问题。

您是否有版本控制,错误跟踪之类的东西?

是的,是的(Subversion和Trac)。由于我们正在与科学家合作(通常是远离他们),因此版本控制和错误跟踪至关重要。经过一些指导才能使一些科学家了解版本控制的好处。

您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

确保他们熟悉工具链。它需要预先进行投资,但会使他们不太愿意拒绝它,而倾向于更熟悉的东西(Excel)。当工具失败(并且将失败)时,请确保有地方可以寻求帮助-邮件列表,用户组,组织中的其他科学家和软件开发人员。越有帮助,让他们重返物理领域越好。


21

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

它涵盖了诸如版本控制,调试,测试,脚本和各种其他问题之类的主题。

我已经听了大约8或9堂讲座,因此强烈建议您参加。

编辑:讲座的MP3也可用


16

这里的核/粒子物理。

  • 大型编程工作以前通常是使用CERNLIB(PAW,MINUIT等)和GEANT3Fortran中完成的,最近主要是在C ++中通过ROOTGeant4完成的。还有许多其他专门用途的库和工具,LabVIEW在这里和那里都可以看到一些用途。
  • 在我从事这项业务的最后阶段,数据获取通常意味着相当低水平的工作。通常使用C语言,有时甚至使用汇编语言,但是随着硬件变得越来越强大,这种情况正在消失。另一方面,现在许多板卡都使用FPGA进行构建,需要门极旋转...
  • 一次性,图形界面等几乎使用任何东西(Tcl / Tk曾经很大,最近我看到了更多的Perl / Tk和Python / Tk),其中包括许多主要存在于粒子物理学界的软件包。
  • 许多编写代码的人很少接受或没有经过正式的培训,并且根据口头传授的知识,过程的传递非常不均匀,但是大多数软件组负责人都认真对待过程,并阅读了必要的内容,以弥补他们在这一方面的不足。
  • 主要工具的版本控制无处不在。但是许多个人程序员却因为较小的任务而忽略了它。正式的错误跟踪工具不那么常见,夜间构建,单元测试和回归测试也是如此。

要改善的事情:

  1. 站在本地软件领导者的一边
  2. 实施您想在自己的区域中使用的过程,并鼓励您邀请的人也使用它。
  3. 等待。物理学家是经验主义者。如果有帮助,他们将(最终!)发出通知。

还有一项改进建议。

  1. 花一点时间来帮助您直接与之共事的人。查看他们的代码。告诉他们算法复杂性/代码生成/ 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以来,我在工作中(计算EM)看到了很多Perl。对于性能而言,通常使用C / C ++ / Fortran。对于并行计算,好吧,我们通常在EM中手动并行化运行,而不是隐式地执行程序(即,在计算雷达横截面时按视角划分工作)。

2.)我们只是在这里把人们吸引进来。我们拥有的许多代码非常混乱,但是科学家通常是一堆散乱的脑子,根本不介意这类事情。不理想,但是我们有交付的东西,而我们的人手严重不足。我们正在慢慢好起来。

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

4.)我建议为科学家实施最佳实践:慢慢做。作为科学家,我们通常不运送产品。 科学界没有人通过编写整洁,可维护的代码来为自己命名。通常,它们从该代码的结果中得到认可。他们需要花时间学习软件实践的理由。慢慢引入新概念,并尝试使其遵循;他们是科学家,因此,在他们的经验证据证实了版本控制之类的功能的用途之后,他们将一直在使用它!



5

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

语言:

  • C ++-用途广泛:可以用于任何事物,速度快,但是在MPI方面可能有点不方便
  • 倍频程 -适用于一些补充计算,非常方便且高效

库:

  • Armadillo / Blitz ++ -C ++的快速数组/矩阵/多维数据集抽象
  • Eigen / Armadillo-线性代数
  • GSL-与C一起使用
  • LAPACK / BLAS / ATLAS-极大而又快速,但不太方便(用FORTRAN编写)

图形:

  • GNUPlot-输出非常干净整洁,但有时效率不高
  • 原点 -绘图非常方便

开发工具:

  • Vim +插件-对我来说很棒
  • GDB-使用C / C ++时的出色调试工具
  • 代码::块 -我使用了一段时间,发现它很舒服,但是我认为Vim仍然更好。

如果您的c ++运行速度比c慢,则说明使用错误。“当然,这很容易做到,但这是另一回事。::使用c ++已有大约7年的历史了,并且仍然一直在学习新知识::
dmckee ---前主持人小猫

我确实注意到C ++的忠实拥护者,但是很难看到它比C或Fortran可能“慢得多”。除非您包括HPC的C变体,例如UPC和CUDA的C。
Suugaku

4

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

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

  • 特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

通常,数据分析和绘图是使用IGOR ProORIGINKaleidegraph等通用数据分析程序包完成的,可以将其视为“ Excel plus”。这些软件包通常具有可用于自动化的脚本语言。更专业的分析可能会为这项工作提供专门的工具,而该工具通常是很久以前写的,没有人知道它的来历,而且还很容易出错。一些其他技术人员可能会使用所提到的语言(Python,R,带有Gnuplot的MatLab进行绘图)。

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

  • 是否对没有编程背景的人进行了培训?

我去过两所大学的网格计算,3D可视化,学习Boost等研讨会。作为一名本科生,我们曾教过Excel和MatLab的VBA,但C / MatLab / LabVIEW更为常见。

  • 您是否有版本控制,错误跟踪之类的东西?

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

  • 您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

一步一步来!我正在尝试用更坚固的东西替换共享文件夹,也许找到一个模仿当前同步工具行为的SVN客户端会有所帮助。

总体而言,我要说的是,对于大多数自然科学项目而言,通常最好花时间进行研究!


感谢您分享您的想法!我同意“通常最好花时间进行研究”,但是由于缺乏版本控制和编程方面的基础培训等知识,经常会浪费多少时间,我想说科学家低估了这个问题。
onnodb

4

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

特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

这些天我主要使用MATLAB(易于访问可视化功能和数学)。我以前经常使用FortranIDL。我使用过C(但是我更像是C的读者而不是C的读者),Excel宏(丑陋而令人困惑)。目前,我需要能够阅读Java和C ++(但我无法真正在其中编程),并且我也对Python进行了修改。为了我自己的娱乐,我现在正在用C#进行一些编程(主要是为了获得可移植性/低成本/漂亮的界面)。我可以使用几乎所有与我在一起的语言编写Fortran ;-)

是否对没有编程背景的人进行了培训?

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

您是否有版本控制,错误跟踪之类的东西?

我最近才开始使用Subversion / TortoiseSVN。我过去使用过的组使用了修订控制。我不知道任何使用正式错误跟踪软件的学术团体。我仍然不使用任何类型的系统测试。

您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

我会尝试在本科阶段介绍一些软件工程思想,然后在研究生阶段通过实践加以加强,还提供诸如上述“软件木工”课程之类的资源的指针。

我希望有相当一部分的学术物理学家正在编写软件(尽管不一定全部),并且他们迫切需要至少对软件工程的思想进行介绍。


4

特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

Python,NumPy和pylab(绘图)。

是否对没有编程背景的人进行了培训?

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

您是否有版本控制,错误跟踪之类的东西?

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

您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)。

确保基础结构已建立并得到良好维护,并尝试出售源代码控制的好处。


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人)中使用版本控制(在我的情况下,使用githuib.com使用git)的仅有的人之一。这确实令人担忧,但是他们似乎并不热衷于尝试并满足于传递zip文件(讨厌)。

我的建议是继续使用LabView进行采集(也许尝试让您的同事就采集和制作的工具集达成共识,然后将其提供给所有人),然后转向将数据导出到CSV(或类似格式)中,在R中进行分析。在这方面重新发明轮子真的没有多大意义。


2

特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

我的大学物理系教授LabVIEW类,并在其研究项目中广泛使用了它。

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

关于数据分析,您可以使用任何所需的数字运算器。理想情况下,您可以使用X语言进行困难的计算,并格式化输出以在Excel,MathcadMathematica或任何jour du jour绘图系统中很好地进行绘图。不要期望这里标准化。

您是否有版本控制,错误跟踪之类的东西?

回顾过去,我们没有,如果这样做的话,对我们所有人来说将更加容易。没有什么比破坏一切和花费数小时来修复它更难了!

对于任何通用代码,绝对要使用源代码控制。鼓励个人以更通用的方式编写代码。这实际上只是编码最佳实践。确实,您应该让他们教授(或参加)计算机科学课程,以便他们获得基础知识。

您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

数据获取(DAQ)和数据分析之间有明显的区别。意思是,可以在DAQ上进行标准化,然后允许科学家在自己选择的程序中处理数据。


2

另一个不错的选择是Scilab。它具有LabVIEW等图形模块,具有自己的编程语言,例如,您还可以嵌入Fortran和C代码。它被用于公共和私营部门,包括大型工业公司。而且是免费的。

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

对于绘图,我使用Matplotlib。我很快将不得不制作动画,并且使用MEncoder已经看到了很好的效果。这是一个包含音轨的示例

最后,我建议采用模块化的方法,即尝试将主要代码片段保存在不同的文件中,这样代码修订,理解,维护和改进将变得更加容易。例如,我已经编写了一个用于文件完整性测试的Python模块,另一个用于图像处理序列的模块,等等。

您还应该考虑使用调试器进行开发,该调试器允许您在代码中可设置的断点处检查变量内容,而不是使用打印行。我已经使用Eclipse进行Python和Fortran的开发(尽管在编译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等等。(特别是当新版本破坏了向后兼容性时。)许多改进通常都会引入许多错误。尽管如此,这取决于具体的应用案例!请注意,这是个人选择,许多人可能会对此表示反对。

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


2

绝对可以使用Subversion来保持源代码的最新,正在进行的工作和稳定的快照副本。其中包括用于本地软件工具的C ++,Java等,以及用于一次性处理的快速脚本。

随着科学和应用工程学对“孤独的牛仔”开发方法学的浓厚兴趣,将存储库组织到主干,标签以及其他内容的通常做法是-不用担心!科学家及其实验室技术人员喜欢旋转旋钮,摆动电极并追逐真空泄漏。让每个人都同意,例如使用Python / NumPy或遵循一些命名约定,已经足够了。忘记尝试使它们遵循奥术软件开发人员的惯例和约定。


2

对于源代码管理,由于具有清晰的单一事实点(SPOT),因此Subversion之类的集中式系统对于科学用途而言是优越的。记录更改并具有撤消任何文件版本的能力,而不必追寻在哪里可以找到文件的优点,它具有巨大的记录保存优势。像GitMonotone之类的工具:哦,我的天哪,我可以想象还会发生混乱!当希格斯玻色子过去或超新星爆炸时,使用新版本的传感器玩弄新的传感器时,拥有明确记录的黑客工作脚本版本会带来幸福。


您是否尝试过使用分布式版本控制系统?
安德鲁·格林

1
几乎所有的分布式系统都使它像集中式系统一样容易。您只需记录一个提交ID(以Git术语表示),而不是修订版本号(如SVN中)。
菲尔·米勒

2

特别是您使用了什么语言/环境来开发科学软件。数据分析?什么图书馆?(例如,您使用什么作图?)

我用于数字和与科学意义相关的东西的语言:

  • C(开发速度慢,调试过多,几乎不可能编写可重用的代码)
  • C ++(而且我学会了讨厌它-开发速度不如C慢,但可能会很痛苦。模板和类最初很酷,但是过了一会儿,我意识到我一直在与之抗争并找到解决方法,语言设计问题
  • Common Lisp,虽然可以,但是在科学计算中并未广泛使用。不容易与C集成(如果与其他语言相比),但是可以工作
  • 方案。这成为我个人的选择。

我的编辑器是Emacs,尽管我确实将vim用于诸如编辑配置文件之类的快速操作。

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

为了进行数据分析,我通常生成一个文本文件并使用GNUR。

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

是否对没有编程背景的人进行了培训?

自从我毕业于CS以来,我认为这不适用于我-但是在我工作的地方没有接受过正式培训,但是人们(工程师,物理学家,数学家)确实可以互相帮助。

您是否有版本控制,错误跟踪之类的东西?

版本控制绝对重要!我将代码和数据保存在位于世界不同地方的三台不同的机器中-存放在Git存储库中。我一直都同步它们(所以我有版本控制备份!)我不进行错误控制,尽管我可能会开始这样做。但是我的同事根本没有BTS或VCS。

您将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)

首先,我会给他们尽可能多的自由。(在我工作的大学里,我可以选择让别人安装Ubuntu或Windows,还是安装自己的操作系统-我选择安装自己的操作系统。我没有他们的支持,我对发生的任何事情负责我的机器,包括安全性问题,但我要对机器执行任何操作。

其次,我将了解它们的使用并使它正常工作(需要FORTRAN?我们将对其进行设置。是否需要C ++?没问题。Mathematica?好的,我们将购买许可证)。然后看看其中有多少人想学习“其他工具”以帮助他们提高生产力(不要说“不同”工具。说“其他”,这样看来就不会有人会“输”或“让”去”等等。从编辑人员开始,看看是否有一些团体希望使用VCS来同步他们的工作(嘿,您可以待在家里并通过SVN或GIT发送您的代码-那样不好吗?)等等。不要强加-展示这些工具有多酷的示例。使用R进行数据分析,并向他们展示它多么容易。显示精美的图形,并说明您如何创建它们(但从简单的示例开始,


2

考虑到F#与数学构造的紧密语义联系,我建议F#作为执行与科学相关的操作的潜在候选人。

此外,其单位-的衡量的支持,写在这里做保证的数学模型和实现源代码之间适当的翻译有很大的意义。


1

首先,我绝对会使用脚本语言以避免必须解释很多额外的内容(例如,如果您正在编写低级,性能敏感的内容,那么手动内存管理通常是可以的,但对于那些只是想要将计算机用作升级的科学计算器,这肯定是过大的。)此外,请查看周围是否有特定于您的域的内容(R代表统计信息)。这样做的好处是,已经使用了用户熟悉的概念,并具有针对特定情况的专用代码(例如,在R的情况下,例如,计算标准偏差,应用统计检验等)。

如果您希望使用更通用的脚本语言,我将使用Python。它要做的两件事是:

  • 可以进行实验的交互式外壳
  • 它的语法清晰(尽管有时很长)

另外一个优点是,它具有用于处理您要处理的大多数事情的库。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.