每个计算科学家都应该具备哪些核心技能?

计算科学 教育
2021-12-13 19:33:43

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

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

有很多不在此列表中:矩阵编程(MATLAB、NumPy 等)、电子表格(如果使用得当,它们与大多数编程语言一样强大)、任务自动化工具(如 Make)等等。

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

4个回答

“计算科学家”有点宽泛,因为它包括使用纸/LaTeX 和概念验证实现进行数值分析的人,编写通用库的人,开发解决某些类别问题的应用程序的人,以及使用这些问题的最终用户应用程序。这些组需要的技能是不同的,但是对“全栈”有一定的了解有很大的优势。我将描述我认为这个堆栈的关键部分,在那个级别工作的人当然应该有更深入的知识。

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

每个人都应该知道他们正在解决的问题类别的基础知识。如果您研究 PDE,这意味着您对几类 PDE(例如 Poisson、弹性以及不可压缩和可压缩的 Navier-Stokes)有一定的了解,尤其是哪些属性对于“精确”捕获很重要,以及哪些属性可以达到离散化错误(这会告知有关局部守恒和辛积分器的方法选择)。您应该了解应用程序感兴趣的一些函数和分析类型(升力和阻力优化、故障预测、参数反演等)。

数学

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

软件工程和图书馆

熟悉抽象技术和库设计对计算科学领域的几乎每个人都有用。如果您使用概念验证方法,这将改进您的代码的组织(使其更容易被其他人“翻译”成一个健壮的实现)。如果您从事科学应用程序,这将使您的软件更具可扩展性,并使与库的交互更容易。在开发代码时要采取防御措施,以便尽早检测到错误并且错误消息尽可能提供信息。

工具

使用软件是计算科学的重要组成部分。熟练使用您选择的语言、编辑器支持(例如标签、静态分析)和调试工具(调试器、valgrind)大大提高了您的开发效率。如果您在批处理环境中工作,您应该知道如何提交作业和获取交互式会话。如果您使用已编译的代码,那么了解编译器、链接器和 Make 等构建工具的工作知识将节省大量时间。版本控制对每个人来说都是必不可少的,即使您独自工作。学习 Git 或 Mercurial,并将其用于每个项目。如果您开发库,您应该完全合理地了解语言标准,以便您几乎总是在第一次编写可移植代码,否则当您的代码没有在他们的时髦环境中构建时,您将被用户支持请求所淹没。

乳胶

LaTeX 是科学出版和协作的事实标准。熟练使用 LaTeX 对于能够传达您的结果、就提案进行协作等非常重要。编写图形创建脚本对于可重复性和数据来源也很重要。

我自己的背景是计算机科学专业,所以我的意见可能有点偏颇。话虽如此,我会在列表中添加“基本算法和数据结构”。我所说的基础本质上是线性搜索和排序,以及平衡树、堆和/或哈希表等数据结构。

为什么?好吧,在大多数计算算法中,你最终会花费大量的时间和精力来转移数据,而实际上并没有计算任何东西。曾经实现过有限元代码吗?这大约是 90% 的数据组织。完成这件事和把它做好之间的区别可能是计算效率的一个数量级。

我还要补充的一个与计算机科学相关的小点是关于处理器实际工作原理以及它擅长什么以及不擅长什么的简短介绍。例如:

  • 加法和乘法速度很快,除法或超越函数则不然。我见过成年男子用需要三个除法的东西代替平方根运算,并认为他们做得很好(除法和平方根同样昂贵)。
  • 3 级缓存每年都在变大,是的,但是 0 级缓存,即真正快的缓存,仍然只有几千字节。
  • 编译器不是魔术。他们可能会展开小循环或向量化极其直接的操作,但他们不会将冒泡排序变成快速排序。
  • 在你的最内层循环中调用具有多重继承的多态对象的方法在概念上可能是甜蜜的,但它会让你的 CPU 想要杀死自己。

这是非常无聊的东西,但只需要几分钟的时间来解释,记住它会让你从一开始就写出好的代码,或者设计不依赖于不存在的硬件特性的算法。

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

稍后我可能会添加此内容,但对于初学者,我会取出“shell 脚本”并将其专门替换为“Python 脚本”。Python 比 shell 脚本更具可移植性,并且比类似的 shell 和脚本语言更具可读性。它的大型标准库和在科学领域的普及(可能除了生物学,它也使用 Perl)使它成为一种很好的计算通用语言,更不用说学习编程的良好第一语言了。它现在是麻省理工学院 EECS 专业教授的第一门语言,在就业市场上很受欢迎,尤其是在科学计算领域。它的在线文档非常丰富,并且还有许多基于 Python 的编程文本在线可用。

使用 Python,您可以教授基本的编程结构以及脚本。此外,Python 对单元测试有很好的支持,所以 Python 也可以用来教授单元测试。Python 还具有广泛的数据库 API(可以替代或增强必须学习 SQL),以及一些提供类似 Make 功能的构建实用程序。我个人更喜欢 SCons 而不是 Make,因为我发现 Python 比 shell 脚本更容易记录和测试。

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

Python 还不完全是 MATLAB。SciPy 和 NumPy 在功能方面还有很长的路要走,但在通用性方面,我使用 Python 来完成比 MATLAB 更广泛的任务。

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

该主题最喜欢的参考资料似乎是 David Goldberg 的“What Every Computer Scientist Should Know About Floating Point Arithmetic (1991)” http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768