Learning how to program is about developing appropriate habits of the mind, so it could perform basic tasks, such as problem domain analysis, data definitions and some template and syntax transformations very quickly and almost unconsciously.
The recursive process itself - the patterns of thinking while one writes a part of a program, are described in a great details in HtDP books and prior works on so-called data-driven development. In this books (and on-line course based on it) shows how following the simple patterns of thinking leads from problem analysis to data definitions, describing concrete examples and checking expectations by writing test cases before the actual code.
The shape of a data structures influences the final shape of corresponding function, so, based on the kind of data-definitions which domain analysis has produced an appropriate template could be selected. Then a template must be filled and transformed into the actual code of a procedure.
Everything looks great, but there is one big problem. This habit cannot be developed quickly, just by reading the book or watching the on-line course - you will forget everything you have read in a week and no skills would be gained, only some vague view of what is possible (which is already good, compared to ignorance of an typical coder).
One must do all the exercises/homeworks, which means instead of just reading a book in one week, the training process will expand into few months. 3 months only for HtDP.
There is also SICP, On Lisp, ANSI CL and few Haskell books, K&R, Programming Erlang, some Algorithms and Data-Structures book (from MIT press) and AIMA, which means years of boring exercises. After that one might think about as or call oneself, well, a programmer.
The way of becoming a top-performer is not hidden or secret - it simply goes through a few great books. The problem is that, unfortunately, just to read them is not enough, and one must start in ones twenties, because the journey takes time..
The most important think to realize is that programming is a writing skill, which cannot be practiced by reading other people's texts/code. One must practice in crafting one's own code.
This is why to read other people's code is so difficult - your are trying to read the final version of the code using, so to speak, "sequential, top-down process", while the process of writing, which produced it, is "bottom-up, recursive, spiral" one and by its nature is completely different.
So, do not waste your time on mere reading, practice the writing skills by doing exercises from a few great books. After that everything else would be quite easy, no matter what crappy languages or products you will encounter with in the industry, dominated by idiots.