I think one of the biggest aspects of learning programming is patience. It's very easy to want to rush and learn everything to make these super awesome programs, but really, it doesn't work that way. Don't rush to 'make an app' or rush to make a money. Take your time and understand programming and realize that it may take years for you to really understand what you are doing.
I prefer to avoid what is a 'shallow' approach to the subject, which consists of starting from ground zero, going to some 'coding bootcamp' and learning how to crank out 'apps' in 3 months. I think that sort of environment will give you a shallow understanding of programming and create the sort of programmer that is always on stackoverflow or some such site googling solutions to the myriad of problems they will face, and they will end up creating a slop of code that, although it might work initially, they don't really understand exactly why it works, and i will be unmaintainable. Ultimately, I'm trying to avoid becoming a 'library user', aka someone who knows a bit about programming, but if the library doesn't supply the feature, I'm stuck and unable to do anything.
This is a fantastic read for someone who is interested in the field
http://norvig.com/21-days.html
It's 'learn programming in 10 years' instead of 21 days. In other words. The 10 years thing is more of an arbitrary number, but it's essentially saying to treat programming as a craft that you seek to master, and recognize that it takes TIME... it's no different than the master sculptor or painter whose first concern isn't making a ton of money, but is rather learning everything about and mastering all the concepts to produce enduring artwork.