Making Software, which is all about how we empirically research software engineering and some of the things we’ve learned about it.
Engineering a Safer World, about how to use a systems-theory approach to analyzing software safety. The book is available for free under the “Open Access” tab.
SICP might be in the category of “books programmers start to read”. There seem to be a lot of questions on the Internet about which Scheme implementation to use for it; fewer have actually finished reading the book and even fewer seem to have finished a significant number of the exercises. I think that’s okay; you can safely recommend SICP because you enjoyed it yourself without having finished it. That’s less true of the Dragon Book and TAOCP.
I’ve read through chapter 4 and have finished the exercises through the end of chapter 2. It’s been more enlightening to take it slowly and let the material sink in, I think.
People recommending that others, particularly beginners, read TAOCP or even Introduction of Algorithms (in a cover-to-cover way) is a pet peeve of mine.
I dunno, TAOCP is quite useful as a reference, I’ve found. You could work through it (and I have tried), but it’s just so dry and many things are not immediately applicable in your daily work. But when you need it for certain techniques, it’s a great place to go back to. I don’t think I would recommend it to a beginner at all, though.
My own non-technical recommendation: Never Split the Difference. It teaches empathetic, non-combative negotiation. This skill can prove invaluable when, for example, one wants to figure out the true cause behind seemingly nonsensical feature requests.
In How to Have Impossible Conversations, Peter Boghossian and James Lindsay guide you through the straightforward, practical, conversational techniques necessary for every successful conversation – whether the issue is climate change, religious faith, gender identity, race, poverty, immigration, or gun control. Boghossian and Lindsay teach the subtle art of instilling doubts and opening minds. They cover everything from learning the fundamentals for good conversations to achieving expert-level techniques to deal with hardliners and extremists. This book is the manual everyone needs to foster a climate of civility, connection, and empathy.
I second this recommendation. The techniques it teaches are simple, but not necessarily easy. I’ve read this book cover to cover twice now; that’s significant because I rarely read books (especially cover to cover) since my high school days were over (though I was a voracious reader at the time).
I’ve also heard good things about Computer Systems: A Programmer’s Perspective by Randal E. Bryant, David R. O’Hallaron. Though I couldn’t catch up on the entire book as yet, even the first few chapters are so enlightening and refreshing!
OSTEP would probably fit into this list as well. It’s written by an academic even though the author says they prefer books written by practitioners, but I’d argue it belongs still.
The Dragon Book is amongst the worst introductions to compilers, generally recommended by people who already know about the material contained within (in which case it can be a good reference) or people who haven’t read it at all. Better choices include Programming Language Concepts, by Peter Sestoft, and Modern Compiler Implementation in ML, by Andrew Appel.
I agree with your recommendation of Modern Compiler Implementation in ML (the “Tiger Book”) over the Dragon Book.
But, I still found Tiger Book confusing at times, because it mentions so many design alternatives. In my project group we really wanted to do first-class functions, so a lot of the alternatives the book presents were not valid. It was hard for me to see how all the pieces should fit together.
Later I read Compiling with Continuations, also by Appel, and really enjoyed it. It felt a lot more cohesive because it explains the design of one particular compiler. And the language it compiles (SML) has the cool features I was interested in. Maybe it was also easier just because I read it second. :)
Are there specific complaints you have about “The Dragon Book”?
It was one of the text books for my undergrad compilers class a long time ago, and I’ve used it as a reference several times since then, and haven’t had any complaints with it. It doesn’t cover the bleeding edge of compiler development, but it covers the basics of grammars, lexers, syntax analysis and all of that pretty well, I thought.
It does seem a little out of place under “CS Fundamentals.”
It aims to be comprehensive rather than a good intro, and it regularly does things like make passing reference to concepts which are explained later in the book. So if you already know the material it’s fine, but if you’re a n00b you’re confused.
I don’t think it’s fair to criticise it as a bad intro book because it’s not trying to be one. The Preface says it’s aimed at readers finishing up an undergrad CS education and experience with multiple programming languages. At my university, at least, a class covering the basics of finite automata, regular expressions, etc. was a prerequisite for taking the classes using this book.
The listed books (those I’ve read, anyway; 3 out of 5) are well-written and some count as classics. Most of the underlying concepts aren’t UNIX-specific anyway. Do you have alternatives which are a) non-UNIX, b) well-written and c) practical?
For what they’re like, I have a list of key, non-UNIX OS’s for people to check out with comments on them. The book on capability systems also describes some with interesting architectures.
Being a Chicken developer, you might have liked Genera and the Lisp machines. Mezzano is a recent OS I remember. Idk if it has anything like Genera’s capabilities. lispm on Hacker News had this page where the company described its advantages at the time. Some still stand.
No I don’t, that’s what I mean about Monoculture. But I would say yes, most of those idea are very UNIX-specific, we’re all just the fish that somebody asks “how’s the water?”
Certainly true, and it would be nice if there were more (books about) alternative OSes. However, most of the UNIX books go into depth about file system architecture, process scheduling, networking and so on, which any serious OS needs to implement anyway.
Well, so it happened that I only read books about Unix. Still, it seems to me that the core principles are more or less the same across different OSes.
At the time of my talk “The Pragmatic Programmer” wasn’t as relevant as before, as many of the key insights there had become common practices today. Still, there’s no argument that it’s a very important book in the history of programming. Haven’t seen the updated edition, though.
However I like to say that common practice isn’t always as common as you’d think :)
It’s very easy for people to do Just Enough to fly under the radar when in fact their actual day to day craft embodies practices that would make most Crustaceans cringe.
I speak from experience on this matter, since I resembled that remark for many years, and still do in some areas :)
More seriously, it’s hard to do everything right and sometimes on teams it’s hard to even do the things you like doing.
Totally. The trick is figuring out which things are “more right” in a way that represents actual functional difficulties as opposed to just somebody’s version of what’s elegant or idiomatic.
For instance, I’d argue that using some form of version control isn’t just best practice, it’s a strong way to keep you from shooting yourself in the foot :)
See also:
The two books I recommend to everyone are
SICP might be in the category of “books programmers start to read”. There seem to be a lot of questions on the Internet about which Scheme implementation to use for it; fewer have actually finished reading the book and even fewer seem to have finished a significant number of the exercises. I think that’s okay; you can safely recommend SICP because you enjoyed it yourself without having finished it. That’s less true of the Dragon Book and TAOCP.
I’ve read through chapter 4 and have finished the exercises through the end of chapter 2. It’s been more enlightening to take it slowly and let the material sink in, I think.
People recommending that others, particularly beginners, read TAOCP or even Introduction of Algorithms (in a cover-to-cover way) is a pet peeve of mine.
Calculating is better than scheming anyway. ;)
I dunno, TAOCP is quite useful as a reference, I’ve found. You could work through it (and I have tried), but it’s just so dry and many things are not immediately applicable in your daily work. But when you need it for certain techniques, it’s a great place to go back to. I don’t think I would recommend it to a beginner at all, though.
My own non-technical recommendation: Never Split the Difference. It teaches empathetic, non-combative negotiation. This skill can prove invaluable when, for example, one wants to figure out the true cause behind seemingly nonsensical feature requests.
A related book is Impossible Conversations.
I second this recommendation. The techniques it teaches are simple, but not necessarily easy. I’ve read this book cover to cover twice now; that’s significant because I rarely read books (especially cover to cover) since my high school days were over (though I was a voracious reader at the time).
I’ve also heard good things about Computer Systems: A Programmer’s Perspective by Randal E. Bryant, David R. O’Hallaron. Though I couldn’t catch up on the entire book as yet, even the first few chapters are so enlightening and refreshing!
Thanks for putting up this list BTW!
OSTEP would probably fit into this list as well. It’s written by an academic even though the author says they prefer books written by practitioners, but I’d argue it belongs still.
OSTEP is wonderful, +1
The Dragon Book is amongst the worst introductions to compilers, generally recommended by people who already know about the material contained within (in which case it can be a good reference) or people who haven’t read it at all. Better choices include Programming Language Concepts, by Peter Sestoft, and Modern Compiler Implementation in ML, by Andrew Appel.
for my undergrad compilers class we read Introduction to Compilers and Language Design, which I really enjoyed. free too!
I agree with your recommendation of Modern Compiler Implementation in ML (the “Tiger Book”) over the Dragon Book.
But, I still found Tiger Book confusing at times, because it mentions so many design alternatives. In my project group we really wanted to do first-class functions, so a lot of the alternatives the book presents were not valid. It was hard for me to see how all the pieces should fit together.
Later I read Compiling with Continuations, also by Appel, and really enjoyed it. It felt a lot more cohesive because it explains the design of one particular compiler. And the language it compiles (SML) has the cool features I was interested in. Maybe it was also easier just because I read it second. :)
Are there specific complaints you have about “The Dragon Book”?
It was one of the text books for my undergrad compilers class a long time ago, and I’ve used it as a reference several times since then, and haven’t had any complaints with it. It doesn’t cover the bleeding edge of compiler development, but it covers the basics of grammars, lexers, syntax analysis and all of that pretty well, I thought.
It does seem a little out of place under “CS Fundamentals.”
It aims to be comprehensive rather than a good intro, and it regularly does things like make passing reference to concepts which are explained later in the book. So if you already know the material it’s fine, but if you’re a n00b you’re confused.
I don’t think it’s fair to criticise it as a bad intro book because it’s not trying to be one. The Preface says it’s aimed at readers finishing up an undergrad CS education and experience with multiple programming languages. At my university, at least, a class covering the basics of finite automata, regular expressions, etc. was a prerequisite for taking the classes using this book.
It belongs in the category most well known unread books in my circle :)
i found John Ousterhout’s book A Philosophy of Software Design to be pretty good as well.
I spend more time reading articles about the books that programmers should read than actually reading the books
The “Operating Systems” list should just be called “Unix”. Death to this monoculture, I say!
The listed books (those I’ve read, anyway; 3 out of 5) are well-written and some count as classics. Most of the underlying concepts aren’t UNIX-specific anyway. Do you have alternatives which are a) non-UNIX, b) well-written and c) practical?
For what they’re like, I have a list of key, non-UNIX OS’s for people to check out with comments on them. The book on capability systems also describes some with interesting architectures.
Being a Chicken developer, you might have liked Genera and the Lisp machines. Mezzano is a recent OS I remember. Idk if it has anything like Genera’s capabilities. lispm on Hacker News had this page where the company described its advantages at the time. Some still stand.
I was specifically referring to book recommendations, but thanks for the list!
No I don’t, that’s what I mean about Monoculture. But I would say yes, most of those idea are very UNIX-specific, we’re all just the fish that somebody asks “how’s the water?”
Certainly true, and it would be nice if there were more (books about) alternative OSes. However, most of the UNIX books go into depth about file system architecture, process scheduling, networking and so on, which any serious OS needs to implement anyway.
Well, so it happened that I only read books about Unix. Still, it seems to me that the core principles are more or less the same across different OSes.
They included The Passionate Programmer but NOT The Pragmatic Programmer
raised eyebrow.
At the time of my talk “The Pragmatic Programmer” wasn’t as relevant as before, as many of the key insights there had become common practices today. Still, there’s no argument that it’s a very important book in the history of programming. Haven’t seen the updated edition, though.
That’s a perfectly reasonable take.
However I like to say that common practice isn’t always as common as you’d think :)
It’s very easy for people to do Just Enough to fly under the radar when in fact their actual day to day craft embodies practices that would make most Crustaceans cringe.
I speak from experience on this matter, since I resembled that remark for many years, and still do in some areas :)
I appreciate the self deprecation.
More seriously, it’s hard to do everything right and sometimes on teams it’s hard to even do the things you like doing.
Totally. The trick is figuring out which things are “more right” in a way that represents actual functional difficulties as opposed to just somebody’s version of what’s elegant or idiomatic.
For instance, I’d argue that using some form of version control isn’t just best practice, it’s a strong way to keep you from shooting yourself in the foot :)
“The Pragmatic Programmer” was updated in January 2020. I haven’t read the 20th anniversary edition yet though.