Learn
[ Home ]
- Favorite Books:
-
Structure and Interpretation of Computer Programs (SICP): My first exposure to this book was through 6.001 (R.I.P.) as a freshman. Over ten years later, I still learn a lot every time I open it.
-
Introduction to Algorithms (CLR): Provides consistently clear and precise explanations of algorithms and their analysis. Yes, I still refer to it as CLR, not CLRS (sorry, Stein).
-
Introduction to Linear Algebra: It's embarrassing how badly my knowledge of the fundamentals has eroded since my undergrad days. As part of an effort to repair the damage, I have been watching lectures and working through problem sets from various courses provided by MIT OpenCourseWare. One of the best is 18.06, mainly due to the passion of Gilbert Strang, and this is his book which accompanies the course.
-
Holub on Patterns: Leads off with a couple excellent essays on OO design (including a classic on why getter and setter methods are evil). The heart of the book is two deeply annotated programs that each tie together about half of the GOF Design Patterns. Reading and working through these programs is like looking over the shoulder of a mentor.
-
Mastering Regular Expressions: This material was more relevant to me when I worked at Amazon, but it's hard to avoid problems where regular expressions are the best tool for the job. This is the first and last book you need on the topic.
-
Effective Java: The best book on Java, bar none. I can't count the number of errors I've seen that would have been avoided by following the advice in this book. I no longer use the language on a regular basis, but, if I return to it, the first thing I'll do is read the second edition.
-
Real World Haskell: Not (yet) a classic, like the books above, but the authors do a great job of clearly explaining some of the (many) challenging aspects of this language. The effort you put into learning Haskell will be worth it. Even though I'm still a relative novice, getting my head around topics such as monads has definitely changed the way I think about programming.
I've become more and more of a fan of strong, static typing, mainly for purpose of eliminating as many errors as possible, as early as possible. To that end, I started working through Types and Programming Languages (TAPL), by Benjamin C. Pierce. To reinforce the material in the book, and to help teach myself Haskell, I started the tapl-haskell project, which aims to provide Haskell ports of all of the OCaml implementations provided by Pierce. Contributions and/or feedback appreciated.