How should I go about learning CS?
silentbicycle: Speaking as another history undergrad, here's what I've found helpful:Read HTDP (http://htdp.org/), SICP (http://mitpress.mit.edu/sicp/), and/or CTM (http://www.info.ucl.ac.be/~pvr/book.html), and do most of the exercises. They're all huge books, but getting even halfway into any of them will cover a tremendous amount of material. Also, they focus on largely complementary material, and each may help clarify concepts you find puzzling in the others. Also, HTDP is probably the most approachable of the three. (The first two are available online, the third has a draft PDF floating around. There's something to be said for a hardcover on your desk, though.)Also, find something you're seriously interested in and program for it. With an undergrad in history, you have quite a few niches to draw upon that most CS grads don't. (Python is one reasonable language for this. People will debate this endlessly, though; picking something and actually doing it is more important than getting bogged down in worrying about language differences, for your purposes. Having libraries relevant to your niche is also important.)You will almost certainly need to learn C somewhere along the line; it's a good candidate for the lingua franca of algorithms. _The C Programming Language, 2nd ed._ by Kernighan & Ritchie is the book, and for good reason. Learning C will also get you intimately acquainted with many mistakes people frequently make, which will help hone your testing / debugging. (This is the upside of C making it easy to shoot yourself in the foot, I suppose.)For math and algorithms, take your language(s) and dive in at Project Euler ( http://projecteuler.net/ ), a series of math puzzles. Have fun with it, and dig deeper into any questions you don't understand or can't code a reasonably efficient solution for. The algorithmic insights will come when you read other peoples' solutions that solve the problem 1000x faster. :) Also, comparing both idiomatically similar and fundamentally different solutions to the same problem across several languages can teach you quite a bit.For data structures (which you didn't explicitly mention, but will need along with algorithms), I found learning OCaml (via http://caml.inria.fr/pub/docs/oreilly-book/ ) most helpful. ML is an excellent language family for expressing complex data structures, and a little experience with it will probably make thinking about them clearer, regardless of what language you're working in. (Other people will probably have better book recommendations, though.)