The simplicity of USB from a user perspective is built on complexity for developers.
Creating a universal, plug-and-pray interface is inherently complicated. The USB standard is very tedious and every implementation is a little different, so developers need to learn the nuance of the hardware they are using. The vendor libraries help, but they are often bloated, and never portable. This is why TinyUSB and TinyUF2 are two of my favorite open-source projects.
TinyUSB is an open-source, cross-platform USB stack. It is designed to be compact and memory-safe for embedded applications. It supports over 100 boards from more than a dozen MCU vendors. This is a huge advantage for code portability.
https://github.com/hathach/tinyusb
This code portability is likely why @adafruit uses it for TinyUF2 and CircuitPython. TinyUF2 builds a drag-n-drop UF2 bootloader with TinyUSB for a growing list of microcontroller platforms.
https://github.com/adafruit/tinyuf2
Creating cross-platform projects like TinyUSB and TinyUF2 requires a high-quality, well-planned build environment. The portability forces them to be command line based, so they cannot use the crutch of graphical IDEs.
I think these projects are great for intermediate-beginner developers to help them learn good practices early. The code portability also provides a wide array of low-cost supported hardware. The hardest part may be choosing which board to get.