The roar

I'd attended college football games before, including several at Chapel Hill (so a vaguely major program), but yesterday we went to our first pro game, the Giants at the 49ers. I decided at the beginning of the season to start following football a lot more closely this year, and my teams being the 49ers and the Steelers (in that order) it's been a very rewarding season so far, at least in terms of the quality and drama of the games I've been watching. That kept up yesterday, which was probably my favorite specific game of the year so far; for general games, it's hard to match the early season when our wins were still surprising, but I do think this one was better than our games against (say) the Lions. At any rate, it is something we should do again, possibly to the point of getting season tickets for next year.

Since so much of my audience here comes from Pittsburgh (including me, in a very real sense), I feel the need to carry out the rituals of justification: why am I rooting for the Niners, or at least, why would I root for the Niners over the Steelers? Actually living in San Francisco is a good reason, of course, but it's a still-newly-acquired one. But actually I've been a 49ers fan for essentially my entire life; I picked it up from my parents, who lived and married in San Francisco. Southern Oregon, where I born, is still 49ers country as well, although like most rural areas it's dominated by high-school and college football; and when we moved to Virginia, that fanship became (yet another) thing separating me from most of the kids there (Redskins fans, when they cared). So I do have a strong connection to the team.

I may have to root for the Steelers over the 49ers in their game, though, for complicated playoff reasons; for the 49ers, it might make the difference between a first or second seed, but for the Steelers it might determine whether they go at all. We'll see. I'll actually be at that game, although unfortunately I could only get one ticket.

The stadium's in the southeast corner of the city; we'd bussed there, but on the way home we walked out. My sense of geography betrayed me a bit, though, as apparently the San Francisco grid on Candlestick Point veers even further off the cardinal points; we ended up trudging through the parking lots and along long lines of cars until we finally broke free into Bayview, where we caught an excellent sunset.

We were debating a where to go for dinner on the way home when I finally got a long-delayed voicemail from cpride inviting us to a dinner party with him, Zoe, edanaher, and mkehrt. That was also very good, but it was nice to finally stumble over our threshold and call an end to the day.

Standard forensics

My life mutates and evolves, its vines clinging to the clay, cutting grooves in no particular pattern but gradually giving me form. Watching its progress is curious; are those tendrils so unlike the roots of these trees? Well, anyway.

(Cat and I) are doing well. She's been away for most of a month, looking after her mother, which is as long as we've been separated since the summer I spent interning at Apple. It's quite different to be the one at home; the residue of a second life surrounds you, temporarily set aside, and you externalize a sort of animist longing onto it all, the idle unopened letters, the chair neurotically checking the calendar, the book on the couch holding a patient seance. The vigil will be over tomorrow, but it seems right to document their efforts.

I was actually going to meet her there, in New York, to go to her cousin's wedding, but it was this last weekend, and there was no wedding, or at least there was no reception, or no cocktail party, or no whatever-it-was-planned-to-be that day, Saturday, before the expected rain washed those plans down to meet the storm. So now I have most of a ticket and no flight. It was going to be a break, a small vacation, even if most of it was to be on airplanes, and I replaced it with work, which was not well-chosen on my part; but I will try to make up for that this next weekend, I think.

Work continues to be quite interesting, and not just in the very dry way that I can find interest in nested formalism, but also in a spate of projects afoot, most of which I cannot discuss, of course. But I do finally find myself in the position of being able to point to something already done and say, Aha, you know, this automatic reference counting that was added to Objective-C, I did that. I did... well, I suppose I did both the principal language design and the main implementation in the compiler, although I had a number of collaborators on both, and there were endless meetings about it, including quite a number above my head. But there, a feature that is not quite so esoteric as "access control" or "exceptions".

I do have something esoteric to go on and on about, though. :)

In C, if you declare a variable, you can then write that name as an expression. That expression is an l-value, meaning the result of the expression identifies a place in memory where a value is stored; it's so called because it's valid on the left side of an assignment. In most places you would write an expression, the l-value is further converted to an r-value, meaning the result of the expression is an actual value, namely the value currently stored in that place in memory. This "value kind" is just as much a part of the type judgement on expressions as the formal type.

For the most part, there isn't much room for latitude in language design about all this: whether an lvalue-to-rvalue conversion occurs depends on the operation being done to the result. There is one exception, though: if the result of an expression is syntactically ignored, should the conversion happen or not? Well, it doesn't normally matter: implementations are generally free not to do operations they don't need to do. However, an l-value can be volatile, meaning you have to do exactly the operations on described by the formal model. (This is the C/C++ definition of volatile; Java's is quite different and much more useful)

Anyway, for various historical reasons C and C++ actually have completely different takes on this. In C, if you have a statement consisting of an expression whose result is an l-value, you always do lvalue-to-rvalue conversion on that; and in C++, you never do. It's been that way for, oh, twenty years or so; it's a bit silly, but it's done. Right? No. Early last year, twelve years into the drafting process of the latest C++ standard, someone actually pointed this out to the committee; and then early this year, the committee finally got around to considering it; and lo, they decided to change the behavior, so that ignored volatile l-values arising from certain syntactic forms (essentially, the forms that can yield l-values in C) would always henceforth undergo lvalue-to-rvalue conversion. So this is progress, of a sort, if you don't mind breaking strict source compatibility.

Of course, they've completely fouled up the new wording in the standard, such that in about eighty words there are (as I've counted so far) four different judgement calls you have to make about their intent. This is pretty standard for C++, which is sometimes as bad as the law in terms of how much legislative history you have to read to divine an often scattered and inattentive purpose, and possibly also in terms of how remote it is from any chance of improving anyone's life.

But at some point, probably soon, one of us will make those judgements and implement the new rule, maybe only in C++11 mode to preserve strict source compatibility, and the language will creak slowly forward on its axles with either one fewer wart or one more, depending on how you see it.

Anyhow, that is one small aspect of the life of a compiler engineer.


We went east for the holidays this year, which means Jersey City, for Cat's parents, and Virginia Beach, for mine. For the first time since we've been engaged, we actually had significantly different travel plans, primarily because my parents have a new longhair cat which leaves enough fur behind it (†) that they were specifically warning Cat away (††). So she was just heading out to her parents for a week beginning Wednesday, whereas I was joining her on Christmas night, then flying south on Monday afternoon, then coming back up on Thursday to spend a few days with lordm in Brooklyn.

But that was not to be; the Newark airport didn't open from the snow until three hours after my flight was meant to take off, and given that they had twenty hours of flights to make up, it really didn't seem to make any sense to force my way onto a replacement plane. So instead I called my parents a lot and spent the spare time with Cat in Jersey City before finally taking PATH into the City on essentially the original schedule.

On Thursday, I just hung out in Brooklyn until Moiseyev got off from work, at which point we went up to Times Square to find Julie and Christin Steinbruch (whom I hadn't seen in years), watch the end of North and South, and play random Wii games until after midnight, whereupon M. and I went back to the borough, missed a farewell party, wandered through Prospect Park, and then got called in to close a bar with some central-Pennsylvania people associated with M.'s neighbor/friend Paul, leading eventually to a long 5am diner conversation. It's in times like this that being adjusted -3 hours really comes in handy.

On Friday, we naturally didn't get up until after 3pm, at which point one of my random hey-people-I-am-here feelers paid off and we met up with jcreed at a diner on (I think) Flatbush, where we proceeded to stay roughly forever while discussing philosophy, occupations, &c. Eventually we split up and M. and I went into the City to acquire alcohol-favors and Julie, having done which we headed into Queens for a Party populated with unknown-to-me people which nonetheless was very pleasant except inasmuch as I will one day learn not to engage in drinking contests with myself, as a bottle and a half of wine is really just Too Much To Reasonably Have Drunk And Yet. And then we caught a cab back to Brooklyn and went to another party where I met Paul again and at which I essentially stirred chocolate fondue and then all-but passed out.

On Saturday, I believe it was 4pm before we all got up. We watched assorted football, then went to a bad-side-of-mediocre English-ish pub, then bundled off to see True Grit. Which I enjoyed! modulo still being somewhat hung over. And thence back to sleep.

On Sunday, I eventually badgered M. out of bed at 2pm, and we wandered over to a sports bar to catch some extremely unbalanced football games, serendipitously gathering up Paul again along the way. And then it was off to JFK, where the planes were all running late but I snuck onto an earlier flight anyway.

And on Monday it was work again, and now here I am, writing to you when I should be sleeping.

Alas, I missed a few people due miscellaneously to snow, travel, and miscommunication, but I will have other chances, I am sure.

† This might not actually be an issue. Cat and dog allergies are usually to the dander, not the fur, and if anything that's usually lower with longhairs. That said, the real problem is that the house is packed with approximately eighteen cat-years of accumulated dander, and my parents have the usual blindspots about it, even when they're making a specific effort. For example, last year they had no cats, and my mother very carefully vacuumed the rug in the room where we were sleeping — but didn't clean at all beneath the futon, so as soon as we pulled it out....
†† We're actually both allergic to cats and dogs, and in the abstract, I think my allergies might actually be worse. In practice, Cat's reactivity is testing the brim already, so any new exposure tends to hit her quite hard. And of course I'm more willing to tolerate the cat to spend time with my parents, just as she's more willing to tolerate the dog to spend time with hers.

Blessings bee

Cat and I have vowed never to travel significantly over Thanksgiving ever again, so we hosted Thanksgiving this year. After inviting most of the people we know in California, we ended up with six people: platypuslord, buoren, moonndragn, Zoe (Kevin's flatmate), Katie (a friend of Kevin's from CMU Design), and Karunya (Em's flatmate). Eight was a good, comfortable number for our apartment; I'm guessing we could go up to twelve before it felt cramped.

We actually ended up with only two vegetarians, but at various points I'd been expecting disproportionately more, so the menu de-emphasized meat and generally avoided unnecessary contamination. Since we did most of the cooking, it was fairly easy to avoid Cat's allergies (to gluten, egg, soy, and crustaceans). I had the week off, so I did most of the cooking; we split the shopping pretty evenly.

I made:

  • a 10-pound roasted turkey, not stuffed or brined;
  • gluten-free stuffing (bread, broth, celery, onion, fennel), which ended up oddly-spiced but quite edible;
  • simple baked sweet potatoes;
  • a sautéed acorn squash, fennel, and green bean mélange;
  • a red beet, golden beet, and parsnip salad, marinated and served cold;
  • a cranberry salad with celery, toasted pecans, and crushed caraway;
  • vegetable broth, used in the stuffing and gravy and to baste the turkey.

Cat made:

  • a gravy from the turkey drippings;
  • a vegetarian gravy from broth and chestnuts;
  • the bread for the stuffing;
  • an apple crisp dessert.

Kevin made:

  • mashed potatoes and
  • macaroni and cheese (gluten- but sadly not soy- free).

For completeness, we had a cheese/crackers plate and the obligatory sliced canned cranberry jelly, and Em brought chicken gravy and olives. We also polished off (by volume) four-and-a-half bottles of wine, with two people not drinking.

Kevin, Em, and Dan all brought board games. We spent a lot of time just talking, but we also played an abortive game of Mao, a round of Eat Poop You Cat, one letter of contributed Taboo, a game of Scotland Yard, and a game of Pandemic.

Other than that, Kevin gave us some background music on the piano, Zoe passed out on the futon, and it seemed like everyone had a good time, so mission accomplished, and we'll probably do this again next year.



Prolonged periods have passed since I previously posted. Are past pains present palliatives? It is possible. So suddenly I speak.

I have been at work.

I don't honestly recall how enveloped I was by Viz at first; perhaps Cat or Carl could speak better to that. By the time I left, though, I was finding work increasingly easy to set aside, partly from demoralization but partly because there was a limit to how interesting it could be. There were some fascinating problems there, to be sure, but it was relatively rare that I got to solve them (the StandardConceptConverter (IIRC) being a rare exception) — instead, my job was largely a question of principled engineering and persistent application of not-terribly-demanding creativity, which I suppose is the steady-state of good software development.

The work I've done for Apple has been more captivating. There is something, je ne sais quoi, something about language implementation which holds me, which burrows into my soul and nests, laying foundations in my thoughts and forming struts from my dreams. It occupies me; I am controlled in all quarters. I wake to the playing of problems, and the melody leads into the rushes of work, the stanzas beating out my pulse. When I worked on JavaScript (†), I would wake and remember only representations of values, waiting to be laid out more plainly, more quickly. It cannot be borne; I am terrified; I am torn apart; I am reorganized; I am born again. It is quite disturbing how easily I can find myself thinking of nothing else.

And so I must begin writing again, or else the mad musical soul colonists will eat me and leave nothing behind but code.

† To ward off the spirits: JavaScript is a terrible language. So is C++. It is a sad truth that both have their own unique importance and so justify becoming the foci of much implementation effort. There is a Pareto-like principle at work here, although I have far from abandoned the dream of better languages; really I think it would impossible to work on such inferior languages and not constantly hope for betterment. Complacency is a luxury of the contented.


A few things have happened recently which are worth noting here.

First, my project at work achieved a state of "technical success", which means that it (1) works correctly and (2) achieves its technical goals but (3) probably won't be accepted by its intended targets anyway. I am allowed to talk about it in general terms — for example, I can disclose that we were "applying compiler technologies like LLVM to JavaScript", specifically to improve its performance — but, unfortunately, not to disclose any particular ideas we had and implemented. Regardless, it's been shelved indefinitely pending an unexpected approval by the target team.

This means that I've moved on to brighter things (still at Apple, naturally); in particular, I am now working on the standard LLVM C++ front-end (clang-cc). So after a mere year of using C++ full-time, I have progressed to the inevitable terminal state of an expert C++ programmer, i.e. wanking about language specs and re-implementing the compiler.

I think I still really, deeply hate this language. It's an expert's language with naive pretensions of simplicity. It encourages the worst traits in experts (to endlessly obsess about minutiae) and punishes beginners (who can easily make terrible mistakes with no hint as to why). And even experts are continually blocked by the endless foolishness of the language, which invariably only lets you express three-quarters of what you need. Everything else — the awkward near-backward-compatibility with C, the explicit memory management, the primitive control structures — everything else is just an annoyance.

The result of all this is that I am strongly tempted to develop a dependently-typed imperative programming language with explicit meta-programming support. Unfortunately, working on compilers for forty hours a week really saps your drive to come home and hack on a totally different compiler.

Finally, I've started running consistently in the mornings — I've only skipped three days out of the last nine. This morning's effort was five and a half miles in about an hour, which is not terrible for having just started again.


Overnight flights are not so terrible if you divorce yourself from all hope of fulfilling sleep. Had a notable if not deep conversation with The Woman From The Window Seat, a tech writer with family in Elisabeth. Shared the plane with Ali. Will crash somewhere in WEH in short order.


Yesterday I went sailing on the Bay.

We were invited on Saturday, which is the sort of notice for a weekday outing that seems reasonable only to people in particular circumstances of life. I scrambled to make it acceptable, succeeding mostly by virtue of having recently brokered progress through the power of other-uncompensated overtime. Cat didn't have the same luck, as the cowards treacherously scheduled a departmental meeting against our unannounced expedition. So it was me, a postdoc and three recently-employed persons. (The preceding sentence forced me to abandon the Oxford comma.)

Our boat was a 32-foot Catalina, for those who understand that, which is a set that excludes me. We gathered at noon, and finally set out from the Berkeley marina at two-thirty — it was that sort of day. Our plan was first to tack to Angel Island, then motor around to the Gate and jibe back home; unfortunately, with the slow start, the incoming tide, and the 25-naut eastward winds, that was mostly fouled. Instead, we tacked to Richmond, set aground to ease some suffering; that was about five-thirty. From there, we planned to tack further north to Red Rock Island, but we were becalmed, so instead we somehow decided to motor past Angel Island and then resume the first plan, which was fine except that we had low winds when we came east of Alcatraz, so we spent a long few hours there in the cold, with dark water and distant lights, puttering home on power. I eventually got home and dinner at midnight, and it would have been later except for combinator's generosity in giving me a ride.

The mechanics of sailing are very fun; it's a lot of running about on the boat, balanced with carefully-timed exertions, all required to make any progress at all. If anything, I regretted having so many people around to divide the labor. I came aboard knowing a fair amount about the basics of sailing, and I gained some good practical experience but not appreciably more theory; our skipper mostly ordered us about without explaining why, and maybe that was reasonable for a first voyage.

I spent a lot of time at the helm. Some of this was lifeless: the endless slow circles I cut there in the marina, keeping the M alive while she was prepped for berth, those memories Time can claim for herself, I do not need them. But Lady? Spare for me certain moments, if you will; leave me those minutes where I held my course straight at five nauts in the winds off the Gate, sailing down on Ghirardelli Square and past the searchlights of Alcatraz. Those are not times fit for the gods.

An occupation of a sort

Cat and I have successfully relabeled ourselves as San Franciscans; specifically, we are nobs; in finer detail, we are at:
1650 California St. #24
San Francisco, CA 94109
Fortunately, this is a block away from an Apple coach-route, where operators stand poised to whisk me to the bleak desolation of Cupertino. Unfortunately, that requires 75 minutes in each direction, and I need to plan for a 9 o'clock orientation on Monday. Our network access will be quite limited until some unknown moment on the 2nd, so pray allow me to suggest contacting us via phone rather than email, should you require our attention before then; my number remains 412-654-2712.