Tolkien, for all his vaunted designs, only got to The Good Stuff when he was IN it, really working the text of the novels (or novel, if you consider The Lord of the Rings one big book). He could not worldbuild his way into a workable story; he had to muddle and discover and revise, just like the rest of us….
In a single stroke, we get: a mythic backstory, a grand MacGuffin, a sense of language and history, the sublimely satisfying train of magic numbers — three … seven … nine … ONE! — plus something graphically weird and beautiful on the page.
It’s all just tremendous — the perfect kernel of Tolkien’s appeal.
And, guess what:
Not only was the inscription missing from the early drafts of LOTR … the whole logic of the ring was missing, too. In its place was a mess. The ring possessed by Bilbo Baggins was one of thousands the Dark Lord manufactured, all basically equivalent: they made their wearers invisible, and eventually claimed their souls. They were like cursed candies scattered by Sauron across Middle-earth.
Tolkien’s explanation of this, in his first draft, is about about as compelling as what I just wrote.
It’s fine, as far as it goes; he could have made it work, probably? Possibly? But it is not COOL in the way that the final formulation is COOL. It has none of the symmetry, the inevitability. It does only the work it has to do, and nothing else. It is not yet aesthetically irresistible.
There are several revised approaches to “what’s the deal with the ring?” presented in The History of The Lord of the Rings, and, as you read through the drafts, the material just … slowly gets better! Bit by bit, the familiar angles emerge. There seems not to have been any magic moment: no electric thought in the bathtub, circa 1931, that sent Tolkien rushing to find a pen.
It was just revision.
I find this totally inspiring.
I find it totally inspiring, too.
This reminds me of this Guy Gavriel Kay quote which I’ve posted before and will now post again:
I learned a lot about false starts in writing. I mean that in a really serious way. His [Tolkien’s] false starts. You learn that the great works have disastrous botched chapters, that the great writers recognise that they didn’t work. So I was looking at drafts of The Lord of the Rings and rough starts for The Silmarillion and came to realise they don’t spring full-blown, utterly, completely formed in brilliance. They get there with writing and rewriting and drudgery and mistakes, and eventually if you put in the hours and the patience, something good might happen. That was a very, very early lesson for me, looking at the Tolkien materials. That it’s not instantly magnificent. That it’s laboriously so, but it gets there. That was a huge, huge, still important lesson.
After holding out for a few months, I’m finally on Mastodon at @bencrowder@mastodon.social. I’ve wanted to provide a more lightweight way for readers to respond to posts (email can feel a little too formal sometimes) without adding comments to the site itself, and I think this is it.
The Rise and Fall of Ancient Egypt, by Toby Wilkinson. While it admittedly took me four months to read this (slow going because of all the less familiar names), I liked it a lot. How vast a time period this is — and yet still so inconsequentially small from a geological/cosmological perspective. I didn’t realize it took three years (speaking of mere blips) from the discovery of Tutankhamun’s tomb to when they finally opened his sarcophagus. Also didn’t know that pharaoh originally meant “palace,” or how often pharaohs repurposed the materials from previous pharaohs’ tombs. (All the time.) I took Middle Egyptian and Coptic in college and reading this book reminded me of that and really made me miss studying dead languages. I need to make time for that again, somehow.
Saints volume 3. Loved it. These were mostly parts of Church history I was less familiar with, so I enjoyed filling in those gaps. It was also fascinating to see how various world events affected people in the Church in different countries. Looking forward to the next volume. In the meantime, I’ve been dipping into the global histories.
Recent fiction reads
The Justice of Kings, by Richard Swan. I really liked this. The legal/judicial aspect was right up my alley and the fantastical/horror elements also worked well for me. The writing’s great, too. Immediately bought the sequel, which came out a few weeks ago.
Never Let Me Go, by Kazuo Ishiguro. Didn’t like it anywhere near as much as Remains of the Day or Buried Giant. It felt a lot more like Klara and the Sun, which I also didn’t like all that much. (This type of story doesn’t appeal to me. I need to stop forgetting this.) Also, I went in having heard there was a twist and…there wasn’t one. Not really.
Jon Stokes on AI. A fairly positive take. I don’t know how much I agree with it, but I found it interesting.
Charles Chen on React being the new IBM, in the sense that no one ever got fired for choosing React, in spite of it not performing as well as other frontend frameworks.
GB Studio, a retro game creator for making Game Boy games, kind of like the game creators for Pico-8 and other fantasy consoles. I never actually use these, but they look fun and eight-year-old Ben would have been all over this.
Pedro Cattori on snake case being the best case. The older I get, the less I think I care about this kind of thing (other than keeping it consistent across the codebase, which seems like a baseline for maintaining sanity).
Eggspensive, a map showing the price of eggs across the U.S. (I should have posted this earlier!)
Cole Peters on redefining developer experience. Fully agree that user experience matters far, far more than developer experience. Also agreed that the sprawling array of tools a frontend engineer needs to stay on top of these days is…a bit much, and very much agreed about focusing on web platform fundamentals.
Nannou, a Rust creative-coding framework. The code examples look pretty good, actually — easy to read and reason about.
Dan Wang’s 2022 letter. Fascinating read about last year’s lockdowns in China among other things. The bits at the end about books and food were also quite interesting.
Continuing on with working my way through the Elixir introduction. I’m trying to figure out how to keep this from taking forever (especially since I’m only doing this in little bits of free time here and there), so there’ll be a bit less commentary than last time.
Binaries, strings, and charlists
I love that you can use ? to show the code point in front of a character literal. (Not that ord("a") or "a".charCodeAt(0) is all that harder.)
Pattern matching on binaries and bitstrings is good.
Keyword lists and maps
I like being able to use atoms as the keys in keyword lists and maps. It’s a small thing, but it’s nice.
Ooh, do-blocks are just syntactic sugar. (Apparently I really like it when control flow statements are just special syntax on top of lower-level constructs like keyword lists.)
Modules and functions
Okay, like in Rust, modules are named in code (with defmodule) rather than named implicitly by whatever the containing file is called. I think I like that it’s explicit.
I don’t think I’ve seen private functions specified by changing the function definition keyword (def to defp in this case). Usually what I’ve seen is a separate keyword (private) or private-by-default (Rust) or capitalization change (Go) or mere convention with underscores (Python). Cool.
Ooh, guards on function definitions. I like this. Function overloading++. (Har har.) I know you can get the same behavior with conditional statements in a single function body, and that’s probably less verbose, but still. This seems easier to reason about.
Function capturing is interesting. I guess it’s needed because the parentheses in function calls are optional.
Default arguments with \\. Huh. Moving things up to a function head if there’s more than one default argument is also interesting. Brings back the old C/C++ days with header files.
Recursion
Guards on function definitions: great for recursion. I like being able to separate out the base/termination case like that.
I think multiple function clauses might be clearer than Enum.reduce for writing reduce algorithms. (Though I do like having the function at the end with Enum.reduce — in JavaScript, it feels like the initial value is often harder to see when it’s at the end after the function body.)
Enumerables and streams
Being able to map/reduce on ranges is nice and is something I wish more languages had. (I’ve had to do this in JavaScript a couple times recently.)
The famed pipe operator at last! Looking forward to using it in practice, since it does seem like it makes chains of function calls easier to understand.
Streams look nice.
Processes
Okay, so these are kind of like lightweight threads, similar to goroutines in Go. That makes more sense (referencing my questions in the last post). I like the send/receive syntax a bit more than Go’s channel syntax, too.
Ooh, the after timeout! I really like that that’s built in.
The docs on linked processes make it sound like you build your own supervisors in Elixir, which sounds amazing. Can’t wait to learn more about that. (I’ve always used external processes like supervisord.)
This bit about sending messages to and from processes being the normal way to maintain application state? That’s really intriguing — something I haven’t really seen before. (At least not from the perspective of being built in to the language.) Looking forward to seeing what this looks like in practice.
IO and the file system
The names of File.cp_r/2 and File.rm_rf/1 make me irrationally happy. Especially given the danger of the latter. Ha.
Oh interesting, files are processes under the hood. Beginning to suspect this may be an everything-is-a-process type language. Which is new to me and very interesting.
Okay, we’ll stop there for now. Halfway through the introduction!
This time the chart doesn’t have a specific year baked in, so it’s reusable. (And there’s a variation for leap years.) It’s freely available as PDFs in both portrait and landscape. Currently just letter size, though maybe someday I’ll start including A4 and other sizes.
Colophon: I made these charts with HTML (it’s just a table), CSS, JavaScript (on page rather than via Node), and Firefox. The font is Avenir Next.
Andy Bell on the extremely loud minority when it comes to building for the web. I believe one of the reasons for WordPress’s dominance is the number of sites that are document-like rather than app-like (where React is maybe a somewhat better fit, though I still prefer more minimal solutions).
Kevin Roose on chatting with Bing’s Sydney chatbot. I read the whole transcript and it’s bonkers. Clearly Sydney is not a person or some other kind of sentient being, but still, that was a crazy read.
Max Matza on foreign accent syndrome. I don’t have this, though my wife and kids might sometimes beg to differ. (The actual thing, though — wow!)
CAD Sketcher is working on adding more CAD functionality to Blender. (Disclaimer: while I’m interested in CAD and occasionally link to it, I’ve never actually done any CAD.)
Eliot Peper interview with Ray Nayler. Relevant quote: “At no point between life’s starting point 3.7 billion years ago and my and your complex awareness right now has that chain of informational exchange and interpretation been interrupted. If it had been, you would not be here to think of that interruption’s consequences.” That blew my mind — that the ancestral chain of my physical body is unbroken all the way back (as evidenced by the fact that I’m here, and that intermediate links had to survive long enough to reproduce).
Henrik Karlsson on the childhoods of exceptional people. Fascinating reading, even if I have no idea how reliable the conclusions are. As for me, I care a lot more about my children growing up to be good people, and don’t particularly care if they grow up to be exceptional, but doing some of the things listed in the post (within reason) seems like it might be interesting.
The Soul of a New Machine, by Tracy Kidder. Really good! I especially enjoyed the technical details about building computers in the early 1980s. I’m grateful that debugging is so much easier now (with the caveat that I’m sure it’s probably harder for the engineers building today’s computers than it is for those of us building higher up the stack). While part of me wishes I could have been there to build a new computer, the overtime culture at Data General seemed unhealthy and management seemed immature, and that’s not worth it regardless of how innovative or interesting the work is.
In Praise of Slowness, by Carl Honoré. I felt like this could probably have been shorter (self-help isn’t really my thing, by the way), but still worth reading. I now drive the speed limit, which I didn’t expect to be an outcome of reading this book. I also find myself consciously acknowledging that things usually don’t need to be rushed, which has been helpful. The bit about playing classical music half as fast was fascinating, too.
Recent fiction reads
The Handmaid’s Tale, by Margaret Atwood. For some reason I thought this was going to be boring and stodgy (I knew basically nothing about it before reading it), but it was well crafted, eminently readable, with good prose. It felt modern, too — almost like it could have been written yesterday. But it was also uncomfortable and heavy and so, so sad. This reminded me once again that as a rule I don’t particularly like dystopian fiction. Also, I learned that mayday is a borrowing from the French m’aidez — “help me.”
Slaughterhouse-Five, by Kurt Vonnegut. I…didn’t really like it. Or get much out of it. (Even though I tried to.) For me it was kind of a rambly mess, and the humor didn’t do anything for me either. But I’m glad other people like the book. I did sort of like Cat’s Cradle, so Vonnegut’s not completely off the table for me, but I’m also in no rush to read the rest of his catalog.