Armand Halbert The official website of Armand Halbert: Software Engineer https://ahalbert.com/ Wed, 22 Apr 2026 00:10:51 -0500 Wed, 22 Apr 2026 00:10:51 -0500 Jekyll v4.4.1 Computing in the Era of Doom: What Were PCs Like in 1993? <p><strong>Game Engine Black Book: Doom</strong>. By Fabien Sanglard. 429 pages.</p> <p>Doom. The game that popularized the term “deathmatch”. The game that made modding accessible to millions of players. The game that killed productivity across thousands of offices around the world. It wasn’t the first first-person shooter (for example, Doom’s developer id Software had released Wolfenstein 3D just a year prior) but it was the game that put the genre on the map. Fabien Sanglard’s <a href="https://fabiensanglard.net/gebbdoom/">excellent book</a> dives completely into the internals of the game, detailing the compromises made to render a 3D world on consumer hardware of the era. The result is not just a technical reference but a memory capsule of what it was like to develop and play games on a PC in 1993, when every byte of memory mattered and every CPU cycle had to be fought for.</p> <p>Playing Doom in 1993 required an expensive machine, even at sub-20 Frames Per Second (FPS). How much would such a machine cost? What was the state of the art in features back then and how did it work?</p> <h2 id="the-cpu">The CPU</h2> <p>The state-of-the-art CPU of that era was the Intel 486 DX2, which was 2.5x as fast as a predecessor 386 running at the same clock speed. How did Intel achieve such a feat? Through improving the instruction pipeline and adding a brand new on-CPU cache.</p> <h3 id="the-pipeline">The Pipeline</h3> <details class="collapsible-box"> <summary>What is pipelining?</summary> Imagine you have multiple roommates sharing a laundry room, all wanting to do one load of laundry at the same time. It would be pretty silly for one roommate to reserve the whole room at the same time. Instead, once one roommate's washing is done and in the dryer, the next roommate can start their washing. <img src="/assets/pipelining_laundry.svg" alt="Pipelining illustrated with a laundry metaphor" /> A similar idea applies to CPUs. Each instruction goes through several phases during its execution. A processor might have the following phases: <ul> <li><strong>Prefetch</strong> - grab the instruction from memory before it is needed</li> <li><strong>Decode</strong> - Figure out what the instruction does</li> <li><strong>Execute</strong> - Actually execute the instruction (Add, subtract, jump)</li> <li><strong>Write-Back</strong> - Write the results of the executed instruction to the registers and/or cache</li> </ul> </details> <p>In the 386, there was a 3-phase pipeline: Prefetch, Decode and Execute. However, decoding took two clock cycles to complete, meaning that an instruction could only be executed every two cycles. The 486 introduced a 5-phase pipeline with two decode steps, allowing an instruction to be executed each cycle. This alone doubled the throughput of the processor.</p> <p><img src="/assets/pipeline_386_vs_486.svg" alt="386 vs 486 pipeline comparison" /></p> <p>However, there was a tradeoff: a deeper pipeline is more likely to starve. If for some reason the pipeline is forced to clear (for example: an if statement jumping to another memory address), it would take five cycles to restart the flow of instructions again rather than the four of the 386. If the 486 pipeline frequently stalled, it would actually be slower than the 386.</p> <p>The core problem was getting instructions and data from RAM to the CPU. While CPUs were getting faster, memory access times were not. Fetching from RAM took at minimum two cycles, usually more. If the CPU was constantly waiting for information from RAM, that was time not spent computing. What Intel needed was a way to bring instructions and data to the CPU before they were needed, ensuring an always full pipeline.</p> <p>What Intel needed was an on-CPU memory cache.</p> <h3 id="the-cache">The Cache</h3> <p>When designing the 386, Intel engineers originally planned to add a cache, but it would not fit in the lithography machine that made the chip, so it was abandoned in favor of an optional off-CPU cache. Over the next four years, semiconductor manufacturing processes improved enough for Intel to add an 8 KiB cache on the 486. It’s a very small cache: for a computer with 4 MiB of RAM, 8 KiB only covers .2% of the available memory space. But it didn’t need to be large – it just needed to hold the right information at the right time.</p> <p>Unlike future processors like the Pentium 4, the cache did not attempt to predict what it would need in advance. When the processor attempted to access memory not in the cache, (known as a <em>cache miss</em>), the processor would instruct the memory controller to get the missing information. But the processor would not just get that byte and cache it, it would pull in the surrounding 15 bytes referred to as a <em>cacheline</em>. This exploited <em>spatial locality</em>: if your code accesses one byte, the surrounding bytes are likely to be needed soon too. Sequential code execution or iterating through an array would naturally fill the cache with useful nearby data. This worked well in practice for the tight inner loops typical of game engines like Doom’s renderer, where the same instructions and data structures were accessed over and over.</p> <p>Sounds great in theory, but there were some problems: Because the 486’s cache was <em>unified</em> (shared between data and instructions), a data-heavy operation could evict instructions from the cache, and vice versa. Imagine Doom’s renderer is running a loop — the instructions for that loop are in the cache, running at 1 cycle per hit. Then the loop reads a texture or a lookup table, and that data load evicts some of the loop’s own instructions. On the next iteration, those instructions have to be fetched from RAM again, stalling the pipeline. The code is fighting with its own data for 8 KiB of space. This phenomenon is known as <em>conflict misses</em> or <em>collision misses</em>.</p> <p>Later processors like the Pentium solved this by splitting the cache into a separate instruction cache and data cache (8 KiB each), so the two could never interfere with each other. For the 486 however, Intel would have to compromise with a unified cache. Engineers instead used a clever trick to avoid conflict misses: set up the cache so that 4 different cachelines can co-exist at the same time. This is known as a <em>4-way set associative</em> cache.</p> <p>To understand what this means, consider the simplest alternative: a <em>direct-mapped</em> cache. In a direct-mapped cache, each memory address maps to exactly one slot (known as a <em>set</em>) in the cache. If two addresses happen to map to the same slot (and in 8 KiB of cache with megabytes of RAM, collisions are frequent), they evict each other every time — even if the rest of the cache is completely empty.</p> <p>In the following image, we have a cache with 4 potential memory slots, A, B, C, and D. A and C map to Set 0 and B and D map to set 1. In a direct-mapped cache, A and B have to be evicted to free up room for C and D even if Sets 2 - 7 are empty. Why can’t those slots be used for A and B? If any slot could be used for any cacheline, there would have to be a database linking each slot to each address. That would take up more space that could be used for the cache, and require a time-consuming lookup through the entire database before finding the cacheline - defeating the purpose of the cache.</p> <p><img src="/assets/cache_direct_vs_4way.svg" alt="Direct-mapped vs 4-way set associative cache" /></p> <p>The 486’s 4-way set associative design instead divided the cache into 128 <em>sets</em> containing 4 <em>ways</em> (slots) rather than 512 sets. A given memory address still maps to a specific set, but within that set it can occupy any of the 4 ways. This means 4 different addresses that would have collided in a direct-mapped cache can now coexist. Only when a 5th competing address arrives does something need to be evicted. Through this design, the 486 managed to hit the cache 92% of the time during normal operation (known as <em>cache hits</em>).</p> <p>The improved throughput of the 486 would allow Doom to run at a decent framerate. But Doom’s designers would have to contend with an even bigger limitation: The dreaded DOS memory limit.</p> <h2 id="ram-and-dos-extenders">RAM and DOS Extenders</h2> <blockquote> <p>640K ought to be enough for anybody</p> </blockquote> <p>While Bill Gates did not actually say the above oft-repeated quote, it was true that DOS had a limitation of 1 MiB of RAM with 384 KiB reserved for system use, leaving only 640 KiB for applications. DOS used some of that 640 KiB, so in practice the amount of memory for an application was less than that.</p> <p>Why did DOS have this limit? The original processor for the IBM PC, the Intel 8088 (an 8086 variant) had a maximum addressable memory of 20-bits (1 MiB). However, the actual processor could only handle 16-bit words (64 KiB). To use 20-bit memory addresses, Intel engineers came up with a bizarre trick called <em>segmented addressing</em> where two 16-bit addresses (a <em>segment</em> and <em>offset</em> address) were combined to form a 20-bit address.</p> <p><img src="/assets/segmented_addressing_8088.svg" alt="8088 segmented addressing" /></p> <p>This design had a lot of problems: memory manipulation was error-prone since different segment/address combinations could point to the same real memory address. The situation only became more complicated with the 24-bit 286 and 32-bit 386. Intel’s solution was to let post-8088 processors run in two modes: <em>Real Mode</em>, where the processor functioned as a very fast 8088, and <em>Protected Mode</em> which allowed you to use the full 32-bits of a 386 or 486.</p> <p>Problem solved! Well, it would be if Microsoft’s MS-DOS supported Protected Mode. Unfortunately, in order to keep applications backward-compatible the OS only allowed real mode, forcing developers into the 640 KiB limit. This created a market for DOS extenders that allowed DOS to use the extra memory.</p> <p>How did they work? An application (DOS could only run one thing at once, after all) would start in protected mode. If it needed to make a system call to DOS, the extender would intercept the call, switch the processor to real mode, make the system call, translate the result from 16-bits to 32-bits and finally switch back to protected mode.</p> <p>They were complicated to set up. You had to locate the DOS extender file, load it and the application, and configure the application to use it. This required 100 lines of C code. Fortunately, enterprising developers from Canada solved the problem by creating a compiler that bundled the extender into your program. Watcom’s C compiler retailed for mere $639 ($1460 today). Hard to believe compared to today, where gcc and clang are free world-class compilers. But for the price, Watcom would free you from the hated 16-bit limitations of MS-DOS.</p> <p>Like many games and applications of the era, Doom did not use the <code class="language-plaintext highlighter-rouge">malloc/free</code> memory allocators provided by libc and instead opted to use its own memory manager. This was to prevent memory fragmentation, where as memory objects are allocated and freed, memory has a lot of small holes in it, making it impossible to allocate a larger object.</p> <p><img src="/assets/memory_fragmentation.svg" alt="Memory fragmentation" /></p> <p>In this example, there is enough room for F to be allocated, but there is not a hole big enough for it to fit in, so F cannot be allocated. While memory could be defragmented, the game has to pause to consolidate memory. This would be unacceptable.</p> <p>To stop memory fragmentation from crashing the game, Doom used a zone-based memory-manager: all assets for a level were grouped into the same zone together, so when you finished the level, the entire zone could be freed in one sweep, leaving a large block for the next level to use.</p> <h2 id="graphics">Graphics</h2> <p>Having a fast CPU and RAM to render Doom’s semi-3D environments was important, but the pixels still had to get to your monitor somehow. Once the CPU rendered a frame of Doom, it had to be sent over the bus to the VGA (Video Graphics Array) controller. VGA and the ISA bus were never designed to play fast action games, but to render graphs, text and spreadsheets. If you ran VGA in 640 × 480 as Windows 3.1 did, you were limited to 16 colors. You try animating demon gore with at most two shades of red! If you wanted more colors, you could use “Mode Y” which supported 256 colors at 300 × 200. Doom’s developers opted to use that mode.</p> <details class="collapsible-box"> <summary>What was the ISA bus and why was it a performance killer?</summary> In addition to the difficulty programming for VGA, actually getting the frame RAM to VRAM was a very slow operation. On PCs of the era, if you wanted to send or receive data from the CPU/RAM to a device like a hard drive, graphics controller or modem the data had to transit over the ISA bus. This feature of the PC had not been updated since 1984, and while its theoretical throughput was 8 MiB/s, in practice it was 1-2 MiB/s and could be as low as 500 KiB/s. <br /><br /> Doom ran in "tics" of 35 tics/s so it could go up to 35 fps. But if you actually wanted to do that, you had to copy 35 frames a second to the VGA controllers RAM, and that required being able to transfer 2.1 MiB/s. That would take more than the available bandwidth of the bus.<br /> <br /> Even simple desktop GUIs like Windows 3.1 had to resort to dragging a window by its outlines in order to get acceptable performance from PCs of the era. If it showed the contents of the window while moving it, the graphics controller would be unable to keep up.<br /> <br /> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/Windows_3.11_workspace.png" alt="Windows 3.1, Source: Wikipedia" /> <figcaption class="figure-caption">Look at me ye mighty PCs and despair!</figcaption> </figure> </center> Hardware manufacturers were fed up with an ISA standard that hadn't been refreshed in almost 10 years. They introduced a new standard called VESA Local Bus (VLB) that would be much faster.<br /> <br /> VLB was about 10x faster than ISA, and was very simple: It adopted the same protocol as the 486 Bus Unit Protocol. The bus is "local" in that it's directly hooked up to the CPU, not requiring a chipset to mediate between the CPU and the hardware. This sped up adoption.<br /> <br /> There were, however, some downsides:<br /> <br /> The bus ran at the same speed as the CPU (since it was synchronous with the CPU) and it had a lot of instability past 40 MHz. The electrical load driven by the CPU was inversely proportional to the clock speed, so the number of slots available decreased if you increased the clock speed. 3 could be provided at 33 MHz, 2 at 40, and just 1 at 50 MHz.<br /> <br /> Hardware manufacturers had to take care their hardware peripherals ran at a variety of speeds, leading to a lot of compatibility problems and frustrations for consumers who wanted a computer that just worked.<br /> <br /> Then in 1993, Intel introduced the Pentium Bus Protocol, which was based on PCI and totally incompatible. VLB quickly faded away, but it was there long enough to make Doom playable.<br /> <br /> </details> <p>VGA was difficult to program for. The CPU did the actual work of rendering, but then the scene it had rendered in RAM had to be copied to the VGA controller’s Video RAM (VRAM). To compensate for having only 64 KiB addresses for 256 KiB of video graphics memory, the VRAM was divided into 4 memory banks:</p> <ul> <li>Bank 0: Pixels 0, 4, 8…</li> <li>Bank 1: Pixels 1, 5, 9…</li> <li>Bank 2: Pixels 2, 6, 10…</li> <li>Bank 3: Pixels 3, 7, 11…</li> </ul> <p>This design also allowed the VGA controller to read from all 4 banks in parallel, making it fast enough to drive a 60 Hz monitor. However, for the programmer it got complicated very quickly: a simple operation like drawing a horizontal line might span all four banks, requiring four separate bank switches and four separate copy operations. Every pixel write required the programmer to calculate which bank it belonged to, switch to that bank if necessary, and compute the correct address within the bank. Forgetting to switch banks or switching to the wrong one produced garbled output with pixels scattered across the screen.</p> <p>An ordinary programmer would despair at such a setup. But programmer John Carmack instead turned VGA’s weaknesses into a strength. Doom cleverly stored three frames in VRAM: one currently drawn to the screen, the next frame to display, and the one currently being copied from RAM to VRAM. This <em>triple-buffering</em> eliminated screen tearing, where the monitor displays a half-drawn frame. The renderer could draw to an off-screen buffer while the monitor displayed a completed one, then swap them during the monitor blank interval when the monitor finished drawing.</p> <h2 id="sound">Sound</h2> <p>Who can forget the iconic soundtrack to E1M1?</p> <div class="text-center"><iframe width="560" height="315" style="max-width: 100%;" src="https://www.youtube.com/embed/BSsfjHCFosw?list=PLD741146AA133C8E3" frameborder="0" allowfullscreen=""></iframe></div> <p>Doom’s iconic sound effects and music didn’t come for free. While the PC came with a very basic speaker, it was mostly used to diagnose system health at startup. The number of beeps (1 = healthy) would give you some diagnostics, but any serious gamer had to invest in a sound card.</p> <p>Here’s a comparison of them over time through another classic PC game, <em>The Secret of Monkey Island</em>:</p> <div class="text-center"><iframe width="560" height="315" style="max-width: 100%;" src="https://www.youtube.com/embed/a324ykKV-7Y?si=wj4WtFDTDtfM9-Vy" frameborder="0" allowfullscreen=""></iframe></div> <p>Let’s take a look at a few of these cards:<br /> <br /></p> <h3 id="soundblaster-16">SoundBlaster 16</h3> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/sound_blaster_16.jpg" alt="A SoundBlaster 16, Source: Wikipedia" /> <figcaption class="figure-caption">The SoundBlaster 16. The standard sound card of the era.</figcaption> </figure> </center> <p>The SoundBlaster line of cards was the standard everyone else had to match. If your card wasn’t SoundBlaster compatible, it might as well not exist. The SoundBlaster consisted of two chips: an FM synthesis chip for music, and a sample playback chip for playing sound effects. To play music, the programmer would describe several sine waves that approximated an instrument. Since the SoundBlaster faked musical instruments with FM synthesis, the result had a buzz to it that defined the audio of games from that era.</p> <p>To play sound effects, the programmer would stream the sound effect to be sampled to the card directly. The challenge was that there was only one channel for sound effects, but Doom needed up to 8 simultaneous sound effects (gunshots, monster growls, doors, footsteps). Doom had to mix all these sound effects before sending the final result to the SoundBlaster.</p> <h3 id="gravis-ultrasound">Gravis UltraSound</h3> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/Gravis_UltraSound.jpg" alt="A Gravis Ultrasound Pro Sound Card. Source: Wikipedia" /> <figcaption class="figure-caption">A Gravis UltraSound Pro. Note the unique red resin used to make the card.</figcaption> </figure> </center> <p>The Gravis UltraSound, affectionately referred to as the GUS, was SoundBlaster compatible, but also featured what they termed “Wavetable Synthesis”: they actually used recorded samples of musical instruments to play back music. A piano sounded like a piano, not a buzzy approximation of one. This required having samples to play back on the hard drive, and Gravis provided a 12 MiB driver to store them. When hard drive space was between 40 MiB and 300 MiB, this was a high cost for quality sound.</p> <p>The GUS had its own onboard RAM for playing sound effects. It shipped with 256 KiB of RAM and was upgradable to 1 MiB. Since Doom could load the sound effects into the GUS’s RAM and tell it to play the relevant effects, this improved the performance of the game, but not by a lot. At the end of the day, you bought an UltraSound for the music, not for a better framerate.</p> <p>However, Creative still dominated the gaming market because the GUS’s SoundBlaster emulation was not reliable and often did not work. Consumers anxious to avoid compatibility problems opted for the cheaper SoundBlaster, and Doom was one of the few games to natively support the card. But it developed a cult following among audio purists and is still loved by retro gamers today.</p> <h3 id="roland-soundcanvas">Roland SoundCanvas</h3> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/Roland_SCC-1.jpg" alt="A Roland SCC-1 sound card. Source: Wikipedia" /> <figcaption class="figure-caption">A Roland SCC-1</figcaption> </figure> </center> <p>Unfortunately for Gravis, there was one card for music that towered above them all: the Roland SCC-1. Roland introduced a standard of 128 instruments called MIDI (Musical Instrument Digital Interface) that anyone could use. Musicians could use a musical keyboard to play any number of instruments, then play them all back in a beautiful symphony.</p> <p>The problem was that Roland cards did not support the format for sound effects (PCM) used by games of the era. If you wanted the best sound, you needed to buy a Roland sound card and a GUS or SoundBlaster for sound effects, then mix the audio streams yourself. Not only was this complicated, but it was also expensive: $499 in 1991 ($1,140 today).</p> <h3 id="why-doesnt-this-ing-thing-work">Why Doesn’t This @#$%ing Thing Work?</h3> <div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//</span> <span class="c1">// Why PC's Suck, Reason #8712</span> <span class="c1">//</span> <span class="kt">void</span> <span class="nf">I_sndArbitrateCards</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> </code></pre></div></div> <p>The above code snippet is real and from the audio device detection function used by Doom. This was the days before standardized sound libraries making playback a breeze: a programmer had to actually write code for each of the sound cards they wanted to support. Id, facing pressure to develop Doom in 13 months opted to use a third-party library called DMX developed by Paul Radek to support sound on DOS. John Carmack would later say using DMX was the biggest mistake in developing Doom, because it meant the DOS version could not be open sourced later. In addition, as Doom’s development neared the end, the relationship between Id and Radek began to sour.</p> <p>For the gamer, it wasn’t a fun experience either: the card didn’t just work when you plugged it in. For each game, you had to run SETUP.EXE and set the sound card’s settings, such as IRQ, DMA channel, and base I/O port. How did you find those numbers? By opening up the computer and looking at little switches on the card or motherboard called jumpers. And if you got them wrong? Well, you opened it up and tried again. But if you got it working? The experience of hearing Doom’s sound at its best was like nothing else offered at the time.</p> <h2 id="networking">Networking</h2> <p>Doom pioneered networked multiplayer gaming. It supported cooperative play through the main campaign but the real innovation was a new mode that id called <em>deathmatch</em>. In this mode players would fight each other, competing to be the one to get the most kills. While the term “deathmatch” had been used even in first-person shooter games before Doom, Doom made it a common household term.</p> <p>Unlike games today, Doom uses a peer based networking model instead of a client-server model. Typical games have a master “server” that stores the game state, keeps track of where everyone is, etc; A player connects to the server, sends their actions to it, and receives updates about other players from the server.</p> <p>Doom instead sent your actions to all the players in the game, eliminating the need for a server. The game ran on 35 <em>tics</em> a second, and when networked, the game waited for each player to send their action for the tic to you before proceeding to the next one. This worked well because Doom didn’t run over the internet, but instead over a LAN or if you really wanted to get crazy, a modem directly calling a friend. But it also meant you ran your deathmatch at the speed of the slowest player. If one connection hiccuped, every other player froze waiting for their inputs. And if any machine ever did drift out of sync the simulations diverged permanently and the game became unplayable. You could not join a game already in place, since you would not have the history of actions required to have the same game state as everyone else. And if your connection died, your avatar would be stuck there for the rest of the game.</p> <p>Doom was before the days of ubiquitous internet and instead used more primitive methods of communication. Let’s look at what it supported.</p> <h3 id="serial-cable-null-modem">Serial cable (null-modem)</h3> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/null_modem.png" alt="A null-modem cable. Source: Google" /> </figure> </center> <p>The cheapest option. A null-modem cable was a special serial cable called a that you plugged into the COM port. About $5 at any computer shop. Strictly two players, and you needed to be sitting in the same room — the cable stopped working after a few feet. For two friends with a couple of PCs, it was the easiest way in.</p> <h3 id="modem">Modem</h3> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/us_robotics_modem.png" alt="A US Robotics modem. Source: Google" /> </figure> </center> <p>For two players in different houses, Doom could play over a <em>modem</em>. One player’s PC would dial the other’s phone number, and the two modems would negotiate a connection — the iconic screech you may have heard from dial-up internet. Speeds ranged from 2,400 to 14,400 bits per second in 1993, with latency in the 200-500 ms range. This was slow and expensive (long-distance phone calls were billed by the minute), and limited to two players, but it meant you could deathmatch a friend across the country if you were both willing to pay for it.</p> <p>Not only did you have to pay for the phone call, modems themselves were expensive: A top modem capable of 14.4 kb/s (kilo bits per second) would run you $150 - $300. It would take you 25 minutes to download the shareware version of Doom (2.7 MiB) on such a modem, and the game had so much anticipation that the person at University of Wisconsin assigned to upload it couldn’t get through to upload it!</p> <h3 id="ipx-over-lan">IPX over LAN</h3> <p>While two player co-op or deathmatch was mindblowing at the time, the premier multiplayer experience was 4 players on a local network. Doom used IPX (Internetwork Packet Exchange), a protocol from Novell’s NetWare that was the de facto standard for office and college campus LANs in 1993. If your institution ran NetWare – and most did – every PC on the network already had IPX drivers loaded. All you needed was a network card and the right cable.</p> <p>What sort of cable was used for IPX networks? The standard of the time was called 10Base2, often referred to as “Thinnet”. You networked all of the computers together with a single cable, rather than each computer getting its own cable and connecting to the router. This configuration is referred to as a “Daisy Chain”, and required a cap at each end of the cable to prevent the network from reflecting back on itself and bringing the network down. Unlike modern networks, if any part of the daisy chain was broken, it would break the entire network.</p> <p><img src="/assets/network_daisy_vs_star.svg" alt="10BASE2 daisy chain vs modern star topology" /></p> <details class="collapsible-box"> <summary>John Carmack Breaks the Pre-Internet</summary> <blockquote> Doom used IPX broadcast packets to communicate between the players. This seemed like a good efficiency to me a four player game just involved four broadcast packets each frame. My knowledge of networking was limited to the couple of books I had read, and my naive understanding was that big networks were broken up into little segments connected by routers, and broadcast packets were contained to the little segments. I figured I would eventually extend things to allow playing across routers, but I could ignore the issue for the time being.<br /> <br /> What I didn’t realize was that there were some entire campuses that were built up out of bridged IPX networks, and a broadcast packet could be forwarded across many bridges until it had been seen by every single computer on the campus. At those sites, every person playing LAN Doom had an impact on every computer on the network, as each broadcast packet had to be examined to see if the local computer wanted it. A few dozen Doom players could cripple a network with a few thousand endpoints. <br /> <br /> The day after release, I was awoken by a phone call. I blearily answered it and got chewed out by a network administrator who had found my phone number just to yell at me for my game breaking his entire network. I quickly changed the network protocol to only use broadcast packets for game discovery, and send all-to-all directed packets for gameplay (resulting in 3x the total number of packets for a four player game), but a lot of admins still had to add Doom-specific rules to their bridges (as well as stern warnings that nobody should play the game) to deal with the problems of the original release. <br /> <br /> </blockquote> -- John Carmack </details> <h2 id="the-whole-package">The Whole Package</h2> <p>If you wanted to play Doom at anything approaching 30 FPS, you needed the following:</p> <ul> <li>486 DX2 ($550)</li> <li>Diamond Stealth Pro Graphics Card ($350-$500)</li> <li>SoundBlaster 16 ($179)</li> </ul> <p>Adding in a motherboard, hard drive, power supply etc would run you another $1000, bringing the cost to around $2179 - close to $5000 in today’s dollars. For comparison, the median household earned $31,240 in 1993. Such a computer would represent 7% of the median family’s yearly income. And if you wanted the best sound, you needed two sound cards, not just a SoundBlaster. Nor would such a computer come with a network card or modem to play multiplayer.</p> <p>According to Sanglard, a machine with those specs could play Doom at 24 FPS. Now we complain if a game is one frame below 60 fps.</p> <p>Sometimes I like to appreciate just how far we’ve come in computing in the past 33 years. I was too young to experience the glory days of Doom firsthand — by the time I was old enough to play games, I never had to think about DMA channels or IRQ jumpers. The abstractions that hide all of this from modern developers are, for the most part, a gift: I can write a game in Unity without knowing what a cacheline is, much less having to hand-tune a renderer to fit inside 8 KiB of it.</p> <p>But there’s a craft in the constraints of 1993 that modern development rarely demands. Every system in Doom — the zone memory manager, the column renderer, the lockstep network model, the software sound mixer — exists because the hardware forced it into existence. With 4 MiB of RAM and a 66 MHz CPU, you don’t write a generic engine. You write the specific engine that fits the shape of the specific problem on the specific hardware you have. The result is a piece of software so tightly coupled to its era that reading about it today feels like reading about a ship in a bottle. Nothing was left to the runtime or the framework because there was no runtime or framework.</p> <p>That’s what makes Sanglard’s book worth reading even if you never plan to write your own game engine. It’s a snapshot of a moment when every programmer was also a hardware engineer by necessity, when shipping a game meant understanding the silicon it would run on from the ground up. We gained a lot by abstracting away from that world. But it’s worth remembering, now and then, what the view looked like from down there.</p> <h2 id="works-cited">Works Cited</h2> <p>Crawford, John H. Calif.. “The i486 CPU: executing instructions in one clock cycle.” IEEE Micro 10 (1990): 27-36.</p> <p>Crawford et al., Intel 386 Oral History Panel. https://archive.computerhistory.org/resources/text/Oral_History/Intel_386_Design_and_Dev/102702019.05.01.acc.pdf</p> <p>Shirriff, Ken. “Examining the silicon dies of the Intel 386 processor”. https://www.righto.com/2023/10/intel-386-die-versions.html</p> <p>Sanglard, Fabien. <em>Game Engine Black Book: Doom</em>.</p> <p>Totilo, Stephen. “Memories of Doom”. <em>Kotaku</em>. https://kotaku.com/memories-of-doom-by-john-romero-john-carmack-1480437464</p> Mon, 20 Apr 2026 00:00:00 -0500 https://ahalbert.com/reviews/technology/2026/04/20/black-book-doom.html https://ahalbert.com/reviews/technology/2026/04/20/black-book-doom.html Reviews Technology Vim + Markdown = Writer's Heaven <p>I use Jekyll, Markdown and Vim to write content for my blog. Rather than wrestling with a full-fledged CMS or writing raw HTML, I can use a human readable markup language to write my posts. Vim is my editor of choice, and while I like the friendliness of GUI markdown tools, I miss my shortcuts, autocomplete and plugins in vim. Having a minimalistic text editor gives me an environment that is distraction free, version controlled and easy to publish. This article will go into how to set up vim to effectively edit Markdown with these features:</p> <ul> <li>Spelling</li> <li>English Auto-Completion</li> <li>Auto-Formatting</li> <li>Grammar Checking</li> </ul> <p>Some notes before we begin:</p> <ul> <li>I use <a href="https://github.com/junegunn/vim-plug">vim-plug</a> to manage my plugins, and this guide assumes you do too.</li> <li>There are two .vimrc files used here: <code class="language-plaintext highlighter-rouge">~/.vimrc</code> and <code class="language-plaintext highlighter-rouge">~/.vim/after/ftplugin/markdown.vim</code>, which is a file that runs only after <code class="language-plaintext highlighter-rouge">~/.vimrc</code> is loaded and a markdown file is detected.</li> </ul> <h2 id="the-basics">The Basics</h2> <p>Vanilla vim itself comes with a lot of markdown support, such as frontmatter highlighting and spelling.</p> <p><code class="language-plaintext highlighter-rouge">~/.vim/after/ftplugin/markdown.vim</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">" Disable line numbers</span> <span class="k">setlocal</span> <span class="nb">nonumber</span> </code></pre></div></div> <p>I never found much value in line numbers when writing, so I turned them off specifically for Markdown.</p> <h3 id="spelling">Spelling</h3> <p><code class="language-plaintext highlighter-rouge">~/.vim/after/ftplugin/markdown.vim</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">" Turn spellcheck on</span> <span class="k">setlocal</span> <span class="nb">spell</span> nnoremap zs <span class="m">1</span>z<span class="p">=</span> <span class="c">" Disable check for sentence capitalization</span> <span class="k">setlocal</span> <span class="nb">spellcapcheck</span><span class="p">=</span> </code></pre></div></div> <p>Vim has a very effective spellchecking system that you can enable with <code class="language-plaintext highlighter-rouge">set spell</code>, and a few keystrokes that make correcting your spelling easy. <code class="language-plaintext highlighter-rouge">z=</code> brings up a list of possible corrections, while <code class="language-plaintext highlighter-rouge">1z=</code> picks the most likely one. I remapped it to <code class="language-plaintext highlighter-rouge">zs</code> to make it easy to correct spelling. If it’s a word vim doesn’t recognize, you can use <code class="language-plaintext highlighter-rouge">zg</code> to add it to the dictionary.</p> <p><code class="language-plaintext highlighter-rouge">spellcapcheck</code> is a feature that detects if you forgot to capitalize the beginning of a sentence. Unfortunately, it is just a regular expression, so if you write something like “vs.” it will decide that you forgot to capitalize the next word and highlight it. You can disable it by emptying the regex, as I did with <code class="language-plaintext highlighter-rouge">setlocal spellcapcheck=</code> .</p> <h2 id="vim-markdown">vim-markdown</h2> <p>Vim-markdown, <a href="https://github.com/preservim/vim-markdown"><code class="language-plaintext highlighter-rouge">preservim/vim-markdown</code></a> is a plugin that provides several nice features, such as:</p> <ul> <li>Folding</li> <li>Highlighting of fenced code blocks</li> <li>Highlighting of front matter</li> </ul> <p>and some useful commands like:</p> <ul> <li><code class="language-plaintext highlighter-rouge">:Toc</code> — Create a table of contents in the quickfix list</li> <li><code class="language-plaintext highlighter-rouge">:InsertToc</code> — insert a table of contents into the buffer</li> <li><code class="language-plaintext highlighter-rouge">:SetexToAtx</code>, <code class="language-plaintext highlighter-rouge">:HeaderDecrease</code>, <code class="language-plaintext highlighter-rouge">:HeaderIncrease</code></li> </ul> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Plug <span class="s1">'preservim/vim-markdown'</span> <span class="c">" Enable folding.</span> <span class="k">let</span> <span class="nv">g:vim_markdown_folding_disabled</span> <span class="p">=</span> <span class="m">0</span> <span class="c">" Fold heading in with the contents.</span> <span class="k">let</span> <span class="nv">g:vim_markdown_folding_style_pythonic</span> <span class="p">=</span> <span class="m">1</span> <span class="c">" Don't use the shipped key bindings.</span> <span class="k">let</span> <span class="nv">g:vim_markdown_no_default_key_mappings</span> <span class="p">=</span> <span class="m">1</span> <span class="c">" Filetype names and aliases for fenced code blocks.</span> <span class="k">let</span> <span class="nv">g:vim_markdown_fenced_languages</span> <span class="p">=</span> <span class="p">[</span><span class="s1">'php'</span><span class="p">,</span> <span class="s1">'py=python'</span><span class="p">,</span> <span class="s1">'js=javascript'</span><span class="p">,</span> <span class="s1">'bash=sh'</span><span class="p">,</span> <span class="s1">'viml=vim'</span><span class="p">]</span> <span class="c">" Highlight front matter (useful for Jekyll/Hugo posts).</span> <span class="k">let</span> <span class="nv">g:vim_markdown_toml_frontmatter</span> <span class="p">=</span> <span class="m">1</span> <span class="k">let</span> <span class="nv">g:vim_markdown_frontmatter</span> <span class="p">=</span> <span class="m">1</span> <span class="k">let</span> <span class="nv">g:vim_markdown_json_frontmatter</span> <span class="p">=</span> <span class="m">1</span> </code></pre></div></div> <p>An explanation of the settings:</p> <ul> <li><code class="language-plaintext highlighter-rouge">vim_markdown_folding_disabled</code> is set to <code class="language-plaintext highlighter-rouge">0</code> to enable folding, which lets you collapse sections of your document under their headings. To understand folding behavior, see <code class="language-plaintext highlighter-rouge">:help folding</code>.</li> <li><code class="language-plaintext highlighter-rouge">vim_markdown_folding_style_pythonic</code> changes the fold behavior so that the heading line itself stays visible when folded, rather than being hidden with the rest of the section.</li> <li><code class="language-plaintext highlighter-rouge">vim_markdown_no_default_key_mappings</code> disables the plugin’s built-in key mappings, letting you define your own without conflicts.</li> <li><code class="language-plaintext highlighter-rouge">vim_markdown_fenced_languages</code> defines a list of language names and aliases for syntax highlighting inside fenced code blocks, so that e.g. a block tagged <code class="language-plaintext highlighter-rouge">bash</code> gets highlighted as <code class="language-plaintext highlighter-rouge">sh</code>.</li> <li><code class="language-plaintext highlighter-rouge">vim_markdown_frontmatter</code>, <code class="language-plaintext highlighter-rouge">vim_markdown_toml_frontmatter</code>, and <code class="language-plaintext highlighter-rouge">vim_markdown_json_frontmatter</code> enable syntax highlighting for YAML, TOML, and JSON front matter respectively, which is useful if you write Jekyll or Hugo posts.</li> </ul> <h2 id="completion">Completion</h2> <p>Why type each word by hand when you can tab-complete it? I use the plugin <a href="https://github.com/girishji/vimcomplete"><code class="language-plaintext highlighter-rouge">girishji/vimcomplete</code></a> and its companion, <a href="https://github.com/girishji/ngram-complete.vim"><code class="language-plaintext highlighter-rouge">girishji/ngram-complete.vim</code></a> to provide auto-completion for English.</p> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Plug <span class="s1">'girishji/vimcomplete'</span> <span class="k">let</span> <span class="nv">g:vimcomplete_tab_enable</span> <span class="p">=</span> <span class="m">1</span> Plug <span class="s1">'girishji/ngram-complete.vim'</span> <span class="k">let</span> vimcompleteoptions <span class="p">=</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'buffer'</span><span class="p">:</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'enable'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se"> \</span> <span class="s1">'priority'</span><span class="p">:</span> <span class="m">2</span> <span class="se"> \</span> <span class="p">},</span> <span class="se"> \</span> <span class="s1">'ngram'</span><span class="p">:</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'enable'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se"> \</span> <span class="s1">'priority'</span><span class="p">:</span> <span class="m">1</span><span class="p">,</span> <span class="se"> \</span> <span class="s1">'filetypes'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'markdown'</span><span class="p">],</span> <span class="se"> \</span> <span class="s1">'bigram'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se"> \</span> <span class="p">},</span> <span class="se"> \</span><span class="p">}</span> autocmd <span class="nb">VimEnter</span> * <span class="k">call</span> <span class="nv">g:VimCompleteOptionsSet</span><span class="p">(</span>vimcompleteoptions<span class="p">)</span> </code></pre></div></div> <p><code class="language-plaintext highlighter-rouge">priority</code> determines which completions show up first in the completion menu, with larger numbers == higher priority.</p> <p><code class="language-plaintext highlighter-rouge">ngram-complete.vim</code> allows for completion based on the frequency of words, making it much more useful than standard dictionary completion, which picks words in alphabetical order. The <code class="language-plaintext highlighter-rouge">bigram</code> option allows completion based on frequency of words given the previous word rather than just the frequency of the current word you are completing.</p> <h2 id="auto-formatting">Auto-formatting</h2> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Plug <span class="s1">'dense-analysis/ale'</span> <span class="k">let</span> <span class="nv">g:ale_fixers</span> <span class="p">=</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'markdown'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'prettier'</span><span class="p">]</span> <span class="se"> \</span><span class="p">}</span> </code></pre></div></div> <p>The <a href="https://github.com/dense-analysis/ale"><code class="language-plaintext highlighter-rouge">ale</code></a> plugin (Asynchronous Lint Engine) allows auto-formatting and linting in vim, running external tools asynchronously so they don’t block your editing. With the configuration above, you can run <code class="language-plaintext highlighter-rouge">:ALEFix</code> to format the current file, or add the following to have it format on save:</p> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">g:ale_fix_on_save</span> <span class="p">=</span> <span class="m">1</span> </code></pre></div></div> <h3 id="prettier">Prettier</h3> <p>I use <a href="https://prettier.io/docs/install"><code class="language-plaintext highlighter-rouge">prettier</code></a> to auto-format my markdown files so that they are easy to read.</p> <p><code class="language-plaintext highlighter-rouge">~/.prettierrc.yaml</code></p> <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">overrides</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">files</span><span class="pi">:</span> <span class="pi">-</span> <span class="s2">"</span><span class="s">*.md"</span> <span class="pi">-</span> <span class="s2">"</span><span class="s">*.markdown"</span> <span class="na">options</span><span class="pi">:</span> <span class="na">proseWrap</span><span class="pi">:</span> <span class="s2">"</span><span class="s">always"</span> </code></pre></div></div> <p><code class="language-plaintext highlighter-rouge">proseWrap</code> automatically wraps lines into 80 character columns. Be careful when enabling it if you haven’t started your post with it, as it can create large diffs.</p> <h2 id="linting">Linting</h2> <p>The ale plugin enables automatic linting of your posts on save. While I don’t use the lint features personally, I will guide you on how to set them up in case you find them useful.</p> <h3 id="markdown-lint">Markdown-lint</h3> <p>Markdown-lint highlights common issues with Markdown files. You can install it with</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm install -g markdownlint-cli </code></pre></div></div> <p>Set it up with a <code class="language-plaintext highlighter-rouge">.markdownlint.yaml</code> file.</p> <p><code class="language-plaintext highlighter-rouge">.markdownlint.yaml</code></p> <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Enable all rules by default</span> <span class="c1"># https://github.com/markdownlint/markdownlint/blob/main/docs/RULES.md</span> <span class="na">default</span><span class="pi">:</span> <span class="kc">true</span> <span class="c1"># Allow inline HTML which is useful in Github-flavour markdown for:</span> <span class="c1"># - crafting headings with friendly hash fragments.</span> <span class="c1"># - adding collapsible sections with &lt;details&gt; and &lt;summary&gt;.</span> <span class="na">MD033</span><span class="pi">:</span> <span class="kc">false</span> <span class="c1"># Ignore line length rules (as Prettier handles this).</span> <span class="na">MD013</span><span class="pi">:</span> <span class="kc">false</span> </code></pre></div></div> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">g:ale_linters</span> <span class="p">=</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'markdown'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'markdownlint'</span><span class="p">]</span> <span class="se"> \</span><span class="p">}</span> </code></pre></div></div> <h3 id="vale">Vale</h3> <p>Vale is a command-line tool that brings code-like linting to prose. It is not a grammar checker. You can find it <a href="https://vale.sh/">here</a>.</p> <p>I did find it took a bit of effort to install and get working. Here’s a guide for what I did:</p> <ol> <li>Install Vale. You can find instructions <a href="https://vale.sh/docs/install">here</a></li> <li>Create a <code class="language-plaintext highlighter-rouge">~/.vale.ini</code> file</li> </ol> <div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Where the styles are kept. </span><span class="py">StylesPath</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">.vale</span> <span class="py">Packages</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">write-good, proselint</span> <span class="w"> </span><span class="py">MinAlertLevel</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">suggestion</span> <span class="w"> </span><span class="c"># Where to look for local vocabulary files. </span><span class="py">Vocab</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">Local</span> <span class="w"> </span><span class="c"># Define which styles to use for Markdown. </span><span class="nn">[*.{md,markdown,txt}]</span><span class="w"> </span><span class="py">BasedOnStyles</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">Vale, write-good, proselint</span> <span class="w"> </span><span class="nn">[*]</span><span class="w"> </span><span class="py">BasedOnStyles</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">Vale</span> <span class="w"> </span><span class="c"># Disable any rules that are more annoying than useful </span><span class="py">write-good.E-Prime</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">NO</span> </code></pre></div></div> <ol> <li> <p>Create the folder <code class="language-plaintext highlighter-rouge">~/.vale</code></p> </li> <li> <p>Run <code class="language-plaintext highlighter-rouge">vale sync</code></p> </li> <li> <p>Create the folder <code class="language-plaintext highlighter-rouge">~/.vale/config</code> and <code class="language-plaintext highlighter-rouge">~/.vale/config/vocabularies/Local</code></p> </li> <li> <p>Create the files <code class="language-plaintext highlighter-rouge">~/.vale/config/vocabularies/Local/accept.txt</code> and <code class="language-plaintext highlighter-rouge">~/.vale/config/vocabularies/Local/reject.txt</code></p> </li> </ol> <p>Once you’ve completed these instructions, you can change your <code class="language-plaintext highlighter-rouge">~/.vimrc</code> as follows:</p> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">g:ale_linters</span> <span class="p">=</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'markdown'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'vale'</span><span class="p">,</span> <span class="s1">'markdownlint'</span><span class="p">]</span> <span class="se"> \</span><span class="p">}</span> </code></pre></div></div> <h3 id="harper">Harper</h3> <p>However, I found the above linters didn’t highlight anything useful, and were more an annoyance than anything else. I next turned to <a href="https://github.com/Automattic/harper"><code class="language-plaintext highlighter-rouge">harper</code></a>, which is not supported by ALE, so I had to build in support for it.</p> <p>You can find instructions on how to install Harper <a href="https://writewithharper.com/docs/integrations/language-server">here</a></p> <p><code class="language-plaintext highlighter-rouge">~/.vimrc</code></p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Plug <span class="s1">'dense-analysis/ale'</span> <span class="k">let</span> <span class="nv">g:ale_linters</span> <span class="p">=</span> <span class="p">{</span> <span class="se"> \</span> <span class="s1">'markdown'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'harper'</span><span class="p">]</span> <span class="se"> \</span><span class="p">}</span> <span class="k">let</span> <span class="nv">g:ale_markdown_harper_config</span> <span class="p">=</span> <span class="p">{</span> <span class="se">\</span> <span class="s1">'harper-ls'</span><span class="p">:</span> <span class="p">{</span> <span class="se">\</span> <span class="s1">'diagnosticSeverity'</span><span class="p">:</span> <span class="s1">'warning'</span><span class="p">,</span> <span class="se">\</span> <span class="s1">'dialect'</span><span class="p">:</span> <span class="s1">'American'</span><span class="p">,</span> <span class="se">\</span> <span class="s1">'linters'</span><span class="p">:</span> <span class="p">{</span> <span class="se">\</span> <span class="s1">'SpellCheck'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>false<span class="p">,</span> <span class="se">\</span> <span class="s1">'SentenceCapitalization'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se">\</span> <span class="s1">'RepeatedWords'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se">\</span> <span class="s1">'LongSentences'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se">\</span> <span class="s1">'AnA'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se">\</span> <span class="s1">'Spaces'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>true<span class="p">,</span> <span class="se">\</span> <span class="s1">'SpelledNumbers'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>false<span class="p">,</span> <span class="se">\</span> <span class="s1">'WrongQuotes'</span><span class="p">:</span> <span class="k">v</span><span class="p">:</span>false<span class="p">,</span> <span class="se">\</span> <span class="p">},</span> <span class="se">\</span> <span class="p">},</span> <span class="se">\</span><span class="p">}</span> </code></pre></div></div> <h2 id="grammar-checking">Grammar Checking</h2> <p>While Harper was more sophisticated than the linters above, none of the above tools really worked for me. I wanted a more sophisticated grammar checker for my writing. I thought an LLM was ideally suited to this task, so I built my own plugin <a href="https://github.com/ahalbert/vim-gramaculate"><code class="language-plaintext highlighter-rouge">ahalbert/vim-gramaculate</code></a> to check my grammar.</p> <div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Plug <span class="s1">'ahalbert/vim-gramaculate'</span> </code></pre></div></div> <p><img src="/assets/gramaculate.gif" alt="Gramaculate in action" class="img-fluid" /></p> <p>You can then use <code class="language-plaintext highlighter-rouge">:Gramaculate</code> to check your grammar. By default, this uses a local model with Ollama, but you can <a href="https://github.com/ahalbert/vim-gramaculate/blob/main/doc/gramaculate.txt">read the docs</a> to configure it with any model you want, local or remote.</p> <h2 id="writers-heaven">Writer’s Heaven</h2> <p>I find writing with vim a breeze once I got this all set up, and I hope this guide helps you do the same. Between spellcheck, auto-completion, formatting and grammar checking, vim becomes a surprisingly capable writing environment that stays out of your way and lets you focus on the words. If you have any suggestions for other plugins or workflows, feel free to reach out.</p> Tue, 24 Mar 2026 00:00:00 -0500 https://ahalbert.com/technology/2026/03/24/vim-markdown.html https://ahalbert.com/technology/2026/03/24/vim-markdown.html Technology If You Write a Series of Blog Posts, Please Link Them at the Beginning <p>I love reading blog posts that go into a subject in depth. So nothing disappoints me more to find a part 3 of a blog post and not know where to find part 1 and 2. I can look at the blog archive, but if it’s mixed in with other posts, I may not be able to find it. The author sometimes links to the previous post at the beginning of each one, which is better, but then I don’t know if there’s a fourth part.</p> <p>I want to read your blog series, but I can’t read blog posts I can’t find. Not linking the posts in a series frustrates your readers, suppresses engagement, and means fewer people actually read the whole thing. And if readers do read a single part of your post series, they lose the context of the whole series. You worked really hard on your post series! You deserve to have it be the best series it can be, and your readers deserve a great experience.</p> <p>So, if you write a series of blog posts, please make it easy for your readers: link each part at the top. And if you develop a blogging platform or static site generator, I have a request: make it easy for writers on your platform to automatically generate a table of contents for a series of blog posts.</p> <h2 id="if-you-use-jekyll-i-made-it-easy">If You Use Jekyll, I Made It Easy</h2> <p>For my own website, I developed a <a href="https://github.com/ahalbert/jekyll-series-links">jekyll plugin</a> to link related posts together at the top of each article. It’s not the only tool either, <a href="https://github.com/alexbevi/jekyll-series-navigation">jekyll-series-navigation</a> and <a href="https://github.com/tbjers/jekyll-series">jekyll-series</a>. I really should have investigated if a plugin already existed before I wrote my own.</p> <h2 id="what-about-other-platforms">What About Other Platforms?</h2> <p>Jekyll isn’t the only static site generator out there, and this problem isn’t unique to it. Hugo has built-in <a href="https://gohugo.io/content-management/taxonomies/">series support through taxonomies</a>, which lets you group posts together and generate navigation automatically. Astro doesn’t have a built-in series concept, but its content collections make it straightforward to query and link related posts. WordPress users have plugins like <a href="https://wordpress.org/plugins/jeangenerator-series/">Jeangenerator Series</a> or can use categories and custom fields to stitch posts together. Ghost and Substack, unfortunately, don’t offer much here – you’re stuck manually linking posts, which means the problem I described above is alive and well on those platforms.</p> <p>If you’re building or choosing a blogging platform, series support should be on your checklist. It’s a small feature, but it makes a real difference for readers trying to follow along.</p> <h2 id="make-it-easy-to-follow-along">Make It Easy to Follow Along</h2> <p>A blog series is a commitment. The writer puts in the work to break a complex topic into digestible parts, and hopefully the reader comes back for each one. The least we can do as writers and platform developers is make sure the reader can actually find the next part. Link your series. Build tools that link series automatically. Your readers will thank you.</p> Thu, 19 Mar 2026 00:00:00 -0500 https://ahalbert.com/blog/2026/03/19/series.html https://ahalbert.com/blog/2026/03/19/series.html Blog Invasion of the Body Snatchers <p><strong>Invasion of the Body Snatchers</strong>. By Jack Finney. 228 pages.</p> <p>Jack Finney’s 1955 novel is one of those works that has seeped into popular consciousness without many people watching or reading the source material. The plot is a familiar one: aliens invade earth not with a loud show of technological terror, but quietly and slowly, replacing people one at a time. Author Jack Finney denied writing anything other than a science-fiction thriller, but it’s really a nightmare about 1950s America itself. After reading, the writing may not make an impression, but what lingers is the creeping sense that America was already doing to its citizens what the pod people do more efficiently.</p> <p>The plot is simple. Dr. Miles Bennell has a small medical practice in Mill Valley, California. Local patients come to him, convinced that their loved ones are no longer their loved ones. They are imposters, identical in every detail, but <em>wrong</em> somehow. After investigating, Miles and a group of Mill Valley residents find that aliens, known as “pod people” have invaded the town and replace existing townspeople with near-perfect duplicates. The only thing missing is what makes them human - emotion, ambition, desire, love. They are people with the people removed.</p> <p>The pod people live only a few years, consuming all of the life on a planet before launching themselves into space to consume another. Upon discovering the conspiracy, Miles and his friends attempt to sound the alarm, only to find the authorities either don’t believe them or have already been converted. Taking matters into their own hands, they attempt to destroy the farm producing the pods, but fail. Fortunately, the pods decide Earth’s resistance is not worth it and launch themselves into space, looking for an easier planet to consume.</p> <h2 id="nobody-believes-you">Nobody Believes You</h2> <blockquote> <p>We hate facing new facts or evidence, because we might have to revise our conceptions of what’s possible, and that’s always uncomfortable.</p> </blockquote> <p>The novel’s central horror is not the pod people themselves but the experience of knowing something is wrong and being unable to convince anyone. The psychiatrist Dr. Kaufman diagnoses the early reports of impostors as “epidemic hysteria”, a mass delusion spreading through a community. He cites a real case of mass hysteria, the <a href="https://en.wikipedia.org/wiki/Mad_Gasser_of_Mattoon">Matoon Maniac</a>, when residents of Matoon, IL became convinced someone was gassing sleeping women with a paralytic agent. The truth was there was never a gasser to begin with, instead a mass delusion had taken over the town. Dr. Kaufman is applying a framework of reason to an unreasonable situation. By the time Miles determines that Kaufman is wrong, Kaufman himself has been replaced. The person insisting there is no conspiracy is now part of it.</p> <p>This is the nightmare within the nightmare. The institutions we trust to distinguish the real from the imagined are themselves vulnerable to replacement, and once they go, our epistemological ground collapses entirely. Who validates the validator? Miles cannot prove the pod people exist to someone who is not one because the evidence is the behavior of people who look and sound completely normal.</p> <p>Finney wrote at the height of McCarthyism, and the resonance is hard to miss. The novel has been read as an anti-communist allegory, where the pod people are Soviet conformists, the heroes as American individualism under siege. It has also been interpreted as a critique of McCarthyism itself, in which anyone could be accused of being something they were not, and denials were taken as further evidence of guilt. I find the latter interpretation a stretch, because the invasion is real rather than imagined: it’s not paranoia if the conspiracy is real. The anti-communist reading holds up better: the pod people offer exactly what the Soviet project promised: security, equality, freedom from want, an end to competition and conflict, while delivering a nightmarish collective with no room for the individual self.</p> <h2 id="technology-and-dehumanization">Technology and Dehumanization</h2> <blockquote> <p>But now we have dial phones, marvelously efficient, saving you a full second or more every time you call, inhumanly perfect, and utterly brainless; and none of them will ever remember where the doctor is at night, when a child is sick and needs him. Sometimes I think we’re refining all humanity out of our lives.</p> </blockquote> <p>A side theme of the novel is Miles’s discomfort with the modern world. The novel is set in 1976 (though I suspect my edition was edited to fit the 1978 film), a world where the telephone operator has been phased out in favor of automatic telephone switching machines. Dr. Miles Bennell states that he still makes house calls, something that is out of place in modern medicine.</p> <p>During the 1950s, the cost of labor skyrocketed, and companies increasingly searched for automated solutions to common business tasks. The telephone operator – who knew the doctor’s night schedule and could route an emergency call accordingly – was replaced by the dial phone, which could not. The savings were real; what was lost was harder to quantify.</p> <p>This is Finney’s deeper argument, more subtle than the pod allegory. Automation does not merely replace labor: it replaces the relationships that we build when we work together. What remains is more efficient but less alive. The pod people are this process taken to its endpoint: perfectly functional humans with the human part automated away. The dial phone is not worse at connecting calls: it is better. The loss is something that we don’t even notice until it’s too late. Finney suggests that this is the real danger: refinement happening without anyone deciding it should, through a thousand small improvements that are individually defensible but collectively devastating.</p> <p>By the pod people’s logic, they are not replacing humans, but <em>improving</em> them. They eliminate everything inefficient: desire, fear, ambition. A pod person does not suffer. They do not lie awake at night. They have no particular wants that could be disappointed. They are, in a narrow technical sense, optimized.</p> <p>Finney gives the pod people a chance to make the argument sincerely. When Miles confronts Dr. Kaufman as a pod person, he is genuinely puzzled by Miles’s resistance. What exactly is Miles fighting to preserve? The anxiety? The loneliness? The pods offer a kind of peace, and to them, it is irrational to fight for the right to suffer.</p> <p>The novel’s answer is that subtracting emotion is precisely the problem. When you subtract emotion, you are not just subtracting suffering, you are subtracting life itself. Miles and Becky fight back against the pod people because of love for each other, something that makes them do irrational things to protect each other. The pods cannot replicate this because they have no use for it, and find it so intolerable that they leave Earth to find easier places to conquer. Finney is not exactly criticizing technology, but rather a vision of technology that delivers comfort by amputating the parts of life that make comfort meaningful.</p> <p>This attitude spoke to a particular anxiety of postwar America: the fear that prosperity and ease were not the end of the story but a new kind of danger. William H. Whyte published <em>The Organization Man</em> the same year Finney’s novel appeared in print, worrying that corporate life was producing people who had traded individual identity for institutional belonging. The pod people are Whyte’s thesis taken to its conclusion. The 1950s gave Americans television, suburbs, appliances, but mass production also led to conformity and dehumanization: the same model of house on every street, the same product on every shelf. Abundance and sameness arrived together, and Finney was not the only one wondering whether the former was the price of the latter.</p> <p>The pod people are not malicious. This is what makes them so unsettling. They do not scheme or hate or compete. They simply are, identically, together. No one pod person is different from any other in any way that matters. They share resources, make no demands on each other, and pursue no individual ends. They are the perfect collective.</p> <p>Finney’s achievement is to make this collectivity feel like death rather than liberation. The pod people have faces Miles recognizes as his neighbors, and they speak to him with those voices, but the person behind the face is gone. Not suppressed or disciplined or repressed, as it might be in an authoritarian society, but genuinely absent. There is nothing left to suppress.</p> <p>At the same time, Mill Valley before the pods arrive is not a portrait of vibrant individualism. It is a small American town, quiet and neighborly and largely indistinguishable from every other small American town. The pods do not descend on a population of eccentrics and artists and visionaries. They descend on people who were already, in the ordinary social sense, quite similar to their neighbors. The horror is partly that the difference between pod Mill Valley and pre-pod Mill Valley is not as large as we would like it to be. The pods merely make explicit what suburban conformity had been accomplishing more gradually.</p> <h2 id="the-end">The End?</h2> <blockquote> <p>Look, you fools, you’re in danger! Can’t you see?! They’re after you! They’re after all of us! Our wives, our children, everyone! THEY’RE HERE, ALREADY! YOU’RE NEXT!</p> </blockquote> <p>The novel ends hopefully: the pods, finding Earth’s resistance more trouble than it is worth, launch themselves into space to find easier prey. Miles and Becky survive, and Mill Valley is slowly repopulated, albeit with its earlier residents mysteriously dying early of an unknown illness. It is an ending that fits the 1950s, an era of confidence that Americans can meet any threat.</p> <p>The film versions of <em>Invasion of the Body Snatchers</em>, in contrast, end much bleaker than the novel: there, the pod people win.</p> <p>The 1956 adaptation, directed by Don Siegel, originally ended with Miles screaming on the highway before studio pressure added a framing device that restored some hope. The 1978 version, directed by Philip Kaufman and set in San Francisco, dispenses with the frame entirely. There are no survivors. The final image – Donald Sutherland turning to point and emit the inhuman shriek of a pod person – became one of the most disturbing endings in American horror.</p> <p>The divergence maps neatly onto their respective cultural moments. Finney wrote when American confidence was near its peak. By 1978, after Vietnam and Watergate, the idea that American institutions could be trusted had curdled. The pod people winning felt more honest about how the world worked.</p> <p>Which ending is truer to the novel’s themes is an open question. Finney’s hopeful resolution sits uneasily with his own argument: if conformity was already doing what the pods do, then defeating the pods does not solve the problem. The 1978 ending takes the subtext seriously. If the pods are a metaphor for what American life was already becoming, then resistance was always futile.</p> <h2 id="the-verdict">The Verdict</h2> <p><em>Invasion of the Body Snatchers</em> has survived seven decades because Finney had the instincts of a great thriller writer and the themes of something more serious. The plot moves fast, the dread accumulates efficiently, and the ending – Miles and Becky running through darkened fields while Mill Valley sleeps – remains one of the most effective sequences in American science fiction.</p> <p>The novel’s weaknesses are mostly those of its genre and moment. The romance between Miles and Becky is sketched lightly enough that their love, which the novel stakes everything on, is more asserted than felt. The characters do not have distinguishable personality traits. And Finney’s prose, while serviceable, does not have the literary ambition that might have made the novel’s ideas fully explicit.</p> <p>But the ideas are there, worked into the machinery of the plot with enough craft that the novel holds up as both entertainment and allegory. The question Finney is really asking: how much of yourself are you willing to give up for comfort, belonging, and the approval of your neighbors? has not aged at all.</p> <h2 id="stray-observations">Stray Observations</h2> <ol> <li> <p>The original title was <em>The Body Snatchers</em>, but my edition was updated to reflect the film’s title.</p> </li> <li> <p>The gender politics are exactly what I should have expected of a 1950s sci-fi thriller: the female characters mostly exist to feed the male characters.</p> </li> <li> <p>There’s an absolutely bizarre segue into a story about a black shoeshine man named Billy who is genial and friendly to his customers but secretly hates them. I really have no idea what Finney was going for with the anecdote. Racial politics of the time?</p> </li> </ol> Wed, 18 Mar 2026 00:00:00 -0500 https://ahalbert.com/reviews/2026/03/18/the_body_snatchers.html https://ahalbert.com/reviews/2026/03/18/the_body_snatchers.html Reviews Nightwood <p><strong>Nightwood</strong>. By Djuna Barnes. 180 pages.</p> <blockquote> <p>To say that Nightwood will appeal primarily to readers of poetry does not mean that it is not a novel, but that it is so good a novel that only sensibilities trained on poetry can wholly appreciate it.</p> </blockquote> <p>No less a luminary than T.S. Eliot provided the introduction to Djuna Barnes’s 1936 novel. He wasn’t kidding when he said it was more poetry than prose. <em>Nightwood</em> is among the densest books I’ve ever read. Barnes discards niceties like plot and clarity in favor of a dreamlike experience that haunts me to this day. The book can be maddeningly frustrating at times, such as when the action of the plot is relegated to a footnote of a long digression. Pages pass where you track every word and still feel you have grasped nothing. When Ms. Barnes writes, “We look to the East for a wisdom that we shall not use—and to the sleeper for the secret that we shall not find,” she captures in a single breath what makes <em>Nightwood</em> so singular and strange. I understand the words, and they stick with me, but what do they mean?</p> <p>This is a book that rewards a second reading. The first time, I decided to let <em>Nightwood</em> wash over me, concentrating on the rhythm and sound of the novel rather than the specifics of the plot. The second time, I paused and lingered over the most impactful sentences, taking in the mood and strangeness of Ms. Barnes’s vision.</p> <p><em>Nightwood</em> is less a novel than a prose poem about obsession, decay, and the night itself – the hours when our ordinary identity dissolves and our animal natures take over. Almost all the novel is set when ordinary people are asleep, but it is only at night that our characters can become their true selves. Each of them is driven by extreme desires, and each of them is undone by these desires.</p> <p>The first four chapters introduce the characters and their backstories, their psychology, and their desires. Each of them meets Robin Vote and forms a relationship with her. Robin abandons each of them in turn, and the last four chapters deal with the aftermath.</p> <h2 id="dramatis-personae">Dramatis Personae</h2> <h3 id="robin-vote">Robin Vote</h3> <blockquote> <p>The perfume that her body exhaled was of the quality of that earth-flesh, fungi, which smells of captured dampness and yet is so dry, overcast with the odour of oil of amber, which is an inner malady of the sea, making her seem as if she had invaded a sleep incautious and entire. Her flesh was the texture of plant life, and beneath it one sensed a frame, broad, porous and sleep-worn, as if sleep were a decay fishing her beneath the visible surface.</p> </blockquote> <p>Robin is the center of <em>Nightwood</em>. She forms romantic relationships with three of the main characters, and their obsession with her proves their undoing. A young American woman drifting across Europe, Robin is known for her excess: excessive drinking, numerous lovers, and overwrought emotional outbursts. And yet she remains an enigma throughout the novel. She is given little dialogue and understood only through the eyes of those she leaves behind.</p> <p>Robin is defined by contradictions: described as “clumsy, yet graceful”, her husband finds her presence “painful, and yet a happiness.” She is restless, developing a habit of disappearing for weeks at a time, wandering the streets of interwar Europe at night. She is a lost soul, forever searching for something she never finds. Robin is someone ill at ease with herself, lacking a secure identity. “A tall girl with a body of a boy”, Robin is often depicted in men’s clothing, hinting that perhaps the root of her issues involves her gender identity. Once she acquiesces to having a child with her husband, Felix, she truly flies off the rails, abandoning her child for a series of lesbian relationships that she also finds empty and unfulfilling. In the final scene of the novel, Robin has descended to acting like a dog, getting on all fours and barking.</p> <h3 id="felix-volkbein">Felix Volkbein</h3> <blockquote> <p>He was usually seen walking or driving alone, dressed as if expecting to participate in some great event, though there was no function in the world for which he could be said to be properly garbed; wishing to be correct at any moment, he was tailored in part for the evening and in part for the day.</p> </blockquote> <p>Felix is an orphan from birth, the son of a self-invented Jewish “Baron” who fabricated a noble lineage before dying alongside Felix’s mother. Felix inherits both the fake title and the obsession with aristocracy that created it. He is a man desperate to belong to a European tradition that will never accept him, surrounding himself with the trappings of old-world culture – titles, antiques, and deference to anyone with a claim to nobility. He marries Robin and pressures her to have a child in the hope that she will give him a male heir to continue his fraudulent dynasty. But Robin is incapable of playing the role Felix has written for her; she abandons both husband and child.</p> <p>Felix is left with a sickly boy who will never be the vessel for his ambitions. Young Guido is a sickly, emotional boy whose hopes lie in the priesthood. Felix accepts his son’s religious fervor and moves to Vienna so that if his line must end with Guido, it ends in his native Austria. He ends the novel an alcoholic, getting drunk in cafes while Guido watches.</p> <h3 id="the-doctor">The Doctor</h3> <blockquote> <p>In the old days I was possibly a girl in Marseilles thumping the dock with a sailor, and perhaps it’s that memory that haunts me. The wise men say that the remembrance of things past is all that we have for a future, and am I to blame if I’ve turned up this time as I shouldn’t have been, when it was a high soprano I wanted, and deep corn curls to my bum, with a womb as big as the king’s kettle, and a bosom as high as the bowsprit of a fishing schooner? And what do I get but a face on me like an old child’s bottom-is that a happiness, do you think?</p> </blockquote> <p>Born Matthew O’Connor, the Doctor is not, strictly speaking, a licensed practitioner of medicine. If Robin is the center of the plot of <em>Nightwood</em>, the Doctor is the novel’s soul. Given to lengthy monologues on every subject from religion to gender to the nature of night itself, he is simultaneously prophet, fool, and confessor. The other characters come to him to pour out their hearts; he responds with streams of consciousness that are as illuminating as they are baffling. He is as fractured as those he counsels; his pain is that there is nobody to listen to his troubles.</p> <p>When Nora visits him in the small hours, she finds him in bed wearing a woman’s nightgown and wig, surrounded by cosmetics and feminine trinkets. Embarrassed (he was expecting someone else), he confesses his desire to be a woman to Nora. Nora, however, is too consumed with her desire to reunite with Robin to notice how the Doctor is. He ends the novel weeping in a bar, undone by the weight of everyone else’s suffering that he has carried.</p> <h3 id="nora-flood">Nora Flood</h3> <blockquote> <p>The world and its history were to Nora like a ship in a bottle; she herself was outside and unidentified, endlessly embroiled in a preoccupation without a problem. <br />    Then she met Robin.</p> </blockquote> <p>Nora is described as “having the strangest salon in America…for Catholics, Protestants, Brahmins, dabblers in black magic and medicine.” Self-assured and confident, she is a publicist for circuses in Europe. She meets Robin, and they become inseparable. Their life together in Paris is intense and claustrophobic – Robin disappears each night, and Nora lies awake tormented by what Robin is doing and with whom. When Robin finally abandons her for Jenny Petherbridge, Nora is destroyed. Unlike Felix, who redirects his loss toward his son, Nora cannot let go. She seeks out the Doctor repeatedly, less for his counsel than for the relief of speaking Robin’s name to someone who will listen. She ends the novel searching for Robin in increasingly desperate ways. Nora’s tragedy is that she loves Robin with a completeness that demands reciprocity – and Robin is constitutionally incapable of giving it.</p> <h3 id="jenny-pentherbridge">Jenny Pentherbridge</h3> <blockquote> <p>To men she sent books by the dozen; the general feeling was that she was a well-read woman, though she had read perhaps ten books in her life.</p> </blockquote> <p>Derisively referred to as “The Squatter”, Jenny’s defining personality trait is having no personality of her own. Married four times and widowed four times, she lives off the income of her late husbands. Unable to feel or create, she survives by absorbing the emotions and experiences of others. Jenny repeats overheard stories as her own, mimicking the passions she cannot generate. When she encounters Robin, she does what she always does: she takes her. She steals Robin from Nora not out of love but out of an insatiable hunger to possess what others desire. Yet even Jenny cannot hold Robin. Jenny throws a fit when Robin starts giving attention to yet another woman. Jenny is presented as a kind of emotional vampire, hollow at the core, and her relationship with Robin is the most joyless in the novel. She is perhaps the darkest mirror Barnes holds up to obsession, desire with nothing behind it at all.</p> <h2 id="identity">Identity</h2> <blockquote> <p>What had formed Felix from the date of his birth to his coming to thirty was unknown to the world, for the step of the wandering Jew is in every son. No matter where and when you meet him you feel that he has come from some place—no matter from what place he has come—some country that he has devoured rather than resided in, some secret land that he has been nourished on but cannot inherit, for the Jew seems to be everywhere from nowhere.</p> </blockquote> <p>The novel’s entire cast is composed of people who do not belong and invent a false persona to fit in. Felix has no claim to the aristocracy he craves. O’Connor practices medicine in the shadows and cannot inhabit the gender that fits him. Jenny can only be herself by taking from others. Ms. Barnes published the novel in the 1930s, and it reflects the atmosphere of interwar expatriate Europe, a world of people who had fallen out of the conventional social order. The night of the title is the space they all occupy: the margins, the hours when the respectable world is asleep.</p> <p>The queer themes get the lion’s share of today’s literary analysis, but Jewish identity runs through the novel in a way that deserves more attention than usually received. Felix’s half-Jewish heritage is a source of both pride and shame for him. His father invented a fake noble lineage partly to escape the stigma of being Jewish in Vienna, but Felix has internalized both the need to belong and the knowledge that he never will. <em>Nightwood</em> vividly illustrates why Zionism was such a force among European Jews in the early 20th century. When assimilation demands the erasure of who you are, and acceptance is never fully granted regardless, emigration to a homeland of your own becomes a coherent answer. Felix’s tragedy is that he cannot accept this. He keeps chasing membership to something he will never belong to.</p> <h2 id="relationships">Relationships</h2> <blockquote> <p>“You know what man really desires?” inquired the doctor, grinning into the immobile face of the Baron. “One of two things: to find someone who is so stupid that he can lie to her, or to love someone so much that she can lie to him.”</p> </blockquote> <p>Every relationship in <em>Nightwood</em> is structured around an unbridgeable asymmetry. Felix wants a dynasty; Robin wants nothing he can give. Nora wants a complete and permanent union; Robin cannot stay still long enough to be anyone’s. Jenny wants to possess; even she cannot hold Robin. This asymmetry is not a product of cruelty or malice on Robin’s part. Barnes presents Robin as a force of nature, something that comes in and wrecks lives impersonally.</p> <p>The Doctor is the one character who escapes Robin’s orbit, yet he suffers the same structural loneliness from the other side: everyone unburdens themselves to him, and he has no one to unburden himself to. Barnes seems to be saying that this is the nature of all deep attachment; one person always loves more, and that person is always destroyed.</p> <p>At the same time, I found the relationships with Robin unconvincing. Why does she marry Felix to begin with? What does Nora see in Robin, who is given so little interiority? The relationships forming get almost no narrative space. Most of the novel is dedicated to the characters’ backstories and destruction, not the actual action of the plot. Barnes may have intended Robin’s blankness as a kind of negative space onto which others project their desires, but the effect is that the novel’s emotional stakes feel asserted rather than earned.</p> <h2 id="the-verdict">The Verdict</h2> <p><em>Nightwood</em> is not an easy book, and I don’t think it’s meant to be. It demands patience, a tolerance for beautiful obscurity, and a willingness to let the novel’s images accumulate rather than waiting for plot. On those terms it largely succeeds. The Doctor alone is worth the price of admission – a character of genuine originality, comic and tragic in equal measure. The portrait of Nora’s grief is quietly devastating, all the more so for how little Barnes sentimentalizes it.</p> <p>The novel’s weaknesses are real. Robin is meant to be unknowable, but Barnes is perhaps too successful at keeping her shrouded in mystery. She never quite coheres into a person, and the relationships built around her feel like they’re orbiting an absence rather than a character. The ending, for all its strangeness, is more striking as an image than as a conclusion. And the density of the prose can tip from lush into impenetrable.</p> <p>But I think about this book more than I expected to. Its vision of exile, of people who cannot fit into the world as it is arranged endures. Barnes had no interest in reassurance, and the novel doesn’t offer any. What it offers instead is a compassion for her characters, understanding them without accepting their decisions.</p> Mon, 09 Mar 2026 00:00:00 -0500 https://ahalbert.com/reviews/2026/03/09/nightwood.html https://ahalbert.com/reviews/2026/03/09/nightwood.html Reviews Cribsheet <p><strong>Cribsheet: A Data-Driven Guide to Better, More Relaxed Parenting, from Birth to Preschool</strong>. By Emily Oster, PhD. 326 pages.</p> <p>Mommy forums are full of arguments about what is right and wrong for your child. What should your policy be for screen time? What’s the best way to approach potty training? Most of these arguments are based around ancedata. Worse, they often come with a lot of judgment attached to them. <em>If you sleep train your baby, you don’t care about them at all.</em></p> <p><em>Cribsheet</em> is the answer to all this. This is the second book in economist Emily Oster’s <em>Parentdata</em> series. Like the first entry, <a href="https://www.ahalbert.com/reviews/2025/07/14/expecting_better.html"><em>Expecting Better</em></a>, Dr. Oster takes a look at the data on a broad swath of parenting controversies and distills it into non-judgmental advice on how to raise your little one. Some of it will be controversial, such as her advice on breastfeeding: marginally better for your child’s health than formula, but no need to kill yourself over it. On other topics, like vaccines, she follows the conventional wisdom.</p> <p>More often than not, though, the data is inconclusive - a parental choice is neither good nor bad. In that case, Dr. Oster suggests that you do what works for your family. That will frustrate parents looking for explicit guidelines, but I found it relaxing to know many of the choices we agonize over will not matter too much.</p> <p>That, of course, still means you have to find something that works for your family. Alongside her research, Dr. Oster presents common microeconomic concepts to help you make better choices, from decision trees to Bayesian reasoning. I found these parts too simplified to be really helpful, but I imagine the book would not have sold well if it became a treatise on decision theory.</p> <p>There are limits to the kind of economic thinking espoused by the book. Much of the advice offered in the book only matters if you have some degree of economic flexibility. Take the chapter on childcare. Dr. Oster only considers having a nanny vs. daycare. Given that only 37% of children under 5 attend a daycare, and even fewer families have a nanny, the chapter is not applicable to families that are not upper middle class.</p> <p>Then again, no book can be all things to all people. What makes <em>Cribsheet</em> shine is Dr. Oster’s writing style. She weaves clinical data with stories about her own parenting journey in a witty, self-deprecating style that makes you feel like you are receiving advice from a wise friend rather than a detached expert. Dr. Oster can’t settle every parenting debate, but it can give you the confidence to make your own decisions when the science runs out – which it turns out, is most of the time.</p> <p>Now onto a sample of the content of the book.</p> <h2 id="breastfeeding">Breastfeeding</h2> <p>Prior to delivering her daughter, Dr. Oster took a breastfeeding class at a Chicago hospital and was given a list of purported benefits of breastfeeding. One of them was that Mom would form better friendships. She was skeptical and, upon researching it herself, found out that no one had actually researched this topic. But there were some more plausible benefits for breastfeeding. What does the data say?</p> <p>One problem with studies of breastfeeding is that they tend to be observational studies rather than randomly controlled trials (RCTs). This means that they tend to not control for the fact that women who breastfeed are different from the ones that don’t. For example, studies find that breastfed children have lower rates of diabetes later in life. However, women who breastfeed also have higher incomes than ones that don’t, and poorer children are more likely to develop diabetes. That could mean the poverty causes diabetes rather than breastfeeding preventing it. Once you control for demographics, things like babies who are breastfed having higher IQs tend to disappear.</p> <p>There is one big randomized controlled trial of breastfeeding called PROBIT that was carried out in Belarus. It found that breastfed infants were less likely to have diarrhea and rashes than infants fed formula. But for many illnesses, the rates that they had them were identical. Some observational studies have found breastfeeding reduces ear infections, such as one in the Netherlands, but other studies in the UK find no relationship.</p> <p>I personally have heard that breastfeeding is good for the baby’s immune system. But Dr. Oster didn’t cover that in the book, so I don’t know if it’s true or not. But if you decline to breastfeed or can’t, don’t feel that you are setting up your child for failure.</p> <h2 id="sleep">Sleep</h2> <p>Sleep deprivation is one of the most brutal aspects of early parenthood. Those first months can feel like an endless blur of two-hour increments and 3 a.m. feedings. Parents will do a lot to get an uninterrupted few hours of sleep, but will sleep training your baby harm them? How do you best protect your baby from SIDS?</p> <h3 id="safe-sleep">Safe Sleep</h3> <p>SIDS is the leading cause of death in infants in the US, killing around 0.5% of children, almost always in the first four months of life. The causes are poorly understood, but a few interventions have cut down SIDS dramatically.</p> <h4 id="intervention-1-babies-on-their-backs">Intervention 1: Babies on Their Backs!</h4> <p>SIDS, thankfully, is rare, so it’s difficult to study. There has never been an RCT of putting babies to sleep on their backs and relied on case-control studies. However, evidence from these studies was so strong that the American Academy of Pediatrics decided to recommend back sleeping in the absence of a randomized trial. Later studies observing the effects of a “Back to Sleep” campaign in Denmark justified this, finding that deaths from SIDS fell by half in the months after the campaign started, preventing an overall 8% of infant deaths.</p> <h4 id="intervention-2-alone-in-their-crib">Intervention 2: Alone in Their Crib</h4> <p>This recommendation forbids co-sleeping or putting blankets. It’s easy enough to keep stuff out of the crib, especially with the advent of wearable blankets and swaddles. But many infants sleep better with a parent. How risky is co-sleeping?</p> <p>Co-sleeping in any form is associated with an elevated risk of SIDS. But the level of risk depends on the parent’s behaviors, especially if they smoke or drink. See the following chart:</p> <p><img src="/assets/cosleeping_graph.png" alt="pic alt" class="img-fluid" /></p> <p>Even more dangerous is sharing a sofa with an infant. Sleeping together on a sofa is 20x to 60x riskier than the baseline rate in the graph.</p> <p>While the official guidelines are to <em>never</em> co-sleep with an infant, Dr. Oster takes a more moderate position: if it’s the only way your family can get sleep, do it as safely as possible: don’t smoke or drink, put the baby on their back, and take blankets off your bed.</p> <h4 id="intervention-3-in-the-room-with-the-parents">Intervention 3: In the Room with the Parents</h4> <p>This recommendation has the weakest evidence associated with it: the studies done were smaller and not explicitly looking at a relationship between room sharing and SIDS. They tend to be sensitive to which variables are adjusted for and depend on whether the infant was sleeping on their stomach.</p> <p>At the same time, there is a cost to room sharing: child sleep. By nine months, infants who slept in their own room sleep 45 minutes longer than those who don’t. While the evidence is not causal (parents may move the baby to their own room when they sleep better). Sleep is important for infant brain development, so it’s not just important for the parents.</p> <h4 id="intervention-4-no-soft-stuff">Intervention 4: No Soft Stuff</h4> <p>As before, blankets and toys should not be in the crib. Dr. Oster looks at the effects of crib bumpers on SIDS. Only one study looked at this and attributed 48 deaths to them between 1985 and 2012, or .007% of all SIDS deaths. She still recommends against having them, as older children can use them to fall out of the crib, but they are negligible in terms of SIDS risk.</p> <h3 id="sleep-training">Sleep Training</h3> <blockquote> <p>There are people who will tell you their baby slept through the night from three weeks on. In my experienced opinion, most of these people are liars</p> </blockquote> <p>Infants like to get up a lot; parents would rather not. The marketplace has noticed this, and there is an avalanche of books to get your child to sleep better. All of them promise better sleep and happier parenting, but do they work? And will they stunt your child long-term?</p> <p>The approaches fall into two broad camps: some form of “cry it out” (the Ferber or Weissbluth methods), and “no-cry” methods that rely on gentler interventions. There are also attachment parenting advocates who argue you shouldn’t be sleep training at all – that leaving babies to cry themselves to sleep damages their emotional development and undermines the parent-child bond.</p> <p>Two approaches to “cry it out” techniques have received extensive study: “Extinction” (leave the room and don’t return until morning) and “Graduated Extinction” (check on the baby at increasingly lengthy intervals). Across 17 studies on Extinction and 14 on Graduated Extinction, the results were consistent: it works. Sleep-trained babies woke up about half as often during the night each week, and parents who used these methods reported less depression and better mental health.</p> <p>But is it bad for the baby? There’s little evidence that it is. One rigorous Australian study followed 328 families for five years after sleep training and found no differences in emotional development, behavior problems, or parent-child attachment between the sleep-trained group and those who weren’t sleep trained.</p> <p>Dr. Oster got a lot of pushback on this chapter from attachment parenting advocates and some developmental psychologists who felt she dismissed their concerns too quickly. They pointed out studies showing infants and mothers had similar cortisol (stress hormone) levels before and during sleep training. Once sleep training had concluded after three days, infants had the same level of cortisol, while mothers had lower cortisol. The researchers interpreted this as a sign the mother-baby bond was deteriorating. Dr. Oster disagrees, saying that nothing happened to the infants and the mothers were more relaxed afterwards, a net benefit.</p> <h2 id="vaccines">Vaccines</h2> <p>No discussion of the Mommy Wars would be complete without mentioning vaccines. Distrust of vaccines has spiked recently, and outbreaks of diseases like measles are back in the news. Distrust of vaccines is not exactly new; for example, in India and China there was distrust of the smallpox vaccine. In the late 70s a paper was published linking the DTaP vaccine to infant brain injury. The paper was flawed, but a bunch of lawsuits were filed, prices rose, and availability tanked. Congress passed the National Childhood Vaccine Injury Act in 1986 to shield manufacturers from these lawsuits and stabilize the supply. The most recent round of distrust, however, started with ex-Dr. Andrew Wakefield and a paper linking the MMR vaccine to autism.</p> <p>With all the distrust of vaccines, what does the data say? In 2011 the Institute of Medicine, now the National Academy of Medicine, released a comprehensive report (<em>Effects of Vaccines: Evidence and Causality</em>) that looked at 12,000 studies looking at 158 different kinds of adverse events to common childhood vaccinations. They drew the evidence from adverse event reports and epidemiological studies and tried to decide if a relationship was there, not there, or not enough evidence to decide. Most of the time, they couldn’t really answer the question either way. There were 17 kinds of adverse events they found a relationship with. 14 of which were supported by the evidence and 3 rejected They can be categorized as follows:</p> <ol> <li>Allergic reactions</li> <li>Fainting, mostly in adolescents</li> <li>Things specific to the immunocompromised</li> <li>Febrile seizures</li> </ol> <p>Allergic reactions are pretty rare, occurring in only 2.2 per million vaccinations given. Fainting occurs in 3 in 10,000 vaccinations. About 2.5% of children will get them before age 5. Most are not vaccine related, but there is an elevated risk of them up to 10 days after the MMR vaccine. Febrile seizures are linked to high fevers and, while serious, have no long-term effects on children. While there are some risks to vaccines, these are small risks. We routinely take bigger risks every day. At the same time, they are effective at preventing disease. For example, comparisons of children born in the fall versus children born in other parts of the year show that they are more likely to get vaccinated for the flu because their routine doctor’s appointments occur during flu season. The same study found that the vaccinated kids, are less likely to get the flu.</p> <p>What about spacing out the vaccines more, an increasingly popular option? That actually makes febrile seizures more likely, because that reaction to the MMR vaccine is more common as kids get older than 1 year.</p> <hr /> <p>At this point, you’re getting a sense of what each chapter is like; Dr. Oster introduces a common parenting question, finds any study out there related to the topic, and explains what the data says interspersed with humorous anecdotes about her own experiences parenting. It’s a formula that works well, and one I’ll happily follow for a <a href="https://www.amazon.com/Family-Firm-Data-Driven-Decision-ParentData/dp/1984881752">third volume</a>.</p> <p>There are some limitations on the empirical approaches advocated by this book. Dr. Oster cheerfully notes this in her chapter on screen time, noting that data and studies have little to say on long-term impacts of screen time. That being said, 8 hours of screen time a day would probably have some negative impacts. Sometimes, what you need is common sense, not a randomly controlled trial.</p> <h2 id="stray-observations">Stray Observations</h2> <ol> <li> <p>I highly recommend reading this book <em>before</em> your child is born - I was only halfway through the book when our son arrived and didn’t pick it up again until 6 months later. Many of the things I learned in this book would have been useful during this period.</p> </li> <li> <p>A lot of the studies mentioned in this book look at whether certain parenting decisions are related to obesity. Given the advent of GLP-1 agonists, I wonder how many studies will look at obesity rates in the future.</p> </li> <li> <p>Apparently, there are people out there saying that drinking beer improves mothers’ milk supply. I had never heard this before, but drinking alcohol dehydrates, decreasing milk supply. However, there is no evidence supporting pumping and dumping.</p> </li> <li> <p>A lot of the weirder ideas, such as <em>“no cauliflower while breastfeeding”</em> type advice came from the grandparents. I’m glad my mom didn’t say anything crazy to me.</p> </li> <li> <p>After delivering her daughter, Dr. Oster had trouble with breastfeeding. The doctors, to avoid something called “nipple confusion,” (wut?) had some sort of contraption that involved taping a tube to her breast to feed her daughter from the bottle. She declined to bring the device home.</p> </li> <li> <p>Another interesting diversion between empiricism and logic: how to introduce solid foods. The official guidelines are to introduce rice or oatmeal first, then introduce fruit or vegetables, one variety at a time for a few days. This is on the theory that you can mix cereals with breast milk or formula and they’ll be more likely to accept it. You introduce only one variety at a time to control for allergens. These specifics have never been tested. However, Dr. Oster points out that most allergies are caused by peanuts, tree nuts, eggs, and milk. While introducing those foods one at a time makes sense, mixing apples and pears is fine.</p> </li> <li> <p>The guidelines also recommend not to introduce honey before 1 year due to the risk of botulism. While there were some high-profile cases of botulism in the 70s from honey, the actual rate of infant botulism has not changed since the guidelines changed, so maybe its not the driving source of infant botulism.</p> </li> </ol> Thu, 26 Feb 2026 00:00:00 -0600 https://ahalbert.com/reviews/2026/02/26/cribsheet.html https://ahalbert.com/reviews/2026/02/26/cribsheet.html Reviews Expecting Better <p><strong>Expecting Better: Why the Conventional Pregnancy Wisdom Is Wrong–and What You Really Need to Know</strong>. By Emily Oster. 328 pages.</p> <p>When Emily Oster found out she was pregnant, she immediately began researching the best ways to take care of her child in utero. On the internet, there are a lot of opinions and not a lot of data, even among the medical community. For example, she wanted a cup of coffee but didn’t know if it would affect her baby. The <em>Mayo Clinic Guide to a Healthy Pregnancy</em> says no caffeine at all, but <em>What to Expect When You’re Expecting</em> says that up to 200 mg per day is ok. And her sister’s OB/GYN said no more than 300 mg a day. Which rule should she follow? What is the risk of having a cup of coffee each day?</p> <p>Fortunately, Dr. Oster is a microeconomist - an expert in the science of making decisions. She understands the difference between good and bad studies and how to extract insights from data. Not content to blindly follow the rules her doctor prescribed, she went to the source of the data to make her own decisions.</p> <p>The product of this research is the book Expecting Better. In each chapter, Dr. Oster explores a common pregnancy question, explains what research has been done on the topic, and the tradeoffs of the decision. In most cases, she avoids judgment, allowing expectant mothers to make their own decisions based on the data and their preferences. The book is written with exactly the right level of detail—enough to explain to a layman how she arrived at her conclusions without getting bogged down in technicalities. Unlike other books on pregnancy, it is witty and candid— Dr. Oster has a self-deprecating style and weaves her personal experiences seamlessly into discussions of medical studies.</p> <p>Her conclusions often go against common pregnancy wisdom. Take drinking as an example. While the official line is that no alcohol has been shown to be safe during pregnancy, her doctor said 1-3 glasses of wine a week is fine. What does the evidence have to say about it?</p> <p>There are some obvious consequences to drinking while pregnant. Fetal Alcohol Spectrum Disorders (FASD) are a well-known consequence of drinking while pregnant. But FASD only shows up in infants whose mothers binge drink during their pregnancy (over 5 drinks in a session). In Europe, the restrictions around alcohol and pregnancy are more relaxed, but there is a lower incidence of FASD in infants than in the United States. Americans drink less than Europeans while pregnant, but the ones that do are engaging in harmful binge-drinking behavior rather than having a drink with dinner.</p> <p>After reviewing the literature, Dr. Oster found that there were no high-quality studies linking light to moderate drinking in pregnancy to IQ loss or behavioral problems. One study actually reported that 1/2 to 1 drink a day was linked to higher IQ, but this is likely due to confounding factors such as education rather than a real cause. While there were studies that found harmful effects from light and moderate drinking, the studies had serious problems, such as mixing mothers who drank and used cocaine into the same group.</p> <p>This is only one topic she covers in a wonderful book. Other topics covered:</p> <ul> <li>What are the tradeoffs of prenatal testing?</li> <li>How much weight should I gain?</li> <li>Will an epidural harm my baby?</li> <li>Risks of a Cesarean Section</li> <li>What medicines can I take safely?</li> <li>What foods should I avoid?</li> </ul> <p>What I got out of the book is that, short of doing things that are obviously wrong (smoking, cocaine, binge drinking, etc.) most of the rules you’re supposed to follow have only minor impacts. Learning about the evidence relaxed me during my wife’s pregnancy, as I didn’t feel like making one mistake would mess up the baby.</p> <p><em>Side note: My wife did not like this book, as it is written by an economist and not a medical doctor.</em></p> Mon, 14 Jul 2025 00:00:00 -0500 https://ahalbert.com/reviews/2025/07/14/expecting_better.html https://ahalbert.com/reviews/2025/07/14/expecting_better.html Reviews Forever Open, Clear and Free: The Struggle for Chicago's Lakefront <p><strong>Forever Open, Clear and Free: The Struggle for Chicago’s Lakefront</strong>. By Lois Wille. 185 pages.</p> <p><em>Public Ground - A Common to Remain Forever Open, Clear and Free of any Buildings, or Other Obstruction whatever.</em></p> <p>With these words, the founders of Chicago declared that the most valuable land of the city, its shoreline, would be reserved for the people. Of the thirty miles of Lake Michigan shoreline within Chicago, twenty-four miles are parkland. Where other cities crowded their waterfronts with factories and warehouses, blotting out any memory that they sit on a body of water, Chicago sought to keep it clear of commerce and industry. The result is a lakefront park that is the envy of the world. This is the story of Chicago’s heritage, how the city nearly squandered it, and how citizens fought to preserve it. </p> <h2 id="a-park-if-you-can-keep-it">A Park, If You Can Keep It</h2> <p>Two decisions taken in the early days would save the Lake Michigan waterfront. One involved the sale of the now-defunct Fort Dearborn. The leaders of Chicago, all wealthy land speculators, resolved to convert 20 acres of the land into a public square. The idea of the historic site being coated with factories and granaries upset them. Dearborn Park would become a popular site for political rallies and would eventually become the founding site of the Chicago Public Library.</p> <p>The second decision was made by the men named by the state to manage construction of the canal: they resolved not to sell the land between Michigan Avenue and the lake. Even though the land frequently flooded, it probably would have brought top dollar from the grain and meatpacking concerns. Instead, they gifted it to the people of Chicago. Out of that narrow strip of land would bloom the great waterfront park that exists today.</p> <p>To keep the promise of vacant lakeshore, city leaders established Lake Park in 1844. However, the city invested little in it, and it became a dumping ground for the city’s waste. Ignoring the entreaty to keep the lakeshore “Forever, Open, Clear, and Free,” city leaders sold most of the southern shoreline to the <a href="https://www.ahalbert.com/blog/2025/02/23/notes_on_early_chicago.html#:~:text=All%20they%20wanted%20was%20the%20shoreline">Illinois Central Railroad</a>. In 1869, the Illinois Central went further and bribed the state legislature to let them build a train depot on Lake Park in exchange for establishing a park fund for Chicago. Lake Park would not be given back to the people until 1892.</p> <p>The city’s front yard might forever be the property of the Illinois Central. But the city now had <span>$</span>800,000 (<span>$</span>30.2 million in 2024 dollars) to build a park, and everyone agreed the city needed breathing space. The city looked to the North Side to build a new park. In contrast to the South and West Sides, the North Side was undeveloped. The city’s main cemetery was located there and was close to bursting. The North Siders, concerned about disease from the cemetery, lobbied to have the cemetery emptied and replaced with a park. Forgetting that there was already a Lake Park, the City Council established another Lake Park on the North Side in October 1864.</p> <p>A few months later, President Lincoln was assassinated. In honor of Illinois’ first citizen, the park was renamed Lincoln Park. The task of moving the 20,000 bodies buried in the cemetery was never completed – bodies are still being found in the park to this day.</p> <h2 id="urbs-in-horto">Urbs in Horto</h2> <p>While a good start, Lincoln Park was too far away for the majority of citizens on the South and West Sides to enjoy. Paul Cornell, a rich lawyer in Hyde Park (not part of the city in those days), began campaigning for parks there. He knew that the city would eventually expand there and should build a park while the land was cheap. He proposed an independent park commission to run the parks in the southern outskirts of the city and suburbs. Cornell went to the legislature to set up the system, which said the city council should set up parks if they wanted to run them. After greasing some palms, Cornell got his bill—on the condition that it pass in a referendum. He was defeated in a vote widely decried as fraudulent.</p> <p>But Cornell didn’t give up. This time, he thought bigger: he proposed a city circled by parks with grand boulevards linking them. Under this system, all citizens of Chicago would be 30 minutes away from a park. In 1869, the legislature passed a bill providing for three parks commissions, one for each side of the city. At least on the South and West Sides, the referendums passed this time. The North Siders already had their park and were loath to pay taxes for other people’s parks. The county court set up a North Side Park Commission anyways. </p> <p>Political squabbling immediately plagued the new park system. Each side of the city complained they were paying too much and their neighbors too little. Real estate developers and politicians party to the deals insisted on selling land at grossly inflated prices, infuriating property owners and politicians not in on the scheme. The park’s advocates estimated acquiring the park land would cost <span>$</span>75,000. Thanks to the efforts of speculators, it ended up costing <span>$</span>3.5 million.</p> <p>But despite the fighting and scandals, the city had a parks system at last. Residents were captivated by the new look, and the parks unleashed a wave of public-spiritedness not seen before in a city defined by hustling. Nobody could foresee the future disaster awaiting them.</p> <p>On October 8, 1871, the Great Chicago Fire erupted, killing 300 people, destroying 17,500 buildings, and leaving a third of the city homeless. It seemed that Chicago’s ambitions were forever ruined. But three days later, Joseph Medill’s <em>Chicago Tribune</em> ran an editorial, crying, <em>Chicago Shall Rise Again</em>. The citizens responded by electing Medill mayor a month later. This time, Chicagoans were determined to build a beautiful city from the ashes.</p> <p>Park commissioners were told to go ahead with their plans, even if the records had burned and had to be pieced together from memory. Attracted to the chance to build a new city from scratch, a new generation of architects moved to Chicago. Over the next two decades, Chicago’s parks would become the finest in the world. 2,000 acres were converted to 8 big parks and 29 small ones, with 35 miles of boulevards linking them.</p> <p>Even before they were finished, the parks drew all kinds of citizens. The boulevards drew daredevils who liked to race their horses, frightening slower traffic. The commissioners later restricted racing horses to a few hours on Wednesdays and Fridays. On these days, free concerts were hosted in the park, playing Strauss and Beethoven. In the mornings, sheep grazed on the grass to keep it short. Baseball, tennis, boating, swimming, ice skating - the parks provided it to the people. Bicycling was the newest craze, but the the parks commissions banned the “outlandish machines” from the parks grounds. Carriage-riders screamed with rage as they swarmed down the boulevards. With a gift of two pairs of swans, the Lincoln Park Zoo was opened, one of the few zoos in the world with free entry.</p> <h2 id="montgomery-ward">Montgomery Ward</h2> <p>While Chicago had been building other beautiful parks in the two decades after the fire, downtown Lake Park was still shabby. Stables, garbage, and railroad sheds littered what was supposed to be Chicago’s centerpiece park. All of this enraged Montgomery Ward, founder of the nation’s first mail-order catalog business. He called his friend and attorney, George P. Merrick, and told him to do something about it. His battle for the park would cost him <span>$</span>50,000, or <span>$</span>1.75 million in today’s money.</p> <p>The water past the Illinois Central Railroad had gradually been filled with debris from the fire. As a result, Lake Park now covered so much area that Mayor DeWitt Cregier announced plans to build a new civic center on that land. While this violated the injunction that the lakefront remain vacant, he argued that since the use was public and not on the original land protected by Chicago’s founders, it was acceptable. However, he had misunderstood Montgomery Ward. He didn’t want <em>any</em> buildings constructed on Lake Park and filed a lawsuit blocking the construction. The Illinois Supreme Court agreed with him. Two buildings were left behind: the Chicago Public Library and the Art Institute of Chicago. The court ruled that since the original abutters had already consented to those buildings’ construction, they could stay.</p> <p>Baffled by his “open space” concept, city leaders and the newspapers heaped abuse on Ward for his lawsuit. An intensely private man, Ward regretted taking up the cause at all, complaining even gratitude had been denied him. Ward offered to construct the park at his own expense, but the city declined to take him up on his offer. City officials, however, did concede that Lake Park would be a park. Today it is named Grant Park, a centerpiece of downtown Chicago.</p> <h2 id="make-no-little-plans">Make No Little Plans</h2> <p><em>Make no little plans,</em> said Daniel Burnham: <em>They have no magic to stir men’s blood and probably will not themselves be realized. Make big plans, aim high in hope and work, remembering that a noble, logical diagram once recorded will never die, but long after we are gone will be a living thing, asserting itself with ever growing insistency.</em></p> <p>As an architect, Daniel Burnham worshipped order and cherished beauty. The Chicago he designed buildings for in the 1890s was neither. True, parks had flourished on each side of the city, and it finally looked like Lake Park downtown would be cleaned up thanks to Montgomery Ward. But between the parks was a mass of slums and skyscrapers, breweries, and slaughterhouses. In 1894, shortly after designing the wildly successful World’s Fair, Burnham started sketching out a plan for Chicago. Finally completed in 1909, Burnham’s Chicago Plan was the first comprehensive plan for any city.</p> <p>Focusing on the lakefront, Burnham reimagined it as one unbroken playground for the people. Taking advantage of Chicago’s limitless supply of landfill, he imagined man-made lagoons and islands dotting the shore. Burnham then convinced Chicago’s Commercial Club that such a plan would sound business as well. Laborers would recreate in the new parks rather than attend dens of vice or unionize.</p> <p>The Commercial Club started lobbying in Springfield for condemnation rights to connect all the lakeshore parks together. They succeeded, but the Illinois Central Railroad managed to get its land excluded from the bill, making the measure nearly worthless. Not to be deterred, Burnham and the Commercial Club went on a relentless publicity tour of the Chicago Plan. Newspapers spent weeks displaying the beautiful illustrations, children studied it in school, and every property owner was mailed a simplified version of the plan. The Illinois Central started to realize that the plan was so popular they could no longer count on the state legislature to protect them. Meeting city leaders again, the railroad agreed to swap their shore rights in exchange for land to build a new terminal. They also agreed to electrify their line so that soot from the trains would not pollute Chicago.</p> <p>Daniel Burnham, sadly, never got to see his plan come to fruition. He died while traveling in Germany in 1912; the city would not pass a new lakefront ordinance until 1919. And while both the Illinois Central and the government made good starts, neither side entirely fulfilled its side of the bargain. The city constructed one island, Northerly, and connected the lakefront, naming the new park and lagoon Burnham Park. The Illinois Central depressed and electrified its tracks but never consolidated its lines at a new station. By the time 1930 rolled around, the city was bankrupt, unable to even finish the landscaping for Burnham Park.</p> <h2 id="the-age-of-cement">The Age of Cement</h2> <p>After the depression came World War II, and the decisions made by the parks commission after the war were even more disastrous. The strong man on the board was <a href="https://www.ahalbert.com/reviews/2024/04/01/boss-part-1.html#:~:text=Arvey">Jacob M. Arvey</a>, and he was determined to use the city’s parks for patronage rather than recreation. Northerly Island became an airport for business executives, costing taxpayers <span>$</span>200,000-<span>$</span>300,000 a year (<span>$</span>2.5m-<span>$</span>3.9m 2024 dollars). Arvey then allowed 120 acres on the north and south shores to be used as sites for water filtration plants. The Chicago Plan Commission protested that the plants should be placed on blighted land, but it would save the city money to use land it already owned. As a compromise, a 10-and-a-half-acre park was constructed on the north shore site, little more than landscaping for the filtration plant. But the worst development would be McCormick Place, a massive convention center on the lakefront. </p> <p>The lakefront at 23rd Street was not an obvious place to site the convention center. It was a mile from the nearest public transit stop and even farther from the central business district. The only road with access to it was Lake Shore Drive, further increasing traffic on the parkway. Nor was there a need for a large convention center. A study was conducted, and there were only 48 conventions held each year in the United States that needed more than 25,000 square feet. McCormick Place had 306,000 square feet. Further study concluded that the convention center would run at a loss unless subsidized heavily by a race track tax. People protested, but City Hall, backed by the <em>Chicago Tribune</em>, rushed the necessary approvals through government, and McCormick Place broke ground on September 17, 1958.</p> <p>From the beginning, the place was cursed. In 1962, two years after it opened, Chicago had fewer conventions than it had in 1955, and it ran at a loss. Only the fortunes of the racing business allowed the bondholders to be repaid. As predicted, conventions clogged up traffic on Lake Shore Drive, requiring that <span>$</span>62m be spent to construct an interchange to reach the hall. At least it hid the ugliness of the hall.<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup></p> <p>Then, on January 16, 1967, the convention hall burned down. Mayor Daley organized an investigation into the matter, and the evidence was damning. Not only were there not enough sprinklers to provide fire protection, the steel beams holding up the structure were not protected from fire. Had the taxpayer’s money been squandered on a cheap job? Did fire officials inspect the convention hall? Did they ignore fire code violations under pressure from the mayor? Daley’s Republican opponent, John Waner, suddenly had a campaign issue. But when he brought it up to the <em>Chicago Tribune</em> he was told to shut up about the campaign hall:</p> <blockquote> <p>He said if I started blasting away at it [McCormick Place] it might embarrass him and the <em>Tribune</em>, so I had to shut up. I said the <em>Tribune</em> wasn’t doing anything for me anyways. So Tagge said yeah, but at least they weren’t hurting me. So I shut up.</p> </blockquote> <p>Mayor Daley, <a href="https://www.ahalbert.com/reviews/2024/04/08/boss-part-3.html">never one to waste a good crisis</a>, promised a bigger, more beautiful McCormick Place. This time, all the unsightly parking lots would be moved underground, and the structure would be made of glass rather than concrete. While this McCormick Place would expand all the way to the lakefront, parks advocates would get a concession: a small park to connect the north and south sides of the shore.</p> <h2 id="you-can-have-too-much-green-grass">You Can Have Too Much Green Grass</h2> <p>The parks advocates, seeing the writing on the wall, didn’t fight the new convention center. But they had formed a coalition of protestors that would fight to save Chicago’s park system from further destruction.</p> <p>And Chicago would need a resistance. In 1965, the city, like most urban centers in America, was in dire straits. Fleeing the decaying and segregated school system, middle-class parents moved to the suburbs. The Chicago Transportation Authority, facing declining revenues, repeatedly raised its fares. All of this contributed to increased traffic and strain on city roads and highways. Mayor Daley, looking to solve the traffic problem, decided to expand Lake Shore Drive through Jackson Park.</p> <p>Protestors were livid that one of Chicago’s greatest parks would have a highway bisecting it and started chaining themselves to trees to protect them from the chainsaws. Each time, they were arrested, and the road advanced a few feet. It looked like a losing battle, but Daley stopped the road halfway through and announced a new study on improving the park for recreation. The study was not serious -it was given to a firm that routinely accepted business from the city, and they were told the results they would find in advance. Once the protestors were mollified, construction resumed on the other half of the highway. The road remains to this day.</p> <p>There was no shortage of other bad ideas to protest. The city parks department, weighed down by patronage, actively covered the great parks constructed in the late 19th century in concrete. They imagined highways and parking lots where there should be ponds and grass. When asked why he was tearing up two lawns in Grant Park, Park District President James Gatley said:</p> <blockquote> <p>“You can have too much green grass.”</p> </blockquote> <p>Chicago’s parks system had been the envy of the world in 1890, but the system had not grown to accommodate its 3.5 million residents. The city had gone from the first in the nation for park space per 1,000 residents to near-last. Daley would release sketches of proposed parks with great fanfare and then quietly bury them. Indeed, he seemed to think the large parks were outdated, remarking that:</p> <blockquote> <p>The thinking now is to have more small parks out in the neighborhoods rather than these large parks.</p> </blockquote> <p>What Daley thought Lake Michigan needed was an “aquaport”, an airport built into the lake itself. Massive dikes would hold back the water. It would cost three to four times the cost of a normal airport, and have to be built six and a half miles into the lake. Lake Shore Drive would have to be expanded again to accommodate the traffic, cutting off citizens further from the lake. Fortunately, even the Illinois Legislature could see the project for the boondoggle it was and denied Daley the funds needed to construct it.</p> <h2 id="the-future">The Future</h2> <p>Chicago’s founders left a sacred trust to its citizens in the form of a lakeshore that all could enjoy. The city has often not lived up to that trust. City leaders have see-sawed between the needs of the parks and the needs of car traffic. In many parts of Chicago, Lake Shore Drive is a permanent barrier to citizens hoping to walk along the shore. A new attitude among city leaders and citizen vigilance will be required to ensure the Lake Michigan shore remains Forever, Open, Clear, and Free.</p> <div class="footnotes" role="doc-endnotes"> <ol> <li id="fn:1"> <p>Interestingly, <a href="https://www.ahalbert.com/reviews/2024/04/05/boss-part-2.html"><em>American Pharaoh</em></a> describes McCormick Place as a massive success, making Chicago the convention capital of America. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> </li> </ol> </div> Sat, 08 Mar 2025 00:00:00 -0600 https://ahalbert.com/reviews/2025/03/08/forever_open_clear_and_free.html https://ahalbert.com/reviews/2025/03/08/forever_open_clear_and_free.html Reviews Notes on Early Chicago <h2 id="before">Before</h2> <p>400 million years ago, before the brutal winters, Chicago was once a land of perpetual summer. Warm, shallow seas covered the entire Mississippi Valley. Where skyscrapers now rise, coral reefs once bloomed. These reefs would turn into limestone, providing a solid foundation for those skyscrapers. Over the last million years, ice sheets swept down the valley and receded, draining Lake Michigan a little in the process each time. Glacial rivers a mile wide rushed down the valley, but they too shrank. Left behind were only the Des Plaines River, draining into the Mississippi, and the Chicago, headed towards Lake Michigan. Connecting the two rivers was a swamp known as Mud Lake.</p> <p>And the reason for Chicago.</p> <p>In the 1600s, fleeing Iroquois raiding parties, small bands of Potawatomi moved along the coast of Lake Michigan. There, on the southern shore of the great lake, they found turkey, deer, and buffalo drinking from the waters. Better hunting than anyone had ever remembered. Their cousins, the Illini and Miami, had moved west and south, respectively, after a series of wars; the land was empty. The Potawatomi spread along the shores of Misch-i-gon-ong, or Place of Great Lake, trading their nomadic life for a settled one. Visiting friendly neighboring tribes was easy because a series of hunting trails converged on the little river Checagou, named after the wild onion that grew on its banks. In time, the Potawatomi prospered and felt secure enough to welcome the first white settlers to their lands.</p> <p>In the spring of 1673, French explorers left Mackinac seeking converts, furs, and a waterway between the Gulf of Mexico and the Great Lakes. Heading south to Arkansas, friendly Native Americans advised them that going farther would be exceedingly dangerous. But on their way back, they were advised to head back to Michigan using the route they used: porting their canoes between the Des Plaines and the Checagou via Mud Lake. There, the French met the Potawatomi, who were welcoming and eager to trade with the new arrivals. Delighted by his find of hunters to buy furs from and a link between Lake Michigan and the Missisippi River, French explorer Louis Joilet noted that the mouth of the Checagou made an excellent harbor and that it would only be necessary to build a canal over Mud Lake to join the two waterways. Prophetic words. But it would take another 175 years to build.</p> <p>For a time, trade thrived at the mouth of the Checagou. That all came to an end at the turn of the century. The Fox tribe, angry that the French had given arms to their rivals, the Sioux, banned the white man from the portage. For 70 years, it would remain closed, with little known about life on the western shore of Lake Michigan. That is, until Jean Baptiste Point du Sable, Chicago’s first settler, established a new trading post in 1772 and married a Potawatomi woman. The Native Americans tolerated du Sable because he was not white but a black man from Haiti. Convinced of Chicago’s commercial potential, he moved his family there in 1775, and the first recorded Chicago birth was his daughter Suzanne. The trading post thrived even as the French lost control of the area and ceded it to the British, who in turn lost it to the newly formed United States.</p> <p>With the Treaty of Paris in 1783, settlers poured over the Appalachian mountains to settle the newly claimed land. The new settlers quickly clashed with the Native Americans, armed by the British. A war broke out, and the natives were eventually defeated at the Battle of Fallen Timbers in Ohio. As part of the peace treaty, General “Mad” Anthony Wayne demanded land at the mouth of the Chicago River. It was the first indication the American government saw the strategic importance of Chicago. Eight years later, the United States Army established Fort Dearborn at the mouth of the Chicago. The government intended to break the British-Native trade, and agents were ordered to undersell the British at any cost. Traders and settlers moved in, but the little town did not grow quickly, probably because of the harsh weather and marshy soil.</p> <p>Soon, hostilities broke out between the increasingly pro-British Potawatomi and the Americans. As the War of 1812 approached, the younger generation of Potawatomi leaders vowed to destroy the fort. Outgunned and outnumbered, the fort was given evacuation orders. Captain Nathan Heald distributed the fort’s supplies to friendly natives, except the ammunition and liquor, which he had destroyed. He would regret that decision. Enraged by the destroyed supplies, the Potawatomi attacked the retreating soldiers and civilians and destroyed the fort.</p> <p>While the first attempt at settling Chicago by the United States ended in disaster, the government was determined to settle the west, and the Chicago area was a priority. Though the fledgling government was bankrupt from the war, they acquired 2000 square miles around the mouth of the Chicago River from the Native Americans and authorized the Illinois government to build a canal. However, the year-old state government didn’t have the $700,000 required to dig the canal, and the project was dropped. The federal government eventually set aside some money to build a harbor and built a pier 1,000 feet into the lake. Supervising engineer Jefferson Davis did not realize that said pier would wreak havoc with the southern shoreline and the price Chicago would pay to save it.</p> <p>The federal government, eager for cash, fell back on a familiar strategy: buy the lands from the Native Americans for a pittance, force them to reservations west of the Mississippi, and resell the land to homesteaders at inflated prices. In order to attract settlers and fund the canal, the state of Illinois was granted half of the 2,000 square miles acquired earlier, including all of the land along the Chicago river. As for the Potawatomi, they settled in Kansas, a poor people. But the lands they left behind would become one of the wealthiest metropolises the world had seen.</p> <h2 id="boom-town">Boom Town</h2> <center> <figure class="figure mx-auto d-block"> <img class="figure-img img-fluid rounded" src="/assets/chicago_1868.webp" alt="Chicago circa 1868" title="The USS Cochino" /> <figcaption class="figure-caption">Chicago circa 1868</figcaption> </figure> </center> <p>With a new harbor and the natives removed, Illinois and the federal government went about selling their newly acquired land. However, there was little demand for it until 1835, when the Illinois Legislature finally got backing for a canal from eastern bankers. Speculators who had bought lots a few months ago resold them for three to four times what they paid. As word spread that Chicago would make you wealthy, hustlers poured in to buy land. In two short years, Chicago had grown from a muddy village of 200 to 3,260. In two more years, it would incorporate as the City of Chicago rather than the Town of Chicago.</p> <p>The canal broke ground on July 4th, 1836. After many long speeches and a fight with children who had put mud in the official wheelbarrow, Chicago dignitaries shoveled the first dirt of what would become the Illinois and Michigan Canal. Of course, building the canal was easier said than done. The original <span>$</span>700,000 estimate ballooned into <span>$</span>8 million, and the first 20 of 28 miles turned out to be limestone rather than soft clay. By the time the canal was finished in 1848, city leaders were saying that what the city really needed was a railroad. But with the opening of the canal, Chicago boomed again, growing from 20,000 to 30,000 in two years. </p> <p>The city was not a pleasant place to live. Nobody had thought to drain the soil or pave the muddy streets. Swedish immigrant Gustaf Unionius wrote:</p> <blockquote> <p>The surroundings harmonize with the general character of the city - with a few exceptions, resembling a trash can … The entire area might be likened to a vast mud puddle. I saw, again and again, elegantly dressed women standing on street corners waiting for some dray in which they might ride across the street.</p> </blockquote> <p>Human and animal waste flowed into the Chicago River and drained into Lake Michigan. A water pipe extending only 150 feet into the lake sucked that waste back into the city’s water supply. Cholera and typhoid plagued the city, killing 5% of the population in an 1854 epidemic.</p> <p>Beyond smelling foul and creating a health hazard, the harbor built by Jefferson Davis began to reshape the geography of Chicago. The north side of the pier collected sand, creating natural landfill, but the south side of the pier began to erode. After each storm, Michigan Avenue flooded. The wealthy who had built mansions facing Lake Park demanded their property be protected, and Chicago leaders asked the federal government for funds to construct a breakwater. Washington refused, forcing the perpetually broke city and legislature to find another solution to save Michigan Avenue. They found a savior in the Illinois Central Railroad, which volunteered to construct the breakwater. All they wanted was the shoreline.</p> <p>The Illinois Central had powerful backers, including Senator Stephen Douglas and Representative John Wentworth. They preferred a terminal in the western, industrial part of the city, but had acquired land near the lake, and would settle for it. Mayor Walter Gurnee was in a bind. If he allowed the railroad to be built, his neighbors would be at his throat for putting train tracks in their front yard. If he didn’t, their houses would float away. Matters came to a head at a City Council meeting on December 29, 1851, where an ordinance passed to grant the land to the Illinois Central. Gurnee vetoed the ordinance. However, North and West Side constituents pressured their aldermen to overturn the veto. After all, the city would eventually have to construct a breakwater. They would prefer the cost to come out of the pockets of the Illinois Central than their own taxes.</p> <p>In June, Gurnee’s veto was overturned. The result was a compromise that everyone would come to hate. The Illinois Central lost all hope of a terminal where it wanted, would be prohibited in court from expanding, and eventually forced to spend a fortune covering its tracks. The city, when it was finally able to fill in the lake and build a lakefront park, was stymied by the railroad tracks. And when the tracks were covered, another fight would erupt over who owned the air rights. But in 1852, nobody complained.</p> <p>Chicago would soon become the railroad capital of the world. In 1850, only one line entered Chicago. In 1856, Chicago would host 10 trunk lines with a combined 3,000 miles of track. 58 passenger trains and 38 freight trains entered and departed the city daily. The population of the city tripled, from 38,700 in 1852 to 120,000 in 1857. Along the new railroad tracks, industry sprang up: warehouses, factories, and packinghouses. It was not an orderly planned city, and city leaders would spend decades attempting to consolidate the railroads.</p> <p>But what the railroads created in disorder, they made up for in wealth. Enough wealth for the city to attack its chief problem, sewage. A new intake pipe two miles into the lake was constructed, and the Illinois and Michigan Canal was dredged deep enough to reverse the flow of the Chicago River into the Illinois River rather than the lake. The world’s second underground sewage system started construction in 1856. Brick sewers were laid, then covered by raising the streets. The first floors of houses became semi-basements, a Chicago architecture tradition that continues to this day. Other houses were moved by sled to another part of the city, with the occupants inside going about their business. One tavern was even moved with patrons drinking inside. </p> <p>The Illinois Central, hungry for more lakefront land, bribed the legislature in 1869 to give them full control of Chicago’s harbor. As part of the deal, the railroad would pay the state <span>$</span>800,000 for the land, to be used as a park fund for Chicago. Governor John M. Palmer vetoed the bill, complaining that the land was worth $2.6 million and Chicago could permanently lose its harbor. The legislature overrode his veto but repealed the law four years later in the face of public opposition. However, the Illinois Central insisted the act was a contract and irrevocable. It continued to fill in the lake until the Supreme Court ruled that Illinois had a right to repeal the sale in <em>Illinois Central Railroad Co. v. Illinois</em>. The city would spend the next hundred years struggling to reclaim that lakeshore.</p> Sun, 23 Feb 2025 00:00:00 -0600 https://ahalbert.com/blog/2025/02/23/notes_on_early_chicago.html https://ahalbert.com/blog/2025/02/23/notes_on_early_chicago.html Blog Lives of Girls and Women <p><strong>Lives of Girls and Women</strong>. By Alice Munro. 254 pages.</p> <p><em>Lives of Girls and Women</em> is marketed as a novel, but it’s more of a collection of interlinked short stories with no overarching plot. Alice Munro focuses on the ordinary in these stories, following Del Jordan as she grows up in the small town of Jubilee, Ontario, shortly after World War II. Jubilee’s population is quite parochial; they do not think much of ambition, those who violate social norms, or outsiders. However, it does harbor its share of secrets and eccentrics, for the townspeople need something to gossip about. Characterization really stands out in the novel; Munro spends a lot of time developing her characters, and no-one is too insignificant for a personality.</p> <p>As the title suggests, the book focuses on the lives of women in Jubilee. Many of the stories are driven by Del’s relationship with her mother, Ada. Not content to live a life of domesticity expected by gender roles, she is a relentless social climber, looking to move from the outskirts of the town (the Flats Road) to Jubilee proper. Ada is outspoken, writing letters to the newspaper about issues such as contraception, which Del finds embarrassing. Del often finds herself at odds with her mother; where her mother is an atheist and intellectual, Del seeks God and the sensual.</p> <p>While embarrassed by her mother, Del also desires to protect her from the judgment of others, especially her aunts Elspeth and Grace. They criticize Ada for taking a job as an encyclopedia saleswoman, noting how a job leaves little time for ironing. The aunts believe that in addition to maintaining a household, a woman’s job is to keep up the appearances of their social class. Del notices how her aunts live and contrasts it to her poorer lifestyle:</p> <blockquote> <p>They wore dark cotton dresses with fresh, perfectly starched and ironed, white lawn collars, china flower brooches. Their house had a chiming clock, which delicately marked the quarter hours; also watered ferns, African violets, crocheted runners, fringed blinds, and over everything the clean, reproachful smell of wax and lemons.</p> </blockquote> <p>Aunt Elspeth and Grace easily align with stereotypical ideas of womanhood because they can afford to do so. They are quick to criticize and mock anyone for behaving lower-class, which comes from their own insecurity. Much as Del worries about her aunts’ judgment of her mother, they worry about the judgment of others, even the lower classes they look down on. Ada, however, realizes that their values are a trap for her and her daughter’s future. Munro uses the metaphor of a cobweb to describe this trap:</p> <blockquote> <p>Aunt Elspeth and Auntie Grace wove in and out around her, retreating and disappearing and coming back, slippery and soft-voiced and indestructible. She pushed them out of her way as if they were cobwebs;</p> </blockquote> <p>To Ada, the values of Jubilee are a spider web waiting to ensnare the unsuspecting. Ada desires an independent life, a life different from the expectations imposed on her. But it is not an easy struggle; Munro describes the webs being spun as indestructible. While Ada rejects many of the anti-intellectual traits of others around her, she does share their obsession with class. She is constantly striving to improve her social class and is contemptuous of the poverty she finds herself in, reminding her daughter that they don’t live <em>on</em> the Flats Road, but <em>at the end</em> of the Flats Road.</p> <blockquote> <p>My mother corrected me when I said we lived on the Flats Road; she said we lived at the end of the Flats Road, as if that made all the difference. Later on she was to find she did not belong in Jubilee either.</p> </blockquote> <p>Ada’s values lead her to look forward, at the expense of avoiding her past. She tells her daughter that she forgives her brother Bill for sexually abusing her as a child, instead focusing on how he is dying of cancer and that he left her $300 in her will. She is an active participant in her life, determined to leave the poverty she grew up in behind. But despite all her efforts, Ada’s desires do not come to fruition; she does not free herself from Jubilee. Her independent streak also isolates her. She attempts to connect with the other women of Jubilee but is judged for not living up to the feminine ideal. Ada never overcomes the feeling of being a failure, and it drives her to the sick bed. But all is not lost; Del will have the life of the mind she desires, the life of a writer.</p> <p>While Del has her differences with her mother, she is more like her mother than she realizes. They both are rebels, defying the gender and social norms of Jubilee. Del is intellectually gifted and ambitious, an honors student who seeks a scholarship while her classmates drop out and get jobs. Intellectual pursuits are looked down upon in Jubilee in favor of the world of work and domestic life:</p> <blockquote> <p>This was the normal thing in Jubilee; reading books was something like chewing gum, a habit to be abandoned when the seriousness and satisfactions of adult life took over. It persisted mostly in unmarried ladies, would have been shameful in a man.</p> </blockquote> <p>Ada models the intellectual values the town disdains for her daughter; she connects with her through literature and science and encourages her curiosity. Del might wish her mother had not taken a job as an encyclopedia saleswoman, but she loves the encyclopedias themselves. Del devours the facts within, to the point where her mother uses her as part of her sales pitch; she has Del recite the facts she has learned, from American presidents to the capitals of South America. While Del does not appreciate being used as a prop in her mother’s job, she does take a quiet pride in her knowledge being useful.</p> <p>Of course, as a rebel, Del must also defy her mother. Each of the stories in the novel involves Del exploring her identity through new experiences, often conflicting with her mother in the process. In the story <em>Age of Faith</em>, mother and daughter clash over religion. Del has an intense desire to experience God. Ada, on the other hand, suffered under her religious mother and is a staunch atheist/agnostic. When her daughter goes to an Anglican church, Ada goes on a tirade:</p> <blockquote> <p>“God was made by man! Not the other way around! God was made by man. Man at a lower and bloodthirstier stage of his development than he is at now, we hope. Man made God in his own image.”</p> </blockquote> <p>Del visits the church anyways, hoping to get a glimpse of what it means to live as a person of faith. It does not last; Del drops her interest in religion. She needs proof of God and does not find it, saying that “The question of whether God existed or not never came up in Church”.  This frustrates her to no end; from her perspective, the church focuses too much on what God approves of, or more often, what He does not approve of. Even when the minister touches on Jesus’s moment of doubt, Del desires more:</p> <blockquote> <p><em>My God, my God, why hast thou forsaken me?</em> Briefly, the minister said, oh very briefly, Jesus had lost touch with God. Yes, it had happened, even to Him. He had lost the connection, and then in the darkness He had cried out in despair. But this too was part of the plan, it was necessary. It was so we should know in our own blackest moments that our doubts, our misery had been shared by Christ Himself, and then, knowing this, our doubts would all the more quickly pass. But why? Why should they all the more quickly pass? Suppose that was the last true cry of Christ, the last true thing ever heard of Him? We had to at least suppose that, didn’t we? We had to consider it. Suppose He cried that, and died, and never did rise again, never did discover it was all God’s difficult drama? There was suffering. Yes; think of Him suddenly realizing: it was not true. None of it was true. Pain of torn hands and feet was nothing to that. To look through the slats of the world, having come all that way, and say what He had said, and then see—nothing. Talk about that! I cried inwardly to the minister. Oh, talk about that, drag it into the open, and then—defeat it!</p> </blockquote> <p>Atheism is not the only thing mother and daughter disagree on. As Del grows up, she increasingly becomes interested in relationships with others, especially boys. Ada is not a fan of sex, seeing it as a tool of women’s oppression:</p> <blockquote> <p>my mother, who would publicly campaign for birth control but would never even think she needed to talk to me, so firmly was she convinced that sex was something no woman—no <em>intelligent</em> woman—would ever submit to unless she had to.</p> </blockquote> <p>Del, however, is relentlessly curious about it, picking up any book or magazine that discusses the subject. She constantly thinks about the sex lives of others, using them as a model for her own relationships. Del also begins exploring her own sexuality, desiring others, and wanting to be desired. Some of these experiences are not necessarily good for her. In the story <em>Lives of Girls and Women</em>, Del is molested by an older man. Munro does not depict it as unambiguously bad - Del is excited by it and wants it to continue. She does not realize he is taking advantage of her naïveté.</p> <p>I have mixed feelings about this story, especially in light of the <a href="https://www.vox.com/culture/359588/alice-munro-daughter-andrea-skinner-gerald-fremlin-sexual-abuse">allegations</a> made by Munro’s daughter. Reading it, it does not surprise me that the author apparently ignored the sexual assault of her daughter by her husband and may have even believed that her then-nine-year-old daughter was inviting it. Del goes out of her way to create opportunities for the man to touch her and craves his attention. On the other hand, Munro does not portray Del’s molestation as unambiguously good either; a major theme of the story is sexual exploitation of others and Del’s naïveté towards it. In the story, the molester discusses his war experiences in Italy with her mother, mentioning that he saw girls being sold as slaves. Del fantasizes about herself being exploited in such a way, allowing her to act out her sexual fantasies while being blameless for what happens. She does not consider if those slave girls like their position or appreciate being used.</p> <p>Del’s other relationships are more age-appropriate. In <em>Baptizing</em>, she meets Garnet French at a baptist religious revival. She is smitten at first sight, and they begin a courtship. The relationship quickly becomes the focus of her life, and she ignores the advice by her mother not to let her life get sidetracked by a boy:</p> <blockquote> <p>“There is a change coming I think in the lives of girls and women. Yes. But it is up to us to make it come. All women have had up till now has been their connection with men. All we have had. No more lives of our own, really, than domestic animals. <em>He shall hold thee, when his passion shall have spent its novel force, a little closer than his dog, a little dearer than his horse.</em> Tennyson wrote that. It’s true.”</p> </blockquote> <p>Her mother’s fears come to pass; Del is distracted by Garnet and stops studying. As a result, she does not pass her test for the scholarship that she has been working her whole life for. She still becomes a writer, but does not reach the heights her mother imagined for her.</p> <p>By the end of the novel, Del achieves a level of understanding and acceptance of her mother. While she has carved out her own path and beliefs, she appreciates the foundation Ada provided for her life. Their relationship matures into one of mutual recognition and respect, with both characters acknowledging each other’s complexities and the role they play in each other’s lives.</p> <p>I usually find the picks for the Nobel Prize in Literature pretentious and boring. In contrast, Alice Munro clearly deserves the prize - she has a singular talent for building characters and capturing their inner thoughts. This collection of short stories perfectly captures a mother-daughter relationship as a girl grows up and discovers herself. Del’s quest for identity in a world that seeks to limit her will resonate with a lot of readers. This book is a crowning achievement of literature and cements Munro’s reputation as master of the short story.</p> Sun, 21 Jul 2024 00:00:00 -0500 https://ahalbert.com/reviews/2024/07/21/lives_of_girls_and_women.html https://ahalbert.com/reviews/2024/07/21/lives_of_girls_and_women.html Reviews