Now I am absolutely convinced that learning any skill, including programming, is like learning to drive. You make good progress when you listen to those who already have the skill and you practice with different types/models. Listening to those who already are experts goes beyond having a conversation while you are behind the wheel, that may or may not involve you being smacked at the back of your head. It also involves reading books by those who know, watching tutorial videos and watching experts work. Then you go practice as often and on as diverse platforms as possible.
So what is the best way I have figured out?
It is that you have to set no hard targets regarding outcome, let your targets be based on hours committed to learning and practice. That way you don't get frustrated or get incomplete learning out of pressure to meet your outcome based target. If you do as much learning and practice as you maximally can, the outcome part will fix itself. And no more struggling.
I just realised this this past weekend. So now I am abandoning all my outcome based targets and adopting the learning input based targets. The pressure on me has now reduced. I only need to free up hours and days to learn and practice, the outcome will naturally happen.