One of the most fun parts about using GNU/Linux with typical consumer hardware is that every kernel upgrade tends to introduce a hardware incompatibility with at least one device. Every time I upgrade, I look forward to finding out what will break next -- would it be the SD card reader, the microphone, the optical disc drive, the USB interface, or something else new and exciting? To be clear, this is largely the fault of device manufacturers and their propensity for releasing only proprietary drivers. I have immense respect for the solutions that have been developed by the free software community to address this, such as Windows driver emulation layers and other hardcore stuff. Nonetheless, I do dread upgrading.
I first installed GNU/Linux when I was around 12 years ago. At the time, I lived with my parents, and we had only dial-up internet. Before switching to GNU/Linux, I was blissfully naïve about how "modems" actually worked. I had ignorantly assumed that they were a piece of hardware that would handle all aspects of making calls over the phone line. I was wrong. It turns out that the way most dial-up models actually work is that they are a very low-level piece of hardware that basically operate at the raw data level with no support for specific protocols. Much of the logic that makes the device a "modem" is actually very complicated software that runs on the computer. And of course that software is proprietary and runs only on Windows. As mentioned above, the solution that the community has developed is a Windows driver emulation layer that allows you to use the Windows binary drivers on GNU/Linux and it works well, but back in the day, it was very difficult to set up, poorly documented, and generally frustrating to configure. I did manage to figure it out and get my modem working, but I wouldn't expect that most people would have been able to handle it.
These days, things are a lot more friendly, although you still have to deal with them breaking from time to time.