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
This is graduate level, though. Grad-level books tend to stick around for decades.
Visit the
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.
While I agree that this is true of 99% of computer-related books, there are some that are classics. Knuth's Art of Computer Programming; Strang's Linear Algebra; GoF's Software Patterns; Brooks' The Mythical Man Month; etc.
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
nonsense, good books about OS and language design, compiler theory, algorithms, information theory: those are good for decades.
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.
Maybe if all you program in are fad languages and frameworks. Books like The C Programming Language, TCP/IP Illustrated, The Practice of Programming, The Elements of Programming Style, etc. are timeless books.
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.
GoF's Software Patterns
LOL, What? This is what that makes your list look like: Hemingway's For whom the bell tolls; Faulkner's As I lay dying; Vincent & Burpo's Heaven is for real; Sinclair's The jungle
What a joke!
Required reading for internet skeptics
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...
Yep that book is " classically" overrated. It's junk that has gained a mythical status it doesn't deserve. That book isnthe cause of innumerably terrible, convoluted and unmaintainable code bases because someone was writing to "the patterns".
It's an even bigger joke is when you get quizzed in interviews by mindless retards who expect you to have memorized all the worthless "patterns" in the book. And god forbid if you ever look at the code these same idiots write. They make the OpenSSL codebase look like the greatest thing ever. If you ever though C macros could be used for ungodly amounts of obfuscation and indirection one only needs to look at the AbstractFactoryFactoryBuilderFacades that these "patterns" people write.
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
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.
K & R
Effective C++
Object-Oriented Software Construction by Bertrand Meyer
The PostgreSQL manual
I love this book. I think it would be amazingly fun to create a freshmen seminar class around.
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.
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!
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.
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.
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...
Anyone with a BS degree can get into grad school. Perhaps not MIT or Stanford, but all but the top CS program in my state have no entrance criteria above just filling out an application (and the top program is not in a metropolitan area, so forget studying there while working).
-- All that is necessary for the triumph of evil is that good men do nothing. -- Edmund Burke
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.
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 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?
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.
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.
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...
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
You absolutely do not need real/complex analysis to read 95%+ of Knuth's TAoCP. Even a math illiterate can read easily 50% of TAoCP with just a little patience, and that 50% is still way beyond what any other book will cover. Of course, whether it's worth spending this time is, as you pointed out, not obvious.
There are many more current topics; particularly, I'd plug statistics and data mining. A solid understanding of advanced statistics combined with strong algorithmic skills (coding, analysis, design, whatever) is probably the most lucrative cross-specialization there is, at least for the next 10-15 years.
"They were pure niggers." – Noam Chomsky
http://en.m.wikipedia.org/wiki...
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.
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.
It would be more correct to say that it's "classically" misunderstood. GoF is fundamentally a dictionary, but too many people understand it to be a recipe book.
sub f{($f)=@_;print"$f(q{$f});";}f(q{sub f{($f)=@_;print"$f(q{$f});";}f});
It would be more correct to say that it's "classically" misunderstood. GoF is fundamentally a dictionary, but too many people understand it to be a recipe book.
A 1000 times this. People seem to very frequently misundertand that GoF is a book on nomenclature. They give names to common patterns that exist in good software development. These patterns exist because they are useful and they come up time and time and time again. If you write software you will almost certainly implement a number of these patterns, and you certainly use software that uses them. But either way, these patterns exist in software with or without them being given names.
For the less experienced it gived examples of where such patterns might be used, but that's not the main point.
The main point is that I can call patterns by name and the person I'm talking to will understand what I mean. This is better than having to describe them each time.
SJW n. One who posts facts.
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.
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.
I write C++ on a daily basis for more than a decade and have never needed that worthless book. Same with pretty much any other C++ programmer I've talked to and many are far better programmers than me. And the code we write is not the obfuscated junk that only a "patterns" person could write. The only people I've ever met who seem to think this book is great are Java people writing unmaintainable "patterns" code.
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.
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.
"Sinclair's The jungle"
An important book for preparing any college student for what life is like in today's job market.
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...
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?)
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.
Of that list, maybe object oriented programming is important to "know". Otherwise computer science courses should be treated as language and platform agnostic, and only focus on stuff like data structures, arrays, etc. Basic theory that is applicable to any language.
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.
I never did any LISP programming in school either. Oddly enough the language that always fascinated me was Postscript. Its amazing what a printer page description language is capable of.
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.
Inaccessible? Pretty much any job or position in the world needs references. You even need references to work at McDonalds! Reason being people want to make sure you're not a total fuckup and won't take just your word for it. I know, it's tough for anti-social nerds like you to accept this, but in this life you need to be something more than a loner and *gasp* actually make social connections with other human beings!
every grad program in the US requires several letters (maybe not the for-profit degree mills?). they should also be from people you did research with to count for anything. crazy that higher education is so inaccessible in this country and that a big part of getting in is popularity.
I did more research, and it looks like we are both wrong. There are far more programs than I thought which do require references, but by no means all. A small sample size of 10 schools in my state gave 60% needing references. So it does seem to be more common than I thought, but by no means universal. And the other 40% where still quality schools, not diploma mills.
-- All that is necessary for the triumph of evil is that good men do nothing. -- Edmund Burke
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.
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.
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!!!
Different languages represent different ways to think about programming, and it is useful to learn languages for the ideas even if you never use them again. Moreover, different languages are suited for different problems. I wouldn't submit a numerical analysis assignment in Scheme, and Fortran isn't real good as an AI language.
In a computer science curriculum, at least after the freshman year, the students are normally expected to be able to pick up languages as they need them. It's a lot easier to do that when you already know a few different languages.
"When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
A must read for software engineering, anyway. Some of the stuff in it is just plain wrong, some of it is old hat, and quite a bit of it is correct and still relevant. (I recommend the Silver Anniversary edition, which has notes on these.)
"When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
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 think you'd be better skipping this and going straight to the authority on this subject: Stevens, W. Richard & Rago, Stephen A.; "Advanced Programming in the Unix Environment, Third Edition"; Addison-Wesley Professional, 2013.
People should not fear their government. Governments should fear their people.
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
It is overrated, but only by people who didn't understand it.
sub f{($f)=@_;print"$f(q{$f});";}f(q{sub f{($f)=@_;print"$f(q{$f});";}f});
" Some of the stuff in it is just plain wrong..."
Now THAT really does call for a citation. Please state what parts of "The Mythical Man-Month" are "just plain wrong".
I am sure that there are many other solipsists out there.