Reuven's annual summary of interesting books.
I'm always amazed to hear about the death of the publishing industry. True, books and (gulp) magazines are often fighting for their lives, and the state of journalism is in tatters. But at the same time, we continue to see a large number of high-quality books being published. This past year was no exception; I read many books that really enlightened me, giving me new ideas in areas of technology, business and life in general.
So as I do at roughly this time every year, here's a roundup of the most interesting books I've read during the last year. This is not a representative sample; it reflects a combination of books that I bought and received for review, generally because I saw or noticed them. I expect there are many good books I haven't read, but that just means they'll likely be on the list for next year. This also means there almost certainly are some books on this list that I saw for the first time in the past year, but which were published before then.
Python for Data Analysis by Wes McKinney (O'Reilly, ISBN: 978-1-449-31979-3) is an introduction to manipulating data with two well-known Python libraries, NumPy (for numeric analysis and some highly efficient data structures) and Pandas (for data analysis). Reading through the description of these libraries reminded me greatly of the excellent R language for data analysis and manipulation, as well as the relational algebra that we know (and love!) in SQL. The advantage of Pandas is that it allows you to integrate the analysis into a language you are already using, rather than having to learn a new one. The book is full of examples and practical hints; if you ever have wanted to learn how to analyze, manipulate and plot your data, this is a great way to get started, in an excellent and readable language.
Python is remarkable in numerous ways, among them the fact that it is an excellent language for beginning programmers, as well as for experienced professionals. Jason Briggs has written Python for Kids (No Starch Press, ISBN: 978-1593274078), which introduces programming to children aged ten and up through playful examples, including GUI-based programs using the Tk library. The use of child-friendly examples and humor (for example, “Want to hear a dirty joke? A pig fell in the mud!”) makes me want to re-start the programming lessons that I've given my own children.
Ruby, the language I use most often in my day-to-day work, has been the focus of several excellent books through the last year. Perhaps the most celebrated book is Practical Object-Oriented Design in Ruby by Sandi Metz (Prentice Hall, ISBN: 978-0321721334). If you are familiar with object-oriented programming principles, the ones Metz mentions will not be new. However, the examples that Metz provides are so clear, and the practical guidelines and suggestions that stem from these ideas so compelling, that this book is a must-read for everyone in the Ruby community, and even for those using other object-oriented languages.
In a similar vein is Confident Ruby (confidentruby.com), a self-published e-book by Avdi Grimm. Grimm starts off with the assertion that Ruby makes software so easy to write, and to write quickly, that we do so too quickly, creating impossible-to-understand libraries. Grimm's writing is always clear and interesting, and in this book, he breaks down the types of code we are likely to write most often—classes and methods—and gives us guidelines for doing so faster and better.
My last choice on the Ruby front is another self-published book, Working with Ruby Threads by Jessie Storimer (www.jstorimer.com/products/working-with-ruby-threads). I must admit that I'm one of those programmers who hasn't worked much with threads over the years (since Web applications tend not to use them much), so I've gained a bit of an aversion to threads. This book really opened my eyes to issues regarding threading, the differences between Ruby implementations in this area and alternative solutions to the problems.
Of course, other programming languages exist, and I've been trying to dip my toes into those waters. I've played a little bit with Erlang in the past few years, and although I'm not convinced I'll do a lot of work with it, I do like many of its ideas and find it useful and enlightening to try it out. Learn You Some Erlang for Great Good by Fred Hebert (No Starch Press, ISBN: 978-1-59327-435-1) is a large book (600+ pages), which introduces the Erlang language and its many facets, including a great emphasis on testing.
Several months ago, I covered the basics of Web development using the Clojure language, a modern Lisp that runs on the JVM. Web Development with Clojure by Dmitri Sotnikov (Pragmatic Programmers, ISBN: 978-1-937785-64-2) is a gentle introduction to creating Web applications in Clojure, using such libraries as Compojure. The book is aimed at beginners, and it seems to do a solid job of introducing the features of the language that will be useful for Web development. If you are interested in this area and haven't found the on-line tutorials to be sufficiently detailed or helpful, this book probably will serve you well.
A number of books aim not at discussing a particular language, but rather ideas and techniques for working with them. Most intriguing among them is Seven Concurrency Patterns in Seven Weeks by Paul Butcher (Pragmatic Programmers, ISBN: 978-1-93778-565-9). It assumes that threading is difficult and bad, and looks at alternatives to threading to enable safe, concurrent execution. I would say that this book is a good followup to Jessie Storimer's book on Ruby and threads, but this is likely a good read for anyone who is working with threads and wants to find a better way for programs to remove the dangers and frustrations of thread-based programs.
Avdi Grimm's second book of the year, Much Ado about Naught (https://shiprise.dpdcart.com/cart/view?product_id=64334), is a surprisingly interesting read about a subject I quite frankly never expected to think or talk about. The fact that the book is written using TDD techniques also is a good introduction to the subject for people who are new to testing.
Finally, Facebook and LinkedIn might be well known social networks, but the world of social-network analysis has existed for many years and provides techniques that can help you understand your users better. Social Network Analysis for Startups by Maksim Tsvetovat and Alexander Kouznetsov (ISBN: 978-1449306465) introduces the core ideas of SNA and then demonstrates how to apply them using Python code. If your Web applications involve groups of people, you might well be able to benefit from this book to see how they are connected.
The Pragmatic Programmers, continuing its Seven ___ in Seven Weeks series (including the book on concurrency patterns mentioned above), have come out with Seven Web Frameworks in Seven Weeks by Jack Moffitt and Fred Daoud (ISBN: 978-1-93778-563-5), which covers some server-side frameworks and some client-side ones. The idea, as with their other books, is to give you experience and understanding of the frameworks—not to become an expert in them, but rather to gain an appreciation for the ways they work. Just as learning a new programming language can be a useful and enlightening experience, so too can learning a new Web application framework. Experienced Web developers who are eager to learn new paradigms definitely should take a look at this book.
Die-hard Rails developers will be delighted to see that the Pragmatic Programmers have released an update to Crafting Rails 4 Applications by Jose Valim (ISBN: 978-1-937785-55-0). This book doesn't even pretend to teach MVC, Rails conventions or anything else that nearly every Rails book starts with. Instead, the first chapter starts with the creation of a Rails plugin, and things get hairier and more interesting from there. If you are working on complex Rails applications, or just want to gain a better appreciation and understanding of the framework, you likely will want to read this book.
Although I do read (and listen, and watch) a great deal about technology, I also try to find time to read on other subjects as well.
My first recommendation isn't for a book, but rather a magazine. I grew up hearing about The New Yorker as a source of witty cartoons but not much else. I can now tell you, having subscribed for a bit more than a year, that the magazine itself is fun, interesting and thought-provoking, with some of the best writing I've ever had the chance to enjoy. If you want to read about all sorts of interesting topics—as well as tickle your funny bone with the cartoons—I heartily suggest reading The New Yorker.
My favorite nontechnical book of the year is Thank You For Arguing by Jay Heinrichs (Three Rivers Press, ISBN: 978-0385347754). I found this book to be amazingly insightful and interesting, as well as funny, and it taught me the basics of rhetoric—the art of persuasion. The author breaks rhetoric into a number of basic tools and then uses those building blocks to demonstrate how to make a convincing argument.
I continue to be fascinated by China, now that I've been there twice. Three interesting China-related books I read during the summer were: Factory Girls by Leslie Chang (ISBN: 978-0385520188), which describes the reality of the young women who leave the countryside in search of a better future; China Airborne by James Fallows (ISBN: 978-0375422119), which uses aviation as a way to understand modern Chinese decision-making; and Last Days of Old Beijing by Michael Meyer (ISBN: 978-0802717504), a bittersweet book about how the Chinese government is removing historic, old buildings and putting new ones in their place.
I hope that you enjoyed this year's book roundup. I'm always on the lookout for new book suggestions, so if you have any titles to offer, I'd be delighted to hear about them.