An Introduction to Statistical Learning: with Applications in R (Springer Texts in Statistics)
Gareth James , Daniela Witten , et al.
4.8 on Amazon
72 HN comments
Mastering Regular Expressions
Jeffrey E. F. Friedl
4.6 on Amazon
72 HN comments
Game Programming Patterns
Robert Nystrom
4.8 on Amazon
68 HN comments
Steve Jobs
Walter Isaacson, Dylan Baker, et al.
4.6 on Amazon
67 HN comments
Machine Learning: A Probabilistic Perspective (Adaptive Computation and Machine Learning series)
Kevin P. Murphy
4.3 on Amazon
66 HN comments
The Cuckoo's Egg: Tracking a Spy Through the Maze of Computer Espionage
Cliff Stoll, Will Damron, et al.
4.7 on Amazon
61 HN comments
Programming: Principles and Practice Using C++ (2nd Edition)
Bjarne Stroustrup
4.5 on Amazon
58 HN comments
Ghost in the Wires: My Adventures as the World’s Most Wanted Hacker
Kevin Mitnick, William L. Simon, et al.
4.6 on Amazon
55 HN comments
Modern Operating Systems
Andrew Tanenbaum and Herbert Bos
4.3 on Amazon
54 HN comments
Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software 2nd Edition
Eric Freeman and Elisabeth Robson
4.7 on Amazon
52 HN comments
The Singularity Is Near: When Humans Transcend Biology
Ray Kurzweil, George Wilson, et al.
4.4 on Amazon
51 HN comments
The Everything Store: Jeff Bezos and the Age of Amazon
Brad Stone, Pete Larkin, et al.
4.6 on Amazon
51 HN comments
Compilers: Principles, Techniques, and Tools
Alfred Aho, Monica Lam, et al.
4.1 on Amazon
50 HN comments
Test Driven Development: By Example
Kent Beck
4.4 on Amazon
45 HN comments
Patterns of Enterprise Application Architecture
Martin Fowler
4.5 on Amazon
43 HN comments
erkoseonJuly 9, 2014
switch007onJuly 7, 2010
lordleftonJune 15, 2020
jammygitonJan 24, 2019
vips7LonOct 21, 2019
I found Operating Systems: Three Easy Pieces to be better.
http://pages.cs.wisc.edu/~remzi/OSTEP/
wmfonJan 27, 2009
http://books.google.com/books?id=pqYl3SWkA64C
http://books.google.com/books?id=tqtZGQAACAAJ
winkonMay 16, 2014
chadcmulliganonJune 21, 2021
Modern Operating Systems by Tanenbaum is a good theory book - this will probably answer your questions about flushing etc
for down and dirty:
Advanced Programming in the UNIX Environment
TCP/IP Illustrated, Volume 1 (2 and 3)
dwdonNov 17, 2018
I would add: An Introduction to Database Systems - Date
Also a few unmentioned so far:
Discrete Mathematical Structures - Kolman
Introduction To Systems Analysis And Design - Hawryszkiewycz
Modern Operating Systems - Tanenbaum
monocasaonAug 25, 2018
You internalize those, combined with your experience, and you'll be better off than a lot of CS grads.
rkrzronFeb 2, 2017
Yes, it's almost a 1000 pages, but it's written very accessibly and understandably.
weinzierlonAug 27, 2019
yanonOct 15, 2010
rkrzronFeb 14, 2017
It does not focus on the concrete implementation of an OS though.
KociubonSep 6, 2014
Wrong.
The dinosaur book is written by Silberschatz, Galvin and Gagne and is called "Operating System Concepts"
reacwebonOct 21, 2019
elcapitanonApr 29, 2021
rendxonJan 24, 2021
If you don't want the full level of detail, just skip certain parts! You will still learn a lot. I know many people are reluctant to "read a book" and then skip 80% of it, but it is a really great technique for non-fiction.
ma2rtenonDec 26, 2016
countonSep 17, 2014
I'd also get 'Modern Operating Systems' by Tannenbaum, which will explain lots of stuff that might be opaque/confusing if you're not already a kernel guy.
maaaatsonApr 18, 2014
Here is the table of contents: http://www.amazon.com/review/R3K8J39AMWS64U/ref=cm_cr_dp_tit...
EvgeniyZhonNov 25, 2016
wyclifonDec 31, 2011
http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenb...
vips7LonOct 21, 2019
BeltirasonJan 24, 2018
[1] https://www.goodreads.com/book/show/166195.Modern_Operating_...
mvangaonOct 8, 2012
I also think for understanding how operating systems work, nothing beats writing your own! I learned most of the concepts by building a toy OS during the better part of my undergraduate studies. I highly recommend this for people who like coding and are afraid of jumping into the theory too quickly. For example, analyzing memory allocation algorithms is never as interesting as when you have to pick one for your own kernel!
happy-dudeonNov 14, 2018
Have you ever checked out OSTEP: Three Easy Pieces? (http://pages.cs.wisc.edu/~remzi/OSTEP/) I am finding that a much more accessible, organized, and easy-to-ready resource than Tanenbaum's Modern Operating Systems. What do you think of it?
Also, I've recently got my hands on "Practical Filesystem Design," written by the developer of the BeOS filesystem. A PDF is available here: http://www.nobius.org/dbg/practical-file-system-design.pdf
kbronSep 2, 2017
I started out with C, definitely didn't know how to write multithreaded code when I was 10 haha. I learned most of that after reading a great book on operating systems (Modern Operating Systems by Andrew S. Tanenbaum) a couple months ago.
I'm trying to clean up my Github, you'll notice the "DayN" repositories are just edited versions of stuff I found online to learn from. These days I create my own projects, and am slowly deleting those "learning" repositories and making them private.
winter_blueonSep 29, 2014
I would also recommend Andrew Tanenbaum's "Modern Operating Systems" or "Operating Systems: Design and Implementation" (the MINIX book), to anyone interested in OS dev. I read it when I was teenager (around 15), and I really really enjoyed it. Tanenbaums' books were one of the few truly addicting textbooks. As a side, "Structured Computer Organization" by Tanenbaum was also really great. It gives you a foundational understanding of how computers are architected that is indispensable if you're going to be doing OS dev.
fmax30onJuly 10, 2014
Even though i have never seen him nor have i ever met him.
But his words still echo in my mind. Modern Operating Systems and Computer Networks , both extremely well written. They certainly did taught me alot.
Here is to Prof. Tanenbaum , Thank you sir , for teaching me .Even though i've never met you nor i may ever meet you in this life but you should know that some guy from South Asia is thanking you from the bottom of his heart.
mettamageonMay 7, 2021
> The second development concerned the language in which UNIX was written. By now it was becoming painfully obvious that having to rewrite the entire system for each new machine was no fun at all [0], so Thompson decided to rewrite UNIX in a high-level language of his own design, called B. B was a simplified form of BCPL (which itself was a simplified form of CPL, which, like PL/I, never worked). Due to weaknesses in B, primarily lack of structures, this attempt was not successful. Ritchie then designed a successor to B, (naturally) called C, and wrote an excellent compiler for it. Working together, Thompson and Ritchie rewrote UNIX in C. C was the right language at the right time and has dominated system programming ever since.
Tanenbaum doesn't say it, but it almost seems like B and C were designed for creating UNIX. I wonder to what extent the authors of B and C were designing the languages for creating UNIX.
[0] In one of the previous paragraphs, Tanenbaum mentioned that the first version of UNIX was written in assembly.
[1] Modern Operating Systems (ed. 4, p. 715)
mettamageonMay 12, 2021
With that said, I have read/watched tutorials by people who just learned something and the empathy level to beginners is really high. That's something that can be missing with people who have years and years of experience.
ThePhysicistonFeb 15, 2019
reidraconFeb 24, 2013
"Operating Systems: Design and Implementation" (included Minix) and "Modern Operating Systems" are great books and I think is because of them that Minix is relevant in OS teaching (specially OSDI, although I enjoyed MOS too).
EDIT: typo
hadoukenioonMar 31, 2014
kev009onDec 17, 2010
+Code Complete - A no nonsense approach to Software Engineering and other tasks related to development. The SE texts used in most college courses are far too advanced and abstract for undergrad students that have never worked on very large projects. This one delivers excellent advice for single programmers up through medium size groups.
+Some algorithm and data structure book - there are a lot of bad ones. Use Amazon ratings to try and find a good one. Work through the design of as many algorithms as possible, no matter how mundane or the fact that most practical languages have libraries that deliver this functionality. Know what algorithmic complexity is and memorize the complexities of often used data structures to help quickly choose while coding.
+An operating system design book (e.g. Operating System Concepts or Modern Operating Systems) - know how the OS packages RAM, storage, CPU scheduling, network, concurrency for userland programming.
lkrychonNov 30, 2018
CS50 (https://www.edx.org/course/cs50s-introduction-computer-scien...) - Best Intro to Computer Science
Nand2Tetris I and II (https://www.coursera.org/learn/build-a-computer) - Build a computer from logic gates up to a compiler, this is the best class I've ever taken.
Agile Development Using Ruby on Rails (https://www.edx.org/professional-certificate/agile-developme...) - Great introduction to web development and software engineering principles
I've also been reading some technical books. Would definitely recommend
Modern Operating Systems - Tanenbaum
Designing Data-Intensive Applications - Kleppmann
justin66onJuly 9, 2014
Modern Operating Systems is an amazing book but it works at a somewhat higher level. You'll basically read about stuff that happens, or might happen, in an operating system. You'll learn about threading, the elevator algorithm, dining philosophers, how virtual memory works, how a memory allocator works, and a bunch of other stuff.
It's a very well written textbook. The thing that struck me was the way it introduces things at a theoretical or high level and then trusts students enough to present them with real C code and real problems to solve on the next page. Just an excellent textbook.
eggyonAug 23, 2016
I had the 1st Edition with around 12K lines of C in the appendix. Great book, and I had Minix 1.5 running on my old Amiga around 1990. Minix was more portable than Linux, which came out around 4 year after Minix.
I had my money on Minix when Linux came along, since Minix was a microkernel, and I thought it sounded like the better direction to take. Well, Linux won out, and funny enough microkernels came back in style anyway with MachTen, MkLinux, and QNX. QNX was very successful in the realtime OS world. I used it on two jobs.
The newer Tanenbaum book: "Modern Operating Systems" I have not read, but if it is like the first one, I'd imagine it would be very educational too.
rshepherdonApr 6, 2011
I was (am?) a self-taught programmer, I guess I am transitioning away of that label. I am a bit less than halfway through the MSCS program at the moment. I really cannot recommend it enough.
I think I was a pretty good software engineer prior to getting some formal education, but I cannot tell you how often in class the light from heaven just shines right down.. "oh so that's why x is y". If you enjoy the work, its a real pleasure (albeit a painful amount of work at times).
So finally I get to the point. I can see that you have already received a lot of good recommendations. I think most of them are quite good. However, I have a couple of observations about specific books.
Intro to Algorithms - Cormen etc.
If you feel you need a discrete math course, then this book is probably not a good place to start with algorithms. It is a rigorous treatment of the subject. However, if you lack mathematical sophistication, this book can be tough. I aced my discrete course prior to taking an algorithms course taught with this book, and I struggled mightily to get an A-. I found the proofs in the book difficult to understand on many occasions.
Modern Operating Systems - Tannenbaum
This book is very easy to understand and provided me with so many "A HA!" moments. A real pleasure. I am not sure what your current work is, but the only pre-req on this book is a modest amount of C/C++ programming. The reason I say this is because I found that having that, this book allowed me to finally understand what is happening from compile time down to the CPU at runtime. A really rewarding journey.
matthias509onJune 21, 2021
GrumpyYoungManonJuly 14, 2020
For general OS knowledge, I second the other poster's recommendation of Tanenbaum's "Modern Operating Systems"
jfaucettonAug 15, 2012
As a teen, I fumbled around for a while before discovering linux and open source and that good feeling you get when you download the src and start perusing and firing up your debugger. Having said that if you teach js, I'd highly recommend dojo, underscore, I guess most c /c++ might be too advanced but if not Webkit, Redis, and glib are clean fun code bases and dissecting Lisp / Emacs was a blast. As far as answering you actual question goes, I really liked Gödel, Escher, Bach back then, also thinking recursively by Roberts. The only "technical" book I enjoyed reading was Modern Operating Systems by Tanenbaum ( don't know what current editions are like, the roughly 2000-2001 version was great though). Its was simple, very clear, humorous, and a gives a great overview of how the os works.
microtheriononApr 5, 2019
Yes, Dijkstra made major contributions to algorithms—exactly the "safe corner" where correctness thinking applies. Ironically, one of his contributions was to the concept of semaphores. I sure don't hear any of Dijkstra's fans claim today that if distributed programs just used semaphores, all our concurrency problems would be solved.
Another important contribution: The Banker's algorithm, of which Andrew Tanenbaum observed (Modern Operating Systems, 2nd ed):
> The banker’s algorithm was first published by Dijkstra in 1965. Since that time, nearly every book on operating systems has described it in detail. Innumerable papers have been written about various aspects of it. Unfortunately, few authors have had the audacity to point out that although in theory the algorithm is wonderful, in practice it is essentially useless because processes rarely know in advance what their maximum resource needs will be. In addition, the number of processes is not fixed, but dynamically varying as new users log in and out. Furthermore, resources that were thought to be available can suddenly vanish (tape drives can break). Thus in practice, few, if any, existing systems use the banker’s algorithm for avoiding deadlocks.
... which is pretty much my argument: Dijkstra picked himself the neat little corner that WAS amenable to mathematical reasoning, at the expense of real world applicability.
One of Dijkstra's contributions to language design was resigning from the Algol 68 committee. It might do proponents of formal methods good to reflect on why that language was less than a stellar success, given how strongly it relied on advanced formal descriptions.
But the question is not whether Dijkstra contributed to algorithms, language design, or concurrent+distributed computing (he certainly did). The thesis that the Article presents (and supports by quoting Dijkstra, who did agree with that thesis) is that formal methods apply universally in system design, and that today's software woes are largely the result of insufficient application of formal methods.
It is there that I disagree, and that Dijkstra kept pontificating about despite having abolished programming and using computers around the time he started focusing on formal methods. And that detachment from and disdain of the actual practice of computer use is what renders his later opinions suspect to me.
winter_blueonJuly 9, 2014
jason_slackonOct 15, 2010
I have:
- Modern Operating Systems
- Operating Systems Concepts
- Operating Systems (Design and Implementation)
- Solaris Internals
- Design of the FreeBSD Operating System
Sorry for being vague. I just dont have them in front of me right this second...but I cab get more specific if you want.
ggchappellonJan 14, 2016
> A set of processes is deadlocked if each process in the set is waiting for an event that only another process in the set can cause.
That is from Modern Operating Systems, 4th ed. (2015), by A.S. Tanenbaum & H. Bos, page 439. (By "process" they really mean "process or thread".)
One way for thread A to wait on thread B is as you said: thread A can request a lock that thread B currently owns; then A waits for B. So requesting locks in opposite orders can result in deadlock. But of course if there are no locks, then no such waiting occurs, and so deadlock from this cause is impossible.
But there are other ways to wait. If var_a and var_b are shared variables, then code like the following might result in deadlock (The following code is in C; to simplify things, I'm assuming that data races and memory-access ordering are not issues.)
Thread A does:
And thread B does:
If Pony is capable of executing code like the above, then deadlock is possible.
pkaleronFeb 15, 2018
The fix would be to rewrite CoreText in a memory safe language like Swift. This would be “hard”. Or put CoreText in an XPC container. This would both be “hard” and result in terrible performance.
For more details on how hard C, memory management, systems programming, and operating system development is please refer to your local copy of Modern Operating Systems by Andy Tannenbaum.
kevstevonApr 6, 2020
I have also been reading Modern Operating Systems by Tanenbaum- though a quite old edition from the early 200s- wondering if its worth putting on hold until I can get my hands on a newer edition.
Next up, I'd like to do Ben Eater's 8 bit computer as well as nand2tetris.
vmarshall23onJan 6, 2018
There's just so much "how does all this shit actually work" in there ....
JarihdonOct 1, 2012
have - understanding the linux kernel as your reference manual.
by now, you should be comfortable to read/understand the kernel source; download linux kernel source and start browsing through the code.
simply reading books wont get you anywhere - you need to play around with kernel source inorder to understand the linux kernel behavior and different problems you may come across. write simple kernel modules to get a hang of how you can interact/modify with the kernel.
join some opensource project and start fixing bugs you're comfortable with or just play around with your local linux kernel source - make changes; build and deploy and observe what happens.
EDIT:
if you have no prior knowledge of OS Theory and Fundamentals; then you should start here first - read either of the following books
1) Operating System Concepts by Galvin, Silberschatz OR 2)Modern Operating Systems by Tanenbaum
For programming related - system calls and stuff
read 1) Advanced Programming in the UNIX Environment - by Richard Stevens
strlenonAug 28, 2010
Really? That's standard terminology and I could define both in few sentences and could fresh out of college. I don't do OS development (and while I've tweaked a few lines in the kernel source, I'm not a kernel hacker by any means), but I understand the differences between spinlocks, event loops and blocking on mutexes (it's a core part of userland systems/network programming).
I highly suggest picking up Andy Tannenbaum's "Modern Operating Systems" (the MINIX book is excellent too, but is more about "the right way" to build an OS with a microkernel etc... rather than a case study of what exists). It's accessible and meant as an undergraduate text and will give you at least a cursory overview of these issues. It just seems like you had a bad professor for your operating systems course.
T-RonApr 6, 2011
Structure and Interpretation of Computer Programs - Abelson, Sussman, and Sussman
Introduction to Algorithms - Cormen, Leiserson, Rivest, and Stein
The Art of Assembly Language - Hyde
a digital logic book (not sure which is most recommended), and an architecture book (see reply by tftfmacedo)
Modern Operating Systems - Tanenbaum
Introduction to the Theory of Computation - Sipser
Compilers: Principles, Techniques, and Tools - Aho, Lam, Sethi, and Ullman (a.k.a. "Dragon Book")
Programming Language Pragmatics - Scott
A database design book (one that covers Relational Algebra, not just a book on SQL), and maybe a book on Networks. Also, Roy Fielding's paper on REST is both academic and applicable (and more approachable than you'd expect of a Ph.D paper). If you want to go all the way, an undergraduate program usually also has Calculus, Discrete Math, Linear Algebra, and Statistics. Some schools would also require Physics and Differential Equations. I'm sure I'm missing some topics, too, particularly electives.
If you can get through those and the associated problem sets, you'll have a better foundation than most.
mrongeonMar 4, 2008
A less theoretical book, that is useful for a gentle intro is Masting Algorithms with C.
A bit off the theory track, but useful for a software engineer: Modern Operating Systems by Tanenbaum and Computer Organization and Design for info on hardware.