# Essential Reads for the Aspiring Self-Taught Computer Scientist
Written on
Chapter 1: Introduction to Self-Directed Learning in Computer Science
If you’re keen to grasp the formal principles of computer science, you may quickly discover the challenge of finding suitable learning materials. Online educational resources often come with high costs and varied expectations. Many assume you possess a solid foundation in mathematics or a background in STEM fields, making it tough to find an approachable starting point for those outside these areas. I found myself in this predicament as well.
To aid others, I've compiled a list of books arranged in a way that should make your learning journey feel manageable. These selections not only cover the fundamental aspects of the discipline but also delve into the core content areas of computer science: Computer Architecture & Organization, Data Structures & Algorithms, and Computational Theory. While it's possible to learn programming without delving into academic computer science, those genuinely interested in these subjects will find their efforts rewarding. This is a lifelong learning endeavor, and these books are just the beginning.
Section 1.1: Computer Science Distilled
The first book on my list is Computer Science Distilled by Wladston Ferreira Filho. If you lack prior programming or computer science experience, this book serves as an excellent starting point. It distills mathematical concepts to their essentials and introduces key ideas in the field. For newcomers, its main strength lies in teaching how to tackle and solve computational challenges. Understanding the tools at your disposal and recognizing potential limitations can significantly ease the learning process. By reading this book, you'll gain insights into what it means to be a computer scientist and how to effectively approach problems within the discipline.
6 Books That Changed My Life (As A Software Engineer) - This video shares transformative books that have significantly influenced the journey of a software engineer, providing valuable insights for self-taught learners.
Section 1.2: Grokking Algorithms
Next up is Grokking Algorithms by Aditya Bhargava, another beginner-friendly resource that specifically targets data structures and algorithms. This book is vital for anyone planning to engage with more traditional textbook explanations of these concepts. I found it to be immensely helpful during my college studies on data structures and algorithms. The engaging illustrations simplify complex ideas, making them easier to understand and apply. This book effectively introduces time complexity, growth rates, and the various notations that computer scientists use to evaluate algorithm performance—knowledge that proves invaluable during software engineering interviews.
Subsection 1.2.1: OpenStax Math Textbooks
Before we continue with the list, I’d like to highlight the OpenStax math textbook library, which is entirely free to access and download. To delve into computer science concepts, a solid grasp of algebra, trigonometry, and introductory calculus is crucial. However, you can still navigate complex topics even if you haven't mastered calculus yet. I personally tackled data structures and algorithms while studying college algebra—though I wouldn’t recommend this approach. If you're aiming for graduate studies, be prepared to dive deep into calculus, as most programs expect familiarity with multivariable calculus, discrete mathematics, and linear algebra.
Chapter 2: Core Texts for Computer Science Mastery
Section 2.1: Introduction to Algorithms
Introduction to Algorithms by Thomas Cormen and colleagues is a cornerstone of computer science education. You might have encountered this title in various recommendations, but why is it included here? Following the previous books in this list will equip you with sufficient background knowledge to tackle its content. This book articulates the academic language and explanations pertinent to computer science, covering topics in computational and mathematical detail. The groundwork laid by Computer Science Distilled and the visual breakdowns in Grokking Algorithms prepare you for the more complex discussions in this book. It’s essential for beginning computer scientists and one that I frequently reference.
Section 2.2: Database Design for Mere Mortals
Michael J. Hernandez's Database Design for Mere Mortals occupies the fifth spot on my list due to its critical importance in understanding databases as a computer scientist. If you're venturing into fields like data analytics, web development, or software engineering, mastering relational database design and SQL is paramount. This book serves as both a guide to relational database design and an SQL handbook. After all, creating a database is futile if you can't retrieve or manipulate the data within it. SQL will be a language you often use in tech settings, making it essential to grasp its structure and functionality.
A Great Book for Self-Taught Python Programmers: Classic Computer Science Problems in Python - This video discusses a highly recommended book that provides classic problems in computer science, tailored for Python programmers looking to deepen their understanding.
Section 2.4: Pragmatic Thinking & Learning
Andy Hunt's Pragmatic Thinking & Learning is included in my list because it emphasizes the importance of cultivating effective learning habits as a computer scientist. The field of computer science, like many others, demands continuous learning and adaptation as technology evolves. This book equips you with the tools and mindset necessary for a practical approach to lifelong learning. Effectively managing and absorbing new information will be a vital skill for any programmer, regardless of their educational background.
Section 2.5: Essentials of Computer Organization and Architecture
Essentials of Computer Organization and Architecture by Linda Null and Julia Lobur serves as a comprehensive textbook that balances academic rigor with accessible writing. This book builds upon the concepts introduced in Code and presents them in a digestible manner. It is the most beneficial resource I’ve encountered for grasping the intricate ideas of computer architecture. The way math is presented makes it engaging, ensuring that readers do not feel overwhelmed. Whether you're preparing for a computer architecture course or simply wish to learn for enjoyment, this book will surprise you with its clarity.
Section 2.6: Formal Languages and Automata
An Introduction to Formal Languages and Automata by Peter Linz may take you by surprise due to its heavy reliance on mathematical notation and its brisk pace. This book is intended for upper-division coursework and assumes familiarity with mathematical concepts, which I was unaware of when I purchased it. To fully appreciate this text, a solid understanding of discrete math is necessary. While the theory of computation is not every learner's cup of tea, this book encourages a thorough understanding of the theories presented, often necessitating mathematical proofs. For those who enjoy math, this can be an engaging challenge, but it may feel daunting for others.
Section 2.7: Introduction to the Theory of Computation
Similarly, Introduction to the Theory of Computation by Michael Sipser presents rigorous upper-division material. This was one of the most challenging books I encountered when I first started. While An Introduction to Formal Languages and Automata includes more visuals and examples, it’s hard to go wrong with Sipser's book. I suggest opting for whichever is more affordable if you're keen to explore computational theory. For additional support, MIT’s YouTube playlist provides excellent supplementary material for anyone delving into this subject.
In conclusion, if you find yourself fatigued or frustrated while self-teaching, it might be wise to revisit foundational topics that are causing you distress. Taking a break to explore other areas of interest can reinvigorate your passion for learning. The ultimate goal is to persist, not to give up. By familiarizing yourself with these concepts, you'll cultivate a mindset that questions your code and implementation practices—essentially, thinking like a computer scientist.
If you're considering pursuing a graduate degree in computer science but don't have a CS major, follow my upcoming articles detailing paths to formal education in this field. Thank you for reading!
-Joe