Eagle's Path

Passion and dispassion. Choose two.

Larry Wall

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

2019-02-18: INN 2.6.3

INN 2.6.3 has been released. This is a bug fix and minor feature release over INN 2.6.2, and the upgrade should be painless. The main ISC downloads page will be updated shortly; in the meantime, you can download the new release from ftp.isc.org or my personal INN pages. The latter also has links to the full changelog and the other INN documentation.

The big change in this release is support for Python 3. Embedded Python filtering and authentication hooks for innd and nnrpd can now use version 3.3.0 or later of the Python interpreter. Python 2.x is still supported (2.3.0 or later).

Also fixed in this release are several issues with TLS: fixed selection of elliptic curve selection, a new configuration parameter to fine-tune the cipher suites with TLS 1.3, and better logging of failed TLS session negotiation. This release also returns the error message from Python and Perl filter hook rejects to CHECK and TAKETHIS commands and fixes various other, more minor bugs.

As always, thanks to Julien ÉLIE for preparing this release and doing most of the maintenance work on INN!

2019-02-02: Another new year haul

The last haul I named that was technically not a new year haul since it was posted in December, so I'll use the same title again. This is a relatively small collection of random stuff, mostly picking up recommendations and award nominees that I plan on reading soon.

Kate Elliott — Cold Fire (sff)
Kate Elliott — Cold Steel (sff)
Mik Everett — Self-Published Kindling (non-fiction)
Michael D. Gordin — The Pseudoscience Wars (non-fiction)
Yoon Ha Lee — Dragon Pearl (sff)
Ruth Ozeki — A Tale for the Time Being (sff)
Marge Piercy — Woman on the Edge of Time (sff)
Kim Stanley Robinson — New York 2140 (sff)

I've already reviewed New York 2140. I have several more pre-orders that will be delivered this month, so still safely acquiring books faster than I'm reading them. It's all to support authors!

2019-01-20: Review: New York 2140

Review: New York 2140, by Kim Stanley Robinson

Publisher Orbit
Copyright March 2017
Printing March 2018
ISBN 0-316-26233-1
Format Kindle
Pages 624

About forty years in our future, world-wide sea levels suddenly rose ten feet over the course of a decade due to collapse of polar ice, creating one of the largest disasters in history. It was enough to get people to finally take greenhouse effects and the risks of fossil fuels seriously, but too late to prevent the Second Pulse: a collapse of Antarctic ice shelves that raised global ocean levels another forty feet. Now, about fifty years after the Second Pulse, New York is still standing but half-drowned. The northern half of Manhattan Island is covered with newly-constructed superscrapers. The skyscrapers in the southern half, anchored in bedrock, survive in a precarious new world of canals, underwater floors, commuter boats, high-tech sealants, and murky legal structures.

The Met Life Tower is one of those surviving buildings and is home to the cast of this novel: two quants (programmers and mathematicians who work on financial algorithms) living in temporary housing on the farm floor, the morose building super, the social worker who has headed the building co-op board for decades, a chief inspector for the NYPD, a derivatives trader who runs a housing index for the half-drowned intertidal areas, a streaming video star who takes on wildlife preservation projects in her dirigible Assisted Migration, and a couple of orphan street kids (in this world, water rats) endlessly looking for their next adventure. The characters start the book engrossed in their day-to-day lives, which have settled into a workable equilibrium. But they're each about to play a role in another great disruption in economic life.

This is my sixth try for Kim Stanley Robinson novels, and I've yet to find a book I really liked. It may be time to give up.

I really want to like Robinson's writing. He's writing novels about an intersection of ecology and politics that I find inherently interesting, particularly since he emphasizes people's ability to adapt without understating the magnitude of future challenges. I think he's getting better at characterization (more on that in a moment). But this sort of book, particularly the way Robinson writes it, elevates the shape of the future world to the role of protagonist, which means it has to hold up to close scrutiny. And for me this didn't.

As is typical in Robinson novels, New York 2140 opens with an extended meander through the everyday lives of multiple protagonists. This is laying the groundwork for pieces of later plot, but only slowly. It's primarily a showcase for the Robinson's future extrapolation, here made more obvious by a viewpoint "character" whose chapters are straight infodumps about future history. And that extrapolated world is odd and unconvincing in ways that kept throwing me out of the story. The details of environmental catastrophe and adaptation aren't the problem; I suspect those are the best-researched parts of the book, and they seemed at least plausible to me. It's politics and economics that get Robinson into trouble.

For example, racism is apparently not a thing that exists in 2140 New York on any systematic scale. We're at most fifty years past what would be the greatest refugee crisis in the history of humanity, one that would have caused vast internal dislocation in the United States let alone in the rest of the world. Migrant and refugee crises in Syria and Central America in the current day that are orders of magnitude less severe set off paroxysms of racist xenophobia. And yet, this plays no role whatsoever in the politics of this book.

It's not that the main characters wouldn't have noticed. One is a social worker who works specifically with refugees on housing, and whose other job is running a housing co-op. In our world, racism is very near the center of US housing policy. Another, the police inspector, is a tall black woman from a poor background, but the only interaction she has with racism in the whole book is a brief and odd mention of how she might appear to a private security mercenary that she faces down. It seriously tries my suspension of disbelief that racism would not be a constant irritant, or worse, through her entire career.

Racism doesn't need to be a central topic of every book, and sometimes there's a place for science fiction novels that intentionally write racism out as an optimistic statement or as momentary relief. But the rest of this book seems focused on a realistic forward projection, not on that sort of deep social divergence. Robinson does not provide even a hint of the sort of social change that would be required for racism to disappear in a country founded on a racial caste system, particularly given 100 years of disruptive emigration crises of the type that have, in every past era of US history, substantially increased systematic racism.

In a similar omission, the political organization of this world is decidedly strange. For most of the book, politics are hyperlocal, tightly focused on organizations and communities in a tiny portion of New York City. The federal government is passive, distant, ignored, and nearly powerless. This is something that could happen in some future worlds, but this sort of government passivity is an uneven fit with the kind of catastrophe that Robinson is projecting. Similar catastrophes in human history, particularly in the middle of a crisis of mass migration, are far more likely to strengthen aggressive nationalists who will give voice to fear and xenophobia and provide a rallying point.

Every future science fiction novel is, of course, really about the present or the past in some way. It becomes clear during New York 2140 that, despite the ecological frame, this book is primarily concerned with the 2008 financial crisis. That makes some sense of the federal government in this book: Robinson is importing the domestic economic policy of Bush and Obama to make a point about the crisis they bungled. Based on publication date, he probably also wrote this book before Trump's election. But given the past two years, not to mention world history, these apathetic libertarian politics seem weirdly mismatched with the future history Robinson postulates.

There are other problems, such as Robinson's narrative voice convincing me that he doesn't understand how sovereign debt works, and as a result I kept arguing with the book instead of being drawn into the plot. That's a shame, since this is some of the best character work Robinson has done. It's still painfully slow; about halfway through the book, I wasn't sure I liked anyone except Vlade, the building super, and I was quite certain I hated Franklin, the derivative trader obsessed with seducing a woman. But Robinson pulls off a fairly impressive pivot by the end of the book. Charlotte, the social worker and co-op president who determinedly likes all of the characters, turns out to be a better judge of character than I was. I never exactly liked Franklin, but Robinson made me believe in his change, which takes some doing.

Amelia, the streaming video star, deserves a special mention due to some subtle but perceptive bits of characterization. She starts out as a stereotype whose popularity has a lot to do with her tendency to lose her clothes, and I wish Robinson hadn't reinforced that idea. (I suspect he was thinking of the (in)famous PETA commercials, but this stereotype is a serious problem for real-world female streamers.) But throughout the story Amelia is so determinedly herself that she transcends that unfortunate start. The moment I started really liking her was her advertisement for Charlotte, which is both perfectly in character and more sophisticated than it looks. And her character interactions and personal revelations at the very end of the book made me want to read more about her.

There were moments when I really liked this book. The plot finally kicks in about 70% of the way through, much too late but still with considerable effectiveness. This is about the time when I started to warm to more of the characters, and I thought I'd finally found a Robinson book I could recommend. But then Robinson undermined his own ending: he seemed so focused on telling the reader that life goes on and that any segment of history is partial and incomplete that he didn't give me the catharsis I wanted after a harrowing event and the clear villainy of some of the players. For a book that's largely about confronting the downsides of capitalism, it's weirdly non-confrontational. What triumph the characters do gain is mostly told, narrated away in yet another infodump, rather than shown. It left me feeling profoundly unsatisfied.

There's always enough meat to a Kim Stanley Robinson novel that I understand why people keep nominating them for awards, but I come away vaguely dissatisfied with the experience. I think some people will enjoy this, particularly if you don't get as snarled as I was in the gaps left in Robinson's political tale. He is clearly getting better on characterization, despite the exceptionally slow start. But the story still doesn't have enough power, or enough catharsis, or enough thoughtful accuracy for me to recommend it.

Rating: 6 out of 10

2019-01-15: Review: Aerial Magic Season 1

Review: Aerial Magic Season 1, by walkingnorth

Series Aerial Magic #1
Copyright 2018
Format Online graphic novel
Pages 156

Aerial Magic is a graphic novel published on the LINE WEBTOON platform by the same author as the wonderful Always Human, originally in weekly episodes. It is readable for free, starting with the prologue. I was going to wait until all seasons were complete and then review the entire work, like I did with Always Human, but apparently there are going to be five seasons and I don't want to wait that long. This is a review of the first season, which is now complete in 25 episodes plus a prologue.

As with Always Human, the pages metadata in the sidebar is a bit of a lie: a very rough guess on how many pages this would be if it were published as a traditional graphic novel (six times the number of episodes, since each episode seems a bit longer than in Always Human). A lot of the artwork is large panels, so it may be an underestimate. Consider it only a rough guide to how long it might take to read.

Wisteria Kemp is an apprentice witch. This is an unusual thing to be — not the witch part, which is very common in a society that appears to use magic in much the way that we use technology, but the apprentice part. Most people training for a career in magic go to university, but school doesn't agree with Wisteria. There are several reasons for that, but one is that she's textblind and relies on a familiar (a crow-like bird named Puppy) to read for her. Her dream is to be accredited to do aerial magic, but her high-school work was... not good, and she's very afraid she'll be sent home after her ten-day trial period.

Magister Cecily Moon owns a magical item repair shop in the large city of Vectum and agreed to take Wisteria on as an apprentice, something that most magisters no longer do. She's an outgoing woman with a rather suspicious seven-year-old, two other employees, and a warm heart. She doesn't seem to have the same pessimism Wisteria has about her future; she instead is more concerned with whether Wisteria will want to stay after her trial period. This doesn't reassure Wisteria, nor do her initial test exercises, all of which go poorly.

I found the beginning of this story a bit more painful than Always Human. Wisteria has such a deep crisis of self-confidence, and I found Cecily's lack of awareness of it quite frustrating. This is not unrealistic — Cecily is clearly as new to having an apprentice as Wisteria is to being one, and is struggling to calibrate her style — but it's somewhat hard reading since at least some of Wisteria's unhappiness is avoidable. I wish Cecily had shown a bit more awareness of how much harder she made things for Wisteria by not explaining more of what she was seeing. But it does set up a highly effective pivot in tone, and the last few episodes were truly lovely. Now I'm nearly as excited for more Aerial Magic as I would be for more Always Human.

walkingnorth's art style is much the same as that in Always Human, but with more large background panels showing the city of Vectum and the sky above it. Her faces are still exceptional: expressive, unique, and so very good at showing character emotion. She occasionally uses an exaggerated chibi style for some emotions, but I feel like she's leaning more on subtlety of expression in this series and doing a wonderful job with it. Wisteria's happy expressions are a delight to look at. The backgrounds are not generally that detailed, but I think they're better than Always Human. They feature a lot of beautiful sky, clouds, and sunrise and sunset moments, which are perfect for walkingnorth's pastel palette.

The magical system underlying this story doesn't appear in much detail, at least yet, but what is shown has an interesting animist feel and seems focused on the emotions and memories of objects. Spells appear to be standardized symbolism that is known to be effective, which makes magic something like cooking: most people use recipes that are known to work, but a recipe is not strictly required. I like the feel of it and the way that magic is woven into everyday life (personal broom transport is common), and am looking forward to learning more in future seasons.

As with Always Human, this is a world full of fundamentally good people. The conflict comes primarily from typical interpersonal conflicts and inner struggles rather than any true villain. Also as with Always Human, the world features a wide variety of unremarked family arrangements, although since it's not a romance the relationships aren't quite as central. It makes for relaxing and welcoming reading.

Also as in Always Human, each episode features its own soundtrack, composed by the author. I am again not reviewing those because I'm a poor music reviewer and because I tend to read online comics in places and at times where I don't want the audio, but if you like that sort of thing, the tracks I listened to were enjoyable, fit the emotions of the scene, and were unobtrusive to listen to while reading.

This is an online comic on a for-profit publishing platform, so you'll have to deal with some amount of JavaScript and modern web gunk. I at least (using up-to-date Chrome on Linux with UMatrix) had fewer technical problems with delayed and partly-loaded panels than I had with Always Human.

I didn't like this first season quite as well as Always Human, but that's a high bar, and it took some time for Always Human to build up to its emotional impact as well. What there is so far is a charming, gentle, and empathetic story, full of likable characters (even the ones who don't seem that likable at first) and a fascinating world background. This is an excellent start, and I will certainly be reading (and reviewing) later seasons as they're published.

walkingnorth has a Patreon, which, in addition to letting you support the artist directly, has various supporting material such as larger artwork and downloadable versions of the music.

Rating: 7 out of 10

2019-01-13: Review: The Wonder Engine

Review: The Wonder Engine, by T. Kingfisher

Series The Clocktaur War #2
Publisher Red Wombat Tea Company
Copyright 2018
Format Kindle
Pages 318

The Wonder Engine is the second half of The Clocktaur War duology, following Clockwork Boys. Although there is a substantial transition between the books, I think it's best to think of this as one novel published in two parts. T. Kingfisher is a pen name for Ursula Vernon when she's writing books for adults.

The prologue has an honest-to-God recap of the previous book, and I cannot express how happy that makes me. This time, I read both books within a month of each other and didn't need it, but I've needed that sort of recap so many times in the past and am mystified by the usual resistance to including one.

Slate and company have arrived in Anuket City and obtained temporary housing in an inn. No one is trying to kill them at the moment; indeed, the city seems oblivious to the fact that it's in the middle of a war. On the plus side, this means that they can do some unharried investigation into the source of the Clocktaurs, the war machines that are coming ever closer to smashing their city. On the minus side, it's quite disconcerting, and ominous, that the Clocktaurs involve so little apparent expenditure of effort.

The next steps are fairly obvious: pull on the thread of research of the missing member of Learned Edmund's order, follow the Clocktaurs and scout the part of the city they're coming from, and make contact with the underworld and try to buy some information. The last part poses some serious problems for Slate, though. She knows the underworld of Anuket City well because she used to be part of it, before making a rather spectacular exit. If anyone figures out who she is, death by slow torture is the best she can hope for. But the underworld may be their best hope for the information they need.

If this sounds a lot like a D&D campaign, I'm giving the right impression. The thief, ranger, paladin, and priest added a gnole to their company in the previous book, but otherwise closely match a typical D&D party in a game that's de-emphasizing combat. It's a very good D&D campaign, though, with some excellent banter, the intermittent amusement of Vernon's dry sense of humor, and some fascinating tidbits of gnole politics and gnole views on humanity, which were my favorite part of the book.

Somewhat unfortunately for me, it's also a romance. Slate and Caliban, the paladin, had a few exchanges in passing in the first book, but much of The Wonder Engine involves them dancing around each other, getting exasperated with each other, and trying to decide if they're both mutually interested and if a relationship could possibly work. I don't object to the relationship, which is quite fun in places and only rarely drifts into infuriating "why won't you people talk to each other" territory. I do object to Caliban, who Slate sees as charmingly pig-headed, a bit simple, and physically gorgeous, and who I saw as a morose, self-righteous jerk.

As mentioned in my review of the previous book, this series is in part Vernon's paladin rant, and much more of that comes into play here as the story centers more around Caliban and digs into his relationship with his god and with gods in general. Based on Vernon's comments elsewhere, one of the points is to show a paladin in a different (and more religiously realistic) light than the cliche of being one crisis of faith away from some sort of fall. Caliban makes it clear that when you've had a god in your head, a crisis of faith is not the sort of thing that actually happens, since not much faith is required to believe in something you've directly experienced. (Also, as is rather directly hinted, religions tend not to recruit as paladins the people who are prone to thinking about such things deeply enough to tie themselves up in metaphysical knots.) Guilt, on the other hand... religions are very good at guilt.

Caliban is therefore interesting on that level. What sort of person is recruited as a paladin? How does that person react when they fall victim to what they fight in other people? What's the relationship between a paladin and a god, and what is the mental framework they use to make sense of that relationship? The answers here are good ones that fit a long-lasting structure of organized religious warfare in a fantasy world of directly-perceivable gods, rather than fragile, crusading, faith-driven paladins who seem obsessed with the real world's uncertainty and lack of evidence.

None of those combine into characteristics that made me like Caliban, though. While I can admire him as a bit of world-building, Slate wants to have a relationship with him. My primary reaction to that was to want to take Slate aside and explain how she deserves quite a bit better than this rather dim piece of siege equipment, no matter how good he might look without his clothes on. I really liked Slate in the first book; I liked her even better in the second (particularly given how the rescue scene in this book plays out). Personally, I think she should have dropped Caliban down a convenient well and explored the possibilities of a platonic partnership with Grimehug, the gnole, who was easily my second-favorite character in this book.

I will give Caliban credit for sincerely trying, at least in between the times when he decided to act like an insufferable martyr. And the rest of the story, while rather straightforward, enjoyably delivered on the setup in the first book and did so with a lot of good banter. Learned Edmund was a lot more fun as a character by the end of this book than he was when introduced in the first book, and that journey was fun to see. And the ultimate source of the Clocktaurs, and particularly how they fit into the politics of Anuket City, was more interesting than I had been expecting.

This book is a bit darker than Clockwork Boys, including some rather gruesome scenes, a bit of on-screen gore, and quite a lot of anticipation of torture (although thankfully no actual torture scenes). It was more tense and a bit more uncomfortable to read; the ending is not a light romp, so you'll want to be in the right mood for that.

Overall, I do recommend this duology, despite the romance. I suspect some (maybe a lot) of my reservations are peculiar to me, and the romance will work better for other people. If you like Vernon's banter (and if you don't, we have very different taste) and want to see it applied at long novel length in a D&D-style fantasy world with some truly excellent protagonists, give this series a try.

The Clocktaur War is complete with this book, but the later Swordheart is set in the same universe.

Rating: 8 out of 10

2019-01-12: DocKnot 2.00

This is a new major release of the utility I use to generate package documentation. It's the start of a restructure that will eventually let me merge more of my package maintenance tools into this package (and possibly eventually my web site building tools).

The functions previously provided by the docknot command-line tool have been moved to docknot generate, and the arguments have been changed around a bit. There's also a new docknot generate-all, and more default values so that one doesn't have to pass in as many arguments. The Perl module has been similarly restructured, with documentation generation moved into a new App::DocKnot::Generate module.

On the documentation template front, this release also adds a separate TESTING section for Perl modules and changes some of the templating for standard documentation of how to run the test suite.

You can get the latest release from the DocKnot distribution page or from CPAN.

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