You might be familiar with Feynman's Lectures on Physics, but his lectures on Computation (based on a class he taught and his work in 'Connection Machine') aren't any less amazing. Through this short book, Feynman guides us through the concept of computation and the van Neumann architecture in his unique style, from logic functions, to Turing machines, coding and even quantum computers. It will give you a unique appreciation of the finer points in which computers are "Dumb as hell but go like mad" so that you can better squeeze every bit of performance out of your code.
[1] https://www.amazon.com/Principles-Compiler-Addison-Wesley-in...
Test Driven Development by Example, by Kent Beck is a great book, and it's aged well too. There's a lot of good 3rd party material on most concepts, but for TDD the first source is still the best.
This is a style of book I'd like to see for many other languages and paradigms: It doesn't assume that it has to teach you the basics. You know what a variable is, you know how loops work. You're reading it to learn AWK, not to learn programming basics. And it's remarkably readable.
I followed it up by reading the O'Reilly book on sed and awk in order to learn some sed basics, too, and while it is by no means a bad book, it just doesn't reach the same level of understandable writing.
I've also bought and read Real World Cryptography [2] in its early access phase, and I like it for much of the same reasons. It doesn't drown you in math -- it assumes you'd like a solid foundational understanding of up to date cryptography and practice oriented explanation of its concepts and focuses on that.
Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems Book by Martin Kleppmann
Also, as jes noted in another comment, SICP (Structure and Interpretation of Computer Programs) is a must-have and must-read.
Introduction To Operating System Abstractions Using Plan9 From Bell Labs.
https://doc.cat-v.org/plan_9/9.intro.pdf
Today you can just use 9front.
If math is not a strong suit then https://htdp.org/ and https://dcic-world.org/ are good books to take up. The exposition is really good.
I had never taken a theory of computation class so reading this book was a good casual starting point to understand how mathematical logic and computing are related
Plus there’s some good history bits in there too
one of a kind and, for some of us, the best book on programming ever written. i would love to see it updated to modern c.
It is dated in its choice of assembly, but I really enjoyed this style of crystal-clear explanations when I was a young kid learning how to program.
Other extremely well-written books include TaPL (Types and Programming Language), by Benjamin Pierce: https://www.cis.upenn.edu/~bcpierce/tapl/.
Benjamin Pierce's writing style is very good and you can enjoy it in the free series on Software Foundations (using a theorem prover like Coq to develop programs): https://softwarefoundations.cis.upenn.edu/.
It will change your life. Or at least your approach to programming.
Oberon is a beautifully simple language and the Oberon System was amazingly creative and fresh. The ideas and code in the book are a model of clear thinking and exposition.
You are going to find plethora of really good books that users have personally found helpful, great, or simply more understandable.
Give it a go.
2. How to Design Programs
3. Software Design for Flexibility: How to Avoid Programming Yourself Into a Corner
You can learn a lot of algorithms. It's useless unless you start to create architecture and use them in practice.
Hennessey and Patterson's Computer Architecture: A Quantitative Approach is excellent.
I also agree with the recommendations elsewhere on the list of Andrew Tanenbaum's book on operating systems, and of Jon Bentley's Programming Pearls books.