# Ideas Have Expirations Originally published: 2016-01-04 Canonical URL: /2016/Jan/ideas-have-expirations/ One often-overlooked aspect of the [crime of not-writing](http://zackmdavis.net/blog/2015/10/everyday-true-crime/) is that the harm isn't just about the things that deserve to be said that you never get around to saying because you don't put in the time and effort. It's also about the things that you _can't_ say anymore even if you suddenly had the will, because the opportunity to say it was bound to a particular time, and trying to recapitulate the thoughts months or years after the fact would be irrelevant, or impossible. This phenomenon comes in degrees. Start with irrelevance. Often the inadmissibility of tardy words isn't absolute: you _could_ say things late, but the product would be less valuable than if it were timely—especially in a medium like blogging, where the posts being dated and displayed reverse-chronologically creates an expectation that the entries are associated with a particular point in time—at least, that they were written not too long before their publication date, even if the actual content isn't about the ephemera of the day or season. This has contributed to _An Algorithmic Lucidity_ not being as good of a blog as it could be. [![BABSCon swag]({static}/images/crush_kill_destroy_swag-300x300.png)]({static}/images/crush_kill_destroy_swag.png){: .alignright } Like—each of the last two Aprils, I attended (one day of) [BABSCon](http://www.babscon.com/), the San Francisco Bay Area's premier convention for fans of the animated series _My Little Pony: Friendship Is Magic_, both times—even the second!—with the thought that the experience would make good fodder for a blog post in the "autobiographical account of my day at this timely Special Event" genre. I was going to tell you about how the first time, I made a couple of social _faux pas_ while meeting Tara Strong and Nicole Oliver, only one of which was intentional; I was going to tell you about how the second time, I hadn't been planning to buy anything in vendor hall, but couldn't help but say "Shut up and take my money" in response to the demonstration of the [Twilight Sparkle's Secret Shipfic Folder](http://www.secretshipfic.com/) card game, the game-opening card of which I later got autographed by both members of Sherclop Pones, whose [_Friendship Is Witchcraft_ fandub series](http://tvtropes.org/pmwiki/pmwiki.php/WebVideo/FriendshipIsWitchcraft) had clearly inspired some of the cards and probably the game itself, as well as being the source of [some of my favorite music](https://www.youtube.com/watch?v=ACEnJSDVzdc). I was going to tell you about how the first time, I was considering buying a coffee cup depicting the Mane Six (because I frequently bought medicinals at the outpost of the American coffee hegemon, and felt guilty about the wastefulness of accepting the default disposable cup every time like every other American), but hesitated, explaining to the vendor that I wasn't sure whether I wanted to use that cup in public, whereupon she said she could throw in a free [button](https://en.wikipedia.org/wiki/Pin-back_button), to which I replied, "Sold!" And I was going to do a careful sociological analysis of curious observations like how I hesitated to buy that cup and why [H. liked it so much](http://zackmdavis.net/blog/2014/09/pumpkin-spice/) in terms of gender ideology and [signaling](https://en.wikipedia.org/wiki/Signalling_%28economics%29) [contrarianism](http://lesswrong.com/lw/2pv/intellectual_hipsters_and_metacontrarianism/). But I didn't, and those Aprils were nine and twenty-one months ago, respectively. Not timely. My being motivated to write _now_ (["That my past does not define me, 'cause my past is not today"](https://www.youtube.com/watch?v=XqnbYUG6Bn8)) can push a 350-word counterfactual "postview" of what I thought about saying over the threshold into existence, but it would be a bit unseemly to try to construct (I almost wrote _reconstruct_, but the _re-_ prefix should be reserved for things that ever existed in the first place) a 2000-word personal account of the timely Special Event that happened _last year_ or the _year before that_. [![Leafline web client play]({static}/images/leafline_web_client_play-300x206.png)]({static}/images/leafline_web_client_play.png){: .alignleft } Or like—I made [a thing](https://github.com/zackmdavis/Leafline) not too long ago. I didn't mean to. It was an accident, really. It's a sort of oppositional strategy game engine—like a board game you play against the computer. The core move-scoring application is written in Rust, but there's also a web-application GUI (the "web client") in Clojure and ECMAScript 6 that's much more ergonomic for playing a game against. The game is—okay, well, it's chess: the endeavor snowballed out of my desire to participate in my coworkers' friendly office chess games combined with my reluctance to spend effort learning to be good at a task whose [essential nature](https://en.wikipedia.org/wiki/Minimax) is so obviously suitable for automation. But writing a chess engine is just _so_ cliché, and I enjoy naming things, so I quickly settled upon the conceit that _actually_ I was writing an engine for a game that _just happened_ to be exactly like chess, except that everything has different names: for example, instead of the pieces being black and white pawn, knight, bishop, rook, queen, and king, the figurines, or agents (never "pieces"), in my game are [blue and orange](http://tvtropes.org/pmwiki/pmwiki.php/Main/BlueAndOrangeMorality) servant, pony, scholar, cop, princess, and figurehead. (I kept _rank_ and _file_, though.) This "adorable idiosyncratic names for everything" convention permeates the codebase. Despite the fact that unnecessarily gendering things isn't normally my style, I decided that ponies, scholars, and (inevitably) princesses were female, and that servants, cops, and figureheads were male, specifically in order to have an excuse to leave `// ♀` and `// ♂` comments in the [enum declaration](https://github.com/zackmdavis/Leafline/blob/d914c979/src/identity.rs#L35-L43), because I feel like too many of my code comments are restricted to the ASCII or _maybe_ Latin-1 subsets of the Basic Multilingual Plane, such that I don't want to pass up an opportunity to legitimately ("legitimately") use \u2640 FEMALE SIGN and \u2642 MALE SIGN. There are [comments with](https://github.com/zackmdavis/Leafline/blob/d914c979/src/identity.rs#L68-L86) ludicrous rationalizations for using the standard Forsyth–Edwards notation abbreviations ('P' is for _peon_, 'N' is for _neigh_, 'B' is for _book_, 'R' is for _the Rule of law_; the blue team's runes are lowercase because lowercase characters have higher ASCII codepoints, just as blue light has a higher frequency than orange light). Instead of _pawn promotion_, it's _servant ascension_, and a different verb is used to describe the process depending on the target figurine type (the servant moving the to the final rank can _transform_ into a pony, be _brevetted_ to cop, or _transition_ into a princess or scholar). Or, like, Rust is quite [conservative in the Yeggean sense](https://plus.google.com/110981030061712822816/posts/KaSKeg4vQtz), as manifested in features like the compiler forcing you to explicitly handle all possible variants of an enum; in cases where you know an instance of the enum can only be one of a strict subset of the possible variants, but the type system doesn't know that, you have to fill in those branches or supply a default case anyway, [probably](https://doc.rust-lang.org/std/macro.unreachable!.html) with a panic, which is like an exception that you can't catch, to abort the program with a message indicating that something entirely unanticipated has happened and it makes no sense to carry on. So I had been ending all of my panic messages with a stock phrase about how the unexpected thing was contrary to the operation of the moral law ("non-princesslike agent passed to `princesslike\_lookahead`, which is contrary to the operation of the moral law", and so forth), because this isn't the kind of codebase where you just say something like "assertion failed," as if the program should _die_ because of some human authority's mere _assertion_, rather than only as a matter of _justice_ when its behavior is contrary to the operation of the moral law. And then when my coworker [Alexander Corwin](http://acorwin.com/) started contributing, he abstracted away the boilerplate in these panic messages into this [`moral_panic!` macro](https://github.com/zackmdavis/Leafline/blob/d914c979/src/sorceries.rs#L1-L4), which I thought was _brilliant_. The web client is configured to run on port 2882. It's [easy to remember because](http://zackmdavis.net/blog/2012/10/my-favorite-mnemonic/) 2882 is Magnus Carlsen's peak ELO score. [![Leafline console play]({static}/images/leafline_console_play-292x300.png)]({static}/images/leafline_console_play.png){: .alignright } Software, like poetry, is never really finished (only abandoned), but getting the project to the point that I felt it was a minimal viable "product" took about eight glorious weekends (plus a few weekday nights, and with some help from Alexander). Near the end, watching the program utterly trounce me in web client play and [feeling for all the world like a lieutenant junior grade](http://zackmdavis.net/blog/2014/06/lower-decks/), I started looking ahead to what came next for me. Over the past two years, the first two years of my life (that I feel comfortable admitting to), I had spent many, many night and weekend hours hacking on various side projects and coding exercises out of genuine enthusiasm and curiosity and desire to improve my craft—and, honestly, a [feeling of insecurity](http://zackmdavis.net/blog/2015/08/no-award/), sensing that I needed to prove my [worth](http://zackmdavis.net/blog/2014/09/worth/) as a hacker (["I threw myself into my studies, to have the world in my control"](https://www.youtube.com/watch?v=MpE0ZY8FODk)). But decent _chess AI_ in _Rust_ as an _impulsive throwaway project_ seemed like a sufficiently strong signal of my programming prowess that maybe it was time to tie off this project, write the obligatory exciting blog post about it, and start allocating night and weekend hours towards some of the _non_-programming (!) interests I remember having in the before-time (assuming those memories are not fake). I could do some math! Write some fiction! Maybe even meet new friends ("[I will not be shy](https://www.youtube.com/watch?v=EvP7PIt7GNE); I'm going to [try](http://zackmdavis.net/blog/2016/01/dismal-science/); I bet I'll find the reason why so many people, like me—")?!—all while feeling secure in the knowledge that my technology skills are _clearly_ adequate for my continued existence to be economically viable. (For now.) So ... _about_ that end-of-project blog post. I was going to title it "Project Review: Leafline version 0.0.14-MVP; or, Lessons From Writing an It's-Not-Chess Engine in Eight Weekends", and I was going to explain everything to you—not just the silly names for everything that inexplicably amuse me (and only me), but the actually interesting substantive technical details of the implementation. Not that the AI is anything special—it's just textbook minimax search (in the [negamax](https://en.wikipedia.org/wiki/Negamax) style) with α–β pruning and a position-evaluator that [mostly counts material](https://github.com/zackmdavis/Leafline/blob/d914c979/src/mind.rs#L35-L47) but [also has bonuses for things](https://github.com/zackmdavis/Leafline/blob/d914c979/src/mind.rs#L60-L119) like [having both scholars](http://www.chess.com/article/view/the-evaluation-of-material-imbalances-by-im-larry-kaufman) or ponies and servants being in the center sixteen squares, plus a [transposition (hash)table](https://en.wikipedia.org/wiki/Transposition_table) to look up scores of game-states it's already seen before, and another hashtable for [history-heuristic](https://webdocs.cs.ualberta.ca/~jonathan/publications/ai_publications/pami.pdf) move ordering. It's multithreaded, to take advantage of multiple cores (although I confess that the _specific_ threading strategy is kind of a questionable hack). It can search up to 7 plies if you have a decent machine and are willing to wait ten or twenty minutes for the answer. But even if it's nothing special, I was going to tell you about all the deeply moving philosophical insights I got from doing it. It's one thing to know [how to refute](http://lesswrong.com/lw/vg/building_something_smarter/) the classic anti-AI argument (or straw person) that "humans couldn't possibly build something smarter than themselves _by definition_," but it's another thing to have the _personal experience_ of having written something smarter than yourself in some particular domain, to the extent of feeling an acute sensation of futility while playtesting it, thinking: _I've_ already coded _my understanding of what it means to be good at this game; obviously I'm not going to do any better thinking about it with my slow meat-brain_. (Although this is partially explained by my knowing almost nothing about chess strategy that I didn't learn in the course of this project; I've seen one of my coworkers beat the program at 4-ply search _very_ quickly.) I was going to explain to you how α–β pruning works, with hand-drawn diagrams, and how you can interpret it as disregarding possible worlds that are too good or too terrible to be true (given rational play on both sides). I was going to tell you about the exciting surprise where the program seems to behave as if it understands the concepts of [_pinning_](https://en.wikipedia.org/wiki/Pin_%28chess%29) and [_forking_](https://en.wikipedia.org/wiki/Fork_%28chess%29), even though those ideas aren't represented anywhere in the code!—but that when you think about it, that shouldn't actually be surprising: to the extent that we think pinning an opposing piece is a good idea that will lead to us picking up material, then pins _should_ naturally appear in the results of searching the game tree for moves that are predicted to pick up material. And the _reason_ we search for game-states where we hold a material advantage is because we expect that we're more likely to mate from those positions (in future nodes beyond our current planning horizon). Things that are, in all philosophical strictness, mere [instrumental values](http://lesswrong.com/lw/l4/terminal_values_and_instrumental_values/), might profitably be treated _as if_ they were terminal values by some algorithm that can't see far enough ahead to the actual goal, and this is a quantitative phenomenon: the shorter your lookahead, the more you want to rely on near-term approximating rewards. That's why I threw in [a bonus for servants advancing to far ranks](https://github.com/zackmdavis/Leafline/blob/d914c979/src/mind.rs#L92-L110); I suspected that the existing code searching at the not-greater-than-7 plies that it could get in a reasonable amount of time, wouldn't adequately appreciate the true value of servant ascension, even though I expect that value _would_ be naturally emergent in a deeper search, just as the value of some forks and pins emerged from mere 4- or 5-ply searches. (This was just a suspicion, though; I didn't take the time to actually test ascension-seeking behavior.) So—though I've managed to just now haphazardly summarize some of the things about this project, this isn't really a careful project-review post. And now the distance between today and 27 September's 0.0.14-MVP tag is longer than that between [that tag](https://github.com/zackmdavis/Leafline/releases/tag/0.0.14-MVP) and the [start of the project](https://github.com/zackmdavis/Leafline/commit/1847f318fa4). And I ended up making a few more commits in subsequent weeks. So, no longer timely, at least not the way I originally imagined publishing a grand just-finished-project review post as a symbolic milestone marking a transition in how I'm going to start spending my precious non-dayjob time. Or like—in late October, I saw the recent _Jem and the Holograms_ film, because the previews (accurately) made it look like it was going to be _really_ bad, and I thought I'd write a post combining a negative review of the new film with praise for the original _Jem_ cartoon that this awful film mendaciously desecrated the name of. And then ... I didn't get around to finishing the post. _Maybe_ my notes and memory from that night at the theater are accurate enough such that it's not too late—but the potential impact departed with the timeliness; I can't warn you not to go see it, because it's not in theaters anymore. (And good riddance.) But beyond these sad cases of ideas that didn't get written up properly while they were still maximally _relevant_, there's an even worse way to fail to communicate, which is when the would-have-been-author has _changed_ so much since first having the idea, that there's no way they could plausibly do justice to the idea as it was first had. You can't write a Diary entry about the day five years ago that you don't remember, and—more poignantly—you can't write a grand ideologically-driven novel in favor of the ideas you don't believe anymore. Some would argue it's just as well—if it's something you wouldn't write and couldn't stand by today, aren't you relieved that it doesn't exist to sully the name that represents who you are today? Even so, I would still favor intertemporal solidarity among past and future selves against the common enemy of our illiteracy. Yes, illiteracy! Some would call it _writer's block_, but I know better than to bother with the unobservable distinction—whether you choose to describe your hypothesis as "doesn't write because unmotivated" or "doesn't write because doesn't know how," the result is the same: _death_ of the non-author's memetic lineage.