I have generally found that #3 isn't required if you do #4, usually just closing the port within whatever serial software you're using will do. The biggest problem is remembering to do it ![]()
What's happening is that a reset changes the USB VID/PID to the default until the software changes it again, so the PC has to re-enumerate the board. During this time, the COM port is lost, if you have a COM port program on the PC with the port still open, the PC can't enumerate the COM port back to the same one as it's effectively still in use even though it doesn't exist.
#1 is a problem for me as I've had some boards made without the programming port ![]()
With regards to hubs (#2), I have been using a powered USB 3 hub without issue, unpowered hubs do seem to create reliability issues.
Most of my issues have been driver and USB cable related, though I have seen issues using the native port for programming when the code also uses it for PC monitoring purposes (reset button on the Due required).