I'm going through this right now. As a full stack developer, I found Hardware Academy (paid) to be good, and they have guides and forums you can ask questions. [1]

Over the last six months, I have built about five prototypes ranging from 12x10 inches to about 4x4 inches in size. Right now, I've it all fitting in a 2x4 PCB and 2x4x1 3D printed enclosure for customer evaluation. I didn't build the last piece, someone with expertise in hardware built it for me.

I don't have much time (hardware project ;) ), so I will jot down some of my observations and learnings in no particular order.

I'm building an IoT product (ARM Cortex-M4 microcontroller, a few sensors, cellular connection, and GPS). I'm US-based, so some of my comments may not apply to you. I'm also a software developer transitioning to hardware, so some of these may be too basic if you are experienced with building electronics

1. Understand why you are doing this? Is this a must-have or a nice-to-have product? In my case, it looks like a nice to have, so chances of success are low. I'm doing this because I want to build something and learn new skills (marketing, customer development, hardware). I'm saying this because there are times when I feel like I'm digging myself further into a hole as the investment is high and the chances of success are low.

2. Find someone you trust with all the equipment and skills to build it. The best way is to ask them to make small things first and build on the relationship. I've had success on upwork, don't hire based on hourly rate. I'm self funded so money is tight and I initially hired based on rate, which was not great. That said I've found good people at both medium-low and high rates. Sweet spot is around $60 - $100.

3. It's going to take a lot of time and money. For reference, I reached out to two turnkey companies, one gave me a quote for $125,000, and another one wanted about $7,000 to do a prestudy before giving me a quote. I decided to go at it myself and spend about $18,000 and counting. At the end of this $ 18,000, I'll have 12 customer test units (only 12 due to supply chain issues)

4. Understand certification requirements for your target market

5. Use pre-certified modules, which can reduce certification costs. But more importantly, you can do a sales test with small quantities without FCC certification, so using a pre-certified module and classifying my product as an unintentional radiator allows me to sleep better at night.

6. Incorporate firmware updates over the air early so you can fix issues when it is shipped

7. Talk to everyone about this to learn about challenges, especially adoption. In my case, I learned about people's fears that I must overcome and also new market segments.

8. Beware of people who are excited about your product. In my case, I can find people who love it and think it's a fantastic product with lots of potential. They mean well, but they might only be looking at it through a narrow lens. Also, beware of people who are against it. Understand where everyone comes from and make your decisions accordingly.

9. Read through the datasheets of every component and make sure they all work well, understand the software and hardware thoroughly (this sounds obvious, but I've missed so many things the first few times about hardware)

10. Debugging hardware is complicated. Instead of looking at a screen and running logic through your mind, you'll be looking at lots of wires and solder joints when running the logic. It gets harder as you shrink in size.

11. Learn to use kicad and LT Spice

12. This is obvious, but get a multimeter and test for shorts after each soldering session.

13. Always be consistent with wire colors

14. Spend time learning electronics and magnetism understanding RF interference in circuits. I used to think it would be easy to create a circuit board with multiple antennas, but I was very, very wrong.

If you have any questions, need referral or like to chat, please feel free to contact me, email in profile

[1] https://thehardwareacademy.com/

Edit: added info about upwork