Tuesday, September 28, 2004

Mental models

I spent an hour or two yesterday evening correcting a problem in the error-handling code for one of the finite element programs I develop. Today, I spent some hours tracking down a problem in the eigs routine in MATLAB R14. There were two issues, one of them subtle and the other obvious but hard to locate (it resulted in a negative value which would be theoretically impossible -- even in floating point -- if things were working right). This evening, I walked to Long's to buy machine oil so that I could fix the office door lock, which had become nearly impossible to open.

In total, I've spent about half the productive hours since this time yesterday working on fixing problems with one thing or the other. But it's easy to see how those few hours could have become an entire week. So why didn't they?

The reason I'm spending this evening trying to clarify several pages of tedious algebra that I wrote a year ago rather than trying to diagnose problems with eigs and locks and sealing wax is that I have a set of mental models -- of all sorts of things -- that I can employ to find likely problem causes and solutions. My mental model of a lock is pretty crude -- you push in the key and it lifts the pins -- but it's sufficient to tell me that a little oil will probably help things along. My mental model of what goes on inside of eigs is a good bit more sophisticated, and includes a general mathematical component (which is what told me something was very wrong when I got negative numbers for this particular problem), a software architecture component (which told me where to start looking in a thousand line mass of MATLAB code), and a numerical analysis component (which told me why one of the bugs has probably remained undiagnosed for the past several years, and has made little difference to many users). My mental model of my own code is even more sophisticated, since I wrote the thing, and since I've been writing similar codes -- and thinking about how they should be written -- for a few years now.

Now, this collection of mental models is pretty handy for me. Some of those models contain a lot of details that few other people know about, which is probably why people knock on my office doors and ask me questions and then get excited by the simple (sometimes) answers and go off to do cool things (this is how most of my current collaborations got started). But I have not yet figured out how to do a telepathic brain dump to instantly teach another person everything I know about computer arithmetic or real analysis or mixed-language software engineering. I've been tuning some of those skills for over a decade, and while it takes me less time to teach them than it did for me to learn them, it's not an instantaneous thing. But I have more ideas than time, and I would dearly love to give someone enough of my mental models to make some headway on the ideas I end up neglecting.

I suppose I ought to finish being a graduate student before I start aspiring to take on students of my own.

  • Currently drinking: Jasmine tea