The bug is often not in your code
This is the thing that separates embedded from other software work.
A signal is noisy. A pull-up is missing. The clock is configured differently from
what you assumed. A sensor returns garbage because the bus timing is marginal. In
each case the code is correct and the system does not work, and no amount of
staring at the source will show you why.
Learning to reach for a scope instead of another print statement is the shift
that makes an embedded engineer.
Print statements change the timing
Almost everyone starts by debugging with UART prints, and it works until the bug
is a timing problem.
Then the print itself changes the timing and the bug moves or disappears. A
hardware debugger — breakpoints, watchpoints, reading stacked registers after a
fault — is how the job is actually done, and being fluent with one is visible in
an interview within a few questions.
Interrupts are where the hard bugs live
The classic failure is a long interrupt handler, and the classic symptom is a
system that works fine for hours and then misbehaves once.
Race conditions, missing volatile, non-atomic access to a shared variable —
these produce faults that cannot be reproduced on demand, which is exactly what
makes them a favourite interview topic. Understanding them well is a genuine
differentiator early on.
A steadier field than it looks
Entry salaries are lower than web and cloud roles, and the ceiling is comfortable
and the churn is much lower.
Fewer people can do this work, the hiring is concentrated in serious product
companies, and the skills do not go out of date every eighteen months. If you
like hardware, that trade is a good one.