在科学环境中进行编程的实践?
背景
去年,我在大学的一个物理研究小组实习。在这个小组中,我们主要使用LabVIEW编写程序来控制设置,进行数据采集和分析数据。就前两个目的而言,这行之有效,但是对于数据分析而言,这确实是一个痛苦。最重要的是,每个人大多都是自学成才的,因此编写的代码通常很乱(难怪每个博士都很快决定从头开始重写所有内容)。版本控制是未知的,由于IT部门的严格软件和网络法规,因此无法设置版本控制。
现在,事情实际上出乎意料地好了,但是自然科学界的人们如何进行软件开发?
问题
一些具体的问题:
- 我们用于开发科学软件(尤其是数据分析)的语言/环境是什么?什么图书馆? (例如,我们使用什么作图?)
- 是否对没有编程背景的人进行了培训?
- 我们是否有版本控制和错误跟踪之类的东西?
- 我们将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)
到目前为止的答案摘要
到目前为止的答案(或者我对它们的解释):(2008-10-11)
- C / C ++
- 的MATLAB
- 几乎所有受访者都使用版本控制。错误跟踪和其他过程要少得多。
- "软件木工"课程是向科学家教授编程和开发技术的好方法。
- 自己建立一个环境,并向他人展示收益。帮助他们自己开始使用版本控制,错误跟踪等。
- 查看其他人的代码可以有所帮助,但是请注意,并非每个人都可以体会到这一点。
解决方案
回答
我并不是一个真正的"自然"科学家(我研究交通运输),而是一名学者,他编写了许多自己的软件进行数据分析。我尝试使用Python编写尽可能多的代码,但是当我在扩展或者自定义现有软件工具时,有时会被迫使用其他语言。我所在领域的编程培训很少。大多数人或者是自学成才,或者是从以前或者学科之外的课程中学到了编程技巧。
我是版本控制的忠实粉丝。我使用运行在家庭服务器上的Vault来获取论文的所有代码。现在,我正在尝试让部门来设置Subversion服务器,但是我猜我将是唯一使用它的人,至少在最初是这样。我在FogBugs上玩了一段时间,但是与版本控制不同,我认为这对于单人团队几乎没有用。
至于鼓励其他人使用版本控制等,那确实是我现在面临的问题。我正计划强迫我的研究生在他们为我所做的研究项目中使用它,并鼓励他们将其用于自己的研究。如果我教一门涉及编程的课程,我可能会迫使学生也在那里使用版本控制(根据存储库中的内容对其进行评分)。就我的同事和他们的研究生而言,我真正能做的就是提供一台服务器,并依靠温和的说服力并树立好榜样。坦率地说,在这一点上,我认为让他们进行定期备份比让它们进行源控制更为重要(某些人在USB闪存驱动器上携带着他们研究数据的唯一副本)。
回答
这可能是切线的,但希望是相关的。
我曾经在National Instruments,R&D工作,在那里我为NI RF&Communication工具包编写软件。我们使用了很多LabVIEW,下面是我们遵循的实践:
- 源代码控制。 NI使用Perforce。我们做了常规的事情-开发/树干分支,持续集成,工作。
- 我们编写了自动化测试套件。
- 我们有一些人具有信号处理和通信的背景。我们过去经常进行代码审查,并提供最佳做法文档,以确保其代码符合要求。
- 尽管对代码进行了审查,但在某些情况下,像我这样的"软件专家"还是不得不重写其中一些代码以提高效率。
- 我完全知道我们对固执的人的意思!我们曾经有一些人曾经认为指出他们的代码中潜在的性能改进是直接的个人侮辱!毋庸置疑,这需要良好的管理。我认为与这些人打交道的最好方法是慢慢走,而不是努力改变,并在必要时做好肮脏的工作。 [示例:为其代码编写测试套件]。
回答
我不是这方面的专家,但是我一直都知道这就是创建MATLAB的目的。还有一种将MATLAB与SVN集成在一起以进行源代码控制的方法。
回答
这里的核/粒子物理。
- 大型编程工作以前通常是使用CERNLIB(PAW,MINUIT等)和GEANT3在Fortran中完成的,最近主要是在C ++中通过ROOT和Geant4完成的。还有许多其他专用的库和工具可供使用,LabVIEW可以在此发现一些有用的库和工具。
- 在我从事这项业务的最后阶段,数据获取通常意味着相当低水平的工作。通常使用C语言,有时甚至使用汇编语言,但是随着硬件变得越来越强大,这种情况正在消失。另一方面,现在许多板卡都是使用FPGA进行构建的,这些FPGA需要进行门控旋转。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
- 一次性,图形界面等几乎使用任何东西(Tcl / Tk曾经很大,最近我看到了更多的Perl / Tk和Python / Tk),其中包括许多主要存在于粒子物理学界的软件包。
- 许多编写代码的人很少接受或者没有经过正式的培训,并且根据口头传授的知识,流程的传递非常不均匀,但是大多数软件小组负责人都认真对待流程,并阅读了必要的内容,以弥补他们在这一方面的不足。
- 主要工具的版本控制无处不在。但是许多个人程序员却忽略了它们的较小任务。正式的错误跟踪工具不那么常见,夜间构建,单元测试和回归测试也是如此。
要改善的事情:
- 站在本地软件领导者的一边
- 在我们自己的区域中实施我们想使用的过程,并鼓励我们邀请的人也使用它。
- 等待。物理学家是经验主义者。如果有帮助,他们会(最终!)发出通知。
还有一项改进建议。
- 花一点时间来直接与之打交道的任何人。查看他们的代码。告诉他们算法复杂性/代码生成/ DRY或者他们从未学过的任何基本知识,因为一些教授曾经向他们扔过一本Fortran书,并说"让它起作用"。向他们灌输过程问题。他们是聪明人,如果我们给他们机会,他们将学习。
回答
首先,我绝对会使用脚本语言以避免必须解释很多额外的事情(例如,如果我们正在编写低级,性能敏感的内容,则手动内存管理通常是可以的,但对于那些只想使用计算机作为升级的科学计算器,这肯定是过大的。)此外,请查看周围是否有特定于域的内容(R代表统计信息)。这样做的好处是,已经使用了用户熟悉的概念,并具有针对特定情况的专门代码(例如,在R的情况下,例如计算标准偏差,应用统计检验等)。
如果我们希望使用更通用的脚本语言,我将使用Python。它要做的两件事是:
- 可以进行实验的交互式外壳
- 它的语法清晰(尽管有时很长)
另外一个优点是,它具有用于处理我们要处理的大多数事情的库。
回答
What languages/environments have you used for developing scientific software, esp. data analysis? What libraries? (E.g., what do you use for plotting?)
Python,NumPy和pylab(绘图)。
Was there any training for people without any significant background in programming?
不,但是我在多媒体研究实验室工作,所以几乎每个人都有计算机科学背景。
Did you have anything like version control, bug tracking?
是的,Subversion用于版本控制,Trac用于错误跟踪和Wiki。如果他们的TOS适合项目,则可以从http://www.assembla.com/获得免费的bug跟踪器/版本控制主机。
How would you go about trying to create a decent environment for programming, without getting too much in the way of the individual scientists (esp. physicists are stubborn people!).
确保基础结构已建立并得到良好维护,并尝试出售源代码控制的好处。
回答
Software Carpentry课程专门针对从事科学计算的人员,旨在教授软件工程的基础知识和课程,以及如何最好地将其应用于项目。
它涵盖了诸如版本控制,调试,测试,脚本和各种其他问题之类的主题。
我已经听了大约8或者9堂课,因此强烈建议我们参加。
编辑:讲座的MP3也可用。
回答
我强烈建议阅读"每位计算机科学家应了解的浮点运算法则"。我经常遇到的许多问题都来自浮点编程问题。
回答
绝对可以使用Subversion来保留源代码的最新,正在进行的工作和稳定的快照副本。其中包括用于本地软件工具的C ++,Java等,以及用于一次性处理的快速脚本。
随着科学和应用工程学对"孤独的牛仔"开发方法学的强烈支持,将存储库组织到主干,标签和其他任何东西的通常做法都不会打扰!科学家及其实验室技术人员喜欢旋转旋钮,摆动电极并追逐真空泄漏。让每个人都同意,例如使用Python / NumPy或者遵循一些命名约定,已经足够了。忘记尝试使它们遵循奥术软件开发人员的惯例和约定。
回答
对于源代码管理,由于具有清晰的单一事实点(SPOT),因此诸如Subversion之类的集中式系统对于科学用途而言是优越的。记录更改并具有撤消任何文件版本的能力,而不必追寻在哪里可以找到文件的优点,它具有巨大的记录保存优势。像Git和Monotone之类的工具:哦,我的天哪,我可以想象会发生混乱!当希格斯玻色子经过或者超新星爆炸时,使用新版本的传感器玩弄新的传感器时,拥有明确记录的黑客工作脚本版本会带来幸福。
回答
特别是我们使用了什么语言/环境来开发科学软件。数据分析?什么图书馆? (例如,我们使用什么作图?)
我的大学物理系教授LabVIEW类,并在其研究项目中广泛使用了它。
另一个选择是MATLAB,我没有经验。两种产品都有营地。每个都有自己的优点/缺点。根据我们需要解决的问题的种类,一个软件包可能比另一个软件包更可取。
关于数据分析,我们可以使用任何所需的数字运算器。理想情况下,我们可以使用X语言进行困难的计算,并格式化输出以在Excel,Mathcad,Mathematica或者任何基于duour jour的绘图系统中很好地进行绘图。不要指望标准化。
绝对对任何通用代码使用源代码管理。鼓励个人以更通用的方式编写代码。这实际上只是编码最佳实践。确实,我们应该让他们教授(或者参加)计算机科学课程,以便他们获得基础知识。
我们将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)
数据采集(DAQ)和数据分析之间有明显的区别。意思是,可以在DAQ上进行标准化,然后允许科学家在自己选择的程序中处理数据。
回答
特别是我们使用了什么语言/环境来开发科学软件。数据分析?什么图书馆? (例如,我们使用什么作图?)
我曾经为SciPy的主要公司赞助商Enthought工作。我们与签约Enthought的公司的科学家合作进行了定制软件开发。对于科学家来说,Python / SciPy似乎是一个舒适的环境。如果我们是一位没有软件背景的科学家,那么起步要比说C ++或者Java少得多。
Enthought Python发行版随附所有科学计算库,包括分析,绘图,3D可视化等。
是否对没有编程背景的人进行了培训?
Enthought确实提供了SciPy培训,并且SciPy社区非常擅长回答邮件列表中的问题。
我们是否有版本控制,错误跟踪之类的东西?
是的,是的(Subversion和Trac)。由于我们正在与科学家合作(通常是远离他们),因此版本控制和错误跟踪至关重要。经过一些指导才能使一些科学家了解版本控制的好处。
我们将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)
确保他们熟悉工具链。它需要预先进行投资,但会使他们不太愿意拒绝它,而倾向于更熟悉的东西(Excel)。当工具失败(并且将失败)时,请确保它们有地方可以寻求帮助,以邮件列表,用户组,组织中的其他科学家和软件开发人员的身份来发送。越有帮助,让他们重返物理领域越好。
回答
前学术物理学家,现在是英国的工业物理学家:
特别是我们使用了什么语言/环境来开发科学软件。数据分析?什么图书馆? (例如,我们使用什么作图?)
这些天我主要使用MATLAB(易于访问可视化功能和数学)。我以前经常使用Fortran和IDL。我使用过C(但是我更像是C的读者而不是C的读者),Excel宏(丑陋而令人困惑)。目前,我需要能够阅读Java和C ++(但是我无法真正在其中编程),并且我也对Python进行了黑客攻击。为了我自己的娱乐,我现在正在用C语言进行一些编程(主要是为了获得可移植性/低成本/漂亮的接口)。我可以使用几乎所有与我在一起的语言编写Fortran ;-)
是否对没有编程背景的人进行了培训?
大多数(全部?)大学物理课程都开设一门小型编程课程,通常是在C,Fortran或者MATLAB上,但这是真正的基础。我真的很想在某个时候接受过软件工程方面的培训(修订控制/测试/设计中型系统)
我们是否有版本控制,错误跟踪之类的东西?
我最近才开始使用Subversion / TortoiseSVN。过去与我合作过的群组都使用过版本控制。我不知道任何使用正式错误跟踪软件的学术团体。我仍然不使用任何类型的系统测试。
我们将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)
我会尝试在本科层次上介绍一些软件工程思想,然后在研究生层次上通过实践来加强它们,还提供诸如上述"软件木工"课程之类的资源的指针。
我希望有相当一部分学术物理学家正在编写软件(尽管不一定全部),并且他们迫切需要至少对软件工程的思想进行介绍。
回答
我是英国一所大学的统计学家。通常,这里的人们使用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中进行分析。在这方面重新发明轮子实在没有多大意义。
回答
1.)如今,由于硬件更好,脚本语言在大多数情况下都很流行。 Perl / Python / Lisp在轻量级应用程序(自动化,光照计算)中很盛行。自从我们喜欢Unix / Linux以来,在我的工作(计算型EM)中我看到了很多Perl。对于性能而言,通常使用C / C ++ / Fortran。对于并行计算,好吧,我们通常在EM中手动并行化运行,而不是隐式地执行程序(即,在计算雷达横截面时按视角划分工作)。
2.)我们只是在这里将人们投入其中。我们拥有的许多代码非常混乱,但是科学家通常是一堆散布在脑海中的人,不介意这类事情。不理想,但是我们有交付的东西,而我们的人手严重不足。我们正在慢慢好起来。
3.)我们使用SVN;但是,我们没有错误跟踪软件。一个对我们来说最好的是一个txt文件,它告诉我们特定错误在哪里。
4.)我建议为科学家实施最佳实践:慢慢来。作为科学家,我们通常不运送产品。在科学界,没有人通过编写整洁,可维护的代码来为自己取名。通常,它们从该代码的结果中得到认可。他们需要了解花时间学习软件实践的合理性。慢慢引入新概念,并设法使其遵循;他们是科学家,因此,在他们的经验证据证实了版本控制之类的功能的用途之后,他们将一直在使用它!
回答
我在英国大学担任物理学家。
也许我应该强调指出,不同的研究领域对编程有不同的重视。粒子物理学家(例如dmckee)几乎只进行计算建模,并且可能在大型软件项目上进行协作,而像我本人(凝聚态)这样的领域的人则很少编写代码。我怀疑大多数科学家都属于后者。我会说编码技能通常在物理学中被认为是有用的,但不是必需的,就像物理学/数学技能被认为对程序员有用但不是必需的一样。考虑到这一点...
- 特别是我们使用了什么语言/环境来开发科学软件。数据分析?什么图书馆? (例如,我们使用什么作图?)
通常,数据分析和绘图是使用通用数据分析包(例如IGOR Pro,ORIGIN,Kaleidegraph)完成的,可以将其视为" Excel plus"。这些软件包通常具有可用于自动化的脚本语言。更专业的分析可能会为这项工作提供专用工具,而该工具通常是很久以前写的,没有人知道它的来历,而且还很容易出错。一些其他技术人员可能会使用所提到的语言(Python,R,带有Gnuplot的MatLab进行绘图)。
控制软件通常在LabVIEW中完成,尽管我们实际上使用的是Delphi,这有点不寻常。
- 是否对没有编程背景的人进行了培训?
我去过两所大学的网格计算,3D可视化,学习Boost等研讨会。作为一名本科生,我们曾教过Excel和MatLab的VBA,但C / MatLab / LabVIEW更为常见。
- 我们是否有版本控制,错误跟踪之类的东西?
不,尽管人们确实有个人发展设置。我们的代码库位于"服务器"上的共享文件夹中,该文件夹通过同步工具保持最新状态。
- 我们将如何尝试创建一个不错的编程环境,而又不会给单个科学家带来太多麻烦(尤其是物理学家是固执的人!)
一步一步来!我试图用更坚固的东西替换共享文件夹,也许找到一个模仿当前同步工具行为的SVN客户端会有所帮助。
总体而言,我要说的是,对于大多数自然科学项目而言,通常最好花时间进行研究!
回答
另一个不错的选择是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,等等。 (特别是当新版本破坏了向后兼容性时。)许多改进通常都会引入许多错误。尽管如此,这仍取决于特定的应用案例!请注意,这是个人选择,许多人可能会对此表示反对。
- 使用冗余和自动备份! (带有版本控制)。
回答
What languages/environments have you used for developing scientific software, esp. data analysis? What libraries? (E.g., what do you use for plotting?)
我用于数字和与科学意义相关的东西的语言:
- C(开发速度慢,调试过多,几乎不可能编写可重用的代码)
- C ++(而且我学会了讨厌它-开发速度不如C慢,但可能会很痛苦。模板和类最初很酷,但是一段时间后,我意识到我一直在与之抗争并找到解决方法,语言设计问题
- Common Lisp,虽然可以,但是在科学计算中并未得到广泛使用。不容易与C集成(如果与其他语言相比),但是可以工作
- 方案。这成为我个人的选择。
我的编辑器是Emacs,尽管我确实将vim用于诸如编辑配置文件之类的快速操作。
对于绘图,我通常会生成一个文本文件并将其输入到gnuplot中。
为了进行数据分析,我通常生成一个文本文件并使用GNUR。
我在这里看到很多人使用FORTRAN(大多数是77,但大约90),很多Java和一些Python。我不喜欢这些,所以我不使用它们。
Was there any training for people without any significant background in programming?
自从我毕业于CS以来,我认为这并不适用-但是在我工作的地方没有经过正式的培训,但是人们(工程师,物理学家,数学家)确实可以互相帮助。
Did you have anything like version control, bug tracking?
版本控制绝对重要!我将代码和数据保存在世界的两个不同方面的三个不同的机器中-Git存储库中。我一直都同步它们(所以我有版本控制和备份!)我不执行错误控制,尽管我可能会开始这样做。
但是我的同事根本没有BTS或者VCS。
How would you go about trying to create a decent environment for programming, without getting too much in the way of the individual scientists (esp. physicists are stubborn people!)
首先,我会给他们尽可能多的自由。 (在我工作的大学里,我可以选择让别人安装Ubuntu或者Windows,还是安装自己的操作系统-我选择安装自己的操作系统。我没有他们的支持,我对我发生的任何事情负责机器,包括安全性问题,但我想对机器进行任何操作)。
其次,我将了解它们的使用并使它正常工作(需要FORTRAN吗?我们将其设置。需要C ++吗?没问题。Mathematica?好的,我们将购买许可证)。然后看看他们中有多少人想学习"其他工具"以帮助他们提高生产力(不要说"不同"工具。说"其他",这样看来就不会有人会"输"或者"让"去"等等。从编辑开始,看看是否有一些团体希望使用VCS来同步他们的工作(嘿,我们可以待在家里并通过SVN或者GIT发送代码-那不是很好吗?)等等。
不要强加-显示这些工具有多酷的示例。使用R进行数据分析,并向他们展示它多么容易。显示漂亮的图形,并说明我们如何创建它们(但从简单的示例开始,以便我们可以快速对其进行说明)。
回答
考虑到Fas与数学结构的紧密语义联系,我建议Fas是执行与科学相关的操作的潜在候选人。
另外,如本文所述,它对计量单位的支持对于确保数学模型与实现源代码之间的正确转换也很有道理。
回答
我是从事凝聚态物理领域的物理学家,建立经典模型和量子模型。
语言:
- C ++-用途广泛:可以用于任何东西,速度很好,但是在MPI方面可能有点不方便
- 倍频程-适用于一些补充计算,非常方便且高效
库:
- Armadillo / Blitz ++-C ++的快速数组/矩阵/多维数据集抽象
- Eigen / Armadillo-线性代数
- GSL-与C一起使用
- LAPACK / BLAS / ATLAS-极大而又快速,但不那么方便(并且用FORTRAN编写)
图形:
- GNUPlot-输出非常干净整洁,但有时效率不高
- 原点-绘图非常方便
开发工具:
- Vim +插件-对我来说很棒
- GDB-使用C / C ++时出色的调试工具
- 代码::块-我使用了一段时间,发现它很舒服,但是我认为Vim仍然更好。