Andrew S. Tanenbaum
Computer Networks, Fourth Edition is the ideal introduction to computer networks. Renowned author, educator, and researcher Andrew S. Tanenbaum has updated his classic best seller to reflect the newest technologies, including 802.11, broadband wireless, ADSL, Bluetooth, gigabit Ethernet, the Web, the wireless Web, streaming audio, IPsec, AES, quantum cryptography, and more. Using real-world examples, Tanenbaum explains how networks work on the inside, from underlying physical layer hardware up through today's most popular network applications.
I've always been a largely independent learner gleaning what I can from Wikipedia and various books. However, I fear that I may have biased my self-education by inadvertent omission of topics and concepts. My goal is to teach myself the equivalent of an undergraduate degree in Computer Science from a top university (doesn't matter which one).
To that end, I've purchased and started reading a few academic textbooks:
As well as a few textbooks I have left over from classes I've taken at a mediocre-at-best state university:
My questions are:
Software engineering books are welcome, but in the context of academic study only please. I'm aware of Code Complete and the Pragmatic Programmer, but I'm looking for a more theoretical approach. Thanks!
I think you can use most of the other books for reference and just absorb Programming Pearls in its entirety. Doing so would make you better than 90% of the programmers I've ever met.
The "Gang of Four" Design Patterns book. The Design Patterns course I took in college was probably the most beneficial class I've ever taken.
If I were deciding between hiring two programmers and neither had much experience, but one had a CS degree and the other didn't, I'd hire the one with the CS degree. But when you get to comparing two programmers with a dozen years of experience, the degree hardly matters.
Even i'm in the same plane: studying computer science in my free time after work; These are some of the books i have in my shelf right now
Will udpate this list further as soon as i finish them... :-)
I would add Introduction to the Theory of Computation to the list
A lot of good info about block devices and file structuring which you won't find in any of the books you listed. It got a few critical reviews on Amazon because people didn't like his code examples, but the point of the book is to teach the concepts, not give cut and paste code examples.
Also make sure to get a book on compilers
Biggest two omissions I see:
For operating systems I prefer the Tanenbaum instead of the Silberschatz but both are good:
And about the order, that would depend on your interests. There aren't many prerequisites, automata for compilers is the most obvious one. First read the automata book and then the dragon one.
I don't know all the books you have, but the ones I know are good enough so that may mean the others are decent as well.
And let's not forget some database theory books!
In order to cover for my (glaring) lack of knowledge in the basics of networking, I'm looking for a book which would ideally cover:
-> 1 or 2 chapters on the transport layer: tcp, udp...
-> 1 or 2 chapters on the application layer: http, dns...
-> rest of the book would be devoted to pratical way of sending data across the wire using Java-related technologies. This would involve discussions about existing products (eg. hessian, protobuf, thrift, tibco...) , performances comparisons, case studies...etc..
Does such a book exist ?
Edit: Thanks for all the answers so far... however most of the books listed focus heavily on the lower levels of the networking stack (ie. tcp/ip, network administration...). This is one-half of the answer only. I'm still eager to hear suggestions about the other half: discussions around the "state of the art" options available to the Java developer to ferry data around, what products/frameworks are available and how do they compare.
For a TCP/IP text (Not Java centric)
For a Java Networking book I would go with this. Most books are very dated and do not cover the newer stuff, this one covers NIO as well as uses generics in the examples.
If you are looking for improving upon basics on networking it would be better if you look at books which cover basics of networking. Once you are comfortable with the basics of networking you can start with the networking section in Java tutorial and explore the appropriate Java libraries. Networking is an area of its own whose understanding is independent of any programming language.
That said, some of the networking books which I have found helpful are :
Internetworking with TCP/IP, Vol 1 by Douglas Comer
TCP/IP Illustrated Vol.1 by W.Richard Stevens
Computer Networks by Andrew.S.Tanenbaum
As a primer on networking in general, I'd recommend TCP/IP Network Administration, Third Edition, by Craig Hunt. This book provides a chapter on the TCP/IP stack, another on Addressing and routing and the remainder of the book covers in reasonable depth most common network services and diagnostic tools.
For a heavyweight reference, get TCP/IP Illustrated, Vol 1: The Protocols, by Richard Stephens, if you become obsessed with networks buy or borrow volumes 2 and 3.
As far as Java specific networking introduction, I'd suggest Java Network Programming, Third Edition, by Elliotte Rusty Harold, this book does take some critiscim but I still believe it's a good introduction and is an approachable read.
It's a general book for Java beginners but the part about networking is very, VERY clear and easy to grasp.
Can the BitTorrent protocol specify wanting the first 3% or first 5% of the file first? If not, would adding such support be an improvement to the protocol?
Update: so i guess, if it is part of the protocol, why the many clients out there do not use it? After 10 minutes, 10% of the file is done, but usually you cannot even preview 1% of the content... (depends on luck)
BitTorrent's purpose as a protocol is not for streaming media, its purpose is to make a best effort at keeping all data of interest reliably available at all times. Using it for media streaming purposes is actually counterproductive to BitTorrent's goal.
If it's not obvious to you why this is the case, I suggest picking up Computer Networks by Tanenbaum before you go any further.