Resources for a Career in Embedded Software
I recently started working as an Embedded Software Engineer. Many of my peers ask what Embedded Software even is, as there are few resources for people interested in understanding Embedded Software.
I saw this article by D-Rev for people interested in a career in design and social impact and was inspired to compile a similar list for Embedded Software. Hope you enjoy it! If you have something to add, leave a response.
Thanks to Vikram and my mentors for contributing their own advice.
So, what is Embedded Software?
Embedded software is software for hardware. Embedded software controls hardware devices or interfaces directly with the electronics, whether with peripherals like lights or a bluetooth chip or internally moving bytes around on a microcontroller’s registers.
Some examples include Square’s card readers, the low-level code running on your TV remote, and Fitbit’s embedded algorithms, which estimate when you take a step. Even the touch screen on your iPad likely has embedded software, or firmware, to determine whether you are using your finger or your palm. And every laptop will have many embedded software drivers that define how to interface with devices such as a USB keyboard.
We often don’t think of these devices as running code because they don’t look like PCs. But when a physical device needs complex logic, it will usually run embedded software.
Often, embedded devices have constraints like timing, price, and reliability. For example, the embedded software on a pacemaker or airplane controls can’t fail. Unlike a personal computer that blue-screens, we usually can’t just go in and restart an embedded processor.
With these constraints, embedded software is often specialized for specific hardware. Today, Embedded Software Engineers (ESWs) might work across many different platforms, prototyping on an Arduino, building drivers on an ARM-Cortex with Embedded Linux, down to making a final product on a 30-cent PIC, where you may have to write your own C library to work with numbers greater than 256.
How does Embedded Software work compare to other software?
- Like other systems software engineers, you write code to build systems. This may be an embedded product like Square’s card reader or it may be an real-time operating system like uC/OS-III.
- Timing constraints. Embedded devices often need to react real-time. Car sensor chips can’t give a driver on the road the spinny rainbow circle of doom.
- Low cost, power, and memory. You can’t have them all, but embedded software engineers must learn to make it work on a minimal system.
- Limited debugging tools. You may need to utilize slow printf’s or even turning an LED on or off. JTAG and in-circuit emulation for high-end systems.
- Hardware matters a lot. As an ESW, you’ll help Electrical Engineers bring up the board while it is still buggy. You will iterate on software while EEs iterate on the circuit board.
- Testing is hardware-centric. Testing includes software unit tests, continuous-integration hardware tests, and full-system functional tests.
- Design planning is important. Choice of hardware hugely determines the development process, and you may have to live with unchanging hardware choices. Agile/Scrum is possible but less applicable than it is for web development. Lots of people use the Waterfall method.
- But it does not mean that hardware is not changing. Hardware operations may decide to switch out for a cheaper capacitor, meaning those highly-tuned constants you chose in the firmware are no longer correct.
- Deploy process. Updating embedded software is often not possible. How do you debug an embedded device in the field? Is the device even replaceable?
- Tangible Product. In the end, you build a physical product, which is the most satisfying thing to see it out in the world. Some of my favorites:
A Candidate’s Skills Checklist
Preparing for a career in ESW? Here’s what interviewers look for in ESW candidates they think will be able to tackle the problems above.
- Expertise in C programming. While some teams do use embedded C++ or Python, C is still the most widely used. Rust is a modern alternative.
- Experience with an assembly language
- Fluency in concurrency
- Write code with constraints like limited memory and power
- Software design principles for robust, understandable, testable code
- Hands-on debugging. JTAG, oscilloscopes, and logic analyzers are your friends.
- Communicating engineering design. ESWs collaborate closely with many teams, so it’s necessary to communicate ideas clearly and understand trade-offs across teams.
Advice for Students and New Grads
Here’s how you can get ESW practice and demonstrate the above skills to companies you’d like to work at.
- Build. There’s nothing that can replace hands-on experience.
- Personal Projects. Your project might not be exactly like the work you’ll eventually do, especially since the platform will be different. Don’t worry! Do a project you really enjoy.
- Hands-on classes like Embedded Systems or Robotics
- Student organizations such as Solar Car
- Internships. Smaller companies often give interns a wider variety of learning experiences than large companies, so don’t rule them out.
- Document your experiences with YouTube demos, GitHub page, or blog posts describing your process and design
2. Understand the concepts. Read up on C programming, real-time operating systems, state machines, concurrency, computer architecture, digital and analog circuits, communications protocols, schematic design, compilers.
3. Stay up to date with embedded blogs, forums, and podcasts
4. Prepare for the interview.
- Most of my embedded software interviews have centered around vanilla C programming with some threading. Some have been hands-on with an Arduino or microcontroller and IDE, but you won’t have to memorize communications protocols, for example.
- Know another programming language, in case your interviewer asks you a C-unfriendly question.
5. Be flexible
- You may not build a life-saving device in your first job. Still, take the opportunity to learn from senior engineers and build a foundation for your career.
How to become a better Embedded Software Engineer
If you’re a new embedded software engineer and looking to get to the next level, here are some ideas.
- Write clear, clean, testable code. This is the staple of your work and the baseline by which you’ll be measured.
- Own your code. Write your own unit, integration, and functional tests. Take the time to learn how the module you built fits in at the system level.
- Write design documents to get feedback on your ideas and get your ideas heard.
- Learn from your team: ask questions, shadow, and pair-program
- Review code. This is a chance to learn about how teammates think about design tradeoffs.
- Ask for feedback regularly.
- Understand the teams in the technology stack above you (OS/Application) and below you (Electrical).
- Develop an expertise in an embedded software area. Some examples include hardware security, software release process, automated testing, embedded algorithms, kernels, a specific communications protocol stack, board bring-up. Become the “go-to” person for a specialty.
- Be able to work on many parts of the product. Despite an expertise, you need to be able to transition to where work needs to be done.
- Teach — mentor an intern or present your work to the larger team.
- Get familiar with build and debug tools and equipment.
- Get fluent with development tools: Cross compilers, build systems, debuggers, IDEs, automated testing, oscilloscopes.
- Understand practical constraints like noise and clock jitter and how to build robust software
- Learn to read microcontroller reference manuals.
- Document your work. Neither your manager nor you are going to remember the components you built three months ago.
- Participate in strategy definition and timeline planning.
- Join a cross-functional effort to get experience across teams.
Now get out there and build some software! Good luck!
More Resources
Career Articles
- Quora: What does an embedded systems engineer do?
- How new grads can overcome the 3–5 year experience hurdle
- Jack Ganssle’s Thoughts on Becoming an ESW
Courses
- UT-Austin Web Course
- Berkeley’s Embedded Systems Course
Forums and Blogs
- Embedded
- EE Times
- Embedded.fm Podcast
Project Development Platforms
- Arduino
- Beaglebone Black
- Intel Edison
- Raspberry Pi
- Firestorm platform from UC Berkeley
- Texas Instruments LaunchPad
- STM32
Introductory Books
- Making Embedded Systems: Design Patterns for Great Software
- Test Driven Development for Embedded C
- An Embedded Software Primer
- Designing Embedded Hardware
- Embedded Linux Primer
Don’t Know where to Start?
- ESW 101: Microcontroller Basics
- Make a project with some inspiration from Sparkfun: https://learn.sparkfun.com/tutorials/tags/projects
- Understand Sparkfun’s concept and technology tutorials. https://learn.sparkfun.com/tutorials/tags/concepts