Software Understanding in the Sciences is Really Uneven

8 points by nrposner


My day job, such as it is, involves optimizing simulations and scientific tooling. Right now I'm working on an astrophysical simulation with a group at CUNY. One of the grad students has spent the last few months working on a tool to process the output of a simulation.

The output is pretty big, about 200GB for a local test run, probably going into the tens of terabytes once we do a big run on the actual cluster. The tool, which needs to walk the output tables to construct a tree of black hole mergers (and other events, but that's the focus), takes about an hour to run. I answered a request to take a look and see what can be done to speed it up.

The first thing I discover is that the data is split across tens of thousands of .txt files, with every simulation timestep producing several individual tables, some of them just a few rows, others tens of thousands of rows.

The second thing I notice is that the postprocessing code is looping over the files, reading the same one multiple times in some places, to extract the merger information. There's a gigantic dictionary of dictionaries, and the leaf dictionaries are manually simulating a binary tree using labels as keys ("root", "A", "B", "A1", "A2", etc), and the values are pandas dataframes.

It is very difficult to understand. I am reminded that astrophysics grad students have a great deal of brainpower and focus available to them, and this may sometimes be counterproductive.

There's no good way to optimize this code in-place. Luckily, I've built some credibility with this team, so they trust me when I basically tell them we're going to redo the tree construction code entirely, and try to preserve the graphing code, which is also elaborate but is a lot saner, mostly just trying to work within networkgraph's preferred input mode.

Still, I get them to turn their runner into a script rather than a jupyter notebook, install snakeviz, and get a profile on a short run. They audibly gasped when they saw the snakeviz window pop open, and they could just see where all the time was going (mostly walking lots of small in-memory dataframes and loading them from txt). Thing is, they've seen this tool before, I've showed it in previous meetings for other performance work on the main simulation, they just thought it was something I coded up manually rather than something they can also do with cPython's bundled profiler and a single pip install.

It really shouldn't be shocking, since about 2 years ago I was in pretty much the same place, but it surprised me anyway. I sometimes think we need a 'Missing Semester of Your CS Education' equivalent specifically for scientists who got introduced to Python + data science tools and use that for pretty much everything. Intro to profilers and debuggers, the python memory model, useful/harmful data structures, and when NOT to use a dataframe. I think it would be useful.

jvns

might be worth checking out Software Carpentry if you haven't come across it already. Their mission is to teach workshops to help scientists improve programming skills.

Relax

Well, software engineering is a whole discipline itself. It's not that surprising that scientists and other non-SWEs don't really have the understanding and experience to make good decisions on projects like this. I think we're just so close to it and have internalized a lot that we often forget this.

I don't necessarily disagree with your missing-semester idea but I think it'll take more than a semester...

Anywho, I spent a lot of time in biotech and ran into this quite often myself. So many conventions in bioinformatics are weird and wacky. My favorite is cDNA coordinates: they're one-based, which is annoying but not bad, but the coordinate that comes before 1 is not zero but negative one! That one has been the source of many bugs, especially in range computations.

th0ma5

The last decade or so of my professional career was to try to assist PhDs with rapid prototyping. If we can get people to understand abstracting all of the I/O into separate functions, that everything is essentially an if statement or a for loop, and that strategies for dividing and conquering data tasks are paramount, then we're doing pretty good.

But I feel like everyone who works in a career getting eaten by software all have to go through a process of feeling super empowered to the crash realization that the code in their makeMeJeffBezosFinally function isn't working just because of their code. I wish all of these kinds of people luck, but, they also need less snake oil salesmen telling them things should be easier so just buy their snakeoil.

mempko

At this point is science possible without computers? Some scientists are now using LLMs to build software for their research. What are your thoughts on that? Could that enable scientists to do better work or will it worsen what they are doing?

madhadron

University of Virginia's physics department offers basically that course for its undergraduates. I advised on its curriculum when it was created. That being said, there's a big tool gap that I gave up fighting when I left science: software engineering is about producing a program as a reproducible artifact. Computational science is about producing an execution of a program as a reproducible artifact. The last step I took on this path was https://github.com/madhadron/bein which generates an execution and in it you pull its inputs from a tiny LIMS (Laboratory Information Management System) and write the results back, and have a web page to see and track the executions. It doesn't track the source code, sadly.

If I were starting from scratch I'd take something like Oberon plus modern Fortran style array capabilities, give it direct access to Parquet for reading and writing, and only let you load files from the LIMS and write files to the LIMS or specify parameters in your run options. Each run gets recorded along with its source code, parameters, and links to its inputs. Set it up so it's easy to restart an execution in the middle so you can write checkpoints, and make it easy to enable/disable tracing of specific functions and what they're called with and what they return, or what the values a specific variable takes during a loop, while it's running. You need a good plotting library, of course.