Despite Everything

…it’s still you. Looking at yourself in the window. The second afternoon after you finally get COVID for the first time.

As previously reported, I left Zoom late last year and spent a bit of time unemployed, traveling for some of it but mostly staying home. In the process, I got COVID, though not with a particularly interesting story. Would not recommend.

Then I started work at Anthropic doing interpretability research — moving way back into my comfort zone in a way by returning to my web dev roots to create many of the visualizations we cared about, and way out of it in another by jumping into the deeply theoretical end of research, in a field where my total experience is one college course and one casual reading group. Still, I figured some things out and we published Towards Monosemanticity in early October.

I don’t have much to add to the research results in the paper, though I can share some trivial, mildly entertaining anecdotes about the process:

  • In some sense I think my puzzlehunter instincts, finely honed from nearly a decade of untangling every kind of disguised text under the sun, are the only reason we figured out the “third” base64 feature in the paper.
  • At one point I found myself adapting fragments of the graph visualization algorithm in Gansner et al., 1993 with a sense of déjà vu. I had looked into that same paper five years ago during my 2018 internship project, but didn’t use it then because it was solving a different problem from mine.

On the engineering side though, when I think about my relation to web dev, I think about a sticker I nabbed at some career fair and stuck on my dorm room’s door, however many years ago:

A black hexagonal sticker that reads WEBDEV: EXITUS ACTA PROBAT, affixed to the corner of a sheet of paper against a light brown background

If you manage to look past the potato-quality zoom, the Latin says that the end justify the means, where (I assume) the end is the pretty interface and the means are the hacks — the cross-browser shims, the content: " " pseudoelements, the desperate purely-for-presentation JavaScript when you just can’t get pure CSS to work consistently. (I do not particularly endorse generalizing this philosophy to other walks of life.) I wrote a lot of hacks powering a lot of pretty interfaces this year, and even after years away from this stuff, it felt… right.

I dipped my toes into performance engineering. Sometimes it requires deep, arcane knowledge about processor internals, networking stacks, concurrency models, and so on — which I lack, for now. But sometimes you run a profiler once and instantly see that your code is spending 80% of its time serializing data into an unused error message.

Finally, I gained a deeper appreciation of the importance of tooling. As much as I like making UIs pretty and easy to use, I sometimes worry that that isn’t as important as other things: that tools that let you perform qualitatively new actions are much more valuable than usability or aesthetic patches that simply improve the experience of doing actions that were already possible. These patches might be easier to justify if I were building an interface for external users, since they have the option of not using the thing I’m making for any reason, including if they just think it’s ugly. But most of my work goes into internal research tools now.

And yet, I still remember early in my first software internship (Dropbox, 2016), when my mentor watched me navigate the codebase by randomly guessing thematic file names to see if they contained the function whose source code I wanted to read, and quickly impressed on me that that wasn’t sustainable, even if perhaps I technically could have found any given function eventually. If I had to sum up what I learned about software engineering from that internship in a single word, it would be “grep”.

The fact is, I have a finite tolerance for friction. I have a finite attention span. Perhaps most starkly, I have a finite working memory. And the same is true for all my coworkers. If a research insight depends on noticing two things from a list of 100 are the same, just because I theoretically can notice this in an unsorted, unformatted log doesn’t mean I will — and although this is an unrealistically crisp example, I know there are “tooling improvements” I helped build this year that enabled discoveries we otherwise wouldn’t have had.

So, that’s pretty neat.

What else happened this year?

  • Mystery Hunt happened. I postsolved puzzles on stream for a little bit and got Twitch Affiliate.
  • We ran Galactic Puzzle Hunt 2023, which had a lot of people debating whether it was a puzzlehunt.
  • I did yet another FFXIV savage tier. Though I continued to main Sage, I switched jobs more than past tiers to accommodate various friends’ alts; in particular, I tanked a savage fight for the first time in 1½ years, starting directly from the last fight of the tier. Poetic bookends for an expansion.
    • In vaguely related news, my water bottle was confiscated at FanFest, but as the old man lost his horse, I learned that you can just order a single CamelBak water bottle with whatever you want printed on it for much less than I might have expected.
  • Because my laptop mysteriously broke at the start of the year, I played a lot of Magic: the Gathering Arena to drown my sorrows and learned that Googling “mtg standard deck” is highly effective. I got to Mythic that month. Though I tapered off, between a few in-person drafts at work and sporadic online drafts throughout the rest of the year, I learned enough to draft Lost Caverns of Ixalan totally blind and go 7-2.
  • Tyrion Cuthbert: Attorney of the Arcane, a game I crowdfunded a while ago (enough to name a character with an in-game portrait), released. I played through it shortly after release and liked it a lot, though I think I can only confidently recommend it to people who have already played and know that they like most of the Ace Attorney games. I used the momentum to work on my mystery VN backlog, finishing both the (mainline) Danganronpa and Zero Escape series.
  • I played at least one “real” game of League of Legends.
  • I wrote ≈30 quizbowl tossups for EMACS, a computer science side event organized and edited by Anderson Wang. Though I’ve written a handful of tossups before, these were my first tossups to be heard by people outside my immediate social circle, and (no doubt thanks to the editing) they were pretty well-received. I then read for the online mirror and made two silly mistakes while reading that will haunt me to my grave, although they didn’t affect round results and it’s a side event. Overall, I learned a ton and am writing tossups for a new project.
  • This blog made the Hacker News front page once (unlike last year, where it was the GitHub repo). I was pleasantly surprised at the comments’ reasonableness.
  • In another approximation of bookends, I streamed all of my Advent of Code solves on Twitch (in batches, long after each day’s leaderboard) and am slowly putting the VODs on YouTube. I got a lot better at streaming over the month, if only because my first attempt left so much room for improvement.

These year-end posts are getting pretty ritualistic, but I am overall happy with how many new things I tried and how many things I got better at, and hope to do more cool things in 2024. Happy new year!

(note: the commenting setup here is experimental and I may not check my comments often; if you want to tell me something instead of the world, email me!)