For anything that requires a physical connections VMs can be hit and miss, the device won't always show up as an option to do pass through or sometimes it will just be flaky. My experience with that has always been mixed. I would just have a separate machine with windows for that stuff. But in general I do my best to avoid anything that may require windows. It is annoying that so many things are designed for it though instead of being open.
I disagree, though, it may depend on the VM software you use. I’ve found that commercial options tend to be much better in this regard (Parallels, VMWare, etc). Especially when it comes to basic USB pass through and such working reliably out of the box.
I use VMWare Fusion (which uses basically the same VMX core as Workstation) almost daily, for everything from test equipment connections (scopes, AFGs, power supplies, DMMs, GPIB adapters and so on) to embedded development (including firmware programming and debugging) and I rarely, if ever, have a single device fail to pass through. In fact, I think the last time was circa 2009 with some odd Chinese device that didn’t quite respect the USB bulk transfer standard. The developer who handles USB for VMWare had me turn on verbose USB logging, plug the device in and send her the log. I had a patch a few days later.
I’ve actually found using a VM with good USB logging capabilities can be very, very helpful when writing software for an embedded
USB stack. Also for reverse engineering protocols and hacking devices. It makes it super easy to monitor the traffic flow. [emoji4]
Anyway, as I mentioned before, VMs give you the ability to do snapshots and rollbacks of the entire image, in seconds, which is a lot more difficult to setup on a physical machine (and a lot more time consuming to actually do the rollbacks).
Most of my software development is done on the command line these days, and while I *could* easily setup the toolchain under macOS, I instead tend to run them under a Linux VM instead. This has three big advantages:
1) I can rollback to a previous snapshot if something breaks.
2) I can have separate VMs with otherwise incompatible combinations of software installed.
3) I can archive a copy of the VM (with all the dev tools installed) with the rest of the project files (source code, gerbers, etc). That way, if I have to go back 6 months or 6 years from now and make a change, I know the dev environment will be intact and I won’t have to spend a weekend figuring out how to install ancient dev tools on a modern environment).
That applies equally to Linux and Windows tools.
And hey, if you don’t want to have to boot into an OS just to VM another OS, there’s always bare metal virtualization systems (HyperVisors) to manage and run the VMs.