I'd recommend starting with a problem you are confronted with on a day to day basis. For example if your laptops usb port is flaky & connecting an external device works only after five or six tries take a look at the kernel code for usb or even a usb driver. Utilize your c/c++ skills to read the code. From there you will probably have a better insight into why your usb port isn't working & it will place you in a position to modify a small piece of the kernel code if needed. I'd refer to this method as hacking to learn. Have fun!