For learning how to program, How To Code [1] (based on How to Design Programs [2]) is tragically underrated given that it's hands down the best approach to learn how to program (actually, more importantly, how to think about programming) of the many I have looked at. Wish I had known this years ago. Rarely the best learning resources are widely know, so sad.
I decided to give this course a go after reading the eye-opening paper The Structure and Interpretation of the
Computer Science Curriculum [3], and then discovered the edx course in HN [4] [5].
Although having programmed for many years it totally changed the way I look at programming; I followed this with the sadly unfinished but still excellent How to Design Classes [6], which consistently extends this initially FP approach to OO. To check how this approach is language neutral, have a look at Design Recipes in C [7].
Another neglected but wonderful resource is MIT OCW Elements of Software Construction (the 2008 version) [8], which, like the above, is centered around design rather than coding.
What did I get out of all this? A systematic approach to programming.
[1] https://www.edx.org/course/how-code-simple-data-ubcx-htc1x
[2] https://htdp.org/
[3] https://cs.brown.edu/~sk/Publications/Papers/Published/fffk-...
[4] https://news.ycombinator.com/item?id=9810542
[5] https://news.ycombinator.com/item?id=16455240
[6] http://www.ccs.neu.edu/home/matthias/htdc.html
[7] https://hci.uni-hannover.de/files/prog1script/script.html
[8] https://ocw.mit.edu/courses/electrical-engineering-and-compu...