Love it... Rob Pike's response to a question on the go-nuts board about what programming language to learn prior to Go.https://groups.google.com/d/msg/golang-nuts/EJJVEQedKJg/J1qZSmtcKRwJ
A: Bottom up
1. Learn quantum mechanics.
2. Learn statistical mechanics.
3. Learn solid-state physics.
4. Learn semiconductor device physics.
5. Learn quantum electronics.
6. Learn electrical engineering.
7. Learn switching theory.
8. Learn computing architecture.
9. Learn machine language.
10. Learn assembly language.
11. Learn a systems language.
Now you know how a computer works and how to program it.
B: Top down
1. Learn geometry (Euclid; basics of theorem proving).
2. Learn arithmetic.
3. Learn number theory.
4. Learn logic.
5. Learn Boolean algebra.
6. Learn complexity theory.
7. Learn type theory.
8. Learn Lisp.
9. Learn a systems language.
Now you know how a computer can be applied to solve problems safely
Do A and B both.
I suggest option C.
Love it, no way I would have responded like that.
But, now that I see this, I personally would have put Lisp at the center, and not a systems language... My list B would have been quite a bit longer, and I'd keep the Systems Language isolated to the Bottom-Up list.
Mathematics (most of Rob's list B)
AI / Machine Learning
I think Alan Kay would have an answer with some of those things in it - particularly something about Biology. Many of his thoughts and inventions regarding message passing, objects, and concurrency emerged from his background in biology... but arguably, most of what's on my list is not necessary for programming.
Personally, my simple answer would have been that Go is actually an excellent first programming language for those just starting out today. It's not large, nor complex, it's easy to read and easy to write, and exposes you early to concurrency ideas which are crucial in today's world. It also has practical application and a modern standard library.
For those who really
want to learn programming, you just can't go wrong with http://mitpress.mit.edu/sicp/
... start with Racket and move to Clojure. The former has an excellent learning development environment, the latter just kicks ass. http://racket-lang.org/http://clojure.org/