What little I know about software engineering, I largely taught myself through books, conversations with more knowledgeable friends, and just plain getting my hands on some code. Of all the books I’ve read, here are some of the ones I think are the very best.
I’m covering only books here, not magazine or journal articles and not web sites.
The C Programming Language, by Kernighan and Ritchie. Every SWE will ultimately need to know C (the One True Machine Language), and this book is a masterpiece of concise technical writing. It’s a pleasure to read it multiple times.
The Practice of Programming by Pike and Kernighan. Also a masterpiece of concision, and also rewards multiple readings. Covers lots of ground in an approachable and fun way.
Programming Perl by Wall, Christiansen, and Orwant. Every SWE will ultimately need to know a very high-level language (VHLL), and although Perl is not the best example of that category (I still think Python is the best day-to-day-useful VHLL), this book is the most fun.
Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein. You must eat your vegetables. This is the standard serving of vegetables.
Programming Pearls, by Bentley. A wonderful compendium of algorithms, puzzles, and creative solutions.
Expert C Programming: Deep C Secrets, by van der Linden. C is a jungle of Claymore mines, punji stakes, and unnaturally large insects. Oh my god, we are all going to die. Learn precisely how your demise will come in this disturbing novella. (This book could also go in the Security category, below.)
Higher-Order Perl, by Dominus. A fun and practical course on functional programming.
The C++ Programming Language, by Stroustrup. This is another vegetable that you will have to eat.
Effective C++, by Meyers. C++ is exponentially more terrible than C, but this book helps you keep the madness at bay. (Just barely.)
The Design of the Unix Operating System, by Bach; or, The Design and Implementation of the FreeBSD Operating System, by McKusick and Neville-Neil. Reading both is kind of overkill, but that didn’t stop me. Read this before Windows Internals, because it’s much simpler; when you understand Unix, Windows will make more (and less) sense.
Windows Internals, by Russinovich, Solomon, and Ionescu. A terrible and wonderful design, competently implemented — and wonderfully documented.
TCP/IP Illustrated, vol. 1: The Protocols, by Stevens. Solid bedrock.
Practical Internet and Unix Security, by Garfinkel, Spafford, and Schwartz. A classic, and deeper than the title suggests.
Cryptography Engineering, by Ferguson, Schneier, and Kohno. Practical and accessible. You’ll start finding vulnerabilities in real software almost immediately after reading this.
The Art of Software Security Assessment, by Dowd, McDonald, and Schuh. Pretty much everything you need to know, in theory and in practice.