“Programming Pearls” by Jon Bentley is a book based on a collection of articles written by the author for the eponymous column in Communications of the ACM. True to its name, the book presents several pearls of programming wisdom based on the hard-won experience of a brilliant computer programmer who was also lucky enough to be associated with some of the brightest minds in computer programming (the group at Bell Labs). The icing on the cake is the clarity and brevity of the book. I have read the book at least three times over the years and I continue to learn new things from it - no wonder this book is considered a classic in computer programming.
“A Philosophy Of Software Design” is a book by John Ousterhout that aims to teach a set of principles by which one can learn how to design software-systems in order to reduce the overall complexity. This is a tall order for a relatively slim book, but I am happy to report that it lives up to its expectations. I had read many good things about the book from people whom I respect, so I was somewhat prejudiced in its favor before I started reading it. That said, almost all practitioners in the field will find something or the other in this book with which they will disagree.
Although “Concepts, Techniques, and Models of Computer Programming” by Peter Van Roy and Seif Haridi looks intimidatingly big at around 900 pages, I found it surprisingly easy to read. It has a good balance of theoretical and practical descriptions of the concepts covered by it. It has a cohesive overview of the major programming styles in a manner that I have not seen in any other book. I would rank it as a must-read for the serious programmer along with classics like “The Art of Computer Programming” and “Structure and Interpretation of Computer Programming”.
Books filled with good practical advice about constructing software are rare. Code Complete by Steve McConnell is a well-written rarity in this field and has a well-deserved reputation as a classic. It is one of those books that every computer programmer ought to have read. I had read the first edition, published in 1993, as a budding programmer and the book left a lasting impression on me. With the benefit of several years of experience, I find myself agreeing almost entirely with the updated second edition, published in 2004. When someone asks me “How do I write good code?”, I point them to this book without hesitation.
“How to Solve it by Computer” by R. G. Dromey is inspired by George Polya's classic book on problem-solving “How to Solve it”. This book explores how good problem-solving techniques can be applied in computer programming to come up with efficient algorithms for many problems.
In their book “The Practice of Programming”, Brian Kernighan and Rob Pike aim to advise computer programmers on things like testing, debugging, style, performance, design, portability, etc. that they are not usually taught in computer science classes or programming courses. This is what they call the “practice” of programming. Many pick these up over the course of their careers with some trial and error; many simply don't. This is the kind of book that has lessons for both rookie and seasoned programmers and that deserves multiple readings over the course of one's career.
“Computer Architecture” by John Hennessy and David Patterson is an advanced text on the subject that is a sequel to their other book “Computer Organization and Design”. The authors assume in this book that the reader is already familiar with the topics introduced in the other book and build upon these topics. Even then there is a fair amount of overlap among these books that is a bit irritating if you have only recently read the other book.
“Computer Organization and Design” by David Patterson and John Hennessy is an introductory text on this subject for budding computer scientists and computer engineers. The field has been in a state of constant flux in recent times and this book serves as an excellent reference even for professionals, since its authors have kept it up-to-date with all the latest developments. The downside is that such a book becomes dated pretty quickly by its very nature, assuming the field continues its breakneck pace of development even into the near future.
“Data Structures and Algorithms” by Alfred Aho, Jeffrey Ullman and John Hopcroft is a relatively-short introductory text for data structures and algorithms useful for computer programming. It covers a surprisingly-broad set of topics considering its size. It is fairly dated now but it still has all the essential data structures, algorithms and algorithm analysis techniques.
I put off reading Introduction to Algorithms by Thomas Cormen, Charles Leiserson, Ronald Rivest and Clifford Stein (popularly known as “CLRS”) for quite some time because I was somewhat intimidated by its bulk. The recent release of the third edition of this tome finally made me get a copy and give it a dekko. This compendium of a number of algorithms and data structures for computer programming is bulkier than its predecessors, but it does not disappoint. It should serve as a good reference for this field, though not quite as an introductory text for beginners. A serious professional will have a copy handy at all times. Somewhat surprisingly, it does manage to leave out some commonly-encountered data structures and algorithms, so it is not as comprehensive and up-to-date as I would have liked.
“The Art of Computer Systems Performance Analysis” is a comprehensive book by Raj Jain on a topic that is often ignored by computer programmers and architects or is approached in a haphazard manner: the analysis of the performance of computer systems. Such an analysis is useful for capacity-planning, selection of hardware or software for procurement, identification of bottlenecks in an under-performing system, etc. To be clear about the intent of this book, it is not a cookbook on building high-performance systems or on optimising code to make it run faster. Even though it was first published nearly 20 years ago, almost all of it still remains relevant and useful. It would perhaps not be hyperbolic on my part to term this book as one of the under-appreciated classics of computer programming.
“An Introduction to Database Systems” by Christopher J. Date is a classic text-book on database concepts by one of the foremost writers and thinkers in the field. The book has been kept fairly up-to-date over the years by the author and includes topics like logic databases, temporal databases, decision support systems, object databases, object-relational databases, etc. Most of the book however concentrates on the relational data model and relational database management systems. This is not surprising since most of the popular database management systems today are based on this model and the author too clearly prefers this data model over all the others.
“Computer Networks” by Andrew S. Tanenbaum is a comprehensive text-book on the topic written by an author with many popular text-books to his credit. There are more than 800 pages in this book, though the prose is fairly accessible and peppered with the entertaining wit and sarcasm that is the hallmark of the author's text-books. Even though its 2002 vintage shows through every now and then, the book on the whole is fairly up-to-date and still quite relevant. It is therefore a great text-book from which to teach yourself about computer networks.
“Operating System Concepts” by Abraham Silberschatz, Peter Galvin and Greg Gagne is a text-book that teaches the basics of operating systems design. As is implied by the title, the book focuses more on the concepts than their implementation. Almost all the concepts that you need to know to appreciate the working of an operating system are explained here and illustrated with numerous case studies.
“Distributed Systems: Concepts and Design” by George Coulouris, Jean Dollimore and Tim Kindberg is an introductory text-book on distributed computing. It provides a broad overview of the basic principles as well as the major issues in building such systems. Since I happened to have the second edition around, I decided to read that instead of going for the currently-available fourth edition (a fifth edition is in the works), as the two editions didn't seem to differ significantly. This turned out to be not that bad a decision.
“Learn You A Haskell For Great Good” is a nice book with a weird title written by Miran Lipovača. It gently introduces you to functional programming with the Haskell programming language and manages to cover a surprising amount of ground without being intimidating. The author and his publisher have very kindly made the entire book available for free on-line. I think it is a great resource to start learning Haskell, but by itself it is unfortunately not enough to become proficient.
As its sub-title indicates, “Unix” is a book by Brian Kernighan that tells the story of the evolution of the Unix operating system at Bell Labs and beyond. The author was a part of the small and extremely talented group at the hallowed Bell Labs that used and developed what came to be known as Unix. This perspective of the author and their excellent writing skills that has been repeatedly demonstrated via several great books makes this a must-read book for any student of Computer History.
“Out Of Their Minds” by Dennis Shasha and Cathy Lazere is an early (circa 1995) book on the lives of then-living 15 influential computer scientists - some well-known among the students of Computer Science, some not quite so well-known. The stated aim of the book is to get these people to talk about their inspirations, their contributions and where they see the future of their field. As it was published just around the time the world-wide web was becoming popular and computers in general were becoming ubiquitous, it provides very interesting perspectives and historical background.
“Programming Languages” (Second Edition) by Ravi Sethi is a book desgined to be used as one of the text books in a “Principles of Programming Languages” CS course. To that end, it covers all the major programming styles (imperative, functional and declarative) and variants (object-oriented and concurrent), basic lambda calculus, a short tour of a representative programming language or two for each of the covered styles, numerous exercises for the students to work out, extensive bibliography, etc.