The way I did it is by trying to solve more and more advanced problems with simpler tools/features, then looking at more advanced features and seeing where they could be applied to make the problem solving simpler. Rinse and repeat.
An easy example that I can remember is making arrays that dynamically expand. I started with the barebones malloc and worked out how to use std::vector (and other list types) in its place.
Understanding that concept is, what I believe, to be the foundation of learning programming.
I’m no pro whatsoever, but using this method really helps me pick up and learn new languages.
For PSP development, PPSSPP can be very good if configured correctly and you know how to use it.
You can debug on a PSP using psplink but compared to PPSSPP it’s a nuisance to do it every single time. Plus, using a GUI debugger is way nicer anyway.
What really fascinated me was Sony’s approach. For all intents and purposes, it was on par with the PS2 or even better (because of more memory).
Yeah sure, the VUs coupled with the GS throughput were better for graphics processing than the Media Engine in the PSP, but the devil is in the details.
But unlike the PS2, it has a real OS that is capable of loading modules and even do some fake multitasking! This was groundbreaking for the time and this is what made it so magical for homebrew IMO.