Byzantine Reality

Avatar

Searching for Byzantine failures in the world around us

Articles from the year 2011

Slaughterhouse Five

After finishing Do Androids Dream of Electric Sheep?, I decided to continue reading what I have heard of as 'the classics' with Slaughterhouse Five. Like Do Androids Dream of Electric Sheep?, Slaughterhouse Five is a short but sweet read, and I definitely recommend it to those looking for a quick read.

Slaugherhouse Five follows the life of Billy Pilgrim, who has become "unstuck in time." He experiences the events of his life out of order, which makes for a particularly interesting read. Kurt Vonnegut does an excellent job of making this readable, as what could become very confusing is instead posed carefully and to maximum effect. The satire and anti-war message are also done nicely - it's told through Vonnegut's own experiences witnessing the bombing of Dresden, and the times when Vonnegut breaks the fourth wall are done superbly. They do so in such a clear fashion that it temporarily broke my immersion, just to pull me in deeper, now that I know that this thing that I've just read really happened. It makes for a great blend of fiction and non-fiction.

The characters are developed nicely, as was the case with Do Androids Dream of Electric Sheep? and Catch-22. No particular character overstays their welcome, and jumping pseudo-randomly through time makes it really easy to speed up situations that would otherwise run long and be boring or slow down situations that need the time. The religious satire is done very nicely as well - I loved the "alternate" interpretation of the Bible as "don't mess with people who are well connected" and the justification behind that.

The book is immersive and I got through it in a single day, so that's a great sign. If you haven't read it, I would definitely say it's a classic, so go check it out!

Do Androids Dream of Electric Sheep?

I've been a long-time lover of the movie Blade Runner and while I've owned Do Androids Dream of Electric Sheep? (the book from which the movie is based), I had never got around to actually reading it until today. It's a great read and I definitely should have read it a long time ago.

The book is just the right length - not too short but certainly does not overstay its welcome. I started reading it this morning and (with several breaks) just finished it. It's incredibly immersive and doesn't suffer from a lot of the pitfalls that I've complained about in other books. The few sex scenes that it has aren't awkward (like the A Song of Fire and Ice series) and the action scenes are lean and to the point, just like the rest of the book. The movie definitely picks up a lot of inspiration from the book, but that's about it. The details vary greatly between the book and movie, and all that really remains the same are the generalities. Both are amazing and have moments that really make them shine, and the book is a little bit deeper than the movie (although this really comes in via the whole Mercer thing).

Do Androids Dream of Electric Sheep? is exactly what a book should be. It has a lot of memorable scenes, despite being relatively short, brings a good amount of depth to its main characters, and there's a bit right before the end that genuinely shocked me in a good way, which I won't ruin too much for you if you haven't read it but involves Rachael's revenge on Deckard. So the book is the epitome of 'short but sweet', and I got a bit of an extra kick out of it having been in San Francisco this summer (the location where the book takes place) and being able to recognize most of the places it talked about. I definitely recommend the book, even more so to those who love the movie Blade Runner!

The Samurai and the Sacred

While I've seen myself as a history enthusiast, I've definitely read a lot more about the West than the East. So I sought to remedy that by reading The Samurai and the Sacred, a contemporary look into Japanese history and culture. It was an informative book but I felt it was aimed more at those well-versed in Japanese culture than at the layperson.

The book starts off strong and covers exactly what you would expect a book on Japanese culture to cover. The thesis of the book seems to be "the relationship between the Japanese and religion is difficult to quantify and definitely is not what you are commonly taught", and uses the metaphor of a "religious supermarket" to describe the pick-and-choose attitude undertaken by the Japanese with respect to religion. The idea seems to be that instead of having a single religion with a set of beliefs and standards, the Japanese have historically taken many religions and meshed them as needed. The process was definitely not uniform: everybody seems to get a unique blend of religions based on local and temporal influences.

What is confusing in this book is that despite this blend, there seem to be parts in Japan's history where a single, well-established religion (let's take Buddhism as one example) is seen as problematic and somehow de-integrated from the existing culture. Since the book goes out of its way to tell us how well Buddhism and Shinto are in Japan, it's hard to grasp how this happens, and is a point of confusion in the book. The history and interplay involving Christianity is a lot more clear and a lot of this seems to be because Christianity was not integrated as well into Japanese culture as Buddhism was (although over time it appeared to have gained good traction there).

The book is unique in the large number of visuals it displays: nearly every other page has an image on it, and goes a long way towards making the book readable. The iterative style of the book goes a bit against this, however. What I mean is that the book is broken down into themes, so each chapter focuses on a particular theme, and can run from the beginning of Japan's history to the present day. This means that once we've gotten to the present, the very next chapter can jump all the way back to the beginning again. This would be ok but in this book a lot of important events or people were not thoroughly explained the first time through. I had no idea what the Meiji Restoration was until the third time I saw it, when it was finally explained. I get that it wasn't that important the first two times, but since the actual explanation was really only a sentence long, it just created a lot more confusion than necessary.

Thus I think that the book as a whole would have been helped a lot by a bit of reorganization, along the lines of Egypt, Greece, and Rome, which sorted things on date and time rather than by subject. Similarly, a bit more explanation when a new important person or event is introduced would have made it more readable for the layperson as well. All of the Japanese words are introduced nicely, so just a little more explanation on important events would have done wonders for the book (as opposed to me looking these things up).

The author also keeps ending each chapter with something like "now we see the interplay between the samurai and the sacred" (ala the title of the book), but since the chapters really focus on all tiers of society and religion, it comes off as forced and a bit awkward. I would have liked to see either a lot more focus and explanation on the samurai or (more preferably) just dropping that whole thing and just saying "this is the interplay between all tiers of society and the sacred", which keeps it in line with what it already was saying.

So The Samurai and the Sacred is a good but not great introduction to Japanese history. It's the most readable of the books I've looked into and is a good read, but you may find yourself skipping around trying to figure out what's going on. Again, this may be because I'm a bit of a layperson in this area, but I think the book does have a lot of potential overall. Check it out if you're looking to learn more about Japanese history!

The Drunkard's Walk

I've loved math for quite a long time, and have stumbled through the math section at my local bookstores whenever I got a chance. As such, it was pretty hard to miss The Drunkard's Walk, a short but sweet introduction to probability and statistics (with a little bit of history dabbled in), and was entranced by its tagline: "How Randomness Rules Our Lives". I finally got around to buying (and reading) it, and overall it was pretty good.



What The Drunkard's Walk gets right is its accessibility. It teaches the layperson the basic laws that govern probability and statistics through simple examples to show how we can easily be tricked into believing something that is completely inaccurate. In fact, it goes a step further than that and often shows surveys or reports where people were misguided and believed things that were completely wrong or impossible (in a few cases) due to flaws in logic. On other occasions it also describes the history behind the people who discovered these laws and how they came to grips with it. All of this does wonders and makes it an incredibly easy read for what is normally a tough subject to tackle.

So like the book, this review will be short and sweet - go get The Drunkard's Walk and read it right away. If you've already taken classes on probability and statistics you likely won't learn anything new on the math side but will pick up a bit on the history and real-world examples sides, so there's still merit there regardless of your background.

A Song of Fire and Ice: Books One and Two

For my birthday back in June I got the first four books in George R.R. Martin's famous (by now) series A Song of Fire and Ice, and just finished the first two books, A Game of Thrones and A Clash of Kings. Overall I thought they were good but not as amazing as I had been led to believe. Let me tell you why they are good but not great. THIS REVIEW IS SPOILER-FREE!

Why it's good:

Despite their impressive length (>800 pages each with what looks like 8pt font), the books are definitely not boring. There are lots of great characters, and lots of characters in general. This gives the feeling of a big open world and although it sometimes is hard to keep track of who is related to who, this really only crops up in the first book and once characters are incrementally introduced by the second book, it's not that bad. Tyrion is my favorite character so far, which is probably not a surprise because others seem to like him a lot as well. As the series' only vertically-challenged member, he's often mocked by others but far exceeds them as far as intelligence goes. That definitely comes in handy, because there's a lot of political maneuvering going on (plans within plans) and friends can become enemies very quickly (and vice versa).

Martin knows that he has a ton of characters and realizes that many of them need to die through natural or other means throughout this series, and doesn't flinch at killing main characters. This is a big of a mixed bag, but in general is a positive move: killing beloved main characters evokes a lot of emotion and in general, they leave behind enough family/friends to continue the battle after they've left. Thus far really only a single main character has died that I really didn't want to die (everyone who has read the first book likely knows who this is) and reading the second book really brings out a lot of emotion as to the legacy he left behind.

Why it's not great:

There is a lot of maneuvering going on in this series so far, with no sign of it letting up in the next few books. What I mean by maneuvering is 'interactions / showdowns between various characters', and I guess this is to be expected, with the series at five books so far and not yet complete. However, this presents two problems:

1) Since the maneuvering between different characters often doesn't result in any of the parties being killed or expelled from wherever they're operating from, it's hard to get really excited when two of the big characters have a showdown, and when something interesting actually does happen, it completely blindsided me and I had to keep re-reading those sections to make sure I didn't miss anything. As I go to the next chapter I would say something like "wow let's see what trouble Tyrion gets himself into now" but at the same time realize that there's a high probability that it will be nothing decisive. The chapters are all interesting, so I wasn't bored at any part of the books (again, amazing for ~2000 pages), but it's hard to commit to even the next chapter when you know that there will really only be one or two big plot twists in the whole book.

I am aware that this is often referred to as "character development", but for me it just meant that not much of any real value goes on for a lot of the book. So far, it hasn't been the case that any character has developed so much that their decisions couldn't have been guessed from knowing who they were when they were first described in the first book - that is, their development really hasn't changed them to any noticeable degree.

2) The layout of at least the first two books seems to be designed to prevent being immersed in it. Each chapter typically focuses on a different character than before, and in some cases the characters are on opposite ends of the world with nothing to do with one another, so the second I've gotten into the story and really want to know what happens next, I have to put down everything I know about, let's say Tyrion, and remember everything I know about Bran. And this is a massive pain in the ass - I really want to see more of Tyrion and don't really care much about Bran (don't worry about the names too much). I get that the story has to progress on all sides, but this completely kills my drive to read more because now I have to care about Bran and the second I'm interested in his story, BAM! now we're talking about Davos, who is nowhere physically close to the other two characters, and while I like Davos, now we're back to step 1 and I have to remember his story...

Each of the first two books have had climaxes where they stop switching between faraway characters and either stick with one character or switch between characters very close to one another, and these are easily the best parts of the books. These are the parts where Martin really shines - he's a great writer and this is where he gets to show us it. Unfortunately, the rest of the time it suffers from what I will call True Blood Syndrome, in which I have a minority of characters that have really interesting stories but I have to waste a lot of time seeing the other characters dick around to fill time. Note - I've only seen that TV show, so the books could be different. If you've seen the TV show you likely can sympathize - the main plot focuses around this whole vampire thing but the second-tier characters steal a surprising amount of screentime with their adventures that I couldn't care any less about, and the series as a whole would be a lot better if they bit the dust.

So how does that apply to A Song of Fire and Ice? Well, let me give you a little bit of spoiler-free info. In the second book, A Clash of Kings, there are many kings who are clashing to be the one king who rules over all (see! no spoilers!). But while we want to be reading about these kings and their clashing, about half of the time is consumed by second-tier character maneuvering. Granted, the second-tier characters here are a lot more interesting than in True Blood, but by the end of the book they're in pretty much the same shitty situation as when they started. And to top it off, the clashing is the most interesting part but doesn't come up that often - it's more of a "what happens to the world when kings decide to clash" as opposed to "hey some kings are about to clash, do you want to see that?"

A Possible Saving Grace

So in the second book a lot of the tier-one characters (the interesting ones) are conspicuously missing in action. I'm not saying they've been captured and thus don't get screentime, I'm saying you hear about things they've done after it's happened from the second-tier characters. A natural response I had was to say "well what the hell happened to them?", and in typical fashion for a multi-book series, the next book hints at the answer - it runs in parallel to the second book and will have the missing points of view. The book, A Storm of Swords, hints at many battles and tells us right at the beginning that it will not keep the timeline in sync anymore. What that means is spelled out pretty clearly - while everything so far has alternated between characters with events happening more or less at the same time, this book will jump wildly around in time and space to retcon something epic into the story.

Retconning is a very dangerous plot device - I have been on record for hating it as a cheap way for authors to add drama to the story that they forgot to talk about when they wrote the story the first time, and a whole post will be devoted to this later, but it presents a big risk: the next book (for me) has the potential to make or break the series. A particularly stupid retcon could easily kill the series, but if it turns out that the first two books have set it up nicely then it could put a lot of new life into the series and keep it going strong for me.

Although I've spent more time talking about the negatives than the positives, I do recommend at least the first two books, especially if you're into fantasy books. it also showed me how Dan Carlin has killed my love of fantasy and made me a lover of history - he can talk about the fall of the Roman Republic for TEN HOURS and have it be amazing and exciting throughout. There are a crapload of characters there but he knows how to give each of them the screentime that they deserve (which I think is a lot harder since the figures are all real people) and make a seriously engaging story out of a ton of source material. That's also best kept for another post though, so let me reiterate what I said near the beginning: I've read about 2000 pages of A Song of Fire and Ice without getting bored, and that's a great sign.

Supergods

On one of my random adventures through San Francisco's comic book stores I stopped at Isotope Comics (my favorite comic book store). I happened to be in on the day that Grant Morrison was there promoting his new book Supergods. While it was unfortunate that I was there an hour early and completely unaware of him being there in the first place (thus unable to actually buy a ticket to see him), I did buy the book. I read through it pretty quickly and liked it a lot - if you're a comic book reader, this book is a must-buy.

Supergods tells us what comics mean about us as humans. This naturally entails a discussion on the history of comics, which takes up a majority of the book, and even though I had a good familiarity with it beforehand, Morrison does a great job of filling in lots of areas I knew with more information and bringing me up to speed on areas I knew nothing about. There's lots of fun little trivia-ish things in there that are great for the alpha-nerd to pick up on (like all the old-school Batman movies/actors), and lots of discussion on famous and obscure comics of the day. Morrison definitely has his history down, and ties in why certain comics were popular with social events of the times, as well as a good discussion of how the characters have evolved with them.

The rest of the book (told mostly in parallel with the main history lesson) focuses on Morrison's life itself, how he's changed, and how his comics have reflected it. Morrison clearly has had a rockstar life, with all that entails, and it makes for fun reading as well. It breaks up the history parts just often enough to keep both parts interesting, and his life plays like this psychedelic mind-trip of wacky experiences. 

Morrison also chats a bit about the comics he's been involved in, including DC's controversial Final Crisis. I've gone on record before as completely hating it, to the point that I put down all comics altogether until extremely recently, largely because I felt that the use of a deus ex machina is rarely justifiable, but he explains (a lot better than I'm going to right now) that it was all in pursuit of making the comic serve a bigger picture. Specifically, he's talking about issues of hope and giving up, and that hope could triumph over all at the end of the day. At the time, I saw it as changing the fundamental motivations of one of DC's awesome baddies (Darkseid) and just making him into a boring villain, as he switched from being a fascist seeking order at all costs to just being a bastard (which was one-dimensional and boring). Now I see how it served the big picture he was going for but I still agree with my original assessment. Regardless, it taught me to keep my eyes out for this more often, and I saw a bit of it going on in Marvel's Vengeance - more on that in a future post.

Supergods includes a great discussion of the comics of the last few decades, so it also has provided me with a list of a few greats I've missed out on. It answers its thesis well and kept my interest throughout, so I recommend it highly!

Two Caching Strategies for App Engine apps

Recently I took on a redesign of an old project of mine: Active Cloud DB. It's a Python App Engine app that exposes a REST API to the Datastore, allowing clients of any programming language to access Google's scalable key-value datastore. However, the web frontend didn't look too hot, and when I saw what Bootstrap could do, I knew I could use it to do justice for Active Cloud DB. So I did just that, and made a new Active Cloud DB with Go App Engine and Bootstrap, and boy does it look a lot nicer now. Of course it's all open source, so feel free to grab the code we'll be talking about today and follow along at home.

Active Cloud DB provides a minimalist REST API for the Datastore, exposing four of the Datastore API's operations: get, put, delete, and query. To speed up these operations, we also throw in two types of caching via the Memcache API: generational caching and write-through caching. The latter is the more familiar, so let's go over that one first. With write-through caching, write operations (put and delete) hit both Memcache and the Datastore, while read operations (get) read the Memcache version, and only hit the Datastore if the data isn't found in Memcache. Here's what the code for a put looks like:

func put(w http.ResponseWriter, r *http.Request) {
 keyName := r.FormValue("key")
 value := r.FormValue("val")

 c := appengine.NewContext(r)

 key := datastore.NewKey("Entity", keyName, 0, nil)
 entity := new(Entity)
 entity.Value = value

 result := map[string] string {
  "error":"",
 }
 if _, err := datastore.Put(c, key, entity); err != nil {
  result["error"] = fmt.Sprintf("%s", err)
 }

 // Set the value to speed up future reads - errors here aren't
 // that bad, so don't worry about them
 item := &memcache.Item{
  Key: keyName,
  Value: []byte(value),
 }
 memcache.Set(c, item)
 bumpGeneration(c)

 fmt.Fprintf(w, "%s", mapToJson(result))
}

And here's what the code for a get looks like:

func get(w http.ResponseWriter, r *http.Request) {
 keyName := r.FormValue("key")

 c := appengine.NewContext(r)

 result := map[string] string {
  keyName:"",
  "error":"",
 }

 if item, err := memcache.Get(c, keyName); err == nil {
  result[keyName] = fmt.Sprintf("%q", item.Value)
  fmt.Fprintf(w, "%s", mapToJson(result))
  return
 }

 key := datastore.NewKey("Entity", keyName, 0, nil)
 entity := new(Entity)

 if err := datastore.Get(c, key, entity); err == nil {
  result[keyName] = entity.Value

  // Set the value to speed up future reads - errors here aren't
  // that bad, so don't worry about them
  item := &memcache.Item{
   Key: keyName,
   Value: []byte(entity.Value),
  }
  memcache.Set(c, item)
 } else {
  result["error"] = fmt.Sprintf("%s", err)
 }

 fmt.Fprintf(w, "%s", mapToJson(result))
}
The careful reader will have noticed that I haven't talked about the query operation at all. This is because the query operation is a bit more complex than the others. The other operations specifically indicate which key they're operating on, while an arbitrary query can operate on any number of items. So to cache query operations, we employ a generational caching strategy. Essentially, we set a generation value in the Datastore (an integer), and whenever a query is performed, we associate the current generation value with it and store the result in Memcache. So a query for "SELECT * from Entity" performed on an initially empty database (with generation value 0) could be stored with the key "SELECT * FROM Entity / 0". Whenever a write is performed (a put or delete), we increment the generation value, which means that when we do a query, we'll be looking for "SELECT * FROM Entity / 1". That implicitly invalidates all old queries and ensures we don't get any stale query data. In our implementation, we are only concerned with a single query right now, so we simplify how we store that key, but in general it should work fine. The code for retrieving queries thus looks as follows:

func query(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)

 cacheKey := getCacheKey(c)
 if item, err := memcache.Get(c, cacheKey); err != memcache.ErrCacheMiss {
  fmt.Fprintf(w, "%s", item.Value)
  return
 }

 q := datastore.NewQuery("Entity")
 result := map[string] string {}
 for t := q.Run(c); ; {
  var entity Entity
  key, err := t.Next(&entity)
  if err == datastore.Done {
   break
  }
  if err != nil {
   result["error"] = fmt.Sprintf("%s", err)
  }
  keyString := fmt.Sprintf("%s", key)
  result[keyString] = entity.Value
 }

 jsonResult := mapToJson(result)
 item := &memcache.Item{
  Key: cacheKey,
  Value: jsonResult,
 }
 memcache.Set(c, item)

 fmt.Fprintf(w, "%s", jsonResult)
}

With that, you now know how to use Memcache to cache Datastore accesses in Go. Of course, see our CloudComp paper for more details on the Python implementation and an evaluation. I hope that piqued your interest in Go and App Engine, so get coding!

Active Cloud DB - Go Edition

One of the big problems I have as a programmer is that I don't have great UI skills, so whenever I have to make a UI for an app, it tends to look like crap. Lo and behold, to my amazement, that Twitter has taken a huge step towards fixing this problem for me with Bootstrap. Who would have guessed that all I needed was a single CSS file to make my web apps look pretty?

Having seen what Bootstrap can do (and if you haven't looked at that link, go check it out), I decided to take on a small project to give it a test drive. With that, let's talk about Active Cloud DB - Go Edition!

Last year I put together Active Cloud DB, a REST interface to any database that supports the Google App Engine Datastore API. That means that your client (in whatever language you want) can make REST calls to save and retrieve data without having to know how the underlying database works or how to optimize it. Naturally you may assume that the Google App Engine Datastore API is only supported by Google App Engine, and therefore you'd only be able to utilize a single database. But you'd be wrong! Since AppScale implements the Datastore API for all its databases, you can now save and retrieve data to any of the nearly dozen databases it supports. For example, you can save data from your Haskell application to Active Cloud DB and have Cassandra running via AppScale, which I think is pretty cool.

Active Cloud DB is written in Python, and I've been itching for a project to undertake with the sexy new Go App Engine runtime. It couldn't be better reflected in the name - Active Cloud DB - Go Edition! Here's how it all meshes together. All the Datastore communication is done in Go, so querying is done in the usual manner:

func query(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)
 q := datastore.NewQuery("Entity")

 result := map[string] string {}
 for t := q.Run(c); ; {
 var entity Entity
 key, err := t.Next(&entity)
 if err == datastore.Done {
 break
 }
 if err != nil {
 result["error"] = fmt.Sprintf("%s", err)
 }
 keyString := fmt.Sprintf("%s", key)
 result[keyString] = entity.Value
 }

 fmt.Fprintf(w, "%s", mapToJson(result))
}

As you can see from the above snippet, all the Go methods that we have output JSON that AJAX requests can easily consume. We have a small set of Go methods (put/get/delete/query) to keep the interface nice and simple. The app is simple enough to need only a single HTML page, and Bootstrap makes it look damn nice (if I do say so myself). It's got some nice pretty buttons, flash messages, and other things you've seen for years now but look just flawless with Bootstrap. To wrap it all up, there's AJAX that intercepts most of the button clicks and talks to the Go backend. Here's a screenshot of Active Cloud DB in action:

The Python version is still a bit ahead as far as feature support goes - it has caching optimizations from our CloudComp paper that speed up most of the operations via the Memcache API. We'll get to implementing those soon, and that will necessitate a follow-up post. In the meanwhile, go get coding with Go, App Engine, and Bootstrap!

Guerrilla Warfare

A long, long, time ago I picked up an excellent biography on Che Guevara. For those not interested in my review on that, the short version is that he was a passionate individual who fought for what he believed in but abandoned everyone around him to do so (like his pregnant wife in Mexico). Che is definitely a deep, complex character, and the biography I had read definitely portrayed this nicely. So this time around I stumbled on Che’s famous manual Guerrilla Warfare and decided to give it a read.


Guerrilla Warfare falls into the “short but sweet” category of books - it says exactly what it needs to say and doesn’t outstay its welcome. It sells itself as the how-to guide of guerrilla wars, but the introduction tells us it really is more of a short history of how the Cuban guerrilla war was fought. The book focuses on both the practical aspects of warfare as well as the theoretical, and most of the interesting revelations for me were things that are completely obvious in retrospect but not ahead of time. For example, Che repeatedly tells us of the value of having quality shoes and good tasting food to keep morale high, which is definitely true but not immediately obvious to someone like me who has never been in war before.

Three other ideas stood out for me from the pack. First is Che’s insistence that terrorism is not acceptable under any conditions. His train of thought is also easy to understand here: the goal of the insurgency is to gain the support of the people, and committing actions that kill innocents definitely does not further that goal. Sabotage (destruction of military targets) is acceptable since it does not kill innocents, and Che makes it a point to distinguish between terrorism and sabotage. The second interesting point for me was that non-traditional roles, such as doctors, women, and chefs, are highly valued. Part of this is because, as you’d expect, these specialists are rare compared to soldiers, and in the case of chefs, the job is not particularly glorious so most people would rather be on the front lines as soldiers instead. However, as previously mentioned, having good tasting food greatly improves the squalid living conditions that guerrilla war imposes, so having a chef that can cook decent food goes a long way. Finally, there’s a short section that details how to convert a shotgun into a grenade launcher. But it actually gets even better: it’s a molotov cocktail launcher! There’s a picture that goes along with it that makes it easy to understand and the discussion of when exactly you would use this weapon was very interesting to me.
Overall the book is a good read - if you didn’t read Che’s biography because you were daunted by the length of that book, this book is much shorter and gives a good feel for the Cuban revolution part of it. It definitely is no substitute for reading about Che’s entire life, but is a good fun read and does detail very specifically how a successful guerrilla war was fought, as well as what was important to remember along the way for both sides.

God is not Great

While at the Bulldog Cafe in Solvang, I came across Christopher Hitchens’ book God is not Great. I had recently finished Why Orwell Matters, and having liked Hitchens’ writing style, decided to pick it up. It took me a while to get around to actually read it, but it was worth the time.


God is not Great takes a very serious look at religion and why it does not deserve the praise or respect that we normally give it. Pretty much all the religions you’ve likely heard of are covered to some extent, with most of the book focusing on Judaism, Christianity, and Islam. Hitchens does an excellent job of proving his thesis, which is nicely spelled out in the title, and a convincing case for why reasonable people should not believe in god or even respect the idea of it. The latter is what initially drove me to this book, through his notion of antitheism. Antithesism goes a step further than atheism: practitioners here are not just non-believers, but are opposed to the notion of god altogether, with all that entails. Hitchens spends a lot of time going into the “all that entails” part, and is very readable throughout.

I’d say the book is aimed either at converting people who are “on the fence” about religion (that is, they tolerate it but are not too religious) or need ammo to use against religious people they run into. If you’re in either one of those categories, the length of the book is probably about right, but if you already accept Hitchens’ premise or don’t need a whole lot of convincing (e.g., me), then the book is a good read but a little bit long. Recently I read and reviewed Sam Harris’ book The Moral Landscape, and while I liked the general idea, I had a few issues with it. Primarily, I didn’t like how Harris stepped outside of his comfort zones (e.g., atheism and neuropsychology) to try to boost his arguments with things like evolutionary psychology, which didn’t really get spelled out very well and brought down the book as a whole. God is not Great does not suffer from this problem: Hitchens sticks with his specialties (e.g., atheism and history, especially recent history) and the book as a whole comes out a lot stronger than The Moral Landscape.

What also came out as a great plus for this book was how specific arguments / counterarguments were spelled out. Specifically, the usual question of “didn’t atheists kill more people than people of faith” comes up, and instead of the standard answer of “yes but atheists didn’t kill because of their lack of faith”, Hitchens actually goes the history approach and talks about how the church co-opted the big fascist and communist movements throughout to ensure their own survival and well-being. I haven’t seen an approach like this taken before, so it was a very interesting way to go about questions I’ve seen posed many times and answered by others like Harris and Dawkins.

So the book is a great read - believers of faith may want to read it slowly and take it all in, while non-believers should have no problem reading it at full speed. The last few chapters also diverge a bit and talk about alternatives to religion, with a specific focus on philosophy and science. This nicely fills out the book and is done in a compelling manner, and stays largely in line with Hitchens’ thesis. I’m looking forward to checking out his book on Thomas Jefferson, so check back later for a review of that!

profile for Chris Bunch at Stack Overflow, Q&A for professional and enthusiast programmers