Problem-Solving Like a Generalist

Stack of Books

I develop embedded software, but if you look on my coffee table, you’ll see books on a wide variety of programming topics — information retrieval, garbage collectors, and so on. This would strike some people as strange. Shouldn’t I be focusing on electronics or something?

Yes and no. I consider myself an “embedded specialist,” and I focus most of my time (and professional development energy) on that field. And yet, I believe the best way to stay creative is to learn new things and think in new ways. When you see a problem through the lens of another field — and approach it using the tools of that field — new possibilities invariably open up. This is why AO makes a point of hiring generalists; they’re better prepared to make these connections.

Indexing Systems & Information Retrieval

For example, I’ve always been fascinated by indexing systems. (I wanted to be a librarian as a kid.) Information Retrieval, the proper academic term for the field, is rich with strategies for efficiently navigating, compressing, and cataloging data. While these tasks can be handled effectively by generic tools like hash tables or zlib, projects often benefit from more specialized approaches. (There’s a reason why Knuth’s third volume focuses on searching and sorting!)

Data Compression & Memory Efficiency

Data compression is particularly important for embedded systems, since they are typically running out of space. A general-purpose library like zlib may be significantly larger than the microprocessor’s entire storage, so simpler methods are required. IR researchers have discovered several ways to shrink indexes, such as gamma encoding, that are just as applicable to data tables in EEPROM.

Garbage Collectors & Resource Management

Research about garbage collectors (GC) is also full of practical ideas. Most systems need to track the life cycle of some sort of resource — keeping track of what data should stay cached, which resources are closely associated, or when files need to be closed. It just so happens that GC is an entire field with decades of research into these problems, exploring different trade-offs. (If you’re curious, Paul R. Wilson has an excellent survey paper on garbage collectors.)

Many systems benefit from applying custom resource management techniques, rather than relying on a general GC; those are tuned for common use cases, and developers are more likely to know about the behavior of their specific data structures. For example, there may be short-lived objects that can be pooled and reused, avoiding the overhead of the entire allocation/tracing/freeing cycle.

Understanding how garbage collectors work also makes it easier to avoid triggering their edge cases. After studying GCs, it will be much clearer when weak pointers are necessary in Java code, why space leaks can occur in Haskell, and why platforms handle some patterns of allocation far better than others.

That’s Just the Tip of the Iceberg

Specialized domains have a wealth of information about common problems:

  • Bioinformatics literature is full of algorithms for fast string searching and matching — they don’t have to be used on genetic data.
  • Game developers have discovered impressive performance hacks while fighting to keep the frame rate up.
  • Telephony systems’ need to isolate failures have led to novel perspectives on error handling.
  • Web developers could learn a lot about real-time programming by dabbling in embedded, since planning for real-time guarantees has always been a concern.

Our lives are busy, and we should think carefully about how we invest our professional development time. I’d encourage you to make room for new things — to broaden your horizons a little, to step outside your narrow field. I’m sure you’ll be pleasantly surprised by how your new knowledge comes in handy.

And if you have any examples of how experience in one domain can help you see new opportunities in others, please let me know in the comments.

If you’d like to hear more about how learning unusual data structures can make you a better developer, I’ll be presenting at Detroit Lambda Lounge on Wednesday, June 27. I’ll also be speaking at this year’s Strange Loop in St. Louis on September 24.