the scapegoat dev

Embedded programming is like web development

(I wrote a follow-up article: Embedded programming is not like web development)

I often see people discuss embedded development and web development as being two opposite sides of the spectrum of software engineering: one is low-level and hardcore, and the other one is high-level and almost trivial. After more than 20 years working in both domains, I have come to view web and embedded as highly similar—I can use the same approaches in both worlds.

The usual discourse goes as follows:

Web applications and embedded systems are both distributed systems

In an embedded system, you have sensors, actuators, multiple microcontrollers, often a Linux system, increasingly standard cloud connectivity, and over-the-air updates. In a web application, you have client browsers, servers, storage services, databases, caches, logging, and monitoring. These components need to communicate to present the user with the desired functionality.

Furthermore, these components need to be monitored and maintained. The system is usually permanently online. Building software updates is intricate; distributed and update processes often require orchestration. Debugging at scale usually requires monitoring and log collection, as interacting with any individual component is often impossible.

Web and embedded software engineering is remarkably similar

At a more technical level, the software and architecture of web and embedded systems are built on the same underlying abstractions and must fulfill similar constraints.

At a higher abstraction level:

The similarities are even more striking once we zoom in on the code level:

There is a lot to learn from both fields

I have learned a lot from working in both domains and have carried over not just ideas but actual code and tooling. Framing embedded development as low-level systems requiring advanced skills versus web development as a free-for-all, low-hanging fruit obscures how similar they are.

Both are hard to get right, both benefit from a holistic systems approach, and actual code and tooling carry over surprisingly easily.

I plan this to become a longer series that explores what I learned in my career in web and embedded, so stay tuned!

Feel free to comment on HN.