- Proficiency in a low-level language (C, C++ or Rust)
- Part choosing
- PCB design
- Knowing how to read datasheets and reference manuals
- Understanding how registers work
- Coding without an allocator
- Balancing performance with power-saving (battery-powered devices etc)
- Control flow patterns unfamiliar to desktop work (Interrupts etc)
- Knowing the capabilities and quirks of the specific hardware you're using
- Setting up a toolchain etc
- API design for turning register-level code into something practical (like writing drivers or a HAL)
- Soldering
How you can start: Buy a dev board; ARM Cortex-M is a good choice. Eg an STM32 Discover board, or NRF52 board. Either choose an appropriate IDE for C/++, like STM32 Cube, or clone the Knurling App Template for Rust.Figure out a project you'd like to do. Make it happen using the dev board. Ie buy input and output devices, perhaps on breakout boards. Once you're comfortable with this, learn PCB design software; there are some OK free ones like KiCad. Design and order some custom boards. Learn to solder parts their assembly service doesn't have, or won't install.
As an aside to proficiency, there's something rewarding about making a program that has no noticeable latency due to lack of conflicting priorities, and bloat associated with web and GPOS programming.