I think that there has been interesting discussion here, but perhaps an appropriate reaction to the original poster is to change the question, and then answer it. The new question: What language should I learn next so as to make me a better Mathematica programmer?
In my view there are several possibilities, but the one that strikes me as (likely) the best, is to learn Scheme from the Abelson-Sussman text. The Scheme (dialect of Lisp) is the distilled essence of an easily-learned functional programming language. The book, which should be read by programmers regardless of their original language, reveals to the attentive reader a style of programming and data structuring that opens up new pathways to solving problems. It is especially pertinent to Mathematica because, as some have observed, there is a strong element of Lisp in Mathematica. Under the complex syntax, anything can be re-expressed in what is effectively Lisp syntax by displaying in FullFormat.
I cannot say for sure that other languages and books are necessarily inferior for your choice of a second language -- after all your context is different from mine. Since you mention "do" in particular, you may find that Scheme doesn't need a do-loop, but you can really really understand what a do-loop is by implementing a language feature which is a do-loop by writing simple code in Scheme.
Understanding functions, functional applications, recursion of programs and recursive data structures like trees may inspire you to write better Mathematica programs, and even to understand the programs you've already written or others have written, better.