Surprised no one seems to have mentioned the godfather of CS books, The C Programming Language by Brian Kernighan and Dennis Ritchie [0]. At first glance, it's a programming language book rather than a "computer science" book, but you probably won't think that by the time you're finished ...
First, every operating system you'll use - likely in your lifetime - is a giant mountain of C code. From the kernel all the way to the userspace utilities. As a programmer, your career will be forged on the shoulders of giants, and those giants wrote in C. So to understand how your machine works, you must learn C.
Second, K&R covers far more than just a language - it presents a system of thinking about computing. It covers algorithms for line counting, memory allocation, and the construction of linked lists. The techniques you learn for pointer manipulation will enable you to author implementations of data structures that are considerably more elegant and simple than the naive methods [2].
It contains fundamental, influential insights about the computer science field on nearly every page.
Still, I'd discourage you from writing C professionally if you can help it. Rust retains nearly all the advantages of C while abandoning its unsafe memory model and replacing it with compile-time determined allocations and de-allocations. As roughly 70% of CVEs in C or C++ projects are caused by memory unsafety, this is a significant feature [1]. But the insights you make in studying K&R will translate to everything you build, regardless of language.
You'll walk away with a mental model for computers so powerful that it was the genesis of our modern technology era.
FWIW, I liked Plum's "Learning to program in C" far better than K&R's book. I can't recommend Plum today though because it's pre-ANSI so the code all uses K&R style declarations.
First, every operating system you'll use - likely in your lifetime - is a giant mountain of C code. From the kernel all the way to the userspace utilities. As a programmer, your career will be forged on the shoulders of giants, and those giants wrote in C. So to understand how your machine works, you must learn C.
Second, K&R covers far more than just a language - it presents a system of thinking about computing. It covers algorithms for line counting, memory allocation, and the construction of linked lists. The techniques you learn for pointer manipulation will enable you to author implementations of data structures that are considerably more elegant and simple than the naive methods [2].
It contains fundamental, influential insights about the computer science field on nearly every page.
Still, I'd discourage you from writing C professionally if you can help it. Rust retains nearly all the advantages of C while abandoning its unsafe memory model and replacing it with compile-time determined allocations and de-allocations. As roughly 70% of CVEs in C or C++ projects are caused by memory unsafety, this is a significant feature [1]. But the insights you make in studying K&R will translate to everything you build, regardless of language.
You'll walk away with a mental model for computers so powerful that it was the genesis of our modern technology era.
[0]: https://en.wikipedia.org/wiki/The_C_Programming_Language
[1]: https://www.chromium.org/Home/chromium-security/memory-safet...
[2]: https://grisha.org/blog/2013/04/02/linus-on-understanding-po...