Finding the right people for your embedded software development can be a challenge. Sometimes this becomes painfully obvious late in a project.
Bare metal firmware is a different animal. You need more than just a programmer. Skills in the electronics domain are important as well.
Application Code
Your embedded project may be best suited for an RTOS or as a standalone program. This decision should be made carefully at the beginning of a project. You'll want experience behind this decision as it can effect your project long-term.
Custom or vendor-provided driver code can be troublesome. Even when CPU vendors provide driver code, it rarely is out-of-the-box compatible with your needs.
Networking has become more common with embedded controllers. From old-school RS-485 networks to TCP-based solutions you'll have it covered.
Remote upgrades are often desirable and bootloaders are a common feature in modern controllers. Bootloader development requires a complete understanding of the architecture.
All devices will fail eventually. It's important that you reduce the likelihood of failures and have recovery mechanisms in place for these events.