Structures and Interpretation of Programming languages
How to Design Programs