您使用什么语言/环境来开发科学软件,尤其是 数据分析?什么图书馆?(例如,你用什么绘图?)
我曾经为SciPy的主要企业赞助商Enthought工作.我们与签约Enthought的公司的科学家合作进行定制软件开发.Python/SciPy对科学家来说似乎是一个舒适的环境.如果你是没有软件背景的科学家,那么开始使用C++或Java就不那么令人生畏了.
该Enthought Python的分布与所有的科学计算库,包括分析,绘图,3D visualation等.
对于没有任何重要编程背景的人进行过培训吗?
Enthought提供SciPy培训,SciPy社区非常适合回答邮件列表中的问题.
你有没有像版本控制,错误跟踪?
是的,是的(Subversion和Trac).由于我们与科学家合作(通常远程与他们合作),因此版本控制和错误跟踪至关重要.需要一些指导才能让一些科学家内化版本控制的好处.
您将如何创建一个体面的编程环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)
确保他们熟悉工具链.它需要预先投资,但这会使他们不再倾向于拒绝它而更倾向于更熟悉的东西(Excel).当工具失败时(他们会),确保他们有一个可以寻求帮助的地方 - 邮件列表,用户组,组织中的其他科学家和软件开发人员.让他们回到做物理学的帮助越多越好.
您使用什么语言/环境来开发科学软件,尤其是 数据分析?什么图书馆?(例如,你用什么绘图?)
我曾经为SciPy的主要企业赞助商Enthought工作.我们与签约Enthought的公司的科学家合作进行定制软件开发.Python/SciPy对科学家来说似乎是一个舒适的环境.如果你是没有软件背景的科学家,那么开始使用C++或Java就不那么令人生畏了.
该Enthought Python的分布与所有的科学计算库,包括分析,绘图,3D visualation等.
对于没有任何重要编程背景的人进行过培训吗?
Enthought提供SciPy培训,SciPy社区非常适合回答邮件列表中的问题.
你有没有像版本控制,错误跟踪?
是的,是的(Subversion和Trac).由于我们与科学家合作(通常远程与他们合作),因此版本控制和错误跟踪至关重要.需要一些指导才能让一些科学家内化版本控制的好处.
您将如何创建一个体面的编程环境,而不会对个别科学家造成太大影响(尤其是物理学家是顽固的人!)
确保他们熟悉工具链.它需要预先投资,但这会使他们不再倾向于拒绝它而更倾向于更熟悉的东西(Excel).当工具失败时(他们会),确保他们有一个可以寻求帮助的地方 - 邮件列表,用户组,组织中的其他科学家和软件开发人员.让他们回到做物理学的帮助越多越好.
Software Carpentry课程专门针对进行科学计算的人员,旨在教授软件工程的基础知识和课程,以及如何最好地将它们应用于项目.
它涵盖了版本控制,调试,测试,脚本和各种其他问题.
我已经听了大约8或9个讲座,并认为这是强烈推荐的.
编辑:讲座的MP3也可用.
核/粒子物理在这里.
主要的编程工作过去主要在使用CERNLIB(PAW,MINUIT,...)和GEANT3的Fortran中完成,最近它主要使用ROOT和Geant4在C++中完成.还有许多专门使用的库和工具,LabVIEW在这里和那里都有用处.
在我的业务结束时,数据采集通常意味着相当低水平的工作.通常在C中,有时甚至在组装中,但随着硬件变得更强大,这种情况会逐渐消失.另一方面,许多电路板现在都是用FPGA构建的,这需要门捻...
一次性,图形界面等几乎可以使用任何东西(Tcl/Tk曾经很大,我最近看到过更多的Perl/Tk和Python/Tk),其中包括一些主要存在于粒子物理社区内的软件包.
许多编写代码的人很少或根本没有接受过正式培训,而且流程在口头传统中传播得非常不均衡,但大多数软件组领导都认真对待过程并尽可能多地阅读以弥补他们在这方面的不足.
主要工具的版本控制无处不在.但是许多个体程序员忽略了它的小任务.正式的错误跟踪工具不常见,夜间构建,单元测试和回归测试也是如此.
为了改善事情:
找到当地软件领导者的好方面
实施您想要在自己的区域中使用的流程,并鼓励您允许的人也使用它.
等待.物理学家是经验主义者.如果有帮助,他们会(最终!)注意到.
还有一个改善事物的建议.
花一点时间帮助你直接工作的人.检查他们的代码.告诉他们有关算法复杂性/代码生成/ DRY或他们从未学过的任何基本知识,因为有些教授曾向他们扔过一本Fortran书,并说"让它工作".在过程问题上灌输他们.他们是聪明的人,如果你给他们机会,他们会学到的.
这可能略显相关,但希望是相关的.
我曾经在National Instruments,R&D工作,在那里我为NI RF&Communication工具包编写了软件.我们使用了相当多的LabVIEW,以下是我们遵循的做法:
来源控制.NI使用Perforce.我们做了常规的事情 - 开发/主干分支,持续集成,工作.
我们编写了自动测试套件.
我们有一些人具有信号处理和通信方面的背景.我们过去经常进行代码审查和最佳实践文档,以确保其代码符合标准.
尽管有代码审查,但在某些情况下,像我一样的"软件人员"必须重写一些代码以提高效率.
我确切地知道你对顽固的人的意思!我们曾经有人认为指出他们的代码中潜在的性能提升是直接的个人侮辱!不言而喻,这需要良好的管理.我认为与这些人打交道的最好办法就是慢慢来,不要努力改变,如果有必要,我要做好准备去做肮脏的工作.[示例:为其代码编写测试套件].
我不是一个"天生的"科学家(我学习交通工具),但我是一名学者,他编写了很多我自己的软件进行数据分析.我尝试尽可能多地在Python中编写,但有时我在扩展或自定义现有软件工具时不得不使用其他语言.我的领域很少有编程培训.大多数人要么自学成才,要么从以前或在学科之外的课程中学习他们的编程技巧.
我是版本控制的忠实粉丝.我使用Vault在我的家庭服务器上运行我的论文的所有代码.现在我正试图让部门设置一个Subversion服务器,但我的猜测是我将是唯一一个使用它的人,至少在开始时.我和FogBugs玩了很多,但与版本控制不同,我认为这对单人团队来说几乎没那么有用.
至于鼓励其他人使用版本控制等,这真的是我现在面临的问题.我打算强迫我的研究生将它用于他们为我做的研究项目,并鼓励他们将它用于自己的研究.如果我教一个涉及编程的课程,我可能会强迫学生在那里使用版本控制(将它们放在存储库中的内容中).就我的同事和他们的研究生而言,我所能做的就是提供服务器,并依靠温和的说服力并树立一个好榜样.坦率地说,在这一点上,我认为让他们进行定期备份比让他们进行源代码控制更重要(有些人在USB闪存驱动器上携带他们研究数据的唯一副本).
1.)由于更好的硬件,脚本语言现在很流行.Perl/Python/Lisp在轻量级应用程序(自动化,光计算)中很流行; 因为我们喜欢Unix/Linux,所以我在工作中看到了很多Perl(计算EM).对于性能,通常使用C/C++/Fortran.对于并行计算,我们通常手动并行化EM中的运行,而不是让程序隐式地执行它(即在计算雷达截面时通过视角分割作业).
2.)我们只是把人们放在这里混合.我们拥有的许多代码都非常混乱,但科学家通常是一群散乱的人,不介意那种事情.不理想,但我们有事情需要交付,而且我们的人员严重不足.我们正在慢慢好起来.
3.)我们使用SVN; 但是,我们没有错误跟踪软件.关于它为我们获得的好处是一个txt文件,告诉你特定错误的bug在哪里.
4.)我建议为科学家实施最佳实践:慢慢来.作为科学家,我们通常不会发货. 科学界没有人通过干净,可维护的代码为自己命名.他们通常会从该代码的结果中获得认可.他们需要看到花时间学习软件实践的理由.慢慢地介绍新概念并尝试让它们遵循; 他们是科学家,所以在他们自己的经验证据确认了版本控制之类的有用之后,他们就会开始一直使用它!
我强烈建议阅读"每个计算机科学家应该知道的关于浮点算术的内容".我经常遇到的很多问题都来自浮点编程问题.
我是一名从事凝聚态物理领域的物理学家,负责建立经典和量子模型.
语言:
C++ - 非常通用:可以用于任何事情,速度很快,但是对于MPI来说可能有点不方便
Octave - 适合一些补充计算,非常方便和高效
图书馆:
Armadillo/Blitz ++ - C++的快速数组/矩阵/立方体抽象
Eigen/Armadillo - 线性代数
GSL - 与C一起使用
LAPACK/BLAS/ATLAS - 非常大而且快,但不太方便(并用FORTRAN编写)
显卡:
GNUPlot - 它具有非常干净和整洁的输出,但有时不那么高效
原点 - 非常方便绘图
开发工具:
Vim +插件 - 它对我很有用
GDB - 使用C/C++时的一个很好的调试工具
Code :: Blocks - 我用了一段时间后发现它非常舒服,但在我看来Vim仍然更好.