PNAS: Dr. Mathochist, Software Engineer

I've decided to do a new round of profiles in the Project for Non-Academic Science (acronym deliberately chosen to coincide with a journal), as a way of getting a little more information out there to students studying in STEM fields who will likely end up with jobs off the "standard" academic science track.

The thirteenth profile of this round (after a short hiatus for relentless book promotion) features Twitter's own Dr. Mathochist, a mathematician turned software engineer.

1) What is your non-academic job? I'm a software architect at a small company working on a mixture of contracted and open-source projects, mostly dealing with spatio-temporal predictive analytics. Most of my projects are developed for the Java Virtual Machine, almost all in Scala.

2) What is your science background? I have a B.S. in mathematics from the University of Maryland, College Park, and a Ph.D. in mathematics from Yale University, where I focused on certain category-theoretic approaches to quantum topological invariants.

3) What led you to this job? After leaving academics, I intended to find something in the private sector, likely near the Washington, D.C. area where I grew up.

While I was still working in academics I had a math-oriented weblog I used to have more publicly visible writing than the usual research/publication cycle would allow. I aimed it at the level of an interested lay audience, trying to break down much of mathematics into manageable chunks. One of my readers noticed I had a Twitter account and followed me; I looked at his feed to make sure he wasn't a bot, and I saw he mentioned his company was hiring programmers in Charlottesville, Virginia.

4) What's your work environment like? (Lab bench, field work, office, etc) I work in a home office in my apartment. The company has provided a Linux-based desktop workstation with the development environments necessary to work on our projects (IDEA, git, and some others as projects call for them).

5) What do you do in a typical day? I have a number of tickets corresponding to tasks to work on.

Some of them are bugs that other programmers or users have reported. For these, I take the information provided -- what they did, what they expected, and what actually happened -- and try to diagnose why something unexpected happened. Then I work out how to modify the code to get the expected result.

Other tickets are new features to be implemented, or larger-scale restructurings to clean up the code and make it more flexible for future extensions and repair. These require much deeper structural thinking across large sections of the code base to determine the appropriate way to implement the desired behavior.

I also function as a reference for more junior programmers, particularly as regards functional programming in Scala. Scala is a language and functional programming is a style that most incoming programmers are at most hazily familiar with. Part of my job is to improve their understanding of not only what the right way to implement a given feature is, but why that's the right way, and why certain bad habits are bad. I also explore new approaches to software design that we might make good use of in our code, and explain these to other programmers.

6) How does your science background help you in your job? Diagnosing bugs and designing new features both require significant amounts of abstract thought to reason through what the machine will do in any given situation. Bugs, in particular, tend to arise when the original programmer's reasoning depends on hidden assumptions that turn out not to be true in real-world environments. The process of determining these assumptions, understanding why they fail, and shoring up the reasoning in light of the new information is very similar to the process of refining a mathematical proof.

On a deeper, level, mathematics and computer programming are deeply linked, and many of the structures underpinning abstract mathematical theories -- particularly those that category theory investigates -- turn out to be deeply related to common structures and patterns that arise in computer programming. The semantics of functional programming languages -- which are coming to more and more importance in practical coding these days -- are intimately linked to category theory.

Beyond the programming itself, my academic background involved teaching students, and the skills I picked up in the classroom and office hours translate very easily to explaining the ins and outs of programming best practices to others in the office.

7) If a current college student wanted to get a job like yours, how
should they go about it?
The most direct way would be to major in computer science, or in mathematics with a significant computer science component, including a variety of programming languages and both functional and object-oriented software architecture. The upper-level mathematics courses, particularly abstract algebra, will help develop reasoning skills and introduce a more general language that can be used to describe similar patterns across different approaches to programming.

I would also suggest taking courses in some supporting field. My particular company looks for programmers with a background in machine learning (often found in statistics or systems engineering) or design of experiments (other engineering fields). There are other companies that look for backgrounds in biology, chemistry, finance, and many other fields, and having some subject-matter expertise can really help.

8) What's the most important thing you learned from science? How to think deeply about a problem, to understand it inside and out, to be able to propose many different possible solutions, and to know how to judge between them.

9) What advice would you give to young science students trying to plan
their careers?
Plan defensively and with a realistic understanding of various job markets.

Academic research is fascinating, but it's all too easy to focus on that side of it and forget how incredibly difficult it can be to actually make it work. It's also easy to paint yourself into a corner where you don't have a lot of skills that are immediately transferrable to non-academic employers. It can be an uphill battle to explain the value of more general research skills in the context of a job interview; I was lucky enough that the company I work for was started as a side-project of a professor in the systems engineering department of UVA, so they already understood the value I could bring.

10) (Totally Optional Question) What's the pay like? In a word: great. Four years into my post-academic career and I've cracked six figures, which may have been only a distant dream in an academic career. The regular raises more than outpace cost of living, even staying at a single employer.

Not only do I not consider discussions of wages and salaries rude, I think that dismantling the stigma around them is essential for the good of all sorts of workers. It's particularly true in this case, where some of the more harmful elements of academic culture try to shame students into staying against their own best interests.

I'm all for the noble pursuit of knowledge for its own sake, but when you're forty, living paycheck-to-paycheck, scrabbling each semester to put together five adjunct positions at three schools each an hour away from the others, none of which give you health insurance, let alone a retirement plan, the noble pursuit of knowledge isn't looking forward to make sure you'll have a roof over your head at sixty. Shaming people out of talking honestly about money is part of what keeps you from thinking about this reality when you're twenty, and it should have no part in realistic career planning.

More like this

Dr. Mathochist,

How did you make the transition from mathematics to programming when transitioning to industry? Did you do any programming for you dissertation? Or did you teach yourself languages on the side? I'm asking because I am in an Applied Math Masters program, and I'm wondering what kind of advice you can give me before looking for internships/jobs. I don't have a whole lot of programming experience, aside from some MATLAB.
Any advice would be greatly appreciated!