科学领域的软件理解确实参差不齐
摘要
一位软件工程师反思科学家往往缺乏软件工程技能,以优化天体物理学模拟后处理工具为例,倡导为科学家开设一门类似“Missing Semester”的课程。
<p>我的日常工作(如果这算工作的话)涉及优化模拟和科学工具。目前我正在与纽约城市大学(CUNY)的一个团队合作开展天体物理学模拟。其中一名研究生花了几个月时间开发一个处理模拟输出的工具。</p><p>输出数据相当大,本地测试运行约 200GB,在真实集群上进行大规模运行后可能会达到数十 TB。该工具需要遍历输出表来构建黑洞合并(以及其他事件,但重点是黑洞合并)的树,运行大约需要一小时。我回应了一个请求,去查看并找出可以加快速度的方法。</p><p>我首先发现,数据分散在数万个 .txt 文件中,每个模拟时间步都会产生几个单独的表,其中一些只有几行,其他的则有数万行。</p><p>我注意到的第二件事是,后处理代码循环遍历文件,在某些地方多次读取同一个文件以提取合并信息。代码中有一个巨大的字典的字典,叶子字典使用标签作为键("root"、"A"、"B"、"A1"、"A2" 等)来手动模拟二叉树,值则是 pandas 数据框。</p><p>这段代码非常难以理解。这让我想起,天体物理学研究生拥有大量的智力和专注力,但这有时可能适得其反。</p><p>没有好的方法能就地优化这段代码。幸运的是,我已经在这个团队中建立了一些信誉,所以当我说我们打算完全重写树构建代码,并尽量保留绘图代码时,他们信任我。绘图代码虽然也很复杂,但合理得多,主要是尝试按照 networkgraph 偏好的输入模式工作。</p><p>不过,我还是让他们把运行器改成脚本而不是 Jupyter notebook,安装 snakeviz,并对一次短时间运行进行了性能分析。当他们看到 snakeviz 窗口弹出时,明显倒吸了一口气,因为他们可以直接看到时间都花在了哪里(主要是遍历许多小型内存数据框并从 txt 加载它们)。问题是,他们之前见过这个工具,我在之前的会议上为模拟主程序的其他性能工作展示过它,他们只是以为那是我手动编写的东西,而不是他们也可以用 cPython 自带的性能分析器加一条 pip install 就能实现的东西。</p><p>这其实不应该令人震惊,因为大约两年前我也处于几乎相同的位置,但它还是让我感到惊讶。我有时觉得我们需要一个相当于“Missing Semester of Your CS Education”的课程,专门面向那些接触了 Python + 数据科学工具并几乎用它做所有事情的科学家。内容包括性能分析器和调试器入门、Python 内存模型、有用/有害的数据结构,以及什么时候不要使用数据框。我认为这会很有用。</p>
查看缓存全文
缓存时间: 2026/08/07 18:24
# 科学领域的软件理解水平参差不齐
Source: https://lobste.rs/s/rn8uva/software_understanding_sciences_is
我的日常工作,说白了,就是优化模拟和科学工具。现在我和CUNY的一个团队在做一个天体物理模拟。其中一名研究生最近几个月一直在开发一个工具来处理模拟的输出。
输出数据量相当大,本地测试运行大约200GB,一旦我们在真正的集群上进行大规模运行,可能会达到数十TB。这个工具需要遍历输出表来构建黑洞合并树(以及其他事件,但这是重点),运行大约需要一个小时。我应他们的请求去看看能做些什么来加速它。
我首先发现,数据分散在成千上万个.txt文件中,每个模拟时间步都会生成几个独立的表,有些只有几行,有些则有几万行。
我注意到的第二件事是,后处理代码在循环遍历文件,有些地方会多次读取同一个文件,以提取合并信息。代码中有一个巨大的字典嵌套字典,而最里层的字典用标签作为键(“root”、“A”、“B”、“A1”、“A2”等)手动模拟二叉树,值则是pandas DataFrame。
这段代码非常难懂。我不禁想到,天体物理研究生拥有大量的智力和专注力,但有时候这反而会适得其反。
这段代码没有好的方法可以就地优化。幸运的是,我已经在这个团队中建立了一些信誉,所以当我基本上告诉他们我们要完全重写树的构建代码,并尝试保留绘图代码时,他们信任我。绘图代码虽然也很精细,但合理得多,基本上只是尽量适应networkgraph偏好的输入模式。
不过,我还是让他们把运行器改成了脚本,而不是Jupyter notebook,安装了snakeviz,并在一次短运行中获取了性能分析结果。当他们看到snakeviz窗口弹出,能直观地看到时间都花在哪里时(主要是遍历大量小的内存DataFrame以及从txt文件加载它们),他们明显倒吸了一口气。问题是,他们以前就见过这个工具,我在之前的会议中展示过它用于主模拟的其他性能优化工作,他们只是以为那是我手动编写的东西,而不是他们也可以用cPython自带的profiler加上一次pip安装就能做到的事情。
这其实不应该让人震惊,因为大约两年前我也处于几乎相同的境地,但这还是让我感到意外。有时我觉得我们需要一个类似“Missing Semester of Your CS Education”的课程,专门面向那些接触过Python和数据科学工具、并且几乎用它们做所有事情的科学工作者。内容包括:性能分析器和调试器入门、Python内存模型、有用/有害的数据结构,以及什么时候不应该使用DataFrame。我认为这会很有用。
相似文章
学习软件架构
一位软件工程师分享了学习软件架构的见解,强调组织架构与激励机制优先于代码本身,并结合 rust-analyzer 与科学计算代码的实例进行了说明。
@saranormous: https://x.com/saranormous/status/2064510215056400652
尽管以Devin为代表的AI编程助手取得了快速进展,显著提升了代码编写和交付的速度,但本文认为,软件工程中最有价值的部分仍难以通过基准测试衡量,并且需要人类的判断和组织协调,这些是无法轻易自动化的。
我不是软件工程师
作者回顾了23年来被告知自己不是'软件工程师'的经历,并批评行业向代理式人工智能和自然语言编程的推进,认为这削弱了代码质量、可重复性和深思熟虑的工程实践。
编程依旧令人头疼
这篇文章批判了对科技职业浪漫化的看法,将其描述为混乱和充满压力而非井然有序,同时探讨了人们对人工智能取代岗位的焦虑,以及软件开发缺乏明确方向的问题。
软件关乎人,而非代码(2020)
一篇论述软件成功更多取决于理解人及其需求,而非编写完美代码的文章,并以被遗弃的、未解决实际问题的代码库为例。