每位计算科学家应具备哪些核心技能?[关闭]


52

每个科学家都需要对统计知识有所了解:什么是相关性,什么是置信区间,等等。同样,每个科学家都应该对计算有所了解:问题是什么?期望每个在职的科学家都知道有关构建和使用软件的合理知识吗?我们列出的核心技能是-人们以“ cloud”或“ peta”为名处理任何事物之前应了解的事情-是:

  • 基本编程(循环,条件,列表,函数和文件I / O)
  • shell /基本的shell脚本
  • 版本控制
  • 测试多少程序
  • 基本SQL

这个列表中没有很多东西:矩阵编程(MATLAB,NumPy等),使用得当的电子表格,它们与大多数编程语言一样强大),诸如Make的任务自动化工具,等等。

那么:您的清单上有什么?您认为现在期望每个科学家都知道吗?您会从上面的列表中拿出什么来腾出空间吗?没有人有足够的时间学习一切。


1
好问题!但是我不清楚一件事:计算科学家是什么意思?有使用计算的科学家吗?还是认为专业头衔是“计算科学家”的一小部分人?
David Ketcheson

9
用Stack Exchange格式提出问题不是很好。我们真的必须在每个站点上都经历一下吗?
dmckee 2012年

4
@Dan社区Wiki并非允许网站上不存在问题的借口。我还想鼓励那些回答问题的人举Jed的榜样,至少尝试解释为什么您需要某些技能或不需要其他技能
Ivo Flipse'2

5
@IvoFlipse:这是网站上某种形式的问题。也许不像目前所说的那样;也许它需要解决一些较小的问题并重新措辞,但是计算科学中软件工程不佳的问题是一个极为重要的问题,特别是因为计算科学作为一门学科仍处于发展阶段。《自然》杂志上的这篇文章指出了原因。Greg通过他的网站为计算科学界提供了出色的服务。
Geoff Oxberry '02

Answers:


46

“计算科学家”之所以有点广泛,是因为它包括使用纸/ LaTeX进行数值分析和概念验证实现的人员,编写通用库的人员以及开发解决特定类型问题的应用程序的人,以及利用这些问题的最终用户。应用程序。这些小组所需的技能有所不同,但是熟悉“完整堆栈”具有很大的优势。我将描述我认为是该堆栈的关键部分的东西,当然,在该级别工作的人应该具有更深的知识。

领域知识(例如物理和工程背景)

每个人都应该知道他们正在解决的问题的基础。如果您使用PDE,这将意味着您对几类PDE(例如,泊松,弹性以及不可压缩和可压缩的Navier-Stokes)有所了解,尤其是对于“精确”捕获重要的属性以及可以离散化的属性错误(这将告知有关本地守恒和辛积分器的方法选择)。您应该了解一些应用程序感兴趣的功能和分析类型(提升和阻力的优化,故障预测,参数反转等)。

数学

每个人都应该大致了解与他们的问题领域相关的方法类别。这包括稀疏对稠密线性代数的基本特征,“快速方法”的可用性,空间和时间离散化技术的属性,以及如何评估物理问题的适合于离散化技术的属性。如果您主要是最终用户,则此知识可能非常高。

软件工程和库

对抽象技术和库设计有所了解对几乎所有计算科学领域的人都是有用的。如果您使用概念验证方法,这将改善代码的组织(使其他人更轻松地将其“转换”为可靠的实现)。如果您从事科学应用程序的开发,这将使您的软件更具扩展性,并且更易于与库进行交互。在开发代码时应具有防御性,以便尽早检测到错误,并且错误消息应尽可能提供有用的信息。

工具类

使用软件是计算科学的重要组成部分。精通所选语言,编辑器支持(例如标签,静态分析)和调试工具(调试器,valgrind)可以大大提高开发效率。如果您在批处理环境中工作,则应该知道如何提交作业和进行交互式会话。如果您使用已编译的代码,则对编译器,链接器以及诸如Make之类的构建工具的实用知识将节省大量时间。版本控制对于每个人都是必不可少的,即使您一个人工作也是如此。学习Git或Mercurial,并将其用于每个项目。如果您开发库,则应该相当全面地了解语言标准,以便几乎总是第一次编写可移植的代码,否则,当您的代码不在时髦的环境中构建时,您将被埋在用户支持请求中。

胶乳

LaTeX是用于科学出版和协作的事实上的标准。LaTeX的熟练度对于能够交流您的结果,就提案进行协作等非常重要。编写脚本脚本对于重现性和数据出处也很重要。


7
我同意杰德。LaTeX是绝对必要的!:)
保罗

1
我会将“物理与工程”更改为主题专业知识。毕竟,我们并不是所有的物理学家或工程师。答案的这一部分的精神在正确的位置,但是有一个非常明显的假设。
Fomite '02

感谢@EpiGrad,我以这些为例将其更改为“领域知识”。
杰德·布朗

好名单。对性能问题也应该有基本的了解。我遇到了太多的人,他们不了解概要分析代码的简单概念。注意:性能应不仅指速度问题,还应指内存使用情况。
Faheem Mitha '02

错别字:“ probelms”和“ burried”。SE不允许我修复它们-修改太小。
Faheem Mitha 2012年

26

我自己的背景是计算机科学专业的知识,因此我的观点可能有些偏颇。话虽如此,我将在列表中添加“基本算法和数据结构”。我所说的基本是线性搜索和排序,以及诸如平衡树,堆和/或哈希表之类的数据结构。

为什么?好吧,在大多数计算算法中,您最终要花费大量的时间和精力来转移数据,而实际上没有进行任何计算。是否曾经实施过有限元代码?大约有90%的数据组织。完成与完成之间的差异可能是计算效率的一个数量级。

我还要补充一点与计算机科学相关的观点,简要介绍了处理器的实际工作方式,它的优缺点。例如:

  • 加法和乘法是快速的,除法或超越函数不是。我见过成年男子用需要三个分割的东西代替平方根手术,并认为他们做的很棒(分割和平方根一样昂贵)。
  • 是的,级别3缓存每年都在增长,是的,但是级别0(即真正的快速缓存)仍然只有几千字节。
  • 编译器不是魔术。他们可能会展开小循环或对极其直接的操作进行矢量化处理,但不会将气泡排序变成快速排序。
  • 从概念上讲,在最内层循环中对具有多重继承的多态对象的调用方法可能很不错,但这会使您的CPU想要杀死自己。

这真是令人厌烦的东西,但是只需花几分钟的时间进行解释,并且牢记在心,可以让您从一开始就编写好的代码,或者设计不依赖不存在的硬件功能的算法。

至于从列表中删除什么,我认为对于计算科学家来说,SQL有点过多。同样,软件测试很重要,但这本身就是一门科学。单元测试和正确的抽象数据类型应该通过基本编程来教授,并且不需要两年的硕士课程。


2
一点也不无聊。如果有的话,我会选择这样的课程。:-)
Faheem Mitha 2012年

18

我可能会在以后添加,但是对于初学者来说,我将删除“ shell脚本”并将其专门替换为“ Python脚本”。Python比Shell脚本更具可移植性,并且比类似的Shell和脚本语言更具可读性。它庞大的标准库和在科学界的流行(可能也有生物学例外,它也使用Perl)使其成为了一种出色的计算语言,更不用说学习编程的优秀第一语言了。现在,它是麻省理工学院面向EECS专业教授的第一门语言,并且在就业市场上非常流行,尤其是在科学计算领域。它的在线文档非常丰富,并且在线上还有许多基于Python的编程文本。

使用Python,您可以教授基本的编程结构以及脚本。另外,Python对单元测试提供了出色的支持,因此Python也可以用于教授单元测试。Python还具有广泛的数据库API(可以替代或增加学习SQL的功能),以及一些构建工具,它们提供类似于Make的功能。我个人更喜欢使用SCons而不是Make,因为与Python脚本相比,我发现Python更易于记录和测试。

归根结底,我对Python的公然抢先的动机是效率。如果您可以使用一种语言或一种工具来完成大部分工作,那么简化工作流程就容易得多,尤其是当该工具是一种富有表现力的脚本语言时。当然,我可以用C语言做所有事情,但是我的程序要花5倍的时间,而且机会是,我不需要速度。相反,我可以使用Python从文本文件导入数据,对其进行绘制,调用优化例程,生成随机变量,绘制结果,将结果写入文本文件以及对代码进行单元测试。如果Python太慢,则可以将Python包裹在负责处理大量计算任务的C,C ++或Fortran代码周围。对我而言,Python是满足我大部分科学计算需求的一站式服务。

Python还不完全是MATLAB。就功能而言,SciPy和NumPy仍有路要走,但就通用工具而言,我将Python用于比MATLAB更广泛的任务。


7
我忍不住完全不同意这一点。对于系统维护者来说,Python令人头疼,因为它是一个不断变化的目标。计算科学家应该对bash或csh有基本的了解,以便将最基本的东西粘合在一起并在他们可能使用的系统上运行作业。Python很棒,我支持您提倡计算人员学习它,但不以牺牲一些基本的外壳为代价。
比尔·巴特

7
@BillBarth:我认为每个计算科学家都必须学习非常非常基本的脚本的基本bash或csh。我主张在这些基本任务之外使用Python进行Shell脚本编写的原因是,因为我继承了实际上运行程序的数千行bash脚本。它作为信号量来回传递文件​​,重复调用PBS,并且根本没有办法对其进行测试。Shell脚本非常适合小型任务,但不适用于大型任务,而这种风笛式磁带和泡泡糖的噩梦使我花费了几年的论文时间,这就是我坚持的原因。
Geoff Oxberry '02

2
就像我说的那样,我完全不同意“学习python”可能适合该列表。我只是不想以“ shell脚本”为代价。两者都很重要,没有人会允许您将ipython作为shell运行,因此shell脚本非常重要。
比尔·巴特

3
@BillBarth:我在哪里都没有建议Python代替外壳。我只建议Python代替bash进行脚本编写;我相信,如果您学习基本的bash,您将足够了解无控件结构的脚本编写,因此无需深入研究“ bash脚本编制”。一旦要包含控制结构,就应该切换到另一种语言,因为使用bash进行编程对于软件和库维护人员来说是头疼的问题。
Geoff Oxberry '02

1
+1。一段时间以来,Python一直是我的主要编程语言。它不是完美的,但是要等到有人发明出完美的编程语言后,它才能发挥作用。
Faheem Mitha 2012年

14

浮点数学。 大多数科学都处理现实世界的价值,而现实世界的价值通常表示为计算机世界中的浮点。浮点数有很多潜在的陷阱,可能会对结果的意义造成破坏。

该主题最喜欢的参考似乎是David Goldberg 撰写的 “每位计算机科学家都应该知道的有关浮点运算的知识(1991)”,网址为http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768


1
该文档在在线论坛上被提及很多次。但这是一篇冗长而密集的文章,我不确定有多少人实际能够从中受益。
约翰格林,

12

计算科学家必须对计算机科学,数学以及科学/工程学的应用领域有足够的了解。我将在以下各个领域提供技能:

数学:

  1. 数值分析
  2. 线性代数
  3. 普通,偏和/或随机微分方程
  4. 优化
  5. 统计和/或概率
  6. 逆理论

计算机科学:

  1. 演算法
  2. 数据结构
  3. 并行编程(MPI,OpenMP,CUDA等)
  4. 科学可视化
  5. 计算机架构
  6. 使用Linux环境

科学/工程-取决于您要专门研究的应用程序。在我的特殊情况(工程学)中,我将添加诸如连续力学,传热,流体动力学,有限元方法等内容。我想说的是,更加熟悉您拥有多个科学领域,那么您作为计算科学家的用途就越丰富。


您能详细介绍一下“逆向理论”吗?
Faheem Mitha 2012年

1
@FaheemMitha:传统上,我们首先设置模型的参数(例如偏微分方程),然后观察系统的行为。一个“反问题”正在做相反的事情。我们从系统输出的观察开始,并尝试确定产生这些观察的模型的参数。逆理论描述了完成此任务的方法。
保罗

感谢您的解释。您是否对此主题有很好的链接/参考?
Faheem Mitha 2012年

2
en.wikipedia.org/wiki/Inverse_problem 是一个不错的起点。 space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf也有很好的概述。但是,对于更深入的了解,我会推荐一本书,例如amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…–
保罗

4

伟大的问题,然后有趣的答案!我只想添加一小部分。就我所经历的(本人和替代者)而言,多合一工具通常非常好。这样的工具可以是MATLAB,Octave甚至Python(带有库)。每当您在“舒适区”遇到问题时,一个好主意(据我所知和认为)将是尝试使用多合一工具。您可以稍后尝试编写自己的代码。这样的程序包的优点在于编程不会干扰您正在做的事情的理解。

以计算机图形学为例。编写用于平移,旋转或缩放图形的代码是MATLAB中的10行代码(顶部),但可以在C中运行页面。我并不是说C不好。我的意思是,如果您没有充分的理由用C编写代码,MATLAB将是一种更简单,更好和更直观的方法。

有人可能会不同意并指出,类似于C的编程是建立直觉的一种好方法。也许是。但是,当您不必多次处理一个问题时,几乎不必保证坐下来用C之类的语言编写自己的代码。


-1

常识和直觉...直觉是随着时间而来的,并且是在这个大的坏世界中“幸存”了两次可耻的经历之后才出现的。


3
我不知道“胆量感觉”是否真的是一种技能。这仅仅是对先前经验的本能反应。
naught101 2012年
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.