Wow u got a big goal. You should try to read writeups like the ps4 4.05 one from Team overflow. Its pretty detaild. It will help u unterstand one approach to find Kernel exploits. There is not one way to find Hacks. In Addition you Could Check pegaswitch ans try to Understand that Code.
To Write Homebrew you Need to Write some graphic Library ans Reverse Engineer some libs of the Switch itself. Its not easy Right now.
You'll probably catch some grief from folks on here, but pay no mind as usually the most vocal users who talk trash about people trying to learn are also the ones who have no idea what they're talking about.
The first thing I would do in your scenario is do a real inventory of what you actually know and what your true skill level is.
You say you know C++ and python;
What scale of projects have you worked on? Have they been simple hello worlds and desktop applications? Or have you worked in a larger environment with a pseudo/professional atmosphere?
Have you stuck to only the basics, or have you worked with many different libraries? When it comes to C++, have you gone lower and experimented with C yet?
Have you looked into assembly at all yet? Do you generally know how to manage and manipulate a stack?
How is your knowledge of bitwise operations? Do you think you could implement an RShift or MULT in assembly if you had to?
These are all pretty useful skills, but in no way indicative of what you truly need to get started, nor are they skills that can tell you "Yes I can begin Reverse Engineering!". The skillset required to do so is extremely broad, and takes many years to accumulate. My main suggestion to get started in that direction, since you have some level of knowledge in C++, would first be to start understanding lower level languages. Try C, and try doing some basic things at first. Get some interesting math/image manipulation algorithms going. Try writing a basic XOR encrypt/decrypt function. If you feel you've got a handle on it, or like you already know enough where this isn't challenging, try writing a very basic emulator. Not a full system emulator, maybe even just a simple Z80 emulator that does nothing besides move data around correctly.
If you're comfortable with all of that, I would recommend making the dive into assembly. Though it can be a bit maddening at times, you truly begin to understand the complexity of higher level languages when working with assembly. Not only that, but there's no way you could possibly successfully learn any type of assembly without becoming a pro at stack management. If you've never touched any assembly at all before, I can't recommend enough that MIPS is an excellent starting point. Data, address, and pretty much everything is all the same size and it's very easy to get comfortable with and not have crazy issues while working on it. The MARS simulator will help you run that assembly code and debug to see what happens and where things go wrong.
Once you have a firm grasp on all of that, I would start looking into manual translations. Take a C program you've written, generate the assembly for it using gcc. Now delete the .c file. Using only the assembly, rebuild that C file manually. This will start flexing your knowledge of the connections between those higher languages, and the actual bytecode. Once you've done that, try making your own language! With the knowledge you've gained in C and Assembly, you should now be able to make a higher level language that either transpiles down into C, or compiles down into actual assembly. Write a parser, experiment, and break some stuff. It's all a learning experience.
One other thing you may want to do once you have the above knowledge is write some example "exploits". Not anything real or useful per se, but for example, write a buffer overflow in C that overwrites a return address, and calls a python script to open a bash shell. Understanding how you can manipulate memory and the stack as a whole is crucial. Study up on things such as Return-Oriented Programming (ROP), Jump-Oriented Programming (JOP), Buffer exploits, SQL injection (for funsies), ASLR, Canary, DEP, NX, and a slew of other security features. Knowing these things will help you begin understanding security concepts that will help you when you start trying to get ACE on any given platform.
My final note is this: It will take a really long time to get where you want to be. Even if you're top of your class in school, and have a ton of free time, there are so many skillsets in different fields you need to have to do the things you want to do. Practice is key. If you learn a new language, don't let it atrophy. Always practice it by writing whatever dumb little program you want in that language, just don't let the knowledge fall out.
EDIT: Wanted to add this: Shell scripting. While not necessarily a mandatory portion, to work with other developers, you really need to understand linux and common build systems such as using Makefile, using cmake, automake, etc. Knowing how to use the linux bash effectively will not only make your life easier, but will make any given project consume far less time. And also GDB. Learn GDB, for all that is holy, learn GDB as soon as you can.