Learn
[ Home ]
 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 analyses. Useful as both a reference (I certainly can't claim to have read it covertocover), and as a guide to how to develop and analyze algorithms. 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.

Linear Algebra Done Right: A very good complement to other Linear Algebra texts, because it approaches the subject from a very different perspective (in particular, determinants are relegated to the closing chapter). Some might even call it orthogonal (sorry). It is also more theoretical than Strang's book, and thus serves as a good second book on the topic. Both have a good sets of problems for the selflearner to work through.

Convex Optimization: Stephen Boyd, a coauthor, is an excellent lecturer, and this book accompanies his EE364A course, which has both video lectures and assignments online. The book has a nice combination of proofs and applications, making it useful as an advanced, introductory text.

Apostol's Calculus: Volume I and Volume II: These books provided the foundation for my efforts to repair my Calculus skills. In comparison to the books I used when first learning Calculus, these provide deeper explanations and more proofs. As a result, they have enabled me to do more than simply refresh forgotten facts and techniques.

Options, Futures & Other Derivatives: After entering the world of finance, this book provided me with a good introduction to many areas within it. It also has a decent set of exercsies and a Solutions Manual. While the book serves its intended purpose well, it really is only an introduction. Many times I was frustrated by the appearance of a formula without any explanation for how it was derived (although, in fairness, the author does provide some derivations on the book's website).

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 tools for the job. (It's also easy to find problems where they are the worst tools for job, leading you to down to the path to the infamous "two problems".) 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. (Granted, the set is probably countable I just can't count that high.) 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: The authors do a great job of clearly explaining some of the (many) challenging aspects of this language. Even though I am still a relative novice, and I may never use it in a job, I think that the effort I have invested into learning Haskell will still pay off. Getting my head around topics such as monads has definitely changed the way I think about programming.
 Projects:

taplhaskell: 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 this project, which aims to provide Haskell ports of all of the OCaml implementations provided by Pierce. Contributions and/or feedback appreciated.

samplenash: This project contains Haskell implementations of the two algorithms described in a paper I coauthored, entitled Simple Search Methods for Find a Nash Equilibrium. Sadly, I no longer have a copy of the original C++ implementations used to produce the results described in the paper. So, I took that as an opportunity to further explore Haskell.