Ready Player One [A Review]

A fun adventure, but depressing in its view of the world.


Fast-paced, funny, nostalgic, witty, and depressingly pessimistic: Ernest Cline’s Ready Player One is all of the above. It’s the story of a nerd messiah on a quest to save a video game from an evil corporation and the real world from itself. Set in a dystopian future where humanity has largely ruined the world through pollution and over-consumption, there is nevertheless the OASIS: an immersive VR simulated universe which most of earth’s population logs into daily. The game’s creator, James Halliday, left as his last will and testament a vast fortune to whomever might find a hidden Easter Egg.

Of course, the hunt for the egg attracts many lured by the promise of wealth, including the evil corporation IOI (Innovative Online Industries) who plan to buy out the OASIS with the prize money and then monetize the heck out of it through ads and user fees. Wade Watts, a geeky high school student who spends most of his waking life in the OASIS, is the first person to crack the first clue, and after that it’s a mad race to the egg. IOI is willing to do anything to stop him or anyone else from reaching it first, including murder.

9781784754792While the overall plot is not overly original, Cline’s OASIS is an ambitiously vast and enrapturing setting, wrapping up an absurd array of other sci-fi/geek/pop culture worlds into one. It’s a place where X-Wing fighters, the lions of Voltron, and the Klingons all coexist, where sci-fi tech, fantasy magic, and 80s references blend together into something bizarre, creative, and unique.

Page after page, the book brought me back to my high school days of binging through MUDs all night trying to level my character up or lugging my heavy PC and CRT monitor to my friend’s house for a LAN party. In many ways, the dialog could have been ripped entirely from the IM chat transcripts of me and my friends—the inane insults, the lowbrow profanity, etc.—but what I got the biggest kick from was that Cline named the evil IOI villains “The Sux0rs.” Now that is a high school geek insult if ever there was one.

As fun as it was to walk down memory lane, the book was also hard to read in some ways. Cline holds a saddeningly pessimistic view of the world and the future. After all, the premise of the book is that the world sucks, but at least escape can be found through video games. The fate of the world hangs in the balance, and the question is whether Wade can win tons of money by remembering 80s trivia to save the game from ads. To be fair, that’s not just a vision of the future, but is basically our current reality except we use phones to access Instagram and Twitter instead of immersive rigs to access the OASIS. While I certainly don’t intend to over-analyze what is meant to simply be a light page-turner, the book nevertheless comes across as pretty shallow and gloomy. Someone at my work put it well in saying, “You ought to come into the book expecting cotton candy and high fructose corn syrup. There’s nothing good for you there, but boy will it taste good going down.” That’s about the sum of it: a fun adventure, but don’t make much more of it than that.

DISCLAIMER: I received a copy of this book from the publisher for the purpose of a fair, unbiased review.

Static Typing: a Personal Journey

Last February my company sent me to the Colorado School of Mines, my alma mater, to recruit computer science grads. Many of my former classmates were there as well, and I started chatting with a guy who was telling me about his job where he wrote Java every day. Positively gushing, he exclaimed, “I just love Java!”

I was happy for him, but let me tell you that was not my experience with the language when I had to write it in college. It felt extremely verbose and laden with unnecessary syntactic cruft. But worse than anything was its type system; it constantly felt like I was appeasing my robot overlord who demanded that I label my new variable as an integer or a string. It certainly did not feel like it was there to help me.

Near the end of my college experience, I happened to take a web apps course where, over the course of a semester, we built out a Ruby on Rails application together as a class. There was one word to describe my experience: exhilarating. Ruby is a very expressive language and I found that I could largely just write what I was thinking and it would usually work. The curly braces, semicolons, and angle brackets were all gone, and there was very little standing between my ideas and a fully functioning app. It was a wonderland.

I think database work, modeling data, and other back-end tasks are interesting, but I truly love front-end work. There’s something about the work of building an interface between data and a human being that I can just lose myself in. There’s nothing quite like building an app that someone will find genuinely useful, intuitive, and beautiful. When I got my first software engineering job, I knew that was where I wanted to be, but there was just one problem: I’d have to write JavaScript.

When I had first taught myself JavaScript in 9th grade, I picked up a copy of The Book of JavaScript from No Starch Press and struggled my way through the exercises, trying to make them work in Internet Explorer 6. If something didn’t work, I would try alert()ing a variable here or there, but I eventually came to the conclusion that JS was a terribly confusing language with terrible developer tools with terrible cross-browser support.

When I started my first software job, though, I found out that my company was using a cool language called CoffeeScript that brought a lot of the niceties of Ruby to front-end development. Around the same time we were making the switch from Angular 1.x to React, and for the most part, it was a pretty decent setup.

At my next company we were still using React, but the engineers had decided that rather than using CoffeeScript, we’d use this newfangled version of JavaScript called “ES6.” I had plenty of doubts, but when I jumped into the work, I was honestly shocked at how decent the language felt. We no longer had to do all these weird var self = this tricks; everything just pretty much worked the way you would think it should. I was on a project to build an AI chatbot in React which was pretty interesting and fun, but there was one thing that I was finding less and less fun: getting paged when something wasn’t working as intended.

“How did I miss this? How did this get through QA? How did my product owner miss this in his final approval?” I fancied myself to be pretty good at avoiding errors with null and undefined and NaN and the dozen other gotchas in JS, but it turns out that when you’re working on a team and multiple people are touching the code, it really doesn’t matter how good I might happen to be at avoiding those errors, and it doesn’t even matter if everyone on the team is good at it; when working with others, things fall through the cracks. Miscommunication happens, and an API you thought would work a certain way doesn’t.

I knew I was tired of undefined is not a function, but I didn’t know how to solve that problem other than by just not making mistakes. The problem, as I just highlighted though, is that such a solution wasn’t good enough. And when you guarantee to your customers that your app will work and will have a certain uptime, you need to actually meet their expectations.

It was around that time that I stumbled upon Dr. Boolean’s Mostly Adequate Guide to Functional Programming in JavaScript, where it finally clicked for me that my long-held hatred for static typing began to give a little. He described the Maybe type and how it could more accurately express the possibility of missing data in an application, and I knew in my gut that this was what I was looking for to finally slay that dragon, undefined. Maybe I won’t get paged anymore (or at least less often) if I can be more confident in the code I ship! Maybe I will have to tackle fewer bug fix stories!

I began to construct a safety net of sorts around the code I wrote; in addition to automated tests, I started using Facebook’s Flowtype and ImmutableJS to have more visibility into and clarity around the data flowing from our database to our users and back again. Recently I switched from Flowtype to TypeScript to have an even more reliable tool in my belt. In addition to these, we use Lodash/fp, True-Myth, and a myriad of other tools designed to keep us honest about the code we write—code which our users are paying us money to use.

This is why we write tests, yes, but trying to force a test suite to provide the sort of granular insight into your code as you’re writing it is like trying to force a square peg into a round hole. I like to think I’m a moderately decent programmer, but the number of times TypeScript catches me and says, “Oops, let’s take a step back. That’s not actually going to work,” or, “Looks like you need to add one more prop to your React component before it’ll actually work,” helps me to realize that I’m just a finite human being and I can’t keep the entirety of the code in my mind all at once.

Taking a step back, it’s pretty remarkable that someone like me who used to loathe static typing could have had such a change of opinion. I used to think one of the cool things about dynamically typed languages was that they allowed you to quickly prototype an idea without having to cross every T and dot every i. I actually still do think that, but I no longer want to ship prototypes to users unless that’s what they’re expecting. To put myself in their shoes, if I’m going to pay money to use your software, it better well work or I’ll take my money elsewhere. Don’t hear that as entitlement; if Netflix has a hiccup with a video and says, “Sorry, try again,“ I’ll try it again and move on with my life. But if the software simply doesn’t do what it says it will do, that’s a different story.

I love statically typing my JavaScript, and one of the coolest things I like about it is being able to write my UIs heedlessly; for the past few days I’ve been building out a new feature for our React Native app and I haven’t even opened it in my simulator yet. TypeScript is helping me to put the blocks together correctly, and when I open it finally, I expect to just have to do some massage work to style it and lay it out correctly.

What’s next? I would say one of the primary downsides to my current tech stack is that I had to bolt it all together myself. That means things don’t always line up exactly right, and there’s also the infamous node_modules/ cost to all this. I’ve been evaluating Elm and Reason precisely because a lot of the pieces I’ve cobbled together come as part of the package in those languages. My ability to write correct code quickly has improved as a result of some of the tools I currently use, but I long to use a language designed around this workflow.

To summarize, I think static typing makes for a terrible master, but an excellent servant. Nobody likes the feeling of having to placate a compiler just to run the code, but static typing doesn’t have to feel that way. When I write Elm, it’s like I have a copilot pair-programming with me who is always kind, never judgmental, and quick to help me fix my mistakes and stay in the flow. I won’t sugarcoat it: sometimes TS or Elm or Reason or many of the other well-designed type systems can still make it feel like you’re just placating a compiler, but I don’t think that’s a reason to reject them out of hand. They’re powerful, valuable tools that can help us think clearly about the code we write as individual programmers, but more importantly, as teams of people building software together.


Long Before Luther [A Review]

34525486“Was the Reformation doctrine of justification by faith alone an invention or a recovery?” Though Protestants might easily dismiss that question, it would be foolish to do so. The Roman Church asserts that this doctrine that is so central to Protestants is an innovation, and that we have thus been living in error for the past 500 years and need to return to the straight and narrow path found only in Mother Church.

It does not help, of course, that Protestants (and especially evangelicals) can sometimes act as if the modern Church just sort of appeared out of thin air without caring one bit where it came from. Slightly better (but only slightly!) is the belief that the true Church only arose 500 years ago when Luther posted his theses. This is not, however, how any of it works: we came from somewhere, and in one way or another we must reckon with our history.

In a peculiar and ironic way, this narrative of Church History is one that the 16th century Reformers like Luther and Calvin and Zwingli would themselves reject. While they did believe that there was corruption and theological infidelity and corporate sin in the Church that needed to be repented of, this was not a task of reinventing the Church or starting a new Church; their aim was to come back to the historical teaching of the Church. As Fred Sanders has recently put it, they intended to be more catholic than the Roman Church would allow them to be.

It is thus with great pleasure that I learned about Nathan Busenitz’s new book, Long Before Luther: Tracing the Heart of the Gospel From Christ to the Reformation. There have been hundreds of books published this year in honor of the 500th anniversary of Luther’s theses, but this one stood out to me precisely because it works so powerfully to confront this false notion that the true Church was dormant or dead until the 16th century.


Busenitz focuses in specifically on the doctrine of justification by grace through faith with the intention of refuting the Roman Church’s claim that it was an innovative doctrine, having no historical precedent. He begins by looking at the scriptural warrant for the doctrine and then proceeds to examine the doctrine in theologians before Augustine, in Augustine himself, and then in later medieval theologians such as Anselm and Bernard of Clairvaux.

Throughout the whole book Busenitz stays rooted in primary sources, only leaning upon secondary sources to supplement his interpretation or to interact with others who read the sources differently than he does. Given that Busenitz holds a doctorate in church history and patristic theology, the section on the pre-augustinian Church and on Augustine himself are much stronger than the last section on the post-augustinian Church. That’s not particularly a bad thing, but it’s worth noting because there is certainly far more that could have been said about the medieval period than is spoken of here.

Areas of Improvement

Let me reiterate that I am so deeply thankful that this book has been published; Protestants could stand to have a lot more books like this on our shelves. That being said, I see two primary areas where this book could have been considerably strengthened: its doctrinal focus and its engagement with detractors and critics.

Doctrinal focus. In one sense, one has to commend Busenitz for his laser focus on a single doctrine for an entire book-length project; it would be easy to go a mile wide and an inch deep, and because he doesn’t do that he is able to interact extensively with primary sources. That’s pretty rare in popular-level evangelical books, and it’s wonderful that he does so.

Nonetheless, justification by grace through faith is not an adequate summary of everything the Reformers were trying to accomplish, and focusing only on this one doctrine exposes Protestants to the criticism that we only care about getting people saved without investing much thought into the life and function of the Church, and how individuals fit into the whole. Yet for Luther, Cranmer, Calvin, and the rest, the doctrine of soteriology was only part of the project of reformation.

In the medieval point of view, what distinguished the true Church was apostolic descent (can we trace a spiritual genealogy all the way back to the NT?) whereas for the Reformers the true Church was marked by the right preaching of the Word, the right administration of the sacraments, and, for the Reformed at least, the right exercise of Church discipline. Right preaching of the Word came from the ad fontes impulse to dig back down to the primary sources rather than relying on millennia of interpretations instead. They weren’t abandoning Church history, but they were returning it to its proper place. Long Before Luther expressly does not intend to tackle all of that, but I cannot help but feel the book is a bit lopsided as a result.

Engagement with detractors and critics. Having only relatively recently begun to dig into patristics and reformation theology myself, I am in no way qualified to make judgments about whether Busenitz interprets the sources fairly or not. I imagine that most readers of this book will be in the same boat, and for the most part we are required to simply trust that he is not just lifting quotes out of context and using them as proof texts. That’s a scary place to be as a reader, and I imagine his case would have been rhetorically strengthened had he engaged opposing viewpoints more thoroughly.

To be fair, he does do some of this: on p. 25 he uses Alister McGrath’s contention that sola fide is an innovative doctrine as a springboard to get into his argument. In the section on Augustine he gives ample time to the argument that Augustine believed in sola caritate iustificare (“justification by love alone”) rather than by grace through faith alone. Given that the entire book is a defense against the accusation of theological innovation, though, I would have hoped to see this sort of interaction throughout more of his argumentation. This would have also increased the size of the book, but it would have been worth it.


It’s a rather short book weighing in at just over 160 pages minus notes and appendices, and seems to be targeted at the armchair theologian; it’s not as technical as historical theology can get, but I could imagine it going over the heads of some readers who have never read much in this vein before. My criticisms aside, I really do appreciate this book and Busenitz’s zeal to see a Protestant Church more connected to and grounded in its own history.

You can pick up a copy on Kindle for about $9, or you can purchase it from the publisher for roughly the same price.

DISCLAIMER: I received a copy of this book from the publisher for the purpose of a fair, unbiased review.

Humble Roots [A review]

There have been (at least) two trends in my life over the past few years: first, I have grown rather weary of the endless parade of devotional books marching forth from evangelical printing presses, and second I have felt more and more of a desire to be out in my garden planting seeds, pulling weeds, watering, and planning. I tire of devotional literature not for any lack of good intention on the part of the publishing houses, but because so much of it seems to simply trot out the same clichés and formulas as the last 100 books. This has, in turn, led to my reading of far fewer books per year than in the past and thus spending more time out in the garden. To be fair, not all of the blame rests on the publishers; I tend to read books more quickly than they deserve, and my perception of their value might have been higher if I had read them more slowly.

513mja5ds-l-_sy344_bo1204203200_I still keep tabs on new books, however, and when I saw the publisher’s description of Hannah Anderson’s Humble Roots, my interest was piqued to a degree that my cynicism could not repress. The premise is simple: growing fruits and vegetables and tending the land are activities that teach us much about what it means to be humble. In eleven chapters, Anderson walks through her experiences living in a small town in the Blue Ridge Mountains, cultivating the ground with her husband.

Chapter 7, “Vine Ripened,” is in my opinion the most excellent chapter of the book. The luscious-looking plump, red tomatoes in the store are not actually ripe but merely gassed to appear as if they are. Those tomato varieties are not cultivated for flavor but merely for their looks and for their ability to withstand long treks across the country in semis. In the same way, many of us approach life and maturity this way; the virtues we admire in others tend to be whether they are attractive or whether they say things we agree with. If someone knows the “right” people or espouses the right ideas, then we think of them as mature or worthy of our admiration. Anderson challenges this notion and suggests that perhaps the reason we see so many failures of character in the church (and even in the wider world) is because we prize superficial maturity rather than something deeper.

Horticulture is the thread tying the whole book together; this is largely a strength, but sometimes teeters on the edge of becoming cheesy. What saves the book from going there is the fact that Anderson is actually conversant in the language of the garden, and is not simply rummaging for illustrations out of a book or off the internet. She knows what she’s talking about, whether the subject is character or apple trees.

I must say that all in all, this is one of the better books I have read this year. The vine ripened tomato analogy I shared above is something I have been ruminating on for weeks and will likely stick in my consciousness for years to come. You can pick up a copy on Amazon for $7.

DISCLAIMER: I received a copy of this book from the publisher for the purpose of a fair, unbiased review.

Pursuing Health in an Anxious Age [A Review]

Why do greater certainty and more control only heighten our fear for what remains outside our control—especially if the possibilities are so improbable?

—Bob Cutillo, MD

It is a curious thing that health care, whose very existence was once solely predicated upon helping people, has become an intimidating, monolithic, even frightening system that nobody fully understands and that can even ruin people physically, financially, and emotionally. It is not that anyone sets out with an evil gleam in his or her eye seeking to scuttle the lives of the medically needy; instead, we have arrived at the current state of health care rather unintentionally. The root problem is that we believe our health to be a possession to which we are entitled and our health care a service which we have purchased, and thus are owed good service.

This is at least the thesis of the recent book Pursuing Health in an Anxious Age by Dr. Bob Cutillo, a physician for the Colorado Coalition for the Homeless in Denver, Colorado. it is true, of course, that when you or I go to the doctor we do expect competent and accurate diagnosis of any issues we are suffering from. What happens, though, when the diagnosis is something that cannot be treated? We may rage and splutter at the doctor as if we are being short shrifted, but this belies the fact that we have forgotten that health is a gift, not a possession. Nobody receives a guarantee in the birthing room that he or she will live a long, healthy, and disease-free life. Every healthy day we live is undeserved.

31qfo2suwml-_sy344_bo1204203200_With a certain amount of irony, it is this acceptance of our true lot in life that actually leads to a better relationship with our health. Life is a gift, and when a doctor, medicine, drug, or procedure restores us back to health this is also a gift. When we receive the news that a chronic condition is incurable or that death is knocking at the door, we can receive that news with sorrow, but also with a certain measure of peace and contentment, because every good day we have ever lived has been given to us.

I personally have a complicated relationship with the medical establishment; luckily I only have ever been to the doctor for something really serious a couple of times, but the heartache of sickness and death is not far from any one of us. I have lived my life in the peculiar valley that many others dwell in; on the one hand there are those who insist that everything about the medical establishment is good and ought to be accepted uncritically if it is uttered from the doctor’s lips. On the other hand, there are those who swear off anything and everything that has to do with the AMA; healthy living is a specific formula of nutrition, vitamins, essential oils, natural remedies, and even things like homeopathy and reflexology. To be honest, one of the reasons I picked up Dr. Cutillo’s book was to see if he might provide a way forward.

Reading Pursuing Health in an Anxious Age did not automatically reconcile these two groups in my mind or even provide me with an obvious third way, but Dr. Cutillo did help me recognize and understand that the posture of control is evident in both of these groups—they just disagree on how to control life. Viewing life as a gift, however, offers a certain amount of liberty in both. You can receive the diagnosis from the doctor without being disillusioned when the news is bad.

If I have any critique to offer of the book, it’s that its target audience is not always clear. Sometimes it’s as if Cutillo is writing to medical professionals, and sometimes to laypeople. The result is a book that feels at some points laser-focused in its intent and at other points simply over my head. That is a relatively small critique, however, and in general there is plenty of food for thought for any reader. Though I would hesitate to call this a five star book, it nevertheless is one of the most interesting, applicable, and genre-crossing books I have read this year. I highly recommend it.

You can pick up a copy on Amazon for $10 or WTS Books for $16.

DISCLAIMER: I received a copy of this book from the publisher for the purpose of a fair, unbiased review.

Cover photo courtesy of 强 石.

Punderdome [A Review]

I consider myself something of a connoisseur of puns. A pundit, you might say. A pun at its essence is simply a play on words, but a good pun exhibits draws an intersection between two otherwise unrelated conceptual fields in one word or phrase. A pun will always draw forth a groan, but a good pun also draws forth begrudging appreciation for the punster’s rhetorical cunning.61ve2bo1hojl

All of the above is a fancy way to say, “I like puns and I actually spend time thinking about them.” So when I happened to see a new card game come out last month called Punderdome, I was sold… even though I received my copy for free from Crown Publishers. Thanks! I decided to try it out with my wife and one of our friends, two people who both love and hate puns more than most.

The game is quite simple: someone draws two cards at the same time. Each card has a word or phrase on it, and then everyone else has 90 seconds to write down a pun that integrates the two cards. That’s the big idea of the game—I told you it was simple. It might not sound very difficult, but I found it to be rather difficult (and I tend to find puns to come fairly naturally). At the end of the 90 seconds the prompter decides which pun is the best, and that winner gets the two cards. Whoever gains the most cards wins.

A quirky aspect of the game is that whoever brings the game out and wants to play it is the first prompter, and (as a sort of apology for the groans that will ensue) he or she has to fill two mystery envelopes each with a prize. At the end of the game, the winner gets to pick one envelope as their prize. Of course, there might be a good prize in only one of the envelopes, so it’s a bit of a gamble.

The game is pretty fun, but I imagine it would be most fun with a large group of people. The only critique is that some of the combinations of cards can be fairly difficult, which decreases the fun when everybody fails to come up with anything. It’s a great game in general though, and I love how simple it is.

DISCLAIMER: I received a copy of this game from the publisher for the purpose of a fair, unbiased review.

Home Cooked [A Review]

Cooking good food is one of those things we just do not seem to have time for these days. Most folks subsist on a combination of microwaved dinners, takeout, or dine-in. When we do cook, it’s usually a matter of popping open boxes from the pantry or pouring a frozen bag into a pan and coating it with a tear-open packet of sauce. After all, when creating a relatively decent hot meal is this easy, is it really justifiable to pour extra time into a meal just to make it from scratch?

home-cookedIn her new Home Cooked: Essential Recipes For a New Way to Cook (10 Speed Press, April 2016), Anya Fernald offers a middle ground between slow-cooked, high quality foods and fast but flavorless cooking. Her suggestion is simple, yet genius: put in time creating quality base ingredients and preserve them, and then when time is short on a weeknight you’ve got flavor-packed ingredients that are ready for use immediately.

Take, for instance, her sofritto: there’s nothing to it but olive oil, onions, carrots, and celery, and I couldn’t even begin to count the number of times I’ve made this to start a soup. I usually rush it, cooking it hot just to get it done, and the flavor is never as good as it could be. Her innovation is to cook it ahead of time and freeze it in ice cube trays for ready-to-go flavor later on.

The first portion of the book is devoted to such recipes for base ingredients, and then the rest of the book is divided up into appetizers/cocktails, meals, and desserts that utilize these base ingredients. Interspersed throughout are her various thoughts on cooking as well as stunning photography.

If there’s anything that turned me off about the book, it was the many recipes that I personally found rather unappealing (fried chicken hearts? raw beef?). I imagine it’s mostly because I’m vegetarian, but my omnivorous wife had much the same reaction as me.

That being said, there are plenty of other interesting recipes in the book that are appealing. I normally link to both the physical copy and a digital copy of the book, but in this case just do yourself a favor and pick up a hardback copy of the book from Amazon for $17.50. Not only is the Kindle Edition actually more expensive, but the hardback is worth it. It’s well-bound and sturdy, and quite aesthetically pleasing.

DISCLAIMER: I received a copy of this book from the publisher for the purpose of a fair, unbiased review.