Stereotypical End-of-year “Best Books” Blog Post Title

What makes a book good? I read a decent number of books per year, and I am always quite hesitant to rate a book higher than 4 stars, mostly because I want 5 stars to mean something beyond “I enjoyed this book.” To that end, my top books of the year are not organized according to metrics like “best page-turner” or “most elegant prose,” but by their superlative effect upon me and my perception of the world.

The series that had the most unexpected yet profound impact on the way I existentially frame hamartiology

One of the best parts about reading fantasy is its orthogonality to the real world; because its internal logic and meaning and telos are different, it enables us to to then come back and consider our own world from a new vantage point. When my friend Chris encouraged me to read the Wheel of Time this year, I was initially hesitant simply because of the sheer commitment that 14 books represent. I eventually decided to give in, though, mostly because I was curious what it would be like to read through the transfer of ownership of the series from Jordan to Sanderson.

The series is mostly what you would expect from an epic fantasy: world building, grand adventures, a well-developed system of magic, a colossal battle between good and evil, etc. The series certainly has its highs and lows, and in general I would recommend it to the average nerd who is interested in that sort of thing. What really struck me about the WoT, though, was the way in which Jordan framed the world’s “fall myth,” which is interesting at all in a world with a cyclical view of time. Thousands of years prior to the setting of the story, a very powerful man named Lews Therin Telamon who walked in The Light eventually broke and in his madness killed his entire family and then catastrophically reshaped the very geography of the world in his grief for what he had done.

What’s fascinating is how oddly congruent that is with the orthodox Christian doctrine of sin (hamartiology). While Christians speak often (okay, irritatingly often) about the “brokenness” of the world, we always speak about it exactly like that: as a state that the world is in, that we regrettably have to deal with. We do not speak about it anywhere near like the way Jordan does, which is an active, volitional deed for which we bear responsibility. That’s for a good, pastoral reason: we do not under any circumstance want to communicate to the hurting, the victimized, the tortured, the raped that they are somehow volitionally responsible for the injustice done unto them.

Yet I must acknowledge that there is, ironically, something quite safe when we only speak of sin in terms of a past passive action that created a present, immutable state. “Well, what Adam and Eve did is water under the bridge, and we have to live with it now.” While true, it is dangerously blind to the fact that the breaking of the world is a very present possibility, for me, now, and in every moment of my life to come. The breaking of the world is something I can do, and that’s as horrifying as it should sound.

Any orthodox Christian hamartiology is also framed with respect to the incarnation of God: “He became man that we might become God,” and thus we believe not only in the breaking of the world but also its incremental unbreaking, its better-than-mending restoration. This comes about by the submission of our every thought, desire, and deed to King Christ’s direction, an idea which we must admit is wholly repugnant, alien, and unspeakable to the modern, western ethical aesthetic.

So we arrive where Augustine does, which is to say that while Christ frees our wills from complete and utter bondage to sin and enables us to finally actually be able to submit to Christ, we are presently still just as able to work against what is good and right and true. We can break the world yet further.

When we fail to forgive, we rend relationships asunder. When we willingly choose to rebel against Christ and refuse to repent, we rend our own souls. When we collectively choose to shirk our stewardship of the planet where we live, we can even break the very geography beneath our feet and the atmosphere above our heads.

The Wheel of Time was one of the best series I read this year precisely because it pressed me to really feel the weight of my volitional capacity, and the effect of even my seemingly inconsequential decisions upon the world.

Robert Jordan's Wheel of Time series

The series that most deeply shaped my imaginative-emotional perception of when people make terrible life decisions, and their prospects of hope

I live with a sort of uncertainty about how to react when another human being makes a poor life decision. If it is someone in the news, I can sort of sadly write it off as simply what happens when someone gets too famous or some other sort of tweetable moral posturing. If it is someone relatively close to me, perhaps I might react with either anger or judgment or maybe even real grief. Yet what I have always found very difficult is to respond with empathy or compassion when someone makes a terrible choice.

I first picked up On the Edge of the Dark Sea of Darkness, the first in Andrew Peterson’s Wingfeather Saga, because I love his music and was curious if he was able to transfer his skill to non-musical writing. I did not expect him to help me grow in compassion.

Dark Sea of Darkness is a fun book aimed at older kids and teenagers, but in the end the novel ends up feeling just lighthearted in general. The second book quickly takes a turn, though, and explores the evil that human beings are capable of doing to one another, and to themselves. Over the course of the saga, benign characters become broken characters with guilt dragging behind them. Protagonists antagonize themselves, and the villainy of Gnag the Nameless becomes somewhat understandable when placed in his narrative context.

Peterson does a fantastic job of making horrible things feel horrible, as well as retaining a sense of compassion for those who do horrible things. This dynamic came out especially for me in the interaction between Tink, Janner, and Leeli, and their sacrificial sibling love for one another even when they get off-course. Because of that, it’s something both my wife and I are itching to read to our kids.

The Wingfeather Saga

The book that was most helpful toward forming my theology of vocation

Every Good Endeavor by Tim Keller and Katherine Leary Alsdorf is somewhat of a modern classic in the nano genre of the theology of vocation. Evangelical Christians have a reputation for thinking narrowly about the role that faith plays in one’s life, as if the only thing of even remote significance in life is getting people to toe the gospel line. That sort of thinking reflects a belief in the sacred/secular split that Schaeffer railed against so hard in the seventies, and which apps like Headspace unwittingly rail against from the other side today.

Every Good Endeavor — Timothy Keller

A belief that work is mostly unimportant other than for providing financial legs for the gospel is somewhat akin to Victorian thinking that sex is a necessary evil one must engage in only for the higher good of children. Work does provide the money to translate the Bible into other languages so that new people can reflect on it for themselves in their native tongue. It does provide the money that runs churches and ministries to single mothers and rehab clinics and everything else. But to consider “the marketplace” merely as an engine for something more important is to miss a crucial fact: God made us, and God made work, and nary the two shall part. It is an aspect of our existence.

This book is fantastic for exploring the many different facets of the question of faith and work, and it’s one of the few books I read this year that I will very likely read again. Do not enter the book expecting someone to tell you how you’re supposed to think about work; that is what your own brain is for. Read the book slowly and reflectively over the span of an entire year. Converse with Keller and Alsdorf with your pen in the margins. Let the book prompt you to think.

The book that came most out of left field for me

On the first day of Advent this year I took my kids up to my dad’s house in the mountains to get a tree. I wanted to grab some Christmas-themed audiobooks for kids on the way, so I searched for basically that in Libby and downloaded the top few results. How Mrs. Claus Saved Christmas was one of them, and it was… not at all what I expected. Falling firmly on the utterly fantastical side of the historical fiction spectrum, the book is about a woman named Layla in the fourth century who marries Saint Nicholas and they both live happily ever after, literally.

They live forever, with super powers that enable them to travel at super fast speeds so they can deliver presents to people in need. Along the way they are joined by King Arthur, Attila the Hun, and many others in their mission up until the 1600s, when Mrs. Claus goes head to head with the evil Puritan Oliver Cromwell in a battle royale over whether Christmas should be legal or not.

The Autobiography of Santa Claus & How Mrs. Claus Saved ...

The book is… interesting. We live in a world that is largely unaware that it came from somewhere, and so I am usually a fan of books that try to breathe life into history such that more people are exposed to different times and places. After all, “Mrs. Claus battling evil Puritans about Christmas” sounds like a way cooler premise than, “A thoroughgoing history of that holiday commonly referred to as ‘Christmas,’ whereby…” Unfortunately, Mrs. Claus has an irritatingly preachy tone, often lecturing the reader about how women in fourth century Turkey should be free from the ball and chain of marriage or how 17th-century Puritans really need to loosen up and just kind of do a “you do you” approach to life. Whether she’s right or wrong, Jeff Guinn creates in her an historically unconvincing character: the only people who are this overt in their moral posturing are 21st-century westerners.

Still, I include this book in my list for a very specific reason: it was able to imaginatively and emotionally take me outside the box of my own opinions and positions and stand in very weird-feeling shoes. I generally have a positive impression of the Puritans, speaking as an American. More aspects of my life than I can count are due to their beliefs and their journey across the Atlantic to the Americas. Guinn, however, paints them in an incredibly unflattering light, and it enabled me to see the world in a way that I am normally blind to.

The book that caused me to think most deeply about reliance upon technology from a theological vantage point other than my own

When the English Fall also came somewhat out of left field for me in that it popped up at the beginning of the year as a free ebook and I snapped it up because it sounded mildly interesting. The premise of the book is the earth gets hit with a gigantic solar storm that knocks out all electrical systems across the globe. Because of society’s reliance upon electricity, it causes a cataclysmic chain reaction in which billions are without food and water and the world devolves to a state of chaos and anarchy. That is, except for the Amish, whose lives carry on pretty much as usual, until everyone else (whom they refer to as “The English“) shows up at their doors with guns and a demand for food.

It stands apart from the usual crowd of post apocalyptic fiction in its reflectiveness. As a non-violent, charitable people, how can the Amish both give generously to those who ask as well as provide for their own families when supplies run short? Is it ever right to “fight fire with fire” and defend your family when someone is threatening you at gunpoint?

When the English Fall by David Williams

As valuable as it is to think through these ethical dilemmas, what I found most thought-provoking was simply reflecting upon the ways in which I rely upon technology. I don’t just mean, “I check Twitter too much,” but something even more basic: would I be able to survive without electricity? Would I be able to live in and enjoy this world without modern amenities? As a software engineer, my day-to-day existence is quite far removed from the soil upon which my world is built. I enjoy reading authors like Wendell Berry who cause me to wistfully remember the rural reality of my childhood, but even that is something of a lie: I am a vegetarian, and if the power grid were to go down, much of the protein I rely upon would not be available, and nor is my property large enough to grow enough protein. In short, I’m deeply reliant upon this complex machine we call society.

Now, the reality is that a global catastrophe like that is an unlikely scenario, and it is basically “safe” to rely upon society as I do. What actually is a concern, though, is the proclivity of society to lull me into forgetting my creaturehood, and thus forgetting a core aspect of who I am. When my food comes to me by way of hermetically sealed packages lined up and categorized in a grocery store, I begin to associate grocery stores with “where food comes from,“ because the little packages and the trucks that carry them to the store abstract away from me the fact that vegetables are still grown in the ground. Meat eaters today often do not love to ponder the fact that a cow has to have its throat cut and its blood pooled in a drain in order to become the tidy little package of beef in the cold section of the store. I don’t say that to be gross or incite guilt, but only to bring to remembrance Leviticus 17:14, “The life of every creature is in its blood.” There’s a sort of rightness, I think, about the shock factor of killing an animal for food that we conveniently don’t have to confront with pre-packaged meat.

All of this to say that my dependence upon society runs deep. Electricity is synecdoche for the pile of abstractions that is modern life. If you enjoy thinking about this sort of thing, When the English Fall is worth your time.

Wrap

So there you have it: my book superlatives of the year. If any of these books sound interesting to you, read them and let me know what you think!

Advertisements

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.