Computer science (not necessarily programming) teaches you to think about the world rigorously and gives you an idea of what you can and can’t do and how to do the things you can. I’d recommend topics like theory of computation (computability/complexity), algorithms, randomness/randomized algorithms, plus cryptography / quantum computing if you have time. The lectures at http://www.scottaaronson.com/democritus/ cover a good collection of topics, although it may be useful to have a more in-depth understanding than just the lectures (certainly you should at least solve the problems he give).
Mathematics makes you better at rigorous thinking, problem solving, and developing intuition. The same goes for theory of computation / algorithms above, but math classes can be a good addition. At least for a while, the classes also provide you with some really good tools (they get increasingly divorced from reality after some point, usually at the graduate level). I’d recommend taking at least one class in each of combinatorics, analysis, algebra, and topology.
You said things that improve your general thinking, and for those I would give the above. Note that I’m not concentrating on usefulness for other things (like more direct usefulness) at all, although a lot of those classes are also generally useful. But here are some other topics that are just really really useful:
LINEAR ALGEBRA—this is actually just the most used set of tools in almost all technical fields
statistics—not crap about T-tests, although that is moderately useful to know; I mean how to manipulate/analyze randomness, statistical modeling, and probability theory (things like MIT’s 18.440, 6.041, and 6.856, David Blei’s Bayesian Nonparametrics class, and Martin Wainwright’s high-dimensional statistics class; sorry, the last one doesn’t have lecture notes, although the last two are also a little specific / advanced)
Computer science (not necessarily programming) teaches you to think about the world rigorously and gives you an idea of what you can and can’t do and how to do the things you can. I’d recommend topics like theory of computation (computability/complexity), algorithms, randomness/randomized algorithms, plus cryptography / quantum computing if you have time. The lectures at http://www.scottaaronson.com/democritus/ cover a good collection of topics, although it may be useful to have a more in-depth understanding than just the lectures (certainly you should at least solve the problems he give).
Mathematics makes you better at rigorous thinking, problem solving, and developing intuition. The same goes for theory of computation / algorithms above, but math classes can be a good addition. At least for a while, the classes also provide you with some really good tools (they get increasingly divorced from reality after some point, usually at the graduate level). I’d recommend taking at least one class in each of combinatorics, analysis, algebra, and topology.
You said things that improve your general thinking, and for those I would give the above. Note that I’m not concentrating on usefulness for other things (like more direct usefulness) at all, although a lot of those classes are also generally useful. But here are some other topics that are just really really useful:
LINEAR ALGEBRA—this is actually just the most used set of tools in almost all technical fields
statistics—not crap about T-tests, although that is moderately useful to know; I mean how to manipulate/analyze randomness, statistical modeling, and probability theory (things like MIT’s 18.440, 6.041, and 6.856, David Blei’s Bayesian Nonparametrics class, and Martin Wainwright’s high-dimensional statistics class; sorry, the last one doesn’t have lecture notes, although the last two are also a little specific / advanced)
statistical machine learning