A CS grad usually goes to school for a few years and takes multiple classes on different topics software engineering, core fundamental programming skills, computation theory, data analysis, statistics, physics, hardware, security, database, web development, calculus, data structures and algorithms.
There isn’t one book, each of these classes usually has their own book that is issued for the class, and the classes themselves go over the book, along with extra materials.
To reach the same level you more or less have to follow the same “path” one would go through. You could easily do your own legwork and research curriculum and colleges for CS degrees and “shadow” their curriculum yourself. You’d at least get some high level resources such as the books issues and maybe even the class structure. But you wont get the professor, or in-class material.
You kind of need to know at least some of it, but probably not all of it depending on what you want to do.
A CS degree will go primarily over the underlying fundamentals of what you’d end up doing, along with gloss over a number of high level adjacent topics. Something like knowing how a computer works at a hardware level isn’t important if your working in high level situations, such as developing software using Java (a high level language that abstracts away low level details such as memory management) but its good to know and helps in other ways regardless of what you end up doing.
The one area where a CS degree usually doesn’t focus on is the practical application, as this is more specific to a given job and thus is more up to “the domain” of what you’re doing.
Taking web development as an example, a CS grad might not know what HTML is or know exactly how the web works, as knowing how HTML works is only relevant to the web domain. However a CS grad would instantly recognize that HTML creates a “tree” of tags making up the DOM, and know how to leverage JavaScript as a programming language to manipulate the DOM pretty quickly as they would already have some experience learning to program with other languages.
Generally a “self-taught” developer usually leans into their practical skills and experiences more and learns about the fundamentals indirectly, where-as a CS grade starts with the fundamentals and learns the practical skills more on the job.
The key difference is there are some problems “already seen” by CS grads, but self-taught developers have to learn both the fundamentals and practical skills directly themselves at the same time. A self-taught will also be able to focus or “hone in” on a specific domain and usually can have more practical knowledge within that domain, where as the CS grad has more general fundamental knowledge, but less practical experience.
Simply put, college grads don’t go to school for a few years to learn nothing. But they also will learn a broad subject of things that may or may not as important depending on what they end up focusing on.