Eagle's Path

Passion and dispassion. Choose two.

Larry Wall

2019-05-31: podlators 4.12

This release only fixes a test suite issue. I've been putting it off for ages because I was hoping to pick up some previous discussions and make some more substantive changes, but that hasn't happened yet and I keep getting mail from failing tests. Worse, a few other people have investigated the problem helpfully, and I don't want to waste more of anyone's time!

Also, I noticed I'd not posted anything but book reviews for this month, so wanted to do at least one software release, even if trivial.

Anyway, sometimes the Encode module gets loaded before the test suite for podlators, which makes it impossible to test the warnings that happen if Encode isn't available. That's fine, except that the test failed entirely in that case, instead of being skipped. This release fixes it to be skipped properly.

You can get the latest release from the podlators distribution page.

2019-05-30: Review: Bad Blood

Review: Bad Blood, by John Carreyrou

Publisher Alfred A. Knopf
Copyright 2018
ISBN 1-5247-3166-8
Format Kindle
Pages 302

Theranos was a Silicon Valley biotech startup founded by Elizabeth Holmes in 2003. She was a sophomore chemical engineering major at Stanford University when she dropped out to start the company. Theranos's promised innovation was a way to perform blood tests quickly and easily with considerably less blood than was used by normal testing methods. Their centerpiece product was supposed to be a sleek, compact, modern-looking diagnostic device that could use a finger-stick and a small ampule of blood to run multiple automated tests and provide near-immediate results.

Today, Holmes and former Theranos president Ramesh "Sunny" Balwani are facing federal charges of wire fraud. Theranos, despite never producing a working product, burned through $700 million of venture capital funding. Most, possibly all, public demonstrations of their device were faked. Most of their partnerships and contracts fell through. For the rare ones where Theranos actually did testing, they either used industry-standard equipment (not their own products) or sent the samples to other labs.

John Carreyrou is the Wall Street Journal reporter who first broke the story of Theranos's fraud in October of 2015. This book is an expansion of his original reporting. It's also, in the last third or so, the story of that reporting itself, including Theranos's aggressive attempts to quash his story, via both politics and targeted harassment, which were orchestrated by Theranos legal counsel and board member David Boies. (If you had any respect for David Boies due to his association with the Microsoft anti-trust case or Bush v. Gore, this book, along with the similar tactics his firm appears to have used in support of Harvey Weinstein, should relieve you of it. It's depressing, if predictable, that he's not facing criminal charges alongside Holmes and Balwani.)

Long-form investigative journalism about corporate malfeasance is unfortunately a very niche genre and deserves to be celebrated whenever it appears, but even putting that aside, Bad Blood is an excellent book. Carreyrou provides a magnificent and detailed account of the company's growth, internal politics, goals, and strangely unstoppable momentum even while their engineering faced setback after setback. This is a thorough, detailed, and careful treatment that draws boundaries between what Carreyrou has sources for and what he has tried to reconstruct. Because the story of the reporting itself is included, the reader can also draw their own conclusions about Carreyrou's sources and their credibility. And, of course, all the subsequent legal cases against the company have helped him considerably by making many internal documents part of court records.

Silicon Valley is littered with failed startups with too-ambitious product ideas that were not practical. The unusual thing about Theranos is that they managed to stay ahead of the money curve and the failure to build a working prototype for surprisingly long, clawing their way to a $10 billion valuation and biotech unicorn status on the basis of little more than charisma, fakery, and a compelling story. It's astonishing, and rather scary, just how many high-profile people like Boies they managed to attract to a product that never worked and is probably scientifically impossible as described in their marketing, and just how much effort it took to get government agencies like the CMS and FDA to finally close them down.

But, at the same time, I found Bad Blood oddly optimistic because, in the end, the system worked. Not as well as it should have, and not as fast as it should have: Theranos did test actual patients (badly), and probably caused at least some medical harm. But while the venture capital money poured in and Holmes charmed executives and negotiated partnerships, other companies kept testing Theranos's actual results and then quietly backing away. Theranos was forced to send samples to outside testing companies to receive proper testing, and to set up a lab using traditional equipment. And they were eventually shut down by federal regulatory agencies, albeit only after Carreyrou's story broke.

As someone who works in Silicon Valley, I also found the employment dynamics at Theranos fascinating. Holmes, and particularly Balwani when he later joined, ran the company in silos, kept secrets between divisions, and made it very hard for employees to understand what was happening. But, despite that, the history of the company is full of people joining, working there for a year or two, realizing that something wasn't right, and quietly leaving. Theranos management succeeded in keeping enough secrets that no one was able to blow the whistle, but the engineers they tried to hire showed a lot of caution and willingness to cut their losses and walk away. It's not surprising that the company seemed to shift, in its later years, towards new college grads or workers on restrictive immigration visas who had less experience and confidence or would find it harder to switch companies. There's a story here about the benefits of a tight job market and employees who feel empowered to walk off a job. (I should be clear that, while a common theme, this was not universal, and Theranos arguably caused one employee suicide from the stress.)

But if engineers, business partners, a reporter, and eventually regulatory agencies saw through Theranos's fraud, if murkily and slowly, this is also a story of the people who did not. If you are inclined to believe that the prominent conservative Republican figures of the military and foreign policy establishment are wise and thoughtful people, Bad Blood is going to be uncomfortable reading. James Mattis, who served as Trump's Secretary of Defense, was a Theranos booster and board member, and tried to pressure the Department of Defense into using the company's completely untested and fraudulent product for field-testing blood samples from soldiers. One of Carreyrou's main sources was George Shultz's grandson, who repeatedly tried to warn his grandfather of what was going on at Theranos while the elder Republican statesman was on Theranos's board and recruiting other board members from the Hoover Institute, including Henry Kissinger. Apparently the film documentary version of Bad Blood is somewhat kinder to Shultz, but the book is methodically brutal. He comes across as a blithering idiot who repeatedly believed Holmes and Theranos management over his grandson on the basis of his supposed ability to read and evaluate people.

If you are reading this book, I do recommend that you search for video of Elizabeth Holmes speaking. Carreyrou mentions her personal charisma, but it's worth seeing first-hand, and makes some of Theranos's story more believable. She has a way of projecting sincerity directly into the camera that's quite remarkable and is hard to describe in writing, and she tells a very good story about the benefits of easier and less painful (and less needle-filled) blood testing. I have nothing but contempt for people like Boies, Mattis, and Shultz who abdicated their ethical responsibility as board members to check the details and specifics regardless of personal impressions. In a just world with proper legal regulation of corporate boards they would be facing criminal charges along with Holmes. But I can see how Holmes convinced the media and the public that the company was on to something huge. It's very hard to believe that someone who touts a great advancement in human welfare with winning sincerity may be simply lying. Con artists have been exploiting this for all of human history.

I've lived in or near Palo Alto for 25 years and work in Silicon Valley, which made some of the local details of Carreyrou's account fascinating, such as the mention of the Old Pro bar as a site for after-work social meetings. There were a handful of places where Carreyrou got some details wrong, such as his excessive emphasis on the required non-disclosure agreements for visitors to Theranos's office. (For better or ill, this is completely routine for Silicon Valley companies and regularly recommended by corporate counsel, not a sign of abnormal paranoia around secrecy.) But the vast majority of the account rang true, including the odd relationship between Stanford faculty and startups, and between Stanford and the denizens of the Hoover Institute.

Bad Blood is my favorite piece of long-form journalism since Bethany McLean and Peter Elkin's The Smartest Guys in the Room about Enron, and it is very much in the same mold. I've barely touched on all the nuances and surprising characters in this saga. This is excellent, informative, and fascinating work. I'm still thinking about what went wrong and what went right, how we as a society can do better, and the ways in which our regulatory and business system largely worked to stop the worst of the damage, no thanks to people like David Boies and George Shultz.

Highly recommended.

Rating: 9 out of 10

2019-05-28: Review: Nimona

Review: Nimona, by Noelle Stevenson

Publisher HarperTeen
Copyright 2015
ISBN 0-06-227822-3
Format Graphic novel
Pages 266

Ballister Blackheart is a supervillain, the most notorious supervillain in the kingdom. He used to be a knight, in training at the Institute alongside his friend Goldenloin. But then he defeated Goldenloin in a joust and Goldenloin blew his arm off with a hidden weapon. Now, he plots against the Institute and their hero Sir Goldenloin, although he still follows certain rules.

Nimona, on the other hand, is not convinced by rules. She shows up unexpectedly at Ballister's lair, declaring herself to be his sidekick, winning him over to the idea when she shows that she's also a shapeshifter. And Ballister certainly can't argue with her effectiveness, but her unconstrained enthusiasm for nefarious schemes is rather disconcerting. Ballister, Goldenloin, and the Institute have spent years in a careful dance with unspoken rules that preserved a status quo. Nimona doesn't care about the status quo at all.

Nimona is the collected form of a web comic published between 2012 and 2014. It has the growth curve of a lot of web comics: the first few chapters are lightweight and tend more towards gags, the art starts off fairly rough, and there is more humor than plot. But by chapter four, Stevenson is focusing primarily on the fascinating relationship between Ballister and Nimona, and there are signs that Nimona's gleeful enthusiasm for villainy is hiding something more painful. Meanwhile, the Institute, Goldenloin's employer, quickly takes a turn for the sinister. They're less an organization of superheroes than a shadow government with some dubious goals, and Ballister starts looking less like a supervillain and more like a political revolutionary.

Nimona has some ideas about revolution, most of them rather violent.

At the start of this collection, I wasn't sure how much I'd like it. It's mildly amusing in a gag sort of way while playing with cliches and muddling together fantasy, science fiction, faux-medieval politics, sinister organizations, and superheros. But the story deepens as it continues. Ballister starts off caring about Nimona because he's a fundamentally decent person, but she becomes a much-needed friend. Nimona's villain-worship, to coin a phrase, turns into something more nuanced. And while that's happening, the Institute becomes increasingly sinister, and increasingly dangerous. By the second half of the collection, despite the somewhat excessive number of fight scenes, it was very hard to put down.

Sadly, I didn't think that Stevenson landed the ending. It's not egregiously bad, and the last page partly salvages it, but it wasn't the emotionally satisfying catharsis that I was looking for. The story got surprisingly dark, and I wanted a bit more of a burst of optimism and happiness at the end.

I thought the art was good but not great. The art gets more detailed and more nuanced as the story deepens, but Stevenson stays with a flat, stylized appearance to her characters. The emotional weight comes mostly from the dialogue and from Nimona's expressive transformations rather than the thin and simple faces. But there's a lot of energy in the art, a lot of drama when appropriate, and some great transitions from human scale to the scale of powerful monsters.

That said, I do have one major complaint: the lettering. It's hand-lettered (so far as I can tell) in a way that adds a distinctive style, but the lettering is also small, wavers a bit, and is sometimes quite hard to read. Standard comic lettering is, among other things, highly readable in small sizes; Stevenson's more individual lettering is not, and I occasionally struggled with it.

Overall, this isn't in my top tier of graphic novels, but it was an enjoyable afternoon's reading that hooked me thoroughly and that I was never tempted to put down. I think it's a relatively fast read, since there are a lot of fight scenes and not a lot of detail that invites lingering over the page. I wish the lettering were more uniform and I wasn't entirely happy with the ending, but if slowly-developing unexpected friendship, high drama, and an irrepressible shapeshifter who is more in need of a friend than she appears sounds like something you'd like, give this a try.

Rating: 7 out of 10

2019-05-27: Review: Finnish Nightmares

Review: Finnish Nightmares, by Karoliina Korhonen

Publisher Atena
Copyright 2018
ISBN 952-300-222-8
Format Hardcover
Pages 87

Meet Matti. A typical Finn who appreciates peace, quiet and personal space. If you feel somewhat uncomfortable when reading this book, you just might have a tiny Matti living in you.

Finnish Nightmares is a hardcover collection of mostly single-panel strips from the on-line comic of the same name. They're simple line drawings, mostly in black and white with small, strategic use of color, portraying various situations that make Matti, a stereotypical Finn, uncomfortable (and a few at the end, in the Finnish Daydreams chapter, that make him happy).

This is partly about Finnish culture and a lot about introversion and shyness. Many of these cartoons will be ruefully familiar to those of us who are made uncomfortable by social interactions with strangers. A few made me curious enough about Finnish customs to do a bit of Google research, particularly the heippalappu, an anonymous note left in an apartment hallway for the neighbors, which has no name in English and is generally decried as "passive aggressive." A Google search for heippalappu returns tons of photographs of notes, all in Finnish that I can't read, and now I'm fascinated.

I have seen US jokes and cartoons along similar lines, but in US culture I think it's more common for those to either poke some fun at the introverted person or to represent introverted people trying to navigate a world that's not designed for them. Finnish Nightmares instead presents the introverted position as the social norm that other people may be violating, which is a subtle but important shift. Matti's feelings are supported and shown as typical, and the things that make him uncomfortable are things that maybe the other person should not be doing. Speaking as someone who likes lots of quiet and personal space, it makes Finland seem very attractive.

I am very much the target audience for this book. "When you want to leave your apartment but your neighbor is in the hallway" is something I have actually done, but I've never heard anyone else mention. Likewise "when the weather is horrible, but the only shelter is occupied" (and I appreciated the long list of public transport awkwardness). I think my favorite in the whole book is "when someone's doing something 'wrong' and staring at them intensely won't make them stop."

This was a gift from a friend (who, yes, is a Finn), so I read the English version published in Finland. That edition doesn't appear to be available at the moment from US Amazon, but it looks like it will be coming out in both hardcover and Kindle in August of 2019 from Ten Speed Press. It's a thin and short collection, just an hour or two of browsing at most, but it put a smile on my face and was an excellent gift.

Rating: 7 out of 10

2019-05-26: Review: Cold Fire

Review: Cold Fire, by Kate Elliott

Series Spiritwalker #2
Publisher Orbit
Copyright September 2011
ISBN 0-316-19635-5
Format Kindle
Pages 512

Cold Fire is the sequel to Cold Magic and picks up directly where the last book left off. Elliott does a good job reminding the reader of the events in the previous book, but as the second book in a series with strong trilogy structure, it's not a good place to start.

The story opens with more political intrigue. Cat, Bea, and Rory meet, somewhat more formally, the force behind the political radicals, who comes complete with intimidating prophecies about the role of Cat and Bea in upcoming political upheavals. This is followed by some startling revelations about the headmaster of the school Cat and Bea were attending at the start of Cold Magic, which cast the politics of this series in a new and more complicated light. But before long, Cat is thrown into the spirit world for a frightening, revealing, and ominous confrontation with an entirely different power, and from there to literally the other side of the world.

The challenge of a trilogy is always what to do in the second book. The first book introduces the characters and lays the groundwork of the story, and the third book is the conclusion towards which the whole series builds. The second book is... awkward. The plot needs to move forward to keep the reader engaged, so it needs some intermediate climax, but it can't resolve the central conflict of the series. The problem is particularly acute when the trilogy is telling a single story split across three books, as is the case here. Elliott takes one of the limited choices: throw the protagonist into an entirely different side quest that can have its own climax without resolving the main plot.

That side quest involves this world's version of the Caribbean, an introduction to a much different type of magic than the two (or arguably three) seen so far, and the salt plague. Cat washes up with little but the clothes on her back, in the worst possible location, and has to navigate a new social structure, a new set of political complexities, and an entirely foreign culture, all while caught in a magical geas. The characters from the first book do slowly filter back into the story, but Cat has to rely primarily on her own ingenuity and her own abilities.

I know very little about the region and therefore am not the reviewer to comment on Elliott's Caribbean, although I do think she was wise (as she mentions in the book) to invent an entirely fictional patois rather than trying to adopt one from our world. I can say that the political situation follows the overall trend of this series: what if no one ever decisively won a war, and every culture remained in an uneasy standoff? This story takes place in Expedition (referred to a few times in the first book): a carved-out enclave of independent local rule that serves as a buffer between traders from Cat's Europe and a powerful local civilization built on substantial fire magic. The trolls are here too and play a significant role, although this is not their home. The careful balance of power, and the lack of conquest or significant colonialism, feel refreshingly different. Elliott manages to pull off combining that world with the threat of a version of the Napoleonic Wars without too much cognitive dissonance, at least for me.

The strength of this book is its ability to portray the simmering anger and hope of rebellion and radicalism. The background politics are clearly inspired by the French Revolution and the subsequent popular uprisings such as the June Rebellion (known in the US primarily due to Les Miserables), and they feel right to me. Society is fractured along class fault lines, people are careful about what they say and to whom, radicals meet semi-openly but not too openly, and the powers-that-be periodically try to crush them and re-establish dominance. But beneath the anger and energy is an excited, soaring optimism, a glimpse at a possible better world to fight for, that I enjoyed as an emotional backdrop to Cat's story.

That said, none of this moves the plot of the first book forward very far, which is a little unsatisfying. We're given some significant revelations about the world at the very start of this book, and pick up the fraught political maneuverings and multi-sided magical conflict at the end of the book, but the middle is mostly Cat navigating friendships and social judgment. Oh, and romantic tensions.

It was obvious from the first book that this was going to turn into a romance of the "bicker until they fall in love" variety. I'm somewhat glad Elliott didn't drag that out into the third book, since I find the intermediate stages of those romances irritating. But that means there's a lot of conflicted feelings and people refusing to talk to each other and miscommunication and misunderstanding and apparent betrayal in this book. It's all very dramatic in a way that I found a little eye-roll-inducing, and I would have preferred to do without some of the nastier periods of blatant miscommunication. But Elliott does even more work to redeem Andevai, and I continue to like Cat even when she's being an idiot. She has the substantial merits of erring on the side of fighting for what she believes and being unable to stay quiet when she probably should.

I think this was a bit weaker than Cold Magic for primarily structural reasons, and it ran into a few of my personal dislikes, but if you liked the first book, I think you'll like this as well. Both Cat and Bea have grown and changed substantially since the first book, and are entering the final book with new-found confidence and power. I'm looking forward to the conclusion.

Followed by Cold Steel.

Rating: 7 out of 10

2019-05-25: Review: The Raven Tower

Review: The Raven Tower, by Ann Leckie

Publisher Orbit
Copyright February 2019
ISBN 0-316-38871-8
Format Kindle
Pages 432

Mawat is the heir to the Raven's Lease, raised with the self-assurance, determination, stubbornness, and certainty of one who will become the interface between his people and their god. Thankfully, he also has some good sense. One sign of that good sense is Eolo, his servant and companion: thoughtful, careful, curious, guarded, and well-accustomed to keeping secrets and private counsel. Eolo is the window through which the reader sees the city-state of Vastai, confident and certain in its divine protection and its long-standing bargain with the god Raven.

Raven manifests in the Instrument, a designated raven who can speak and give advice to the ruler of Vastai, the Raven's Lease. The Lease cannot be harmed, cannot be killed, because they are a sacrifice to the Raven. When the Instrument dies, so does the Lease, and a new Lease is chosen as the new Instrument is hatched. Vastai and the kingdom of Iraden have flourished under this arrangement for centuries. Mawat, hot-headed and sure of himself, will be the next Lease once his father sacrifices his life to the Raven. As this book opens, Mawat and Eolo are hurrying back to the city in anticipation of that event.

Mawat is very surprised when he arrives in Vastai and finds the Instrument dead, his uncle the apparent new Raven's Lease, and his father supposedly fled but not properly dead as the expected sacrifice. This is not how the world was supposed to work. Either someone is lying, or things have gone horribly wrong.

In another fantasy novel, that would be the story. Hot-headed but good-hearted Mawat walks into unexpected political intrigue, and his loyal and cautious servant Eolo untangles it for him, proving that Mawat's one redeeming feature is his good choice in friends. This is not that book, because the protagonist of The Raven Tower is not actually Eolo.

The protagonist is a large rock.

This is the second work I've read recently, after N.K. Jemisin's Broken Earth trilogy, that uses a second-person narrator as a world-building hint. From the start of The Raven Tower, Eolo is addressed as "you" and observed and commented on by the narrator. The easy initial assumption is that the narrator is the Raven, but if so there's a drastic mismatch between how the people of Iraden see their god and how the narrator describes events. The reader learns more about the nature of the narrator only slowly, through flashbacks into the far past. It becomes clear quickly that the narrator is a god, a being whose every statement must either be true, become true, or lead to their death. What god, and how the narrator relates to Raven, Eolo, Mawat, or the city of Vastai, remains murky until the very end of the book.

I think this story is going to wrong-foot some readers. It starts in the form of a fantasy political intrigue involving lines of succession made more complicated by divinity and magic, but that's not what The Raven Tower is about at all. The flashbacks are less background than the heart of the story: a slow and careful examination of the nature of power and the relationship between humans and gods in this world. If your reaction to the antics of the gods of classical mythology is bafflement at why they risk so much and involve themselves in so much drama, this might be the book for you.

I'm not sure I can do better than Light's comment in her review (spoilers in the comments): "I fuckin' love that rock." In a world full of gods who meddle and support kingdoms and go to wars, the narrator of this novel much prefers to watch and analyze and take time to draw proper conclusions. They're also prone to deciding to think about something for a week or two. This is a relentlessly self-aware and introspective book in a way that I found soothing and oddly compelling, particularly once the narrator rock makes friends largely by accident and has to work through the unexpected feelings of emotional entanglement. (My favorite supporting character in this book by far is Myriad, and it takes some doing to get me to fall in love with a mosquito swarm.) It turns into a story about restraint, careful navigation of dangerous situations, oppression, historical injustice, and a very long game.

The downside is that Eolo's story gets somewhat sidelined. The ending is going to be unsatisfying for a lot of readers since the surface story doesn't get a lot of closure. I liked Eolo for a whole host of reasons and wanted more of an end to their story than I got. (I'm using "they" for pronouns by default here. Eolo is trans and passing as male, but it's unclear to me from the story whether they identify as male or non-binary.) Eolo and Mawat provide an important outside perspective, and ground the longer story and make it more immediate, but they're present here more to provide key pieces of the puzzle than to drive the story themselves.

That caveat aside, I really enjoyed this book. It's less immediately engaging and emotionally engrossing than the Imperial Radch novels, but it's a story that slowly grew on me and will stick with me for a long time. There's something deeply relatable in how the narrator relentlessly examines their interactions with the world, and what makes them happy, sad, and interested, and still arrives at conclusions that are a messy combination of logic and emotion because that's what is actually true. The story is beautifully constructed to show that change over time. It's full of tradeoffs and limitations and partial truths, and it lets them sit there on the page and be felt rather than resolving all of them. It's the sort of novel that gets better the more I think about it.

Be warned going in that you're not getting the medieval court drama with gods that you may think you're getting, but otherwise, highly recommended.

Rating: 8 out of 10

2019-04-30: Haul post

I've not been posting much lately (or writing many book reviews) for a rather good reason: I got sucked into a bunch of open source programming work, including learning Selenium, a little bit of JavaScript, and a lot about web application internals. The project in question (currently called Merou, probably will be renamed) isn't that useful for anyone else quite yet, and is still kind of a mess, but we're slowly cleaning it up. It's nice to be working on open source for work again.

At some point I need to apply what I've learned to getting remctl's Python bindings off of Python 2 and make my web site not look like I haven't touched it since the early 2000s. It would be nice to have an extra 24 hours in each day.

Anyway, book purchasing has continued, of course.

Rachel Elise Barkow — Prisoners of Politics (nonfiction)
John Carreyrou — Bad Blood (nonfiction)
E.K. Johnston — The Afterward (sff)
Daniel Kahneman — Thinking, Fast and Slow (nonfiction)
Arkady Martine — A Memory Called Empire (sff)
Rebecca Roanhorse — Trail of Lightning (sff)

I'm currently significantly behind on writing reviews and need to take some time to catch up, but Minecraft keeps calling me....

2019-04-06: Review: Working Effectively with Legacy Code

Review: Working Effectively with Legacy Code, by Michael C. Feathers

Publisher Prentice Hall
Copyright 2004
Printing 2005
ISBN 0-13-117705-2
Format Trade paperback
Pages 419

Suppose that you're familiar with the principles of good software design, you understand the importance of breaking complex code apart into simpler components, you know how to write good test suites, and you can structure new code to be maintainable. However, as is so often the case, your job is not to write green-field code. It's to add or change some behavior of an existing system, and that existing system was written with complete disregard to (or prior to the widespread development of) all of those principles. How do you start?

That's the core topic of this somewhat deceptively titled book. The title arguably overpromises, since there are many aspects of working with legacy code that are not covered in this book (and couldn't be covered in any one book). Feathers further narrows the topic with a rather idiosyncratic definition of legacy: code without unit tests. The point of the techniques discussed here is to restructure the piece of code that you want to modify so that you can add tests (and, specifically, unit tests; Feathers barely mentions the existence of integration tests).

There are many perils in reading a book about programming that's this old, but Working Effectively with Legacy Code holds up surprisingly well, probably due to its very narrow focus. Code examples are in Java, C++, and C, which are still among the languages that one would expect to see in legacy code even today (although are a less comprehensive set than they were). This book is clearly from the early, excited days of agile and extreme programming and lacks some of the nuance that has later developed, but the constraint of working with legacy code forces compromises that keep it from being too "pure" of an agile diatribe, helping its continued relevance. Feathers is obsessed with unit testing, and I'll make some argument against that focus in a moment, but with legacy code defined as code lacking tests, unit tests are a reasonable place to start.

The vast majority of this book, including a long section of mechanical recipes at the back, is devoted to specific techniques to tease apart code where tangles prevent unit testing in isolation. Feathers's goal is to be able to unit-test only the piece of logic that you plan on changing, while making as few changes as possible to the rest of the code to avoid breaking other (untested) behavior. To do this, he describes a wide variety of refactoring techniques, some of which lead directly to better code, and some of which lead to much worse code in the short term but add seams where one can break code apart in a test harness and test it in isolation. The vast majority of these techniques involve using, and abusing, the object system of the language (including interfaces, subclassing, overrides, making methods and data public, and many other approaches), but he also covers techniques that work in C such as interposition or using the preprocessor. All of the C techniques he mentioned are ones that I've used in my own C code, and his analysis of pluses and drawbacks seemed largely accurate in each case, although he's far too willing to just throw a C++ compiler willy-nilly at a large C code base.

The parts of this book that are not focused on breaking up tangled code to allow for testing are focused on techniques for understanding that code. Feathers is a visual thinker, so a lot of his advice uses ways of drawing diagrams that try to capture dependencies, propagation of values, relationships between classes, possible refactorings, and other structural ideas of interest. I am not a very visual thinker when it comes to code structure, so I'm not the best person to critique this part of the book, but it seemed reasonable (and simple) to me.

Feathers mostly stops at getting code into a structure for which one can write unit tests, following his definition of legacy code as code without tests. Although he mentions integration testing a few times, he's also very focused on unit tests as the gold standard of testing, and is therefore extremely fond of fakes, mock classes, and other approaches to test classes in isolation. This goes hand-in-hand with a desire to make those unit tests extremely fast (and therefore extremely simple); Feathers's ideal would be tests that could run with each keystroke in an IDE and highlight test failures the way syntax failures are highlighted.

This is my largest point of disagreement with this book. I understand the appeal; when I started programming in a language that supported easy and flexible mocking (Python with the core mock module), it was a revelation. Those facilities, alongside interfaces and dependency injection which make it easy to substitute fakes inside unit tests, make it possible to test the logic of every class in isolation without setting up a more complex testing environment. But I've subsequently had a number of bad experiences with code that's comprehensively tested in this fashion, which has convinced me that it's more fragile than its advocates seem to acknowledge.

There are two, closely-related problems with this pure unit-testing approach: one starts testing the behavior of classes in isolation instead of the user-visible behavior of the application (which is what actually matters), and one starts encoding the internal structure of those classes in the test suite. The first problem, namely that each class can be correct to its specifications in isolation but the application as a whole could not work properly, can be caught by adding proper integration tests. The second problem is more insidious. One of the purposes of testing is to make refactoring and subsequent behavior changes easier and safer, but if every jot and tittle of the internal code structure is encoded in the test suite via all the mocks and fakes, a simple half hour of work refactoring the code as part of adding new functionality turns into hours of tedious work restructuring the tests to match. The result is to paradoxically discourage refactoring because of the painful changes then required to the tests, defeating one of the purposes of having tests.

Feathers, as is typical of books from the early days of agile, doesn't even mention this problem, and takes it as nearly a tautology that unit testing and mocking out of dependencies is desirable.

One of his repeated themes is finding a way to mock out database layers. I think this is the place where this book shows its age the most, since that discussion focuses removing the need for a managed test database, worries about colliding with other people's use of the same test database, and includes other comments that assume that a database is some external singleton outside of the development environment of the programmer. This already wasn't the case in 2004 when one could spin up a local instance of MySQL; now, with SQLite readily available for fast, temporary databases, it's trivial to write tests without mocking the storage layer (as long as one is careful about SQLite's lack of schema enforcement). For me, this tilts the balance even farther in favor of testing user-visible functionality across moderate-sized parts of the code base rather than isolated unit testing. I prefer to save the mocks and fakes for dependencies that are truly impossible to use in a test environment, such as external hardware or APIs that call out to services outside of the scope of the application.

I'm spending so much time on testing approaches because testing is the hidden core of this book. What Feathers primarily means by "working with" legacy code is testing legacy code, at least the part that you're changing. My dubiousness about his testing focus undermined some of his techniques for me, or at least made me wish for additional techniques that focused on testing integrated features. But, that caveat aside, this is a detailed look at how to untangle code and break dependencies, useful under any testing methodology. Feathers isn't afraid to get into the nitty-gritty and give specific examples and step-by-step instructions for ways to untangle code patterns safely in the absence of tests. Reading the whole book also provided me with a useful feel for the types of options I should be considering when tackling a messy bit of refactoring.

The audience for this book is people who already have a good understanding of object-oriented programming techniques, but are used to well-designed applications and want to expand their knowledge to some of the tricks one can use to unknot gnarly problems. It's nothing revolutionary, but if that describes you, it's a good resource.

Rating: 7 out of 10

2019-03-27: Review: Caliban's War

Review: Caliban's War, by James S.A. Corey

Series The Expanse #2
Publisher Orbit
Copyright June 2012
ISBN 0-316-20227-4
Format Kindle
Pages 594

Caliban's War is the sequel to Leviathan Wakes and the second book in the Expanse series. This is the sort of series that has an over-arching, long-term plot line with major developments in each book, so it's unfortunately easy to be spoiled by reading anything about later volumes of the series. (I'm usually reasonably good at avoiding spoilers, but still know a bit more than I want about subsequent developments.) I'm going to try to keep this review relatively free of spoilers, but even discussion of characters gives a few things away. If you want to stay entirely unspoiled, you may not want to read this.

Also, as that probably makes obvious, there's little point in reading this series out of order, although the authors do a reasonably good job filling in the events of the previous book. (James S.A. Corey is a pseudonym for the writing team of Daniel Abraham and Ty Franck.) I still resorted to reading the Wikipedia plot summary, though, since it had been years since I read the first book.

Caliban's War opens on Ganymede, a year and a half after the events of Leviathan Wakes. Thanks to its magnetosphere, Ganymede enjoys rare protection from Jupiter's radiation field. Thanks to meticulously-engineered solar arrays, it is the bread basket of the outer solar system. That's before an inhuman creature attacks a unit of Earth and then Martian soldiers, killing all but one of them and sparking an orbital battle between Mars and Earth that destroys much of Ganymede's fragile human ecosystem. Ganymede's collapse is the first problem: a humanitarian catastrophe. The second problem is the attacking creature, which may be a new destabilizing weapon and may be some new twist on the threat of Leviathan Wakes. And the third problem is Venus, where incomprehensible things are happening that casually violate the known laws of physics.

James Holden returns to play a similar role as he did in Leviathan Wakes: the excessively idealistic pain in the ass who tends to blow open everyone's carefully-managed political machinations. Unfortunately, I think this worked much less well in this book. Holden has a crisis of conscience and spends rather a lot of the book being whiny and angstful, which I found more irritating than entertaining. I think it was an attempt at showing some deeper nuance in his relationships with his crew, but it didn't work for me.

The new character around whom the plot revolves is Prax, a botanist whose daughter is mysteriously kidnapped in the prelude of the book. (Apparently it can't be an Expanse novel without a kidnapped girl or woman.) He's unfortunately more of a plot device than a person for most of the story. One complaint I have about this about this book is that the opening chapters on Ganymede drag on for much longer than I'd prefer, while running Prax through the wringer and not revealing much about the plot. This is another nearly 600 page book; I think it would have been a tighter, sharper book if it were shorter.

That said, the other two new viewpoint characters, Bobbie and Avasarala, make up for a lot.

Avasarala is an apparently undistinguished member of the UN Earth government who has rather more power than her position indicates because she's extremely good at political maneuvering. I loved her within twenty pages of when she was introduced, and kept being delighted by her for the whole book. One of my favorite tropes in fiction is watching highly competent people be highly competent, and it's even better when they have engagingly blunt personalities. Avasarala is by turns grandmotherly and ruthless, polite and foul-mouthed, and grumpy and kind. Even on her own, she's great; when she crosses paths with Bobbie, the one surviving Martian marine from the initial attack who gets tangled in the resulting politics, something wonderful happens. Bobbie's principled and straightforward honesty is the perfect foil for Avasarala's strategic politics. Those sections are by far the best part of this book.

I think this is a somewhat weaker book than Leviathan Wakes. It starts slow and bogs down a bit in the middle with Holden's angst and relationship problems. But Avasarala is wonderful and makes everything better and gets plenty of viewpoint chapters, as does Bobbie who becomes both a lens through which to see more of Avasarala and a believable and sympathetic character in her own right. The main plot of the series does move forward somewhat, but this feels like mostly side story and stage setting. If you enjoyed Leviathan Wakes, though, I think you'll enjoy this, for Avasarala and Bobbie if nothing else.

Caliban's War satisfactorily closes out its own plot arc, but it introduces a substantial cliff-hanger in the last pages as setup for the next book in the series.

Followed by Abaddon's Gate in the novel sense. There is a novella, Gods of Risk, set between this book and Abaddon's Gate, but it's optional reading.

Rating: 7 out of 10

2019-03-25: Spring haul

I think it's becoming safe to call this spring. For once, it's a rainy, cold spring in Northern California. This is a collection of relatively random things (mostly pre-orders) that I've picked up in the last couple of months.

Elizabeth Bear — Ancestral Night (sff)
Robert Jackson Bennett — City of Stairs (sff)
Curtis C. Chen — Kangaroo Too (sff)
Maddox Hahn — The Love Song of Numo and Hammerfist (sff)
Karoliina Korhonen — Finnish Nightmares (graphic novel)
Ann Leckie — The Raven Tower (sff)
Jenn Lyons — The Ruin of Kings (sff)
Cal Newport — Digital Minimalism (nonfiction)
Noelle Stevenson — Nimona (graphic novel)
Foxfeather Zenkova, et al. — Dry Season Only (nonfiction)

I already read and reviewed Hahn's book, and have read (but not yet written the review of) The Raven Tower by Leckie.

2019-03-24: Review: The Love Song of Numo and Hammerfist

Review: The Love Song of Numo and Hammerfist, by Maddox Hahn

Publisher Maddox Hahn
Copyright 2018
ISBN 1-73206-630-2
Format Kindle
Pages 329

Numo is a drake, a type of homunculus created by alchemy from a mandrake root. He is, to be more precise, a stoker: a slave whose purpose is to stoke the hypocaust of his owning family. Numo's life is wood and fires and the colors of flames, not running messages to the arena for his master. (That may be part of the message his master was sending.) Falling desperately in love at first sight with an infandus fighting in the arena is definitely not part of his normal job.

Hammerfist is an infandus, the other type of homunculus. They aren't made from mandrake root. They're made from humans who have been sentenced to transmogrification. Hammerfist has had a long and successful career in the arena, but she's starting to suffer from the fall, which means she's remembering that she used to be human. This leads to inevitable cognitive decline and eventually death. In Hammerfist's case, it also leads to plotting revolution against the alchemists who make homunculi and use them as slaves.

Numo is not the type to plot revolution. His slave lobe is entirely intact, which means the idea of disobeying his owners is hard to even understand. But he is desperately in love with Hammerfist (even though he doesn't understand what love is), and a revolution would make her happy, so he'll gamely give it a try.

Numo is not a very good revolutionary, but the alchemists are also not very bright, and have more enemies than just the homunculi. And Numo is remarkably persistent and stubborn once he wraps his head around an idea.

Okay, first, when I say that you need a high tolerance for body horror to enjoy this book, I am Seriously Not Kidding. I don't think I have ever read a book with a higher density of maiming, mutilation, torture, mind control, vivisection, and horrific biological experiments. I spent most of this book wincing, and more than a few parts were more graphic than I wanted to read. Hahn's style is light and bubbly and irrepressible and doesn't dwell on the horror, which helps, but if you have a strong visual imagination and body integrity violations bother you, this may not be the book for you.

That said, although this book is about horrible things, this is not a horror novel. It's a fantasy about politics and revolution, about figuring out how to go forward after horrible things happen to you, about taking dramatic steps to take control of your own life, about the courage to choose truth over a familiar lie, and about how sympathy and connection and decency may be more important than love. It's also a book full of gruesome things described in prose like this:

Her eyes were as red as bellowed embers. Her blood-spattered mane stood up a foot or more from her head and neck, cresting between her shoulders like a glorious wave of shimmering heat. Her slobbering mouth was an orangey oven of the purest fire, a font of wondrousness gaping open down to the little iron plate stamped above her pendulous bosoms.

and emotions described like this:

And he'd had enough. Numo was taut as a wire, worn as a cliff face, tired as a beermonger on the solstice. One more gust of wind and he'd snap like a shoddy laundry pole.

This is the book for simile and metaphor lovers. Hahn achieves a rhythm with off-beat metaphor and Numo's oddly-polite mental voice that I found mesmerizing and weirdly cheery.

Except for Numo and Hammerfist, nearly everyone in this book is awful, even if they don't seem so at first. (And Hammerfist is often so wrapped up in depression and self-loathing to be kind of awful herself.) Next to the body horror, that was the aspect of this story I struggled with the most. But Numo's stubborn determination and persistent decency pulled me through, helped by the rare oasis of a supporting character I really liked. Bollix is wonderful (although I'm rather grumpy about how her story turns out). Sangja isn't exactly wonderful — he can be as awful to others as most of the people in this story — but for me he was one of the most sympathetic characters and the one I found myself rooting for.

(I'm going to be coy about Sangja's nature and role, since I think it's a spoiler, but I greatly appreciated the way Hahn portrayed Sangja in this book. He is so perfectly and exactly fits the implications of his nature in this world, and the story is entirely matter-of-fact about it.)

Hahn said somewhere on-line (which I cannot now find and therefore cannot get exactly right) that part of the motivation for this story was the way the beast becomes human at the end of Beauty and the Beast stories, against all of our experience in the real world. Harm and change isn't magically undone; it's something that you still have to live with past the end of the story. This is, therefore, not a purely positive good-triumphs type of story, but I found the ending touching and oddly satisfying (although I wish the cost hadn't been so high).

I am, in general, dubious of the more extravagant claims about the power of self-publishing to bypass gatekeepers, mostly because I think traditional publishing gatekeepers do a valuable job for the reader. This book is one of the more convincing exceptions I've seen. It's a bit of a sprawling mess in places and it doesn't pull together the traditional quest line, which combined with the body horror outside the horror genre makes it hard for me to imagine a place for it in a traditional publishing line-up. But it's highly original, weirdly delightful, and so very much itself that I'm glad I read it even if I had to wince through it.

This is, to be honest, not really my thing, and I'm not sure I'd read another book just like it. But I think some people with more interest in body horror than I have will love this book, and I'm not at all unhappy I read it. If you want your devoted, odd, and angstful complex love story mixed with horrific images, gallows humor, and unexpected similes, well, there aren't a lot of books out there that meet that description. This is one. Give it a try.

Rating: 6 out of 10

2019-03-06: Net::Duo 1.02

This is an alternative Perl interface to the Duo Security second-factor authentication service. This release supports the new required pagination for returning lists of users and integrations, which will take effect on March 15, 2019. It does this in the simplest way possible: just making repeated calls until it retrieves the full list.

With this release, I'm also orphaning the package. I wrote this package originally for Stanford, and had thought I'd continue to find a reason to maintain it after I left. But I'm not currently maintaining any Duo integrations that would benefit from it, and my current employer doesn't use Perl. Given that, I want to make it obvious that it's not keeping up with the current Duo API and you would be better off using the Perl code that Duo themselves provide.

That said, I think the object-oriented model this package exposes is nicer and makes for cleaner Perl code when interacting with Duo. If you agree, please feel welcome to pick up maintenance, and let me know if you want the web site redirected to its new home.

This release also updates test code, supporting files, and documentation to my current standards, since I was making a release anyway.

You can get the current release from the Net::Duo distribution page.

2019-02-27: Review: Daughters of the North

Review: Daughters of the North, by Sarah Hall

Publisher Harper Perennial
Copyright 2007
ISBN 0-06-143036-6
Format Trade paperback
Pages 207

My name is Sister.

This is the name that was given to me three years ago. It is what the others called me. It is what I call myself. Before that, my name was unimportant. I can't remember it being used. I will not answer to it now, or hear myself say it out loud. I will not sign to acknowledge it. It is gone. You will call me Sister.

I was the last woman to go looking for Carhullan.

It's the unspecified near-future. The British economy, and then society, collapsed from climate change, flooding, and endless wars. The cities are now governed by a fascist emergency Authority, a permanent martial law that controls people's work assignments and allocations and that has required women to have birth control devices inserted. The narrator's marriage has collapsed with the society; her husband does not understand why she is so upset about things that can't be changed.

And so, at the start of the book, she carries out a careful plan to walk away, leaving the city and her marriage behind for the abandoned countryside. She goes to Carhullan: an isolated, self-sustaining farm run by women who refused to be registered and relocated and therefore were stripped of citizenship. A community from which men are barred.

(Let me express my deep gratitude to Hall for starting with her escape, and showing the background only in flashbacks. That authorial choice made this a much better book.)

Daughters of the North (published in the UK as The Carhullan Army) is clearly SF in subject matter: near future dystopia, with a twist of feminist separatism reminiscent of the peak of second-wave feminism. I read it because it won the James Tiptree Jr. Award for speculative fiction that explores and expands gender. But it was also a finalist for the Man Booker prize, with all that implies about writing quality and focus. So be warned: along with a book review, you're also getting an extended digression into the nature of genre and how books like this use the same premise for considerably different goals.

Let me be clear from the start: the writing in Daughters of the North is gorgeous.

Rain blew in from the summit of High Street, colder than before, soaking my face and clothes again. I tried to fasten my jacket but my fingers felt awkward and would not cooperate, so I held it closed over my chest. I peered into the squall. There was still no sign of the farm or even the outbuildings. All I could see were drifts of rain and the relentless brown withers of fell, appearing then disappearing. The adrenaline of the encounter had worn off. I had walked more than twenty miles to escape. And I had gambled with my life. Now I felt numb, and close to seizing up. All I wanted was water to drink, and to take the bag off my back, lie down, and go to sleep. It took all my energy to put one foot in front of the other and remain upright.

It is gorgeous in the way mimetic fiction so often is, where individual moments are sketched through sensory impressions and emotional reactions and given room to breathe and be felt. It's unhurried and deliberate, but still lean and focused, describing the transformation of a woman in a slim two hundred pages.

What it is not is opinionated. Or, more accurately, it's not forthright about its opinions. It describes the feelings and reactions of a woman who becomes known as Sister, it hints at the emotional undercurrents that led her to make the choices that she made, it describes her transformation in the communal culture of Carhullan, and then it stops. What conclusions one draws from that are left entirely to the reader.

I've become convinced by the definition of genre as a set of reading protocols rather than a specific setting or plot structure. (My exposure to this idea is primarily via Jo Walton, but it's a common idea in SF criticism.) Books like this are a convincing way to test that definition. I suspect that many science fiction readers will come away form Daughters of the North profoundly unsatisfied, muttering things like "but what happened then?" or "but were they right?" I also suspect that many readers of primarily mainstream fiction will slip happily into this book and add it to the mental pile of speculative fiction they enjoy. Or, even more likely, decide it's not speculative fiction at all. And, in a way, I think they would be right.

In Daughters of the North, the world is setting. But in speculative fiction, the world is a character. The difference between setting and character is that characters change and grow over the course of the story, at least in the reader's understanding. Setting does not, or if it does, it changes incidentally.

In the supplementary material at the end of the edition of this book that I read, Hall says that she wanted to explore what might draw someone away from the established order and towards extremism or militancy. By the end of this book, one does have some feel for why the narrator made that choice, but it's tenuous and contradictory and conditional. I think Hall does a beautiful job of illustrating how much of life is inherently tenuous and contradictory and conditional. Decisions are rarely crisp and clear, but they still change one's life. Sometimes someone abruptly stops enduring the unendurable, and then something new happens. I think it's very telling, and very sharply observed by Hall, that although the narrator is fleeing humiliation and oppression, the part of her former life that bothers her the most is the futility and purposelessness. Carhullan, despite a few characteristics of utopia, is also brutal and political. But its charismatic leader never fails to give the community a purpose and a goal.

For the reader approaching this book through the speculative fiction reading protocol, though, it can be profoundly frustrating. There are glimmers of the expected plot arc: this world is awful, and the main character recognizes that and decides to act. There is some movement along that arc. But for the reader expecting setting as character, for the world itself to grow and change, Daughters of the North is maddeningly ambivalent. Who exactly are the Authority? What are they thinking; what are their motives? What's the best way to fight them? Is it the way Carhullan fights them? Will it work? What will they do in response? Daughters of the North is uninterested in these questions.

I think it's close to impossible to provide in the same book both the deep sense of character and sensation of mimetic fiction and the sense of change and revolution and setting as character of speculative fiction. The mission to change the world is emotional and political; it demands engagement and consumes the oxygen of the plot. It doesn't leave room for closely-observed ambiguity or ambivalence, or for the quiet spaces in the center of the narrator's character that allow the reader to interpolate or project, to try to puzzle out the shape of friendship and society and courage in a society that is by turn fanatical and utopian. I can write the mimetic fiction reader's reaction to the SF objections: do you want your emotions spoon-fed to you? Why do you want the book to tell you what to think instead of working it out for yourself? If this book described the details of politics and revolution, it would turn into another operatic war story, and all of the fine detail would be lost.

And, to be clear, they're not wrong. But neither is the SF reader; it's just another way of reading.

Despite my appreciation of what Daughters of the North is doing, and the skill with which Hall wrote it, I fear I'm far closer to the SF camp. Here's my counter-argument: I don't want to be told what to think, but I want a fight. I don't want the book to hint at moral dilemmas; I want it to take a stand so that I can argue with it. Write a passionate defense for your utopia. Why is it better? What works? What doesn't? Is the change in political communication style inside Carhullan an aspect of gender, or something Jackie (the Carhullan leader) created, or something any group of people could create with the right discussion structure? The Authority is clearly awful and clearly wrong, but what's the replacement? Is it more Carhullans? Something else? What do you think will happen past the end of this book? Why?

It's not that I want to be spoon-fed, it's that I want to engage. I wanted the story to fight for something, to go out on a limb, to take a risk on its opinions, to declare for a side. Yes, the world is ambiguous and murky: now what? We still have to act, we still have to make decisions, and we still have to decide if those decisions were right or wrong. How do we do that? What criteria should we use? Is Jackie justified in the things she does in this story?

That's what you get out of a story where the world is a character. You get worlds with character growth, which means an argument about change. Political, social, technological, often all three. Daughters of the North almost gets there, gets so very close by the end of the book to making that core argument, but then still turns inward. To the last page, it's more interested in closely observing Sister than in portraying change in the world.

I think some people will adore this book, and it certainly deserves the Tiptree award. It's a far more subtle story of feminist separatism than many of its predecessors, and examines the idea from some interesting angles. It never bored me and never bogged down; it kept me turning the pages eagerly to the end of the story, and I think it succeeded within the goals of its own genre. But, deep in my heart, I'm a world-as-character reader.

Content warning for those who might want it: Daughters of the North contains a detailed torture scene, a scene I would call partner rape, and a few instances of graphic violence.

Rating: 7 out of 10

2019-02-26: Review: Cold Magic

Review: Cold Magic, by Kate Elliott

Series Spiritwalker #1
Publisher Orbit
Copyright September 2010
ISBN 0-316-08085-3
Format Trade paperback
Pages 502

Cat Barahal is a scholarship college attendee, a lucky and fairly precarious position given that the college is mostly for the nobility and only reluctantly admits women. She and her cousin Bee are inseparable, both keeping the other's secrets. For Bee, that's her occasionally prophetic dreams; for Cat, that's her ability to hear things that should be inaudible and wrap her surroundings around her to disappear. Before her parents died, her mother told Cat to never let anyone know what she could do. Bee is the only exception she's ever made.

Although her adoptive family's finances are tenuous, Cat's life isn't bad. She is fascinated by her father's journals and re-reads them regularly, thrives in school, and is mostly successful in navigating the infuriating restrictions of class and gender, despite her temper. But then her life is turned upside down: a cold mage, one of the aristocratic rulers of her world, arrives at her home and demands her in marriage as the price of a contract she'd never heard of before. In short order, she finds herself married by magic and carried away by a strange man who appears to hold her in contempt, left only with instructions from her aunt and uncle to obey.

Cold Magic starts out looking like it's going to be steampunk with magic. Cat and Bee's world feels very Victorian, with gender segregation, an emphasis on clothing, and servants as a mandatory aspect of life for anyone who even pretends to acceptability. But this world feels less and less like typical steampunk as the story goes on. There's some serious world-building work below the surface.

Relative to our world, Cat's is in an ice age, with a land bridge between what we would call England and France. The ice to the north is the domain of fairy, and thus is even more treacherous than is in our world. Politics are divided between feudal lords, local princes (the formation of modern nation-states appears to have been delayed in this world), and the incredibly powerful cold mages. Technology is on the rise, but the cold mages, with some help from the entrenched nobility, are doing what they can to suppress it. Sometimes literally: fires, and therefore a lot of steam-driven machinery, die in the presence of a sufficiently powerful cold mage. The resulting political world is multi-faceted and complicated even before the wildcard of fairy is thrown into the mix.

On top of the magical politics, Elliott does some interesting work with alternate history. Cat and Bee are Kena'ani (Phoenicians, as the hated Romans call them), which in this world have a marginal social role somewhat like that of Jews in our world. When they were driven from their historical cities (by the Persians here, not the Romans), the Kena'ani became the trading backbone of the European world. That, in turn, led to them becoming the spymasters and information brokers, and therefore both necessary and disreputable among the elites. Those elites are a mix of Celts and Mande, the latter bringing their powerful magic to Europe in a diaspora from North Africa in the aftermath of the salt plague and the rise of ghouls.

My one-sentence summary of Elliott's alternate history is "what if most major historical conflicts were fought to a draw." The Roman Empire still exists towards the east, but never managed to completely defeat Carthage. The Celts were never driven out to the margins of Europe. Mande speakers are a major political force. I really liked this world: it's fascinatingly different in a way that feels lived-in, and Elliott wisely avoids getting into the specifics of divergent events. The one thing that did raise an eyebrow is that North America is the home of a parallel intelligent race Cat's people call "trolls" but which are actually bipedal birds (evolved from dinosaurs). They're interesting (and very likable) characters in the story, and full equals of the humans, but making the natives of North America exotic and literally non-human does not have a great history.

Cold Magic is in shape a fairy story. Cat is suddenly forced into a world with elaborate and very dangerous rules, of which she knows nothing, and has to learn on her feet before she dies. For about half of the book, she's dragged along behind Andevai, an arrogant ass who gets furious at her for every rule she accidentally breaks. For much of the rest, she's making her own way across unfamiliar territory and cultures, constantly struggling to learn enough to avoid disaster. This could be frustrating to read, but Elliott pulls it off by giving Cat a temper, a clear understanding of how unfair this is, and an over-sized dose of audacious determination. She absolutely refuses to be cowed, even when she's apparently alone and without allies, which makes this far more rewarding to read than it would be otherwise.

It helps that the pacing is excellent. Elliott lingers a bit too long on Cat's angst in a few places, but otherwise this 500 page book keeps moving. We get a new encounter, a new bit of world-building, a magical confrontation, or a new bit of political complexity every few pages, and yet the story never feels out of control. Cat's has a strong first-person voice and, despite her angst, stays clear on her immediate goals and her unwillingness to become a pawn. I liked her and had no trouble rooting for her throughout. Also appealing is the deep undercurrent of revolution and change throughout the story, an undercurrent that is happening independently of the main characters and creates the feeling of a deeper political history in the world. (Including, intriguingly, this world's analogue of Napoleon, who seems much more likable than our version.)

Also, while I won't say more to avoid spoilers, I loved the cats. That was my favorite scene in the story.

Cold Magic is not as tight and crisp as it could be. It sprawls a bit, occasionally belabors Cat's emotional and identity crises, and is the first book of a trilogy in a way that means it falls short of a satisfying conclusion. It also becomes obvious by the end of the book that the forced marriage is going to turn into a romance, and while Elliott does quite a lot to redeem Andevai over the course of the book, I would have preferred to not have that subplot. Cat deserves a lot better, even apart from the violation of consent at the start. But I had so much fun with this book. It kept me up late several nights and pulled me away from other entertainment to read just one more chapter, and maybe that's what matters the most.

Recommended. I'm definitely reading the rest of this series.

Followed by Cold Fire.

Rating: 8 out of 10

2019-02-24: Review: Artificial Condition

Review: Artificial Condition, by Martha Wells

Series Murderbot Diaries #2
Publisher Tor.com
Copyright May 2018
ISBN 1-250-18693-5
Format Kindle
Pages 160

Artificial Condition is the second in the Murderbot Diaries series of novellas. There's enough context here that you could probably read it out of order, but since All Systems Red has the "get you hooked" low starter price, I'm not sure why you would.

There's no way to talk about this novella without partly spoiling the end of All Systems Red. That's a spoiler that I had before starting to read this series, so I don't think it's too significant, but you should stop reading here (and go read the first one!) if you haven't read the first novella and want to go into it without any information about the ending.

Artificial Condition picks up very shortly after All Systems Red leaves off: Murderbot has made it to a new station undiscovered, and although the events of the first story have made the news, including some of Murderbot's role, it has been relegated to human interest story so far. Just as it would prefer. It wants to slip away unnoticed to the site of a previous contract to do a bit of personal research.

Did it hack its own governor module before or after it went rogue and killed a large number of people? The precise order of events seems rather important.

Getting there requires another transit hop, and when Murderbot's first choice of an automated transport on which to hitch a ride is surrounded by unwanted attention due to a hauler accident, it decides on the second choice and an earlier departure from the station. That is how Murderbot ends up aboard a long-range research vessel with a rather more powerful AI than Murderbot had expected. Even worse from Murderbot's perspective: that AI takes a rather personal interest in Murderbot, its entertainment vids, and its intentions, and has the computing power to draw some rather accurate and unwelcome conclusions.

I think a reader's opinion of this entry in the series will depend on what you think of the role of the research vessel (or, as Murderbot calls it, ART, the Asshole Research Transport). I'm not sure it counts as a deus ex machina if the machina is introduced at the start of the story, but ART has a lot of plot-convenient capabilities. Murderbot largely solved its own problems in All Systems Red, but Artificial Condition would have gone far more poorly if ART weren't willing to throw around its rather considerable weight and political connections.

What makes this feel a bit strange is that ART's motives are murky. The surface-level curiosity is easy to accept, but ART takes what seem to be some significant risks on Murderbot's part for no entirely understandable reason. I'm hoping that this is a sign of mysteries that will be revealed later in the series.

I think some readers will find this forced and a bit too convenient for the plot. I raised an eyebrow several times. But for me this was a minor point compared to my joy at having an intelligent, protective starship as a major character in a series whose characters were already a delight. This is one of my favorite tropes in science fiction; I was far too busy being delighted by ART's interactions with Murderbot to quibble about its unexpected capabilities.

Murderbot itself is the same wonderful mix of shyness, cynicism, and grumpy introversion that it was in All Systems Red. It ends up with a doomed security contract as a way of getting onto the station it is trying to get to, and of course cannot help but do a rather more competent job at that contract than it strictly needed to. Its personal investigations are left still somewhat unresolved, and doubtless will continue to be a plot point in later novellas in this series, but it's starting to ask, and answer, some harder questions about what kind of intelligent being it wants to be and how that fits into the world in which it lives.

I'm thoroughly enjoying this series of novellas (and have now bought all of them published to date). The short length keeps the stories tight and fast-moving and makes them feel approachable, and I'm still getting as much enjoyment out of each as I get out of many novels. If you liked All Systems Red, keep reading.

Followed by Rogue Protocol

Rating: 8 out of 10

Last spun 2019-06-01 from thread modified 2008-08-13