Simula and Smalltalk: A Social and Political History, from my old teacher Ben Dugan. CS history is really fascinating because the field feels so ahistorical to me; we use objects because they make sense, right? But even in other papers I see mention of OO programming as a sort of accident from simulation (Simula) and then hippies (Smalltalk). snej had a great post about the Dynabook that belongs here, too.
Understanding Computers and Cognition (sorry, only in paper form!), but I'm only a third of the way through it. I haven't decided if it's worthwhile yet, but I've seen it on a few "most important books" lists. And I know it's good for me to keep a healthy distrust of our fundamental assumptions.
Also working on the parsing book (which I'll put up somewhere the next time I think about it). Again, I hardly ever consider languages other than context-free grammars, but there is so much more.
And overall, I keep reading Sexy Types in Action, an overview of the power of some more advanced type concepts (higher-rank polymorphism and existential types), again and again in hopes of understanding it more fully. Type systems are again something that I've always taken for granted-- that we're stuck with what exists-- and focusing on ML's type system leads me to that same trap again. I think this is really the crux of it for me:
As we have seen, skillful use of sexy types can often turn what is usually regarded as a runtime invariant into a static check at compile time. To implement such static checks is to reify dynamic properties of values as refined distinctions between types, which increases the degree of heterogeneity in the program.