For as long as I’ve been a professional software engineer, I’ve struggled to explain to people what I do for a living. Most people think that all software engineers are the same and that they are all equally skilled at developing iPhone apps or the software in self driving cars. I can forgive the lack of understanding from the general public but many managers seem equally ill informed. Often a person will come right out and ask, “So what kind of software do you write?”. In those moments, I’ve always struggled because I’ve always lacked a term. I’d mostly answer, “low level” or I’d refer to “the metal” or similar reference.
Now, I’ve become increasing comfortable with the term, “system software”. No, I’m not a kernel developer but I’ve helped debug one. Mostly, I’ve been working on high performance computing applications or the tools to enable them, boot loaders, board support packages (BSPs), device drivers, middleware, profiling tools, debuggers, firmware, exception handlers, fitting math routines to vector instructions, integrating new hardware and software, and on and on. At times, I’ll write or tune some application code; often when performance is critically important. I find writing system software to be the most rewarding since I most often get to see my work leveraged into a much larger final system or product. My career started writing software for vision guided robots which was the peak of immediate feedback. If your robot crashed it’s camera and lighting rig into the work-surface, you likely skipped a few steps debugging code! That’s a true story but thankfully wasn’t me and for that poor engineer a particularly bad day. However, the good days could be great.
I recently started a new large project with an extensive collection of multidisciplinary engineers responsible for the many facets that make up the final product. As one of the system software engineers, I’ve being breathing life into a mass of new hardware. This will be fun!