去年,我在一所大学的物理研究小组实习。在这个小组中,我们主要使用LabVIEW编写程序来控制我们的设置,进行数据采集和分析数据。对于前两个目的,这非常正常,但对于数据分析,这是一个真正的痛苦。最重要的是,每个人都大多是自学成才,因此编写的代码通常非常混乱(难怪每个博士都很快决定从头开始重写所有内容)。版本控制未知,并且由于IT部门严格的软件和网络规定而无法设置。
现在,实际上事情确实令人惊讶,但自然科学界的人们如何进行软件开发呢?
一些具体问题:
到目前为止的答案(或我对它们的解释):( 2008-10-11)
答案 0 :(得分:27)
您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)
我曾经为Enthought的主要企业赞助商SciPy工作。我们与签约Enthought的公司的科学家合作进行定制软件开发。 Python / SciPy对科学家来说似乎是一个舒适的环境。如果你是没有软件背景的科学家,那么开始使用C ++或Java就不那么令人生畏了。
Enthought Python Distribution附带所有科学计算库,包括分析,绘图,3D视觉等。
是否有针对没有任何重要编程背景的人的培训?
Enthought提供SciPy training,SciPy社区非常善于回答邮件列表中的问题。
您是否有类似版本控制,错误跟踪的内容?
是的,是的(Subversion和Trac)。由于我们与科学家合作(通常远程与他们合作),因此版本控制和错误跟踪至关重要。需要一些指导才能让一些科学家将版本控制的好处内化。
你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)
确保他们熟悉工具链。它需要预先投资,但这会使他们不再倾向于拒绝它而更倾向于更熟悉的东西(Excel)。当工具失败时(他们会),确保他们有一个可以寻求帮助的地方 - 邮件列表,用户组,组织中的其他科学家和软件开发人员。让他们回到做物理学的帮助越多越好。
答案 1 :(得分:20)
课程Software Carpentry专门针对进行科学计算的人员,旨在教授软件工程的基础知识和课程,以及如何最好地将其应用于项目。
它涵盖了版本控制,调试,测试,脚本和各种其他问题。
我已经听了大约8或9个讲座,并认为这是强烈推荐的。
编辑:讲座的MP3也是available。
答案 2 :(得分:16)
这里的核/粒子物理学。
改进:
还有一项改善建议的建议。
答案 3 :(得分:11)
这可能略显相关,但希望是相关的。
我曾经在National Instruments,R& D工作,在那里我为NI RF& amp;通讯工具包。我们使用了相当多的LabVIEW,以下是我们遵循的实践:
答案 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)
我是一名从事凝聚态物理领域的物理学家,负责建立经典和量子模型。
语言强>
<强>库:强>
<强>图形:强>
开发工具:
答案 8 :(得分:4)
您使用哪些语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)
Python,NumPy和pylab(绘图)。
对没有任何重要编程背景的人进行过培训吗?
不,但我在多媒体研究实验室工作,所以几乎每个人都有计算机科学背景。
你有没有像版本控制,错误跟踪这样的东西?
是,Subversion用于版本控制,Trac用于错误跟踪和wiki。如果他们http://www.assembla.com/适合您的项目,您可以从TOS获得免费的错误跟踪器/版本控制托管。
你如何努力为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)。
确保基础架构的设置和维护良好,并尝试销售源代码管理的好处。
答案 9 :(得分:4)
前学术物理学家和现在的工业物理学家英国:
您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)
这些天我主要使用MATLAB(易于访问可视化功能和数学)。我过去常常使用Fortran和IDL。我曾经使用过C(但我更像读者而不是C的作者),Excel宏(丑陋且令人困惑)。我目前需要能够阅读Java和C ++(但我不能真正编写它们)并且我也攻击了Python。为了我自己的娱乐,我现在正在用C#进行一些编程(主要是为了获得可移植性/低成本/漂亮的接口)。我可以用几乎任何我提出的语言写Fortran; - )
是否有针对没有任何重要编程背景的人的培训?
大多数(全部?)本科物理课程通常会在C,Fortran或MATLAB上开设一个小编程课程,但这是真正的基础知识。我真的很想在某些时候接受过软件工程方面的培训(修订控制/测试/设计中等规模系统)
您是否有类似版本控制,错误跟踪的内容?
我最近开始使用Subversion / TortoiseSVN。我过去曾与之合作的小组都使用了版本控制。我不认识任何使用正式错误跟踪软件的学术团体。我仍然没有使用任何系统的测试。
你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)
我会尝试在本科阶段介绍一些软件工程理念,然后通过在研究生阶段的实践加强它们,同时提供指向上述软件木工课程等资源的指南。
我希望相当一部分学术物理学家能够编写软件(不一定是全部),他们至少需要对软件工程中的想法进行介绍。
答案 10 :(得分:4)
我是一所英国大学的物理学家。
也许我应该强调,不同的研究领域对编程有不同的侧重点。粒子物理学家(如dmckee)几乎专门进行计算建模,并且可以在大型软件项目上进行协作,而像我自己(凝聚态物质)这样的领域的人们相对不经常地编写代码。我怀疑大多数科学家都属于后一阵营。我会说编码技巧通常被认为在物理学中很有用,但并不重要,就像物理/数学技能被认为对程序员有用但不是必不可少的。考虑到这一点......
通常,数据分析和绘图是使用通用数据分析软件包完成的,例如IGOR Pro,ORIGIN,Kaleidegraph,可以将其视为“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或者你自己写的那些)。所以,通常的工作流程是:
对我来说效果很好。
我是我部门(> 100人)中唯一一个使用版本控制的人(在我的情况下使用git与githuib.com一起使用。)这是相当令人担忧的,但他们似乎并不是热衷于尝试,并满足于传递zip文件(哎呀。)
我的建议是继续使用LabView进行收购(并且可能试图让您的同事就收购和制作的工具集达成一致意见),然后将数据导出为CSV(或者在R中进行分析。在这方面重新发明轮子真的很少。
答案 12 :(得分:2)
当然,使用Subversion来保留源代码的当前,正在进行和稳定的快照副本。这包括用于本土软件工具的C ++,Java等,以及用于一次性处理的快速脚本。
随着科学和应用工程对“孤独的牛仔”开发方法的强烈倾向,将存储库组织成树干,标签和其他任何东西的通常做法 - 不要打扰!科学家和他们的实验室技术人员喜欢旋转旋钮,摆动电极并追逐真空泄漏。这足以让每个人都同意,比如说Python / NumPy或遵循一些命名惯例;忘了试图让他们遵循神秘的软件开发者实践和惯例。
答案 13 :(得分:2)
对于源代码管理,由于明确的单点事实(SPOT),Subversion等集中式系统在科学用途方面具有优势。记录变更和恢复任何文件版本的能力,而无需追查找到的东西,具有巨大的记录保持优势。像Git和Monotone这样的工具:哦,天哪,我可以想象会出现的混乱!当希格斯玻色子经过或超新星爆炸时,清楚地记录了使用新传感器时使用的黑客作业脚本版本的记录,将带来快乐。
答案 14 :(得分:2)
您使用什么语言/环境来开发科学软件,尤其是数据分析?什么图书馆? (例如,你用什么绘图?)
我的本科物理系教授LabVIEW课程并在其研究项目中广泛使用它。
另一种选择是MATLAB,我没有经验。这两种产品都有营地;每个都有自己的优点/缺点。根据您需要解决的问题类型,一个包可能比另一个更优选。
关于数据分析,您可以使用任何类型的数字计算器。理想情况下,您可以在语言X中进行硬计算,并将输出格式化为Excel,Mathcad,Mathematica或任何风格的绘图系统。不要指望标准化。
您是否有类似版本控制,错误跟踪的内容?
回想起来,我们没有,如果我们这样做,对我们所有人来说都会更容易。没有什么比打破一切并挣扎数小时来修复它的了!
绝对使用任何公共代码的源代码控制。鼓励个人以可以更通用的方式编写代码。这实际上只是编写最佳实践。真的,你应该让他们教授(或参加)计算机科学课程,这样他们才能掌握基础知识。
你会如何为编程创造一个体面的环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)
数据采集(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相关的东西:
我的编辑器是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。它有两件事:
作为一个额外的优势,它拥有大多数你想要用它做的事情的库。
答案 19 :(得分:1)
我不是这方面的专家,但我一直都知道这就是为MATLAB创建的。还有a way to integrate MATLAB with SVN for source control。