It's not as hard as it seems.
I'm doing it all, hardware, drivers, system services, userspace.
With hardware, you have very fix constraints what you can do. Connect the dots, and it should work. Miss a thing, and nothing works. Almost everything can be seen as a module; most stuff comes to you as an eval kit that you can fit (somehow) to your current hardware. Thats where you test if it does what is promised, and learn quite early what's missing.
We regularly go through 3-4 hardware stages, with only minor modifications. Most common mistake is mixed up connections (swapped RX/TX lines, confusing connertor pin count), and very seldom you have quirks that you find late in the process.
The complexity is much less than software, because it can't grow additional features over time, as software does. If it wasn't there in the design, you have a hard time adding it later. So you have to test every feature early on, and are fixed to these decisions.
Interesting! It looks a lot harder, but you're right: physics may be scary (to me at least), but it is extremely dependable.
Machine environments on the other hand..
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.