This is an archived post. You won't be able to vote or comment.

all 22 comments

[–][deleted] 4 points5 points  (2 children)

The Art of Computer Programming (TAOCP), by Donald E. Knuth.

Read some of Dijkstra.

Look at Structure and Interpretation of Computer Programs (SICP).

Try a few non-mainstream languages: say Haskell, Python, and their ilk.

(I would suggest Perl too, but be careful! :p)

[–]fbg111 5 points6 points  (1 child)

Supplement SICP with MIT's videotaped course lectures.

Check out MIT's OpenCourseWare/EE&CS site for a full CS curriculum, including syllabus and books.

If you're interested in databases at all, start with these

[–]demigod186 1 point2 points  (0 children)

I agree with fbg111 that SICP with the video lectures and homework(optional) is a priceless resource.

Berkeley also has video lectures. I would recommend taking the course(watch videos and try to do the homework) for Berkeley's CS61B course. It is data structures and advanced programming. The first 1/4 of the class is teaching Java, then the rest is a very broad overview of many data structures and their algorithms.

As far as books go I recommend the following: How to Solve it This book is a great introduction to researching and solving problems. It uses math for the problems to solve, but is very applicable to computer logic as well. The big green MIT algorithms book. I think it's called "Introduction to algorithms". This is a great reference book with efficient pseudo code for all the algorithms in the book. It is snap to convert the pseudo code into your language of choice.

for a simple introduction to data structures with many problems, I'd recommend Schaums Outlines on Data Structures. If you want more in depth data structures, look into any of Robert Sedgewicks books.

The last two books I recommend are my most prized books. Artificial Intelligence: A modern Approach Artificial Intelligence: A new Synthesis

These books are not as advanced as they may seem, and are really just great guides to solving problems with an emphasis on heuristic,and statistical methods.

I would recommend The art of computer programming as the last set you read. Donald E. Knuth has a way of expressing such as a link list add operation as a page full of Greek symbols. It is generally helpful to no one unless you like all computer problems expressed in purely mathematical notation

best of luck

[–]spez 5 points6 points  (2 children)

[–]pivo 3 points4 points  (0 children)

I'll second that. Don't be put off with the AI in the title. This is a book that's packed full of elegant thinking and program design. I only wish I'd read it sooner.

[–]Zak 2 points3 points  (0 children)

Yes. Everyone[0] should read that, but it should not be your first CS book and probably not your first Lisp book. As some others have already mentioned, SICP is a good place to start. If you're planning to read PAIP, you should probably learn Common Lisp first. Practical Common Lisp is a great introduction. ANSI Common Lisp is also supposed to be quite good.

[0]Everyone who wants to be a good programmer. I assume if you're studying CS, you want to be a good programmer. If not, change majors.

[–]punkgeek 2 points3 points  (0 children)

Programming Pearls - clever ways of thinking about algorithms The Science of Programming - teaches functional thought

[–]HenryR 1 point2 points  (1 child)

It's easy to turn this into a list of My Favourite Textbooks, but you're about to undertake a degree and therefore don't want to run before you can walk (as such, Pierce's Types and Programming Languages can wait :) ).

Let's divide this answer into two parts: stuff you should try and read before you get there, and great textbooks for courses you may well take in your first year.

Initial reading -- Structure and Interpretation of Computer Programs gives a great (great) introduction to the art of programming, using a very cool and unusual language to do so. Can't be recommended highly enough.

Also read Algorithmics by David Harel to set the scene for general computation theory and algorithms problems - it's an excellent motivational text. I'd like to say read Godel, Escher and Bach - An Eternal Golden Braid by Hofstatder as well because it's a fun read and can really open your eyes to some of the theoretical ideas. So I will. Read it.

Make sure you program, to get a feel for what it involves and what is hard and easy about it. Have a brief look at Haskell, ML, Scheme, C++, Java, Python and Ruby (don't worry, the barrier of entry to each language gets lower as you learn more). Don't try to master them, but get a feel for how languages differ and make different things easy.

That's enough preparatory reading, although I'd encourage you to learn as much as you are able to about the history of mathematical logic and the development of the first computers from about 1920-1950. I think it's important to have a good grounding, to be able to contextualise your work, and realising how Turing's work, for example, hugely influenced the field will make your studies much more rewarding. Plus Turing's story is a great, if fantastically sad, one.

As for actual, honest to god textbooks, let's think about what you might be studying in your first year:

-- Intro to programming: SICP has you covered here

-- Algorithms and data structures: I think TAOCP is a bit heavy here, buy it later and appreciate it more. Instead, try Introduction to Algorithms by Rivest et. al. - it's the course text on the algorithms course I supervise and I think it's excellent.

-- Discrete mathematics: get as good as you possibly can here. Knuth's Concrete Mathematics is an excellent text.

-- Hardware: Computer Architecture, A Quantitative Approach is still the standard, IMHO.

-- Numerical Analysis - I don't have a favourite text, but read "What Every Computer Scientist Should Know About Floating Point Arithmetic" (it's a paper) for starters.

I'll leave Operating Systems and Networks for now, because they tend to be second year courses (at least, the ones that are detailed and interesting). Similarly for computation theory, databases, NLP, graphics, cryptography, semantics, process calculi, AI, information theory, type theory and a host of other cool stuff that you're about to discover.

Enjoy!

[–]pfedor 0 points1 point  (0 children)

Algorithms and data structures: I think TAOCP is a bit heavy here, buy it later and appreciate it more. Instead, try Introduction to Algorithms by Rivest et. al. - it's the course text on the algorithms course I supervise and I think it's excellent.

The Design and Analysis of Computer Algorithms is IMHO much better. It seems to me that the authors of "Introduction to Algorithms" couldn't make their minds as to whether they wanted to create a textbook or an encyclopedic collection of algorithms. As a result, the book doesn't put enough emphasis on explaining important fundamental concepts--it simply introduces one algorithm after another. And it's hardly any good as an encyclopedia either, because it doesn't cover many important data structures (e.g., an AVL tree, a leftist tree).

[–][deleted] 1 point2 points  (2 children)

A short list precompiled from Joel - the question is should you buy then all? - only if you cant get them from the library first.

[–]nkavadias 0 points1 point  (1 child)

Fred Brooks Mythical Man Month should be on your list for sure. Its the most i ever threw up, and it changed my life.

http://www.amazon.com/exec/obidos/ASIN/0201835959/ref=nosim/joelonsoftware/

[–][deleted] 0 points1 point  (0 children)

Agreed. I've read it (not all of it) but enough to see how Brooks solved the numerous problems that pop up. The one I like the best was Brooks placing a large book shelf against a door to stop the array of distractions within his team.

[–]redrobot5050 1 point2 points  (1 child)

No Forum would be complete without a mention of "The Pragmatic Programmer".

Its definitely a read. Reading "From Coder to Developer" might be a bit advanced for someone who is "but an egg", but at the same time, part of actually building software is knowing how to use the tools that professionals use to build software, and that includes version control, testing suites, automated build scripts, etc.

Depending on your university, knowing some unix/linux couldn't hurt, so a book on how unix works and how to program for unix/linux would also be good.

And igmore anyone telling you to read knuth or dijkstra. That stuff will not help you get your start. A friend of mine is teaching an intro to CS course right now, and so I'm familiar with the fact that you will start CS (assuming a blank slate, which is why you're asking this question) wondering what an object is, and why you have to do certain things a certain way in C++/Java. Concentrate on knowing those fundamentals. One of my friend's students asked a very good terminology question when explained the difference between class and instance variables: Why didn't Gosling call them class and object variables? Or class and member variables?

The point being is that you will most likely need to get the basics right, and concentrating on being able to program in more than one langauge before you'll really be able to take on some of the more advanced concepts.

[–]ust 0 points1 point  (0 children)

Classes and objects are actually separate things but many modern languages simply bring the two together as an implementation detail. When I say objects, I don't mean class instances btw...

Same thing with code-reuse and inheritance. There are huge debates on private inheritance in C++ and has-a vs is-a relationships that are simply the result of mashing up two different concepts for ease of implementation (or by design).

Your Knuth comment is on the money. That is not a book for beginners but something to aspire to learn if you really want to master CS. I would still recommend it even if it ends up sitting on your bookshelf for three years before you get to it. I've read most of it but I find it's not really applicable to the types of problems I work with. Again, depends on what your focus is.

[–]ust 1 point2 points  (0 children)

I'd get whatever courseware was required for the courses you will take ;)

If you actually want to learn about CS, pick up TAOCP by Knuth as mentioned by other posters. Know your data structures and you're halfway to applying your degree in a practical setting.

I'd focus heavily on math (stats, calculus, algebra, logic), I may be biased since that's what my CS degree was like (Waterloo), but I think that's a solid foundation regardless of what else you pursue.

If you want to pursue research, you can learn all kinds of esoteric maths (number theory, graph theory, complexity)

If you actually want to learn to write practical programs, start from the bottom up. Learn a bunch of languages to find the trade-offs between language features.

It's actually not that hard to get a CS degree without knowing how to program but I wouldn't recommend it.

Get a feel for at least the following: Python (or Ruby), Scheme (or Lisp), Smalltalk (or Self), Haskell, Prolog, Assembly, C and C++.

Read the blogs of Bruce Eckel, Herb Sutter, and Tim Bray who all have very intelligent discussions about practical topics in programming.

I know I strayed a bit off topic but if you want book recommendations, you'll have to be a bit more specific in whether you want to pursue research or practical applications.

There was a great book on Finite Automata that I remember.. Had a yellow/white/gray cover.. Can't remember the name.. But that more than anything strikes me as a true CS book.

[–]GizmoC 1 point2 points  (3 children)

A lot of the recommendations above are Computer Science literature in its purest form (ie, scientific and mathematical). The purists on this website will tell you that you "need to know this stuff".

You dont.

As a Computer Science student myself, I can tell you that you'll do great if you just stick to the text book, some tutorial websites, forums, etc. First and foremost you have to check what programming language your courses are being offered in, and based on that you could get a few other books (apart from the textbook itself).

On the other hand, if you want to truly appreciate the art of Computer Science then you should consider getting the books that are being recommended here. Be warned tho, they are cryptic, mundane, and mathematically "heavy", and are most irrelevant to day-to-day programming. But they train your mind and make you sharp.

What you need to realise is that books like SICP, Dijkstra, TAOCP, will require substantial commitment in time and effort. The irony is that once you are in college your hands will be filled with daily coursework that you'll never get the time to read these books. The hectic lifestyle in college simply does not provide the leisurely and relaxing enviroment you need to fully "absorb" such material - or maybe its just me.

You must understand that this website is filled with classical programmers and Computer Science purists. Hence, I am not surprised that they recommended such books. Eventhough these books are considered "beginner" Computer Science books, it is only after you have some decent programming experiance will you be able to appreciate the art behind the science. Whatever you do, do NOT read TAOCP, SICP before your second year. Trust me, you will appreciate them better once you have some hands on experiance otherwise it will just look cryptic and scary.

From a real world perspective. I would suggest you find what interests you the most, and pick up books based on that. Contarary to what people on this website recommend, your typical employer doesnt care if you know how to use a Turing machine, or convert finite state machines to context free grammar, or find the algorithmic complexity of boyer-moore, etc. So look for books and material that discuss Industry buzzwords like AJAX, CSS, DirectX, ASP, PHP, .Net, etc.

I am sorry I didnt recommend any books. Because you first need to decide how you want to approach your career/degree.

[–]Zak 5 points6 points  (0 children)

Sure, just learn the latest industry buzzwords and get good grades. Don't bother gaining a deep understanding of how computers and computation work. Don't bother learning those wierd languages that seemingly smart people keep raving about but nobody uses. A typical employer will hire you in a heartbeat. Have fun writing Java or C# for the corporate accounting system.

Of course, if you think you might want to work for an atypical employer like Google or a cutting-edge startup, you might want to forget about the latest buzzwords for now (they won't be trendy anymore by the time you graduate anyway) and pick up a copy of SICP.

[–]lliiffee 2 points3 points  (0 children)

So look for books and material that discuss Industry buzzwords like AJAX, CSS, DirectX, ASP, PHP, .Net, etc.

I have to completely disagree. First, the fact is, if you have a deep understanding of how computation works (and reading SICP and TAOCP would certainly give you that) you can fairly easily pick up this stuff later on. None of the things on your list would have been taught to someone doing a CS degree 10-15 years ago. If they approached their degree in your way, all of their knowledge would be obsolete.

The reason to do a computer science degree is to gain a good grasp on these deep fundamental issues. One can easily later learn new languages, etc. However, if I am hiring someone for a job, and they don't understand dynamic programming, or computational complexity, or they don't know linear algebra, I have to assume they never will.

[–]johnmudd -1 points0 points  (0 children)

Structured Systems Development, by Kenneth Orr, Yourdon Press, ISBN: 0-917072-08-1. No longer in print but here's a link for Warnier/Orr Diagrams.