From Sales to Embedded Systems: My Journey

Adam Hott
September 18, 2024

In 2021, after years in technology sales and a failed attempt at running a software development business, I knew I needed a change. I wanted to return to my coding roots and dive into something more hands-on. By 2023, I was exploring the Rust programming language, particularly drawn to its safety features. After relocating to Lisbon, I found the freedom to experiment, and that’s when I stumbled upon Embedded Systems—a field that reminded me of my childhood fascination with disassembling and tinkering with electronics.

This is the story of my transition.

The Struggles

Learning the Basics

Transitioning from sales to embedded systems wasn’t easy, even with my background in software programming. The simplest tasks, like getting an LED to blink (the “hello world” of embedded systems), felt monumental. The internet is full of resources, but the sheer volume of information made it hard to know where to start. Add in the equipment costs, and the initial barrier seemed overwhelming.

For my first project, I followed a YouTube tutorial to design a Printed Circuit Board (PCB) using KiCad. I eagerly awaited the arrival of my PCBs from China, only to realize I had left some components off the Bill of Materials (BOM). The result? Half-assembled boards that I had to finish by hand-soldering tiny components I wasn’t yet skilled at working with. To make matters worse, the boards weren’t even programmable! But every mistake taught me something valuable about the PCB manufacturing process.

Challenges with Embedded Rust

After some time, I took a course with a reputable Embedded Rust training company, which fast-tracked my learning by six months. However, every new Microcontroller Unit (MCU) felt like its own little world. I worked with ESP32s, STM32s, RP2040s, and Micro
V2s, each with its own quirks.

Handling linker errors in Rust was another hurdle. The process of setting up correct build configurations and managing dependencies was far from straightforward. Then came asynchronous programming—a whole new beast. “Fearless concurrency” is a term Rust enthusiasts like to use, but achieving it was easier said than done. Several days were spent just reading books on async programming to grasp the fundamentals.

Real-World Mistakes

My internship at Jitter was a turning point. I learned how an embedded team works together and faced new challenges—like dealing with orderly commits and code reviews on GitHub. During this time, I made another rookie mistake: selecting an MCU that lacked an internal antenna but had a connector for an external one. When the prototypes arrived, we had to purchase external antennas just to get Wi-Fi working. These small oversights might be fixable in a prototype, but in full-scale production, they could cause major delays and cost overruns.

The importance of PCB design became even more apparent when I used a footprint from an online resource, only to find it was incorrect. Thankfully, the pads were close enough to what we needed that I could hack a solution by hand-soldering the prototypes. Still, it was a costly lesson that would’ve been much worse in a production run.

Overcoming the Challenges

Small Wins

Despite the steep learning curve, I had several breakthroughs. One project involved placing multiple LEDs in a precise configuration on a PCB. It required out-of-the-box thinking, and while I couldn’t fully automate the process, I managed to create a partially manual solution using Python in KiCad. These moments, where I could apply software tools to solve hardware challenges, were deeply satisfying.

Writing a custom driver for an LED from scratch using only the datasheet was another victory. It bridged the gap between hardware and software and gave me a sense of accomplishment when the LED finally blinked.

Continuous Improvement

As my skills grew, I began to understand the importance of managing libraries and modules systematically, particularly in larger projects. Learning to use GitHub Actions for Continuous Integration and Deployment (CI/CD) was also a game-changer, although it came with its own set of complexities. It required a lot of trial and error, but I eventually got the hang of automating these processes, making my workflow smoother and more efficient.

The Payoff

After months of studying, training, and interning, I secured a full-time role as an Embedded Engineer. I’m now working in a field I love, combining my passion for hardware and software to create products that go beyond imagination.

Final Thoughts

If you’re considering making the leap to embedded systems, my advice is simple: go for it, but only if you’re ready for the grind. The road is challenging, and it may take time to see results. But the rewards are worth it. What meets you on the other side of the challenge is the ability to innovate. You might even solve a problem we don’t even know we have yet! Or just build a glow in the dark cow that goes “moo” (still an innovation I think)!

So, are you ready to take the plunge?