
How to Read a Book - Mortimer Adler. Really helped me feel more comfortable reading technical books and large books. I've probably worked through more tech/textbooks this year than all other years combined. (It's not a particularly high number this year, it was just low all the other years, haha).
Meditations - Marcus Aurelius, Gregory Hays translation. I highly recommend this translation if Meditations is a book that's interested you. It's written very informally and casually. Like Aurelius writing in a notebook before bed. While other translations are very length and flowery with descriptions and overly formal.
Superintelligence - Nick Bostrom. This one gets talked about a lot on here. I bought it because it's a topic I'm very interested in, but I was expecting more hype than real content. I must say, I was very pleasantly wrong about that. Bostrom makes some really solid arguments about what superintelligence might mean and many ways it could potentially arise.
The Life-Changing Magic of Tidying Up - Marie Kondo. I didn't like most of this book. But the tips for tidying up, as well as the surge of motivation you magically get just after reading it made the book worth it.
Test-Driven Development with Python - Harry Percival. Obey the testing goat! Thanks to this book, all my current professional projects are using TDD. I had been making an effort to test code before, but generally after writing the code. The biggest benefits, for me, of writing tests before the rest of the code is that 1) My projects are organized so much better than before. 2) My tests feel much more comprehensive than they ever did previously.
Surprise books. These I wouldn't recommend for everyone here, but they're the most interesting ones I personally found this year:
Obfuscated C and Other Mysteries - Don Libes. Someone on HN recommended it, and I managed to find a used copy for $6. Just incredible if you love C, low level code, and hardcore tricks and optimizations. Some of the chapters explain winning entries to the IOCCC, and some explain strange tricks with C that probably aren't too useful in current day applications and may not even work on modern hardware. Not just insightful, but also very funny.
Computational Fairy Tales - Jeremy Kubica. Recommended to me by someone in IRC. Aimed mostly at kids, it's a fairy tale that involves computing. Princess Ann has to save the kingdom from a prophecy of doom. Along her journey every encounter indirectly describes a comp sci concept, such as showing an ogre how to repeatedly hit metal to make a sword mimics a FOR loop. A magical town where all the people only speak in completely boolean terms ("Is the castle that way?" Ann points. "No, it's that way" the villager points the same direction as Ann, but a fraction of a degree to the side). I think I picked up some good examples for explaining computers to kids without getting into jargon. Very cute, though I didn't finish it because I got tired of the simplicity, would recommend for a child.
"Obfuscated C and Other Mysteries" by Don Libes
"C Companion" by Allen Holub
Don Libes' book actually uses Obfuscated C code entries as interesting instructional examples and Holub's book is a nice intermediate book between K&R and "Expert C Programming".
I never see Holub mentioned much by other C programmers but I think his books are awesome. He actually also has a really good compiler book called "Compiler Design in C" that showed how to build a C compiler from the ground up - with a lot of practical details I never really see in other books in that area. He even had a cool curses implementation to go along with it where you could watch the parsing occur visually, and wrote a curses-like library in assembly so you could run it all on DOS too. He used to write the C Chest columns for Dr Dobbs back in the day and the book "C Chest and Other C Treasures" contains a collection of those articles and other code that C programmers would find interesting. But that book is harder to find these days.
[0] http://www.amazon.com/Obfuscated-Other-Mysteries-Don-Libes/d...
http://www.amazon.com/gp/product/0471578053/
Also appears to be available as a reprint:
http://www.cafepress.com/libes.43758522
Obfuscated C Contest website:
char*M,A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf(M="%d",&C);
-- E; J[ E] =T
[E ]= E) printf("._"); for(;(A-=Z=!Z) || (printf("\n|"
) , A = 39 ,C --
) ; Z || printf (M ))M[Z]=Z[A-(E =A[J-Z])&&!C
& A == T[ A]
|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}
discussed in more detail in Don Libes' "Obfuscated C and Other Mysteries" [1],
I turned out to have rediscovered Eller's algorithm, which only keeps one line of the maze in memory.