Most industries change over time, and some are even significantly disrupted. I would argue the embedded industry is quite conservative and resistant to change. For example, in spite of all the hardware and connectivity changes over the last 20 years the tasks of an embedded developer haven’t changed much.
One significant change, however, is the skillset and background of today’s embedded developer. Many of the new embedded developers come equipped with far less understanding of underlying hardware and software than previous generations. While embedded software developers of the past typically had a hardware background, many new embedded and IoT developers were taught programming using Java, and can often come from an app or web development background.
This has both its pros and cons. On the positive side, these developers are often well-versed in software engineering principles, software architecture, and the web technologies embedded systems are connected to these days.
On the downside, even seasoned developers coming from other parts of the software industry have a hard time understanding some of the quirks that are specific to embedded development. Some of these include:
- Understanding and writing linker configuration files
- Power-on-reset handing
- Special function registers (SFR) and device driver development
- Interrupt vector tables and writing efficient interrupt handlers
- Use only a subset of the C/C++ language due to resource constraints
- Bare metal development or limited OS services
- Flash programming and JTAG debug probes
- Debugging using disassembly code
- Debugging using an oscilloscope
…and the list goes on. It appears many universities no longer include these important topics in their curriculum anymore, putting new embedded developers at a serious disadvantage.
However, seasoned embedded developers, often with decades of experience in small 8-bit microcontrollers, may not have had much experience in software engineering principles of great use in larger, 32-bit systems, such as:
- System design using UML or other high-level descriptive languages
- Change and version control management
- Bug tracking
- Static source code analysis
- Source code reviews
- Unit testing
- Code coverage analysis
- Continuous integration and nightly builds
Developers with a background from the PC, mobile or web industries may be at an advantage here. Additionally, with many embedded devices being connected to the Internet, a whole new set of skills may be needed in the embedded development teams.
Consider for example:
- Integrated TCP/IP stacks, thus mandating the use of an RTOS
- Webservices or other remote procedure call mechanisms
- IoT protocols, like CoAP or MQTT
- Remote device management using, for example, LWM2M
- Bootloaders with remote firmware upgrade mechanisms
- Server-side messaging servers, rule engine servers and database servers
- Data analysis, for example using predictive analytics and machine learning
- End-to-end security from silicon to cloud
In the past, embedded developers mostly had to understand schematic hardware diagrams, assembler code, and basic programming skills in C. Now, the demands of modern embedded developers have exploded, and embedded developers need to be jacks of all trades.
I would argue the detailed hardware understanding of traditional embedded developers might be harder to learn than most of the software engineering and web technologies, but these areas, because of their breadth and scope, may take more time to grasp.
No matter how you put it, both skill sets are needed in most development teams these days, and developers can jump over the fence from either direction, thus complementing their skills and widening their expertise and employability.
What is clear is that the demands on embedded developers are increasing rapidly, and new skills will be needed for future embedded developers.
Long live embedded developers!