The Universe of Discourse
Sat, 05 Oct 2013

Today I was at the Pittsburgh Perl Workshop and I gave a talk because that's my favorite part of a workshop, getting to give a talk.

The talk is about Moonpig, the billing system that Rik Signes and I wrote in Perl. Actually it's about Moonpig as little as possible because I didn't think the audience would be interested in the details of the billing system. (They are very interesting, and someone who is actually interested in a billing system, or in a case study of a medium-sized software system, would enjoy a three-hour talk about the financial architecture of Moonpig. But I wasn't sure that person would be at the workshop.) Instead the talk is mostly about the interesting technical underpinnings of Moonpig. Here's the description:

Moonpig is an innovative billing and accounting system that Rik Signes and I worked on between 2010 and 2012, totaling about twenty thousand lines of Perl. It was a success, and that is because Rik and I made a number of very smart decisions along the way, many of which weren't obviously smart at the time.

You don't want to hear about the billing and accounting end of Moonpig, so I will discuss that as little as possible, to establish a context for the clever technical designs we made. The rest of the talk is organized as a series of horrible problems and how we avoided, parried, or mitigated them:

  • Times and time zones suck
  • Floating-point arithmetic sucks
  • It sucks to fix your mangled data after an automated process fails
  • Testing a yearlong sequence of events sucks
  • It sucks to have your automated test accidentally send a bunch of bogus invoices to the customers
  • Rounding errors suck
  • Relational databases usually suck
  • Modeling objects in the RDB really really sucks
  • Perl's garbage collection sucks
  • OO inheritance sucks
Moonpig, however, does not suck.

Some of the things I'll talk about will include the design of our web API server and how it played an integral role in the system, our testing strategies, and our idiotically simple (but not simply idiotic) persistent storage solution. An extended digression on our pervasive use of Moose roles will be deferred to the lightning talks session on Sunday.

Much of the design is reusable, and is encapsulated in modules that have been released to CPAN or that are available on GitHub, or both.

I went to sleep too late the night before, slept badly, and woke up at 6:30 and couldn't go back to sleep. I spent an hour wandering around Oakdale looking for a place that served breakfast before 8 AM, and didn't find one. Then I was in a terrible mood. But for this talk, that was just right. I snarled and cursed at all the horrible problems and by the end of the talk I felt pretty good.

Slides are available here. Video may be forthcoming.

Share and enjoy.

[ Addendum 20131217: I wrote up the talk contents in detail and posted them here. ]

[ Addendum 20131217: The video of the talk is available on YouTube, and has been since October, but I forgot to mention it. Unfortunately, the sound quality is poor; I tend to wander around a lot when I talk, and that confuses the microphone. Many thanks to Dan Wright for the video and especially for putting on PPW. ]

[Other articles in category /talk] permanent link

Offensive stuff in classes
Many years ago I gave a short talk about the internals of the Perl regex engine. One continuing theme through the class was vomit. I handed out custom-made barf bags before the talk. There's one point in the engine where if the internal compiled format is invalid, the engine dies with the helpful error message Internal urp. I had a slide about that bit of code, illustrated with a picture of two people vomiting. (At least in 2001, that was harder to find on the Internet than you would have thought.)

Shortly before I gave the talk, I got cold feet. I asked a bunch of conference attendees if they thought I should take the picture out. All but one set yes, I should. The one dissenter was Gurusamy Sarathy, at that time the Pumpking, the Perl release manager. "Take it out?" he said incredulously. "Are you crazy?"

I left it in. I don't think it was an error.

I wonder, though, if I would have gotten away with it now. People are a lot more on edge about unprofessional-seeming and potentially offensive conference presenations. They also seem to be more common. When I hear about conference presentations with pictures of porn stars, or "humorous" presentations about projects to "titstare", I wonder where these morlocks came from; I've never seen anything like that at a conference and I would have been surprised and offended to see it ten years ago.

On the other hand, maybe I'm a hypocrite. One year at OSCON I did present a slide that used a still from a porno:

The Biggest Mistake You Can Make

  • I'm going to start big

  • What is the biggest mistake you can make when making a conference presentation?

  • Forgetting to go to the bathroom beforehand

The porno in question was a full bladder fetish video.

Were there people offended by this then? I don't know; I hope not. Nobody complained, but that doesn't prove anything. I can certainly imagine people finding this extremely offensive today. But I still think it's hilarious. Would I do it again? I don't know, but probably not.

From the same talk, was the illustration I used on a slide about "bullshit". I don't know if that's more or less offensive. On the one hand, the picture is a lot more visually disgusting. There is no mistaking what is happening; in the omoroshi picture you might not realize what is happening. (At least one participant commented on my "clever visual pun", explaining "well, of course she's just bowing". "Huh," I said, "that would have been clever.") On the other hand, if you do take the omoroshi picture at face value, it could be understood as a powerfully misogynist image of the humiliation of a woman by men. On the other other hand, I could have used an identical image that wasn't from an actual porno and it could have been understood the same way. But then I would have had an ironclad defense: No, it's just a picture of a woman standing in a room. But it could be the same picture. So I'm not sure. Regardless, I will apologize to anyone who wants an apology; although I considered the image carefully at the time, I hoped that it would not offend anyone, but nevertheless recognized the possibility and chose to risk offense anyway.

Another conceivably offensive slide image I used once is below:

These are two-headed sperm; it's possible that this is an image of human semen. I can imagine someone complaining bitterly about this. Meng Wong told me once that if anyone ever did, I should soothe them by claiming that it was gorilla semen; then it would be all right. That does seem like it might work, although I'm not sure why it should.

But none of that is really what I wanted to discuss; I was only thinking about it today because because I was writing a new talk in which I discussed the following piece of code:


        use DateTime;
        use DateTime::Duration;

        my $then = DateTime->new( month => 4, day => 2, year => 1969,
                                  hour => 0, minute => 0, second => 0);
        my $now = DateTime->now();
        my $elapsed = $now - $then;
        print $elapsed->in_units('seconds'), "\n";
This looks like it ought to calculate and print out the number of seconds between midnight 1969-04-02 and the current time. Instead, because of a series of bad decisions by the designers of DateTime::Duration, it calculates that value as a number of months, days, minutes, and nanoseconds, and then prints out the leftover nanoseconds divided by one billion; typically the answer is a number on the order of 30. In this case it's obvious that something peculiar is going on, but in general you might not realize that this code is not doing what you (or anyone else) wants; you might test it on two times with only a few seconds difference, see that it produces the correct answer, and fail to realize that it breaks completely for any interval that crosses a minute boundary.

My first idea was to claim that this code prints out FUCK YOUR MOTHER, suggesting that although the object knows how much time has elapsed, it refuses to tell you, because it is a spiteful and foulmouthed object. But people have pointed out that sometimes kids attend these conference talks and don't want to hear FUCK YOUR MOTHER (or their parents don't want them to hear it) and anyway, FUCK YOUR MOTHER is sexist and I would prefer to offend everyone without resorting to racism or sexism. I don't mind offending people in general, but it is unfair to do it from a position of power, and to direct it against people with less power than I have.

I spent quite a while thinking about this. Before I committed the slides I struck out FUCK YOUR MOTHER and replaced it with UP YOUR NOSE, EPSTEIN (a catchphrase from the 1970s sitcom Welcome Back, Kotter) and then SIT ON IT, CUNNINGHAM (a catchphrase from the 1970s sitcom Happy Days). Both of these, having aired on prime-time network television in the 1970s, can be presumed to be sufficiently innofensive for a conference talk in 2013.

But they didn't seem to be quite what I wanted, and for a while I considered CHINGA A TU MADRE (Mexican slang for FUCK YOUR MOTHER) which has advantages and disadvantages. I think it's funnier if the DateTime::Duration module turns out to be a Spanish-speaking punk. And some of the people who might have been offended won't understand the Spanish. On the other hand, some of the people who might have thought the joke was funny won't understand the Spanish. And the sexism is the same as in English.

A friend suggested that I just go with GO FUCK YOURSELF, but I decided that I could probably find something funnier if I went in a scatalogical direction. Scatology is safer than sex, because sex is a forbidden adult subject, but everybody poops. Four-year-olds can, and do, make poop jokes and find them hilarious.

The first thing I thought of was I'M SHITTING IN YOUR MOUTH which I do think is funny, but perhaps too physically offensive; it's a really unpleasant image.

But Google search for the Mexican version of FUCK YOUR MOTHER had led me to Wikipedia's page on Spanish profanity, which is a gold mine. Reading through it, I knew, as soon as I saw ME CAGO EN LA LECHE, that I'd found the right phrase.

It means "I shit in your milk!"

That seems to me to lie at the perfect intersection of what I want. It displays the program's obnoxiously unhelpful attitude, it should be no more offensive to anyone than to anyone else, and it conjures u pa mental image whose unpleasantness is strongly tempered by its surreality.

[ Addendum: I should mention that this accusation against DateTime::Duration is false, and it would be completely unfair, except that the desired answer here is so perfectly at the center of DateTime::Duration's purported area of expertise, the answer actually given by DateTime::Duration is so utterly and manifestly useless, and there is no way to get it to produce that answer you actually wanted. If you ask me how many seconds have elapsed since April 2, 1969, and I say "43", can't you reasonably claim that I might as well have said "¡Me cago en la leche!"

[Other articles in category /talk] permanent link