I have always been the kind of person who wanted to own books–lots of books. I grew up in a house full of books, though most of them were inexpensive, well worn paperbacks, and I always found it natural to live between full bookshelves. And while as a young person books were close to unaffordable for me, apart from what I picked up in second-hand bookshops or from the bargain table in big chain bookstores, when I started earning money I started buying books, and slowly the bookshelves began to fill and to expand. At one point I made the decision to buy hardcovers whenever possible, for their durability (though later I made an exception for the kind of book you pick up at the airport to read on a journey–paperbacks are just more convenient for that, but that’s OK for techno thrillers and that kind of thing, or the occasional crime novel). In the final years of my academic “career” I spent several thousand Euros a year on books. Whenever I became interested in a new subject (and since in my teaching I only once in ten years taught on the same subject twice, that happened quite often), I had great fun identifying the most relevant current books and some important classics, and then find them on the internet and buy them. Just reading a book was never good enough for me. Only when I owned it did I have the feeling that the contents were truly mine. Besides, books are simply beautiful objects, and I treat them like raw eggs. Almost all of those of my books not acquired second-hand in the first place could be sold for new without any customer being likely to complain.
In my study in the attic I have more than 35 meters of bookshelves filled with history books (and that’s in addition to nearly as many more shelves in the living room, containing novels, gardening books, some philosophy and languages, and various other things, and of course our kids have a couple of meters of children’s books). But the history books are not just tools of my previous profession. Nor even just beautiful books, atmosphere, the environment I always wanted to live in. In a very deep sense they are part of my identity as an academic and a historically-minded person.
So I consider it a truly symbolic step that today I made room in the bookshelf closest to my desk in the study for my computer science books, and some other study-related volumes. I pushed the World Wars and the Cold War a little further away to have closer at hand the things I really need now. It’s still a tiny bookshelf, just under one yard, hardly noticeable among the book-filled walls. On the other hand, it’s probably more than most computer science students own going into their second term. With computer books just as with history books, I just love to find, buy, and own. Though to be sure, most of these volumes I have read, a few even more than once, or am reading right now. I am still the reading kind. And I still prefer physical books, though riding my bike to UAS, carrying a rather heavy laptop computer, a lunchbox for a ten-hour day, and rainwear at all times (it’s Hamburg, you know), I have come to appreciate eBooks, and therefore I like publishing houses that include them in the price of the printed book, such as Manning.
As you can tell from the picture, I made a few concessions. My CS books are mostly paperbacks. If they are official university textbooks in the US, they are insanely expensive even then (over $ 150 is quite common), a fact that in one case made me violate my other rule for buying books (or movies, for that matter): never to accept a translation when I can get the original version (as long as it’s English or French, for a book; with movies, there is subtitles, so the language doesn’t matter). Yet Objects First with Java by David J. Barnes and Michael Kölling, the top-down teaching classic for object orientation, is literally 140 Euros on Amazon, while the translation, shown in the picture as Java lernen mit BlueJ, is only 40 Euros. So I bit the bullet in that case and rationalized my decision as seeing how programming was done German, only to find that it looks ridiculous to use German method names with English Java keywords, and unless forced to do otherwise I will always do my programming in English, comments included.
The classics section is what you end up with after reading a few “top 10 books every programmer should have” columns. For me, this is the living room kind of book, because in spite of what most of them say, I read them casually, just to get a feeling for some general problems of programming, rather than work through them very thoroughly. Frankly, some of them are still at least partly over my head. I could make sense of some ideas in The Mythical Man-Month by Frederick P. Brooks, I nodded through The Pragmatic Programmer by Andrew Hunt and David Thomas without getting all they are saying, but Programming Pearls I sort of gave up on, because most of the problems in there are both too low-level and too technical for my still limited understanding. I did enjoy the chapter on back-of-the-envelope calculations though (quickly find the rough order of magnitude a problem may be in, like how much water flows out of the Mississippi every day).
Of the more practical things, I read Code Complete by Steve McConnell thoroughly and completely already about a year ago, and later I read the programming (as opposed to software design) sections once more. In spite of being extremely verbose and repetitive, this is the kind of book I could make sense of at my then low level of programming skills–advice on how to write a loop or a switch efficiently, general coding style, etc. In the same line, I worked through and enjoyed Clean Code by Robert C. Martin, though of course it’s a Java book without saying so. The same goes for Refactoring by Martin Fowler, a book, besides, I read rather recently, at a time when I already knew and had used many of the techniques described in there and just thought “of course” most of the time; and Design Patterns by the Gang of Four, whose style is so technical and abstract that I could only make sense of those patterns I had already seen in action. In both cases I often wondered whether some of the things where applicable to languages other than Java, or to a time when programming seems to experience a paradigm change from pure object-oriented to functional. Weniger schlecht programmieren by Kathrin Passig and Johannes Jander I bought primarily for the title, which translates as “How to program less badly.” I found that funny. It’s a rather broad, humorous introduction to most practical aspects of programming, with an emphasis on doing things right from the start rather than muddling through and acquiring inefficient habits. Say, use a version control system, or the command line. Introduction to Algorithms, by Thomas H. Cormen et al., a super-heavy, expensive tome, was recommended in our CS 101 lecture, though I don’t think I’ll need it, or in fact have time to read it, before we do algorithms in the third term.
I already mentioned most of the books in the programming languages section in an earlier post. Since then I can say that I didn’t warm to Thinking in Java by Bruce Eckels even in my third attempt. Accelerated C++ by Andrew Koenig and Barbara E. Moo is the book I probably should have read on that language in the first place, rather than the heavy-handed and error-ridden introduction by Bjarne Stroustrup. As it was, I skimmed the first 100 pages or so and suddenly understood some of the things that had remained rather a mystery to me before. In the meantime, I have also added Prolog Programming for Artificial Intelligence by Ivan Bratko and worked through the first 8 chapters during a vacation week, before I learned that we wouldn’t be using Prolog in our second term lecture on logics and computability afterall. The classic The C Programming Language by Brian W. Kernighan and Dennis M. Ritchie I am reading right now, in preparation for the second part of the lecture on machine-oriented programming (the first part is about assembly language). I emphasize “reading,” because after doing a lot of Java and a good deal of C++, C contains very few surprises. I have done a more interesting-looking exercise here and there without any problems.
The odds-and-ends section contains two books recently acquired in my attempt to look a bit more under the hood of my now-favorite OS, How Linux Works by Brian Ward, and The Linux Command Line by William E. Shotts; a couple of math books in German (personally I had the most use of the one not recommend by our math professor, Mathematik für Informatiker by Gerald and Susanne Teschl, whereas I found the recommended same title by Peter Hartmann oddly disorganized and confusing), a formula collection I enthusiastically bought during the math prep course, but was not allowed to use in Math 101, the classic Introduction to Automata Theory, Languages, and Computation by John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, in the inexpensive, India-printed “international edition” (another one of these compromises), and the book with which I learned LaTeX, Wissenschaftliche Arbeiten schreiben mit LaTeX by Joachim Schlosser.
Fermat’s Last Theorem by Simon Singh is a popular math bestseller, also recommended by our math professor. In a way, it’s a popular history of mathematical science–or rather scientists, as it’s rather centered on the human interest side–for the past 300 years. I read it at the start of the recent vacations. Of course, catering for the mass market, it’s rather shallow on the math side. But I had fun reading about how math departments all over the world, and the Akademie der Wissenschaften in Göttingen, as administrators of the Wolfskehl Prize for proving Fermat’s theorem, in particular, for decades had to deal with people sending confused alleged proofs which then had to be disproved. And of course, a lof the things in there concerned the basics of mathematical proving techniques which were quite familiar to me after the first term, so it was a book that made me feel good, like I was in the know.