My Favorite Computer Science Books

I would like to share five of my favorite computer science books. Almost all of these books are available online in one shape or form, and I am happy to lend them if you can’t find them online. Also, I will continue to make updates to this list when I find more interesting books. Feel free to email me with a book suggestion if you have a favorite.

1. Writing for Computer Science - by Justin Zobel

book1

This book was recommended by one of my mentors many years ago, and I was too busy to read it for a couple of years (regrettably). As a second language speaker, I struggled with writing early on as a student, and this book helped me improve my writing style. One can never overestimate the value of written and verbal communication. Writing is beyond recording information, it is a form of systematic thinking, and it helps us process and understand complicated concepts that we cannot perceive otherwise. One of the important concepts I learned from this book is that writing does not follow research, writing IS research, and therefore it starts before any experiments are conducted.

I have read and reread this book and I continue to enjoy it, especially when I struggle with an occasional case of writer’s block. Whenever I find it difficult to come up with satisfying sentences, flipping through this book helps me regain a motivation and a flow to write better.


2. Data Structures with C++ Using STL - by William Ford

51f3r8Sv4YL.jpg

Data structures is one of my favorite topics to teach, and I find this book an excellent way to understand the elegant concepts using C++. In my view, and I realize that this might be a controversial view, C++ is the most suitable language to learn data structures deeply and fully. One of the things that I like about this book is that it explains C++ concepts very well just before they are used or needed. I used this book to prepare for my preliminary exams early in PhD and it made things much easier for me. I recommend this book to understand pointers and memory management concepts that are not reachable in many other programming languages.


3. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems - by Aurélien Géron

81kv0vHJ0QL.jpg

I learned machine learning the old-fashioned math-based way, and I struggled to scale my implementations and understanding of machine learning practically with modern tools outside of the classroom. I read the first edition of this book and it was exactly what I looked for, a practical project-based guide to machine learning with Python. As early as the 2nd chapter of the book, you build a full machine learning real-estate estimation system that makes decent predictions. I recommend the most recent edition of this book to anyone interested in practicing machine learning.


4. Software Engineering at Google: Lessons Learned from Programming Over Time - by Titus Winters

41uvuuFt06S._SX379_BO1,204,203,200_.jpg

I found that software engineering in academia is sometimes blind to software engineering practice in real-life. Reading research papers, sometimes I sense a separation between software engineering theory and practice. This book provides an understanding of how software engineering is practiced in real-life in one of the biggest tech companies in the world today. I enjoyed the insider perspective and learning about culture in tech companies. I recommend this book to anyone interested in gaining an understanding of how technology is created in companies like Google.


5. System Design Interview – An insider’s guide - by Alex Xu

41WOfByjSPL._SX331_BO1,204,203,200_.jpg

I find system design and software architectures difficult to describe and teach. One must see several architectures to understand what architecture is, and most projects in academia do not reach the scale or problems associated with architecture. The problems of bad architecture usually become more obvious with growing number of users over a period of time. The beauty of this book is that it presents a rich discussion of design and architecture without getting bogged down with the specifics. It presents a natural evolution of system design with the solutions for common problems such as scale and security. I don’t expect a fresh graduate to be responsible for designing a huge software architecture (except in a startup maybe), but every graduate should be able to discuss an architecture and understand its design decisions. This book is an excellent resource to anyone interested in system design and software architecture.