Software Understanding in the Sciences is Really Uneven
8 points by nrposner
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.
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.
I was loosely involved in helping at Software Carpentry sessions for a while, and I found it a frustrating and disappointing experience (although I didn't stay at that workplace for long, and so didn't get a chance to see all aspects of the program).
The group I was with would spend a lot of time teaching the sorts of skills that professional software developers might have, but they always felt kind of disjointed from the actual problems people were running into when they were coming to us for help. So we'd look at a project that was just chaotic spaghetti Python, and the best we could offer was a workshop on running tests with GitLab's CI/CD system. Which isn't necessarily a bad skill, but it didn't really solve the underlying problem that the scientists had, which was that they didn't understand how to decompose a complex problem into useful components in a software system.
And like, how do you even teach that? That's something I was still figuring out after four years of university specifically learning how to write software. I still mostly do it by intuition and feeling - I like to think I'm quite good at it, but I struggle to describe what exactly I'm doing. How do you condense that sort of knowledge into a set of courses for someone for whom code is just a means to a an end? Someone doing brilliant work in Organic Neuroquantum Dynamics is not interested in the finer points if software coupling, they just want their code to work so they can get on with discovering useful things about the world.
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.
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.
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?
I don't have numbers on this, but would assume that most scientific use of computers isn't intensive. You use Python/R/Excel to record and run the numbers produced by an experiment or produce visualizations. In the past, the same work would have been done more laboriously with calculators and pencils, computers just accelerate the process.
I expect the proportion of scientific research that makes use of truly custom-built software (and where poor performance of that software is a real problem) is small, but growing. In many of those cases, I do think that LLMs have utility. I don't want that stuff to be vibecoded, but a quick audit/review by LLM can catch the biggest issues quite effectively, show them how to run a profile, point them towards useful tools, tell them why looping over thousands of small files is a bad idea, etc.
The problem with that is that these researchers are not primarily software engineers, and yet their understanding of the code they write and what it does is arguably the core product, as much or more than its actual output. If they lean on the LLM and vibe-code it, that goes away. You could plausibly get 'better' software (in that it makes the lives of people like me easier) and it wouldn't be worth it. Maybe with a light touch, but it has to be a light touch.
At this point is science possible without computers?
Of course. It's important not to confuse the small areas of science where computation and writing code is the limiting factor with all of science. The vast majority of science is limited by the actual observation. Most scientists aren't limited by software at all. They're limited by growth rates of organisms or access to telescope time or the dozens of steps and incubation time of biochemical reactions or the number of person-hours you can get doing surveys in a bog.
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.