Ask Slashdot: Books for a Comp Sci Graduate Student?
peetm (781139) writes "Having visited with me and my wife recently, the girlfriend of an ex-student of mine (now taking an M.Sc. in pure CS) asked me to suggest useful books for her boyfriend: '... He recently mentioned that he would love to have a home library, like the one you have, with variety of good, useful and must-have books from different authors. ... Mostly, I was thinking your advice would be priceless when it comes to computer science related books, but .. I would appreciate any sort of advice on books from you. ...' Whilst I could scan my own library for ideas, I doubt that I'm really that 'current' with what's good, or whether my favorites would be appropriate: I've not taught on the M.Sc. course for a while, and in some cases, and just given their price, I shouldn't really recommend such books that are just pet loves of mine — especially to someone who doesn't know whether they'd even be useful.
And, before you ask: YES, we do have a reading list, but given that he'll receive this as part of this course requirement anyway, I'd like to tease readers to suggest good reads around the periphery of the subject." I'll throw out Pierce's Types and Programming Languages (and probably Advanced Topics in Types and Programming Languages ), and Okasaki's Purely Functional Data Structures .
And, before you ask: YES, we do have a reading list, but given that he'll receive this as part of this course requirement anyway, I'd like to tease readers to suggest good reads around the periphery of the subject." I'll throw out Pierce's Types and Programming Languages (and probably Advanced Topics in Types and Programming Languages ), and Okasaki's Purely Functional Data Structures .
I don't think knuth's 3 volumes have dated at all- they're still the definitive computer science tomes.
To be well-versed, even if you don't become an expert in each, I would recommend:
Revolutionary Guide to Assembly Language - While it covers only real-mode, it exposes a lot of the hardware to a CS or CSE major without getting into the electronics of things.
Beginning C++ through game programming - Mainly because a lot of material out there is dry. If you have basic games to go with the programming, it makes understanding what you're doing, easier. Especially with object oriented programming.
MySQL books - There are a variety of good books, but in the real-world, storing data doesn't always belong in the system you're on, it could be somewhere else. You can't really get away without knowing databases.
Zen of Code optimization and the dragon book - Understanding what the compiler is doing and what optimizations it makes are key to understanding why code is written the way it is.
There are many others, but those are in my library and have been of significant help during my undergraduate studies; which helped pave the way towards my MS in EE.
A book on consise exposition without complex family relations; one that cuts right to the content. That would be a good start.
'We are trying to prove ourselves wrong as quickly as possible, because only in that way can we find progress.' RPF
Isn't selecting books (even CS books) sort of a personal matter? It seems to me that a gift certificate to Amazon or B&N might be just as appropriate.
Technical books are pretty much obsolete by the time they're published. If you want to get some attractive classics to put on a shelf, go for it.
And the answer is, "Whatever Will Get Him Past His Qualifiers."
And that varies from school to school. Some schools have sufficient flexibility that it will vary from student to student.
Generally, the highly respected works for each subarea of CS are already well known. Someone studying at the graduate level should have no difficulty finding them on their own, one would think.
Moreover, at the graduate level, one is generally studying for some specialization. Without knowing what specialization this person has chosen, any advice we could give him would be unlikely to be of use.
Brooks - "The Mythical Man-month"
Yourdon - "Death March"
DeMarco & Lister - "Peopleware"
Of course he may change majors after reading them.
Cheers,
Dave
They that can give up essential liberty to obtain a little temporary safety deserve neither safety nor liberty.
Ben
Don't you mean levantine nomads???
"Beginning Linux Programming" by the Wrox Press. It covers Linux system calls.
Since most of the "Computer Science" we call today is actually "industrial science" with variations on things we already know, you shouuld go back and learn all of the fundamentals fo the science, which in my opinion was established by Knuth.
Which, I can assure you, you haven't learned them if you went to a typical University in the United States. For one thing, you spent way too much time reading about other things to cover the basics of the science of computing in 4 years at a University.
http://www.amazon.com/Computer...
This should be a graduation present for all University Students, and a cornerstone for those who want to avoid college because of cost/indoctrinized education and begin studying the topic yourself.
What I like about this set of books is, you can even as a beginner, skim the text and if you like, avoid the theory, and immediately start trying to write code and in many cases, the algorithms in the code point to an understanding to the process of many mathematical functions.
With this understanding, you can start trying to tackle some of the fairly formidable abstract ideas in the text which forms the foundations of computer science.
For example, I learned what integration was about from a computer algorithm this way when I was 14, and once I understood what was happening with the code the math was much simpler. I always thought Calculas at the time was big and scary. Not so scary when you do it in C code.
Calculas = Fancy Adding and Subtracting. :-)
But you won't touch any subject matter right now, or in the foreseeable future that Donald didn't already cover in these volumes.
Got Geometrodynamics? Awe, too hard to figure out? Too bad.
Code Complete has been one of the most useful texts that I have found.
Way more than an introduction and a good reference as well
http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262033844
Tanenbaum's Operating Systems: Design and Implementation and Computer Networks.
Circuit analysis for dummies.
It's time he learned the fundamentals.
John McAfee 'It was like that time I hired that Bangkok prostitute; to do my taxes, while I fucked my accountant'
. . . from Gerald Weinberg: http://en.wikipedia.org/wiki/G...
Schroedinger's Brexit: The UK is both in and out of the EU at the same time!
to clarify your relationship to this guy!
I wouldn't usually respond to such a blatant troll, but the level of personal insecurity you demonstrate can only be the result of being rejected by your mother when trying to obtain milk. Seek some help.
Where are we going and why are we in a handbasket?
Compiler construction teaches many different aspects of computer science, and this is a classic.
One of the best-written technical books, ever. On the practical side, but doing useful things (tm) is not illegal in computer science.
A good introduction to the fundamentals of theoretical computer science.
Stephan
Knuth and Dijkstra for programming, Date for databases.
Leandro Guimarães Faria Corcete DUTRA
DA, DBA, SysAdmin, Data Modeller
GNU Project, Debian GNU/Lin
The Little Schemer, The Seasoned Schemer, and The Reasoned Schemer by Daniel P. Friedman et al - these books together are one of the best guides to thinking-about-programming ever written, even if you never write a line of LISP in your life.
Gödel, Escher, Bach by Douglas R. Hofstadter - still one of the best introductions to thinking-about-thinking-about-thinking.
I recommend "Design Patterns" by Gamma, Helm, Johnson, Vlissides
Uh, Linux geek since 1999.
But the original version is 70 bucks! From 1990 no less:
http://www.amazon.com/UNIX-Net...
While the 3rd Edition is cheaper:
http://www.amazon.com/UNIX-Net...
http://www.amazon.com/Deadly-S... Good food for thought dished out in byte-sized chunks. Intellectually tasty and very digestable.
"Getting Things Done" by David Allen is certainly not a computer science book, but many successful computer scientists and entrepreneurs I know have read it and use its principles. GTD helps us organize and maintain their opportunities, plans and intents into a structure. It gets our to-do items out of our heads and into an organized system, so we can focus on one thing at a time. This was one of the most transformative books I've read, and I have a computer science Ph.D.
Introduction to Probabilistic Automata - Azaria Paz
Anything by Claude Shannon
Information theory and statistics - Sollomon Kullback
Artificial intelligence algorithms. Something of the future.
http://www.amazon.com/Parallel-Programming-MPI-Peter-Pacheco/dp/1558603395
http://www.amazon.com/Machine-Learning-Algorithmic-Perspective-Recognition/dp/1420067184/ref=sr_1_1?s=books&ie=UTF8&qid=1398382839&sr=1-1&keywords=Machine+Learning%3A+An+Algorithmic+Perspective
nonsense, good books about OS and language design, compiler theory, algorithms, information theory: those are good for decades.
The contents are but it is irrelevant because you will never read them; anything they might say has been said a thousand ways on the internet.
I have all the "good" books on all those topics from my CS courses. I have not opened them in a decade or longer, despite doing a number of things quite relevant to the topics listed. They do indeed make nice shelf decorations...
"There is more worth loving than we have strength to love." - Brian Jay Stanley
http://www.edwardtufte.com/tuf...
I will not recommend a specific book because in graduate level you should be going for advanced topics in com sci. Look at some AI book genetic algos, neural networks, perceptron inference networks, even just language interpretation. Obviously you should read the classics magical man month which honestly is just a big example of why you can never reduce a task to the point that bring in more people in only just makes more mess of the matter at hand. Also Core J2EE Patterns, but again it depends in what are you want to get into I think java patterns are good cause they are easy to use and well billions of devices run java. Go general and then home in on what you like even some books on algos for image object detection, maybe openpr, id say get involved with an open source project. Get a good linux book at least be competent in the command line, maybe write a driver. Anyway enjoy. Orily series are always good but depends on your pace.
If by "computer science" you mean "programming", then Knuth's series is indispensable, and an excellent addition would be Aho, Hopcroft, and Ullman's "Design and Analysis of Computer Algorithms".
On the other hand, if by "computer science" you mean the branch of mathematics that goes by this name, the best text I know if is Machtey & Young's "Introduction to the general theory of algorithms". Sadly, this book is out of print (few people use use this meaning of "computer science" any more), but right now there are used copies available at amazon. Another excellent book in this category would be Garey & Johnson's "Computers and Intractability: A Guide to the Theory of NP-Completeness". A final text worth looking at is Michael Sipser's "Introduction to the Theory of Computation" (you can save some $$ by purchasing one of the older editions).
One of the clearest books I've ever read.
Strangely, nobody has addressed the graduate student part of the question. Being a CS grad student involves much more than technical knowledge. You also need to internalize the social norms of this career choice. For this purpose, there is no better information source than The PhD Grind by Philip Guo. The book is completely free (as in beer) from Guo's web site. His web page also contains a great deal of career advice worth checking out.
These are my favorites, I consider them essential reading for any developer. They are all about user interface design, a topic which I think developers need to put a lot more thought into.
* Don't Make Me Think: A Common Sense Approach to Web Usability, by Steve Krug
* About Face: The Essentials of Interaction Design by Alan Cooper
* The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity by Alan Cooper
This one is amazing if you REALLY want to understand at the deepest level what goes on inside a computer and how it works. It is amazingly simple to understand and detailed at the same time.
* Code by Charles Petzold
I haven't read this one yet, but it is on my reading list because I have heard so much good about it:
* Code Complete: A Practical Handbook of Software Construction by Steve McConnell
I am about to get down-voted to hell, but I will go against usual trend.
1. FOR NOW. Don't buy Knuth books !!!!! Knuth does not address parallel or concurrent programming. Zero, none. But the biggest problem with Knuth books are the knowledge required. You have to know Real and Complex Analysis and Asymptotic Analysis !!! BS graduate in USA in 99% of cases, never take courses in Real Analysis (and by Real Analysis, I don't mean Calculus course).
Knuth is God of sequential programming.
Buy Math books !!!!!!!!!!!!!!
2. Math Books:
- Complex Analysis (ex. Visual Complex Analysis, Fundamentals of Complex Analysis with Applications 3rd ed)
- Asymptotic Analysis (ex. Asymptotic Methods in Analysis. Into is written by Knuth)
- Abstract Algebra (you can't read any modern Formal Language/Automata book without Abstract Algebra)
- Mathematical Logic. There are many branches in Modern logic. Temporal Logic is de facto language used to describe concurrent systems.
Also, Logic and Abstract algebra are used to formalize and verify programs and programming languages. Later on, as you Mathematical Logic knowledge matures, you can learn about Automated theorem proving & Proof assistant.
I recently graduated from respectable US college with CS degree. Right now, I am studying Abstract Algebra and Mathematical Logic on my own.
I think you were referring to: The Mythical Man-Month: Essays on Software Engineering by Frederick P. Brooks Jr. It is considered a classic.
Since he is likely to have a collection of books on the language(s) he intends to use, I would suggest some on subjects less often covered: Enough Rope to Shoot Yourself in the Foot, by Holub; The Craft of Software Testing, by Marick; Handbook of Walkthroughs, Inspections, and Technical Reviews, by Freedman and Weinberg; What You Need to Know when you can't find your UNIX system administrator, by Mui. I have found these very valuable in maintaining code over the years.
K & R
Effective C++
Object-Oriented Software Construction by Bertrand Meyer
The PostgreSQL manual
The fact that most undergrad and grad CS programs don't have courses in ethics and history is deplorable.
These are some of the best reads in CS:
Computer Power and Human Reason, Joseph Weisenbaum (1976)
Computing Machinery and Intelligence, Alan Turing (1950)
Hackers: Heros of the Computer Revolution, Steven Levy
Godel, Escher, Bach: An Eternal Golden Braid, Douglas Hofstadter (1979)
The Cyberiad, Stanislaw Lem (1974)
These are classics. My favorite, hands-down, is Ted Nelson's "Computer Lib/Dream Machines". This is an odd book - it's written in hypertext (links to other pages and all - after all Nelson invented the term hypertext!) but in print form. Beyond that, it's really two books joined in the middle: Start reading form one cover, it's Computer Lib, start reading from the other, and it's Dream Machines.
Sure, parts of it are dated, but the concepts and thinking teach how to *think* about what we now call UI/UX and architectures better than anything else I've ever run across, and the principles are timeless. Without question the single most valuable computer book ever written - like some bizarrely wonderful foreign food dish, it's a delectable combination of manifesto, history, dreaming, ranting, and amazing insights from greats such as Vannevar Bush, Doug Englebart, and many more, especially Nelson himself. It is one of the weirdest, and most wonderfully serendipitous, books ever written. Lewis Carroll would have loved it, and I really wish Jonathan Ives had heard of it before saddling us with the form-over-function trainwreck that is iOS7...
The only bad thing about this one is that it's quite difficult to find - other than the nearly impossible-to-find original samizdata-like self-xeroxed original version, AFAIK, it's only been published once, by Microsoft Press back in 1987. I had to pay over $100 for a new copy after loaning my original to a reptile that didn't return it...
The other book is Fred Brooks' "The Mythical Man-Month" This is a book that is still every bit as relevant today as when it was written - my good friend Dewayne Perry, one of the world's foremost software engineering experts, agrees that it's perhaps the most important book ever written on software engineering, and how to deal with building software in the real world.
Either one of these would be good, but if you reduce my computer library to one, I'm keeping Computer Lib. It's that good.
"The future's good and the present is nothing to sneeze at." - Roblimo's last
Computer Science: An Overview by Brookshear. See the forest for the trees.
http://www.amazon.com/Computer...
Mythical Man Month by Brooks. Don't get lost in the woods.
http://www.amazon.com/The-Myth...
And find a favorite programmer and follow their writings\blogs\tweets. eg: Carmack, Linus, etc.
Cite Knuth... This is, of course, good science.
Well at least Professor Knuth is still alive, and I don't [YET!] need to refer to the poor man as spinning in his grave.
Good grief.
And folks wonder why you fools believe in myths like ManBearPig.
Structure and Interpretation of Computer Programs, 2nd Edition. This used to be an undergraduate text for a course at MIT. But, it is now optional even at MIT. This is shocking to me. We used the text in my sophomore year at the University of Utah. If you hear old timers (okay me) complaining about programmers these days, this is part of it.
Computer Architecture, A Quantitative Approach (5th edition). I need to update my copy, but this text really allows one to reason about scale and performance.
An Introduction to the Analysis of Algorithms, 2nd Edition. Again, I need to update my copy, but this provides the key mathematical foundations for algorithmic analysis and their performance.
Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition). This is much more practical of a book, but it gives key insights into framework design. Yes, it's about .Net, but it's really about large scale object oriented design applied in the real world and therefore useful to all.
Modern Operating Systems (4th Edition), Tannebaum. A great insight into OS internals, including key concepts that are useful in all sorts of programming.
Essentials of Programming Languages (3rd Edition). A deep dive into interpretation of programs. Provides a great start into programming language semantics.
Compiling with Continuations, Andrew Appel. Of course, the Dragon book is useful. But this book really gives some unique insights into program analysis. Combine this with Engineering a Compiler and you have insights into how code really is transformed into executable artifacts.
In fact, this reminds me, I need to go make sure I still have my copy. It's pricey to replace.
I'll make a final plug for Semantics Engineering in PLT Redex. There are lots of advanced books on programming language semantics, but this is only book I've found in which the rubber hits the road. It is rigorous in its coverage of major language models, but its an actual tool as well.
The Pragmatic Programmer: From Journeyman to Master - It's not a Computer Science book, but it really talks about essential things any programmer should know in order to excel in their career.
Other than the obvious Cormen, Leiserson, and Rivest (plus Stein these days, apparently): http://en.wikipedia.org/wiki/I... I found H. J. Tichy's _Effective Writing for Engineers, Managers, and Scientists_ very useful. I haven't finished _Hacker's Delight_ by Henry S. Warren, Jr., but there's some good stuff in there.
Books are for grad students. Oh wait, you are one!
I hope you plan to become a teacher or professor...if you want to be a computer programmer, it's time to quit school and start working!
It's not computer science, but get a good technical writing book as well. It's a skill you'll wish you had. It helped me tons when I worked on my MS CS degree.
I personally like Developing Quality Technical Information 2nd ed. from IBM press
Press ONE...
If you can get into fucking grad school shouldn't you know this? What the fuck? I can't get in because you need 4 fucking references but at least I know CS theory...
You seem to misunderstand what a citation is. A citation is not saying, "Here, this is true because Mr. XYZ said so," but, "Here, this is being accepted as true (or just considered even) because Mr. XYZ gave good argument/data in source ABC." It is not an appeal to authority, it is reducing redundancy by not re-deriving something already written about elsewhere. And this is a good science practice, as it is rare to be working on a topic where no one has already done some theory work or found some relevant experimental data.
You should have spent a lot of time deriving things in your undergrad and early grad courses, and you should double check the calculations of any citation central to your work to catch typos or actual mistakes. But by the time of writing actual papers or your doctoral thesis, you shouldn't be wasting reader's times by re-deriving things in detail beyond what is needed for outlining background and covering your premises. Unless your new contributions are a better way to present or derive the same solution, or showing a mistake in the derivation, you move on to deriving new things while cite others for stuff already done.
Can't you just buy the books you need on Amazon or read the papers on arxiv? If you're so fucking smart just learn the shit and go make something.
First off, what's "pure CS?" Is there a grad school of adulterated CS? Then, get this book: http://www.amazon.com/s/ref=nb...
Comment removed based on user account deletion
Graduate-level CS encompasses a lot of ground!
Knuth is of course a valuable addition to the book-shelf — as others have pointed out, it's a superb source for chasing up information, details and citations for algorithms and data structures one needs to justify or investigate, if nothing else.
Okasaki's Purely Functional Data Structures has also already been mentioned, and I'd add my endorsement!
I would recommend two other texts to add to a collection:
I would recommend a book on convex optimisation and probabilistic graphical models, but frankly I don't know of a single text on either topic that I could whole-heartedly recommend. Any suggestions?
Introduction to Algorithms by Cormen Leiserson Rivest and Stein.
Are needed in a "home library". Unless you REALLY enjoy reading Algorithms, Software Design Patterns and *NIX technical manuals in your spare time, no thank you. Keep those at the office where they are needed for referenced, not at home.
Suggestion to start the non-technical collection: Is your Mama a Llama?
"Absolutely nothing."
Seriously, does the chain of relationships really need to accompany this post? Why not just say "I know someone entering CS masters program. Suggested reading?" No, instead we need to hear about your "former roommate."
Mod parent up. This is the correct response.
Yaz
Probabilistic Reasoning in Intelligent Systems: Networks of Plausible Inference. By Judea Pearl. It is a great work on Bayesian Networks. For someone in graduate school, you should avoid books on either specific languages or implementations. That is great for a regular software developer but if he is going to graduate school he is probably more interested in research than implementation.
The Structure and Interpretation of Computer Programs.
A good book on Clojure. It's an actually practical LISP with a lot of very modern features geared toward concurrency. It's a highly educational language.
In law school you're taught to cite every... single.. sentence, whether you're referencing fact or opinion. It's exhausting, although you tend to get the hang of it fairly quickly.
And you not only cite every sentence, but you use a highly structured, compressed syntax which not only parses cleanly, but is loaded with semantic meaning--like `this citation is spot on', `this citation tends to support my argument', or `this guy said the opposite of what I'm saying'; plus additional context showing authority and relevance. It's an ontologist's wet dream, and I never understood why more researchers haven't plumbed the depths of legal works.
I think all university classes should require this degree of reference. It would seriously cut down on the amount of bull crap in college papers, and make it waaayyy easier to grade bad papers--you could randomly check a few of the references, and if any of them are crap then you can cut their grade by a few letters on-the-spot.
Cite Knuth... This is, of course, good science.
Well at least Professor Knuth is still alive, and I don't [YET!] need to refer to the poor man as spinning in his grave.
AC posted an excellent response here.. In the event you're filtering AC's, take the time to read it, as it's completely on point.
I would add is this: if you've never completed a Masters thesis or Doctoral dissertation, just try submitting one to your committee without adequate citations. If you write somewhere "I used well-known algorithm ABC because of XYZ" and you don't have a citation for that algorithm, you'll be sent back for rewrites pretty quickly to add appropriate citations.
By way of example, in my Masters thesis several years ago, I mentioned Unix diff , without a citation. Why would this need a citation? It was mostly mentioned in passing, and every computer scientist under the sun knows what diff is, right?
Committee came back asking for further citations on a few things, including diff (which, for the record, is "Hunt, J. W., and McIlroy, M. D. An algorithm for differential file comparison. CSTR, 41 (1976).")
Using citations isn't an appeal to authority. It's akin to using an existing library call in programming. Just as you wouldn't roll-your-own quick sort algorithm when coding, someone writing a scientific paper doesn't re-invent every algorithm ever derived. You find someone who has already done that, and you cite them. The AOCP is useful in this regard due to the sheerly massive number of algorithms Knuth describes. It's hard to go through a Computer Science program and not use one of these algorithms. Knuth himself likewise cites all of the algorithms in the AOCP, so it's not an appeal to his authority, as he delegates that out to others appropriately. It's simply useful because instead of having to track down papers written in the 1960's on your own, you can cite Knuth who cites those papers for you. This is why the AOCP is useful for a graduate student.
FWIW, I cited Knuth. I needs an algorithm to calculate variance, and another on the Box-Meuller transformation. Art of Computer Programming had one for each, which I adapted for my needs, and cited appropriately.
Yaz
After a several year hiatus away from computer stuff I agree completely. I gradated CS in 2002. There was much more priority given to imperative programming and arrays for everything than there should have been. Most of the lecturers were brainwashed by terms like "object oriented is the future", "extreme programming" and other such nonsense because it's "kewl". We did some Prolog but not nearly enough. It wasn't emphasized. We did no lisp! or Scheme.. It's sad that I'm more mature than many of those guys despite being younger. They wanted to market the course with the latest in vogue sound bites and they all bought into it. Ruby is imo another overrated pile of hype. CS courses prepare people to accept the status quo: - The ivory tower people at the top with FP, and everyone else at the bottom dicking about with deprecated methods, broken dependency issues and defunct frameworks. I'm glad I had my hiatus. I program in Prolog, Erlang, and Elixir now, and I'm fascinated by compilers. To be fair I was interested in compilers in CS too but only moderately so.. I program the way I want to with the languages I want to use using programming languages that think the way I think. I forget all the crap they told me. I'm learning functional data structures and abstractions like Monads, and I find it much more rewarding than the unnecessarily convoluted syntactic sugar of imperative languages which seems deigned for 'gottcha'. Also, I believe Erlang's abstracted process based concurrency and declarative paradigm is the true path. And Elixir inherits those too. If I was to design a CS course, it would be Erlang world with some assembler, after learning Lisp/Scheme and Prolog of course. To be fair, Erlang was open sourced long after I graduated.
The Arrogance of Humanism by David Ehrenfeld. A little bit outdated but worth reading because it offers a perspective that you will rarely, if ever, encounter in a computer science department.
Don't bother chasing canon-- by set union everyone's read all that. You might as well juice a rock.
After a paragraph or two of background and previous results being built upon, where there can be multiple citations per sentence, the meat of a science paper is going to be mostly new work or likely dependent on a very small number of other papers. And half the citations in the intro are just there to point out other work that may be relevant or reviews of general material to give the reader context for the research. Review papers that paraphrase large numbers of other papers have plenty of citations through out though, and might be more on par with what you are thinking of for college papers. Other than review papers though, if you have citations for every line, what did you do that was new and added by you?
it really depends what your focus is, but personally for me thats a real that I always
feel I learn from every time I pick it up
Another golden oldie in Jains the Art or Computer Performance Analysis
neither of which is going to be particularly interesting if you're doing pure theory
or dorking around with web applications so you can run out and get vc
The point of a personal library is to have the tools you need readily to hand. Often the answer is not where you expected to find it. I've got 70+ feet of CS books. Some I've used a lot and some I've used very little. Except for scavenged discards, all are there because I perceived value and the potential need for the information. Some things I've used a lot are now pretty much obsolete. I've never needed to use Knuth much, but I have both editions and have referenced them many times over the years. Usually I found I was dealing with the trivial case, but not always. Knowing whether I was dealing with the trivial case was worth the price of admission.
I heartily agree with all of the Knuth votes. I would add Structure and Interpretation of Computer Programs and Concepts, Techniques and Models.
...what am I missing here?
Introduction to Metamathematics by Stephen Cole Kleene for logic
Introduction to the Theory of Probability by Hans Reichenbach for probablility
Introduction to Automata Theory, Languages and Compuation by Hopcraft and Ullman for automata studies
Mathematical Theory of Communication by Claude Shannon and The Calculus of Linguistic Observations by Gustav Herdan for information theory and statistical language processing
As for programming choose a book for whatever poison you work with
How about C. H. Lindsey's Informal Introduction to Algol 68? Obviously he isn't going to be using Algol 68, but this is beautifully and wittily written, describes a language with some interesting features, and has a very unusual two-dimensional organization.
For me, it was "Thinking Forth" by Leo Brodie. Forth is a pretty unique language, barely above assembler level, but able to (quickly) build up code/data structures of Lisp-like complexity (and like Lisp, can self-modify). Brodie's Thinking Forth pulls apart how you'd solve problems with procedural language and completely re-factors them to take advantage of how Forth works.
Even if you don't ever use Forth (and most of us enthusiasts never did for anything but school and our own utilities), learning it changes your thinking. But I'd concede that Forth itself isn't the necessity - it's to learn languages and approaches that solve problems in whole different ways. There should be books on functional languages, APL, or Lisp.
I'm not sure what the classic list would be - but for me, Starting Forth I pull off the shelf decades later to peruse when I need to pull my head outside the box. (It's now available as a free PDF, by the way.)
IANAL, but as I recall, in the practice of law (at least in the US), you don't add anything new. Unless you're a Supreme Court Justice. A lawyer's job is to piece together relevant laws and cases for precedent to provide a legal framework for whatever argument they're presenting.
Ted Nelson's "Computer Lib/Dream Machines"
It's a little tough to find, and stupid expensive. Makes a good gift though. It's pure madness, like other computer books of the time such as My computer likes me and What to Do After You Hit Return. It's okay though, as it adds a lot of charm.
As far as gifting goes, it's much better than The Mythical Man-Month, which is about as charming as the average Slashdotter.
Required reading for internet skeptics
if you have citations for every line, what did you do that was new and added by you?
The conclusion.
A legal paper is like a mathematical proof, where every step must be justified by drawing on an axiom, a definition or an existing theorem. In proofs, relatively few of the arguments need to explicitly state their justification, particularly those that just manipulate symbols according to the very well-known rules, but that's only because the reader can be expected to see the obvious rationales. Beginners are often required to rigorously justify every single step in order to help them understand how the game works.
Law is also about proving things, but the axioms, definitions and theorems aren't as well-defined, so even advanced practitioners need to justify nearly every step.
Note to ACs: I usually delete AC replies without reading them. If you want to talk to me, log in.
That post wasn't about law papers though, it was about science papers, in response to a post saying that style should apply to apply to topics in much more general than just law (in a thread originally talking about CS thesis, where you should be adding something new besides just a conclusion).
I teach "Operating Systems". And yes, I don't expect (I'd love, though!) many from them to have to implement a Second-Chance (Clock) memory page replacement algorithm. But I do expect them to understand how duing professional their lives the programs they write will be treated by the operating system, and how to avoid bad performance resulting from inefficient patterns.
by Don Norman
If a civil case is being litigated in court there's very often a new question to be answered, because the relevant statutory and case law are unclear about the case at hand. Your job as a lawyer is to show the court how the pre-existing law applies favorably to your novel situation, when appropriately extended or amended. In the common law this is how the law slowly grows organically overtime.
Trial and lower appeals courts make new law all the time, and stare decisis demands that one trial court judge normally follow the rule of another trial court judge's opinion in his jurisdiction, even if the case never went up to a higher court, presuming no other rule from a higher court was issued in the mean time.
Take, for example, Judge Vaughn Walker's decision in Perry v. Schwarzenegger, which struck down Proposition 8 as unconstitutional. The case posed a novel question, and Judge Walker's bold decision created new constitutional law in California. But it was not yet binding on other courts. When the plaintiff's won, the state of California declined to appeal. A new litigant entered to take the place of the defendant, but ultimately SCOTUS said that the new litigant did not have standing. That meant that Perry v. Schwarzenegger reached the end of its rope, without any more avenues of appeal, solidifying Walker's opinion as law within his jurisdiction. Walker's decision is now binding precedent on all trial courts in Northern California, the jurisdiction of the court of which Judge Walker was a member. Only the Ninth Circuit Court of Appeals or SCOTUS can overturn that law; any other trial court in Norther California is technically bound by the principles of stare decisis. As more time goes on it becomes increasingly more likely that, if the issue came up again and the Ninth Circuit Court of Appeals heard a similar case, they'd likely adopt Walker's decision, in part or in whole, making it binding on all courts in the Ninth Circuit (basically the Western United States). That's because while Walker's decision is not binding outside his jurisdiction, the longer it stands the more society will orient itself around his ruling, and so the more persuasive it will become to other district courts.
http://grokcode.com/11/the-top...
Soul of a New Machine - Tracy Kidder
The Cokoo's Egg -Clifford Stoll
ugh...I don't want to sound cross but "usability" texts have a long way to go..."computing" isnt about the "computability function"...its' about a user task...if there is no user in the chain somewhere then it's pointless
"usability" is really "human/machine interaction" of a specific instance and context...most texts talk only about those instances of design questions in a context, not the *theory*...any book or "U/X" theory that doesn't start with a *cybernetics* or system science perspective is doomed to become tangled in language and abstractions
I used to teach Human/Computer Interaction as an Adjunct at Washington State University and none of the texts were fit to properly teach the course.
Ben Shneidermans "Designing the User Interface" and his "golden rules for interface design" is, IMHO much more "grown up" than the Krug text.
I'll admit, Krug has a few passages where I say, "Yes, every programmer ever needs to have this concept pounded into their cranium"....but again, that doesn't make it a good "bible" for interface design
honestly there is no one tome anyone can point to for studying computers...it's just machines following instructions...everything else is application of a type of instruction to a context with a user
cue controversy: there **will not be** a true overarching computer science theory until we get past Turing & the 'computability function'
**its all machines following instructions**
Thank you Dave Raggett
Comp. Sci. is a very large and diverse field of study. I would suggest taking a look at the texts used in graduate level courses you're interested in from top universities (MIT, CMU, Berkley, etc.). MIT's OpeCourseware would be an excellent resource for this.
http://en.m.wikipedia.org/wiki...
"Lord of the Flies", "1984", "Fahrenheit 451", and "The Mythical Man Month".
The book that had the greatest influence om me was Domain Driven Design, by Eric Evans.
It really made the difference from thinking like a developer, to thinking like an architect (I still write code every day)
http://www.amazon.com/Domain-D...
The definitive "kitchen sink" for how to do everything.
If it's languages, Bob Harper's Practical Foundations for Programming Languages is good, along with the HoTT book (http://homotopytypetheory.org/book/) if he wants to be on the cutting edge.
Gödel, Escher, Bach - an eternal golden braid, by Douglas Hofstadter.
I think it exposes nicely some fundamental concepts of computer science.
BASIC Computer Games, Microcomputer edition.
As a reminder that you kids have it easy nowadays.
He didn't ask about software development, but about Computer Science. There is a huge difference there. In CS you actually kinda have to use common sense. That common sense has become so good you can pile layers of nonsensical software on top of the underlaying layers of hardware, firmware, and low level software, and it still works.
One has to be prepared.
Knuth for how things work, Mythical man month for how things don't work. Everything else is left as an exercise for the reader.
Wirth's classic, more for the style than the content.
Computer Architecture: A Quantitative Approach by Hennessy & Patterson Helps you understand what goes on inside a computer at the hardware and OS level, as well as illustrating how you can reason about the performance of a system before you actually build it. Computer Graphics: Principles and Practice by Foley & van Dam A good starting point for learning about computer graphics. Not all of it is still relevant, but even if you skip the chapters about vector displays and user interfaces there is still plenty of useful material in there. Programming: The Derivation of Algorithms by Kaldewaij Teaches a way of constructing algorithms that are provably correct. Although I rarely follow this approach to the letter (it is very time consuming), elements of it are extremely valuable in everyday programming. For example, thinking in terms of preconditions, postconditions and invariants (design by contract) helps in designing good interfaces, finding bugs, placing useful asserts etc. Even just thinking to yourself "could I prove this program?" without actually doing it is useful, since if the answer is negative, the program is too complex and probably incorrect.
by Harry Lewis and Christos Papadimitriou.
Since the course was pure CS, you don't need any "Cloud computing for Dummies" books.
That book goes deep into theory and makes for a delightfully light coffee-table reading too.
www.amazon.co.uk/Elements-Theory-Computation-Harry-Lewis/dp/0132624788/ref=sr_1_1?ie=UTF8&qid=1398418173&sr=8-1
The one-star review is about the book being paperback instead of hardcover. Sigh...
Just because a book is about a topic you are interested in, one should not assume that your questions will be answered. Some topics are just so terse or vague or on the fringe that books on the subject will make you more confused, not less.
For example, Haskell. Haskell is like learning to swim in the deep ocean with one arm tied behind your back. I'm sure there are advanced techniques a swimmer like that can use, for example to avoid attracting sharks, but in a swimming pool there are no sharks. This also goes for automatic memory management, favor that at almost any cost. It is not wrong to say that man has become civilized only because he removed by force obstacles in his way, in place of learning to manage them.
Lastly, avoid topics that are too "out there". Categorical logic, intuitionistic type theory, the Y-combinator. One needs to learn to say no. And don't be afraid to exercise judgment. For example, Okasaki's Purely Functional Data Structures is going down the wrong road.
It's about finding the right road. The Liskov substitution principle or Meyer's Design-by-contract are the type of distilled knowledge that one should aim to acquire. And if you like methodologies, a combination of agile development and test-driven development where one tests small units thoroughly is just about right.
if you want to be a computer programmer, it's time to quit school and start working!
Nope. There are plenty of intresting things out there to do which would be very hard to get started on without some sort of higher degree.
SJW n. One who posts facts.
no citation to support your point?
lucm, indeed.
- The Pragmatic Programmer: From Journeyman to Master
- Apprenticeship Patterns
- Refactoring: Improving the Design of Existing Code
- Driving Technical Change
- The Clean Coder
- Personal Kanban: Mapping Work, Navigating Life
- The Pomodoro Technique
- Practices of an Agile Developer
- Pragmatic Thinking & Learning
- Practical Object-Oriented Design in Ruby - If only for Chapter 1 (free on Amazon) which is language agnostic
Plato's 'Republic' to see what geniuses our politicians are.
Plato's Theaetetus to see what idiots philosophers are.
And Lillian Lieber's "The Education of T. C. Mits" to see why we should all know more mathematics than we do.
There are plenty ' "language x/technology y" in 24 hours' books, why not start with them? ... or the 'What managers should know about XYZ'? /me runs and hides :)
Or the plenty 'XYZ for dummies'?
Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
Structure and Interpretation of Computer Programs ...
It was part of my required reading for a computer ethics course. Very entertaining. You really empathize with this college sys admin who is battling an unknown adversary trying to gain access to systems he is responsible for. Throw in the love story as a background and I still remember it to this day.
Yep, this is a great book!
I suggest Richard Feynman's Lectures on Computation. People in the physics world will know the name, but the topics covered are great for CS/CE topics, and probably not things that were considered and/or covered in regular classes.
http://www.amazon.com/Feynman-...
...If she's planning on getting a job instead of teaching.
Every software engineer should read this when they're ready.
It condenses decades of pain/suffering/learning concisely and provides a framework for many of the things that I've learned and experienced but had to rediscover all too often.
If you plan on starting a software company, being a critical part of a startup, or scaling someone's product - you had better read it - it will likely save you huge amounts of time, money, effort, and risk.
Loading...
Doesn't matter how good your ideas are if you can't communicate them.
Knuth's books are very book, but they don't get much use from me. Instead:
Introduction to Algorithms by Cormen et al.
A good statistics book. Mine is an old thing: Mathematical Statistics with Applications by Mendenhall and Scheaffer.
A good operations research book (linear programming, queueing theory, Markov models/decision processes, and the like). Another old thing: Operations Research by Hillier and Lieberman.
Other than that, it's books that are/were used often for programming reference: Common Lisp: The Language by Steele and LaTeX: A Document Preparation System by Lamport look the most worn.
Hopefully, someone will come up with something a little more recent than the "old things" I mentioned above.
Incidentally, It's kinda sad how little of the topics under discussion in "Peopleware" have actually been empirically examined in the peer-reviewed literature...
Any sufficiently advanced technology is indistinguishable from a rigged demo
--Andy Finkel (J. Klass?)
A Programming Language
(by Ken Iverson)
There is no good example of a CS book, well language references like "The C Book" are great for a single language, no CS book can cover all languages. Simply put, if you want a good CS book, pick a language and find the reference manual for that language.
The Psychology of Computer Programming by Gerald Weinburg
The Mythical Man-Month by Fred Brooks
History?
Don't worry - it's a lot like a soul - if you don't have it, you'll never know.
A graduate student in any subject is likely to have some areas of interest and consequently will know the kind of books he might need or benefit from. Graduate studies are more specialized, so in my mind it makes little sense to just give some books a bunch of people on the Internet recommended because they happen to be useful to THEM. For instance, I don' quite understand why so many here recommend TAoCP by Knuth. There are other (sometimes more specialized and up to date) books on algorithms and data structures. Different areas of computer science need different foundations. Something like the venerable Hopcroft/Ullman (1st edition, please!) serves much better as a go to reference for theoretical questions about formal languages, computability and complexity in much more detail than someone who does not specialize in these areas will probably need. And it's quite a small volume. Some people might not even need any of the algorithms detailed in the currently available (or planned) volumes of TAoCP, they might need logic or probability theory, type theory, automata theory, algorithms for model checking, decision procedures for interesting logics, heuristics, concurrency theory, parallel or distributed algorithms, networking, constraint programming, or any number of things. There's really no need to choose the technical literature someone might use for him.
Not a purely scientific read, but excellent book about a time involving a number of computer inventions at Xerox PARC.
http://www.amazon.com/Dealers-Lightning-Xerox-PARC-Computer/dp/0887309895
If you actually never went to school, you probably don't even know all the things you don't know.
You're an idiot. You learn history from textbooks in undergrad. In grad school, you innovate and push the frontier.
Gang of Four, Code Complete
You do that in a PhD program; the question was about a MS. Some masters students to research, but at least where I went to school (on the border of top-10 grad schools in CS) the masters students who do research outside of class were a minority.
Even when working on your PhD, there's a ton of learning about history that you won't have done in undergrad.
That being said... I'm not sure any of my grad-level classes had textbooks. I don't think so. :-)
But I still stand by my statement for the following reasons:
1.) There were at least a couple classes where we easily could have
2.) In my grad-level math classes, we used texts
3.) Grad students take more than grad classes (almost always, anyway)
4.) There will be background knowledge in books not covered directly by your classes that will nevertheless be useful.
Fred Brook's Mythical Man Month - yes, it's more software engineering than CS but some awareness of practicalities is important. ... and, at the risk of incurring significant opprobrium, Jon Skeet's C# In Depth.
Justification for the second of these: yes, it's language specific (and MS-orientated - predictable boos, etc.). However, as a software engineering or computer scientist it'll be necessary at some point to convey technical detail clearly to other people. Jon Skeet does this exceptionally well: ignoring the subject it's possibly the best written technical books I've encountered. (And as a bonus recent editions cover implementations of some interesting CS concepts, e.g. lambas, etc.)
Useful for its brevity: The Elements of Style, Strunk and White. Classic and handy.
Drop the books. Unless you are going to be tested on them or have to do exercises from the end of a chapter. And if you are going to do that, get a friend in class and share the book.
Books are awesome, but not for Computer Science. There are plenty of online tutorials/videos that are free.
You can't really understand modern programming languages without understanding category theory -- and this is the best book to start from. It starts out trivial, and then does mental judo on you half-way through after which you never see mathematics the same way again. (BTW this is good across all the mathematical disciplines, not just comp sci.) P.S. Do the exercises!
http://www.amazon.com/Conceptual-Mathematics-First-Introduction-Categories/dp/052171916X
If you'd like to know what its like working in the IT field on Wall Street, I recommend "120 Days of Sodom" by the Marquis de Sade.
In order to be a successful IT professional, an individual must understand: Programming, Networking and Systems Administration
On the subject of networking, Comer's work on TCP/IP is invaluable. (http://www.amazon.com/Internetworking-TCP-Volume-One-Edition/dp/013608530X)
Off the top of my head:
* _Programming Pearls_ by Bentley
* _Debugging the Development Process_ by Maguire
* _Cuckoo's Egg_ by Stoll
* _Windows Internals_ by Russinovich and Solomon if you're doing low-level Windows work.
* _Code Complete_ McConnell and _Writing Solid Code_ by Maguire are good for someone just getting their first programming job.
Not all MS programs are made equal. I'm in MS program for one of the top CS programs in the country. We don't use textbooks and PhD and MS students share the same classes. My program is heavily research-oriented rather than class-oriented. This is probably due to my grad program being heavily populated by PhD students where MS students are a tiny population. There are more class-oriented MS degrees that are basically an extension of a BS program, but obviously more specialized.
there is actually something which is far more useful to be able to do, more than any amount of books read, which is only really possible effectively and efficiently now that internet searches are possible (and quick, and accurate), and that is meta-learning. in its crudest most disparaging form one might mistakenly call this cut-and-paste programming but it is actually nothing of the sort.
basically what you do is treat everything as a black box, and use the principles of the 6 different types of knowledge (listed on the wikipedia page for Advaita Vedanta, which is mentioned specifically because the western word Epistemology is woefully inadequate) to basically reverse-engineer the subject matter and in effect teach yourself *on the go* by way of analysing the results achieved, even though you are starting out from quite literally zero knowledge.
it does however take a hell of a lot of balls to do this *whilst being paid* and most employers simply will not believe you when you tell them that this is something that you can do... and be *more effective* at applying this technique than people who have been explicitly trained or quotes have experience quotes in the field.
to be fair to those people who genuinely do have experience, often such people *may* have encountered the circumstances before, such that they *may* have the answer much quicker than you-who-has-no-experience-at-all, *but*, the critical critical thing that you need to tell prospective employers is: what happens when something falls *outside* of the experience of the person who quotes has experience quotes? whom then would the employer rather have (if they had to choose one or the other rather than both people) - the person who will get there in the end, regardless of what they are asked to do, or would they rather have the person who can get there *most* of the time but who does not have the skills or intelligence to work out the all-important remaining last 10% of the job, without which the contract will remain unfulfilled and the company will go bust because of it?
in short: no amount of reading will substitute for learning how to learn and applying that skill *every single moment of your life*. when i hear people say i am too old to learn it makes me cringe, and i feel sad for them - i cannot say anything so i have to remain silent - but i feel sad for them because i know that inside they have given up. the only time to give up learning is when you are actually dead, and not before!!!
But the books which shaped my view on computing were
-The dragon book
-Algorithms (Sedgewick)
-An Introduction to Database Systems, (C. J. Date)
-Finite fields and their applications (Lidl, Niederreiter)
-Design Patterns
-The art of computing (Partially)
Lots of mine did have textbooks. Some had specially collected packs of papers. I'm not thinking of any class offhand that didn't have some sort of reference.
"When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
I'd recommend Ellen Ullman's Close to the Machine, a book of essays written in the late 1990s. It's not a computer science book per se, but it is very insightful about how the choices programmers make trickle down to the eventual actual users of the system - that is, not the administrators and employees but the people the system makes decisions for and about. (eg, in the UK's DWP benefits system it would be the people receiving those benefits, not the people deciding whether or not they deserve them).
wg
I feel like most of what you said is true is true of my program, except that the proportion of people who leave with an MS is a majority. And in my case, I had 3 grad-level classes (compilers, PL, and algorithms) that broadly speaking worked like advanced undergrad classes -- no substantive research portion. Like I said, we didn't use texts either -- but I feel we could have easily. Other classes (with research projects as a large portion of the class) also could have, but had us reading actual papers instead -- presumably in large part to give PhD students practice. :-)
I also wouldn't say that a classes-only MS program would be more specialized, unless you mean "better aimed at someone who wants to work in industry." (But in that case, in some ways a PhD program would be much more specialized than that!)
Lots of mine (actually, almost all) had assigned paper readings, but now that you can get almost any CS paper you want free on the web collecting said papers into something that your students pick up explicitly is a lot less important than it was 20 years ago. I wouldn't count that anyway -- by "textbook" I really mean, well, a textbook. An attempt to write up of lots of existing, widely-accepted knowledge into a coherent presentation aimed at a "broad" audience. (Broad here is relative of course; I just mean not "here's what we put together for CS #### at Awesome State University.")
Title: The Elements of Computing Systems Authors: Noam Nisan and Simon Schocken Excellent book, excellent free online course