The Structure and Interpretation of Computer Programs (SICP).
About halfway through the book, they build an explicit dispatch table, and I instantly understood 1) why my C code was so crappy, and B) why C++ and OO languages miss the boat (hint: they only implement the dispatch table in one orientation)
Worth struggling through, even if you never write a line of Lisp code. It has a lot in it about nice designs, abstraction barriers, and how languages actually work.
I also enjoyed it, but I read it probably a bit late in my career.
I remember reading some parts and thinking "wow, if someone had explained this to me like that when I was learning". But then, I'm not completely sure what would have been my experience if SICP was my first contact with CS. I started with GWBASIC, then COBOL, then C; 1st edition already existed by then, so I could have learned with Scheme!
About halfway through the book, they build an explicit dispatch table, and I instantly understood 1) why my C code was so crappy, and B) why C++ and OO languages miss the boat (hint: they only implement the dispatch table in one orientation)
Worth struggling through, even if you never write a line of Lisp code. It has a lot in it about nice designs, abstraction barriers, and how languages actually work.