2019 was a tough year for me, but it’s hard for me to point a finger at any single cause or even piece of evidence of this claim. My wonderful family has been a cornerstone of my life and this was my favorite year with our daughter Ada so far (she turned 3 in 2019). I’ve been successful at work and grew my team to 35 people. We had a few small setbacks this year but were still surrounded by family and friends and were able to enjoy two wonderful family trips to attend weddings in Hawaii and Seattle.

I think for me it felt like I got into too much of a routine and didn’t really break out of it enough. The strongest driving force for me is to make things: programs, games, artwork, films, food. My next biggest driver is to experience the creative works of others, particularly books and films which challenge my viewpoint. My third driver is to get out into the natural world and do intensive backpacking and hiking. I don’t think I satisfied any of these three impulses in 2019.

In 2020, I see the opportunity to celebrate and recognize all of the things going well in my life, but to improve my understanding of what I find fulfilling and spend more time making things and expanding my point of view. I believe that examining the past year and how I did against my expectations is a key part of this iterative process, so I’d like to cover how I scored my goals for the past year and how that feeds into my plans for the next.


Two years ago I started setting personal OKRs (Objectives and Key Results). I wrote about the 2017 results here and decided to carry the practice forward into 2018. I wanted to recap how things have gone and how I’m thinking about this experiment going into 2019.

I am aware that this is a bit of a ridiculous exercise. My answer to “do you have any New Year’s Resolutions in 2018?” was “well it’s like 13 metrics-driven resolutions spread across three main themes”. Most people probably wouldn’t find value in this kind of system, and I think it would be fair to criticize me for taking this approach to achieve goals like “happiness”. I probably overdid it this year by trying to do too much. I felt stressed out about making progress on these goals and that led me to be very protective about my free time. I was probably a worse husband, father, son, and friend this year. At the same time, it’s hard to say that I wasn’t aware that this was the deal I was making. I wanted to push myself to do more, and to have more to show for it. I’m proud of what I was able to achieve in 2018, but there was a cost too.

Reading List - 2018 Books

I enjoyed publishing some thoughts on my reading list from 2017 at the end of last year, and wanted to continue the tradition in 2018. I think my blend moved more toward nonfiction this year, which I’ll blame on getting a ton of good recommendations through work. Stripe is an amazing place to build an impossibly large reading list.

I didn’t quite hit my goal of 20 books this year, but feel good about the material I did get through this year. If I had to pick, I think Men, Machines, and Modern Times, Democratizing Innovation, The Score Takes Care of Itself, and Sculpting in Time were my favorites of the year. I’ve left some notes on these books (and more!) in ascending order of completion below:

Sending nice emails from Google Forms

The teams I manage at work pride themselves on moving quickly. We release features, adjust UI, and run experiments at a rate where it is difficult to follow everything which is going on. I see one of my responsibilities as a manager to keep up this pace of execution, but in a way which holds a high bar for quality and allows for feedback from stakeholders who aren’t following every design discussion or code review.

We had a problem of the sort where an engineer would make some kind of change and then later on get asked “why did you turn this on?”, “why didn’t you tell X?”, “did you consider A, B, C?”. This was adding uncertainty to the development process - engineers would be uneasy about rolling changes and felt pressure to get buy-in from every stakeholder before shipping even small modifications to the software.

I wanted my team to feel safe following a product development process where they wouldn’t get second guessed or called out if they did things the agreed-upon way. Using my favorite productivity tool prototyping platform (Google Apps), I created a form which would handle collecting the details of planned changes, format things nicely, and notify all appropriate stakeholders. We have an agreement with the team now that engineers are “covered” making changes as long as they fill out the form as soon as possible during the development process. If an engineer uses the form, ships a change, and then someone has a problem with how the feature was shipped or communicated, then I intervene and walk the stakeholder through our tracking process. This has been a great step toward making engineers feel more empowered to ship changes, giving stakeholders a concise summary of upcoming changes, and has the side effect of creating a clear log of everything our teams are contributing.

I’ve gotten some interest in this internally from other teams, and I think it’s a generally useful tool for any team of software engineers. I’m going to walk through how it works and was built, with the hopes that you may find something like this useful in your development process.

Which word has the most valid subwords?

As is pretty common at SF tech companies, lots of people at Stripe have laptop stickers with various company logos (including our own) on them. So there have been at least a few cases where I’ve sat in a meeting, maybe slightly distracted, facing a laptop with the word STRIPE on it, and let my mind wander. And where it tends to go is to the observation that there’s lots of other words inside of STRIPE. STRIP is a word, TRIPE is a word, TRIP is a word, and RIPE is a word. There are valid words all up in this thing! And then I tend to think two very specific questions:

  • How many subsets of the word STRIPE are valid dictionary words?
  • What’s the English word which has the highest percentage of its subsets be valid dictionary words?

I’ve thought these questions far too often. And so in the interest of self-discovery, growth, and hopefully moving on to other useless things to think about, I decided to find some answers.

Flow puzzles v1

I’ve had a game idea bouncing around in the back of my head for a few years now. In fact, many of my goals in the past few years (i.e. watching more art films, learning to paint, and publishing a small game) have been in service of expanding my repertoire to be able to work on this larger meta project.

The game itself is structured as a puzzle-based adventure game, where solving puzzle challenges in effect unlock skills which can be used to advance the story. The puzzles themselves are supposed to be abstractions of programming challenges, but presented in a way so that non-programmers could complete them. I wanted to explore the space of manipulating a stream of data, rather than some kind of Turing complete programming environment like Shenzen I/O (which does that really, really well).

A short time ago, a member of my team at work showed me Rete.js, a framework for building node/graph editors in Javascript. This felt intuitively like how I wanted to construct puzzles, so in the spirit of some rapid prototyping, here are a couple demos working out the characteristics of this space.

Caesar Cipher

One of my favorite undergraduate courses was an optional elective on the topic of ciphers, starting with handwritten approaches and eventually moving on into mechanical and then digital cryptography. A few classes in the handwritten section started with the professor writing ciphertext on the board and inviting us to spend some time attempting to break it without knowledge of what the cipher actually was.

A while back I pledged to write a paper on a topic unrelated to my academic major for my Estonian fraternity. I never actually got around to doing this, but at the time of the pledge I had the ciphers course fresh in my head and thought it would more research would be interesting. So in the interest of actually making some progress on this, I thought writing a bit about handwritten ciphers here may be a good way to motivate myself. To ease into it, I’m starting with the most basic cipher I know of: the Caesar Cipher.


I tried something new in 2017, which was to make a set of personal OKRs to fulfill throughout the year. OKRs (Objectives and Key Results) are typically used as a planning framework by companies (both Google and Twitter implement them) but I had never tried to structure personal goals in this way. I’m not sure it’s a general approach I’d recommend for anyone else, but I like the idea of taking a set of abstract goals and trying deconstruct them into measureable tasks.

I respect the effects of small adjustments to habits compounded over time. New Year resolutions have been effective ways for me to implement such changes. In 2014 I started making one-second-per-day videos (and have done so in 2014, 2015, and 2016 so far!). In 2015 I started regular Rosetta Stone lessons to learn Mandarin. In 2016 I tracked my weight and food every day with the intent of losing 30 lbs by the time my daughter was born. In 2017 I wanted to be healthier, happier, grow intellectually, and create things. I’m writing this as a postmortem on the process, and an accounting for how I think it went.

Reading List - 2017 Books

At the start of 2017 I, feeling a little unproductive, defined a set of goals which I’d try to achieve by the end of the year. It was around this time that I, feeling a little unhappy in my job, started looking at other places to work. While I was investigating the culture and history of Stripe (which I ultimately joined) one very common theme was how voracious of a reader its CEO Patrick was.

Reflecting on the meager list of books I’d completed in 2016, I realized that my own reading pace had dwindled over the years. Back when I commuted to Mountain View from SF, I generally had multiple hours per day to read. That became maybe 40 minutes each day when I started taking Muni to work downtown. When Twitter moved its office to within walking distance I basically stopped entirely, not making up in reading the time I was gaining from a shorter commute. I missed the depth I felt that I got from reading books and figured the best way to bring that back was to construct a goal of reading a specific quantity this year.


The first time I remember hearing the term “hackathon” out loud was when I was a couple weeks into my employment on Google’s Developer Relations team. I was trying to figure out what I was going to do to help bootstrap developers for the nascent OpenSocial project. Patrick Chanezon, the Developer Advocate on the project, said something like “we’re going to cold call a bunch of social app authors and hold a hackathon to test out the API” which hadn’t really been done before—we were helping pave a new path for the company at the time. That first event was kind of a mess. I remember stalling for time with a room full of developers since our test server wasn’t booting correctly. An engineer was hurriedly trying to fix things so that the attendees could get to work.

The Exterminating Angel (1962)

The premise for Luis Buñuel’s THE EXTERMINATING ANGEL is that a group of socialites are unable to leave a parlor following a dinner party. This is about as much as I knew going into it, which was exciting, since the premise works better that way.

I figure that if you’re going to keep people in a room there’s a few ways it can go. The most obvious is that the room is literally locked or blocked off and those folks need to escape it physically. In this case that seemed unlikely, mostly because the movie is named The Exterminating Angel and that would be a pretty bad name for a movie about a locked room.


Since starting a new job tends to involve a lot of reflection on the prior one, I’ve spent some time recently thinking about my time at Twitter. While there were both good and bad parts, I generally feel like I had a few great opportunities to participate in product design and understand how even simple looking products tend to have a lot of hidden edge cases and adjustments to smooth those over.

I generally use the example of analytics.twitter.com. Superficially, this site has a very direct purpose–to show you numbers associated with your Tweets. But as my team started exploring a landing page which would show aggregated impressions, we found all sorts of cases which would surprise our customers.

An art a day

I want to get better at creating art in 2017. At the start of a new year I try to make resolutions which are attainable by incremental effort over a longer period of time, so when my friend Buster suggested creating a painting or drawing every day in January, I eagerly agreed.

1999 Days

Friday, February 24th, 2017 was my 1999th day of employment at Twitter, and my last.

I’ve been a bit nostalgic about this, so I reread my initial thoughts on joining Twitter in 2011 to laugh at how young and naïve I was five and a half years ago. I know that when I first started I didn’t really have a great idea of what people did in fast growing companies. Did they jump around and try to work on the most critical problem at the time? Did they focus on small areas and grow them into large ones?

Reading List - Managing Engineers

In May 2016, I was offered the chance to manage the Twitter Dashboard team. This was my first opportunity to manage engineers and I was very conflicted about switching over from a SWE to an EM. As a software engineer, you are generally only responsible for the trajectory of your own career. As an engineering manager, you have a large potential impact on the careers and even lives of all the people you manage. Ultimately I decided to take the opportunity but that I was obligated to do the work to improve my skills to be the best manager I could be.

Sliding Windows

I’ve been working on a small interactive iPad experience for my daughter Ada. I wanted to create a world where objects would respond to touch, break apart, and evolve into different forms. She’s limited to a slappy/flailing motion and I wanted the game playable with only these rough moves. Gestures such as pinch-to-zoom or even panning the camera purposefully would not be appropriate. My v1 build therefore added a camera which zoomed to focus the most recently touched item. This worked well with my (more purposeful) testing, but zoomed around crazily once Ada got her hands on it.

Throne of Blood (1957)

Akira Kurosawa’s THRONE OF BLOOD (as I like to think of it, Michael Fassbender’s favorite Macbeth) is a meticulous, engrossing, and beautiful work. It was created at a time in 1957 where cinema still had a great deal of constraints, but also at a time where Kurosawa had honed his square-frame black-and-white film technique to perfection. There are shots in Throne of Blood which I haven’t seen done with as much skill and artistry in any other film.

The Holy Mountain (1973)

This IMDB review of Alejandro Jodorowsky’s THE HOLY MOUNTAIN says “If you liked ‘The Wall’ (you know, the Pink Floyd movie), but thought it was a bit of a downer and suffered from the lack of a fat woman humping an excitable, legless, animatronic horse, this movie could be for you” which may be a little flip but not entirely wrong description of what to expect from this film.

Suspiria (1977)

Oh boy, SUSPIRIA. A prime example of the “cheesy horror movies so well crafted that they can be considered art films” genre. I can’t even remember what first added it to my queue, but I do remember seeing references to it in a crazy 2010 playthough of the SNES game Clock Tower which led me to the following reasoning:

  1. Clock Tower is an insanely weird, horrific, and beautiful game.
  2. Clock Tower cribs scenes directly from Suspiria.
  3. Therefore, Suspiria must be even more weird, horrific, and beautiful than Clock Tower.

Bin Packing - Shelf Algorithms

I’ve recently been working on an update to the twodee library we use for Ludum Dare games. One (of many) areas I’ll be focusing on is speeding up text rendering.

Text is currently very slow because we have to create and bind a new texture, render glyphs to it, then draw geometry for each piece of text in a scene. One simple optimization is to pack frequently-used text into a single texture which will remove many (expensive) texture binds.

Packing a bunch of rectangles into a texture isn’t the easiest thing to do well. There’s a whole class of algorithms dealing with this “bin packing” problem, each with various tradeoffs. Luckily, I found a very useful paper which covers many of these algorithms (thanks Jukka Jylänki!). To get a feel for how well each of them perform, I decided to implement a few in Javascript (you can see the source here).

Stalker (1979)

There’s a point early on in Andrei Tarkovsky’s STALKER where the Stalker, the Professor, and the Writer have snuck past a military blockade, dodged bullets and ridden a railway work car for a few silent minutes of screen time. The film switches from sepia to color - they have entered The Zone, a mysterious alien-touched segment of the world. “We are home” Stalker says. “It is so quiet out here, it is the quietest place in the world.”


On April 17, 2015, Wes, Kalev and I started work on LD32, our third collaboration on a Ludum Dare weekend game jam.

Our resulting entry, Chromos, is a top-down action game reminiscient of Zelda and (blatantly) Titan Souls. It’s the most ambitious game we have tried to make in 48 hours:

Under the Skin (2013)

A little while ago I read this great article on the cinematic influences of the game Kentucky Route Zero, which got me thinking that I should be expanding my exposure to and ability to talk about film, particularly with regard to influencing work on Moonshot or other creative projects. So I’m starting an informal Cinema Club (think Book Club) and hope to write a bit about the films I watch and what I took away from them.

Black Swan

At some point I overheard Buster (my PM on analytics.twitter.com) raving about Nassim Nicholas Taleb’s books. I was intrigued without knowing too much and dove into Black Swan (even though Buster recommended Antifragile as his favorite) because I wanted to see what the deal was.

Ludum Dare

Ludum Dare is a game jam. Every 4 months a weekend is selected and a theme is announced. Thousands of game developers have the weekend to design, create, and release games for a competition where there are no official judges and no grand prize.

It’s been the most rewarding creative outlet I’ve ever had.

Year in review - 2013

Now that 2013 is pulling to a close I feel the pull that anyone who has ever set pen to paper (metaphorically, in this case) feels now - the thick, crushing desire to “bang out” a top 10 Greatest Hits list before retreating sleepily back into the embrace of a thick holiday sweater for a few weeks’ hibernation. I had a great time in 2013 - got SUPER married to the love of my life, participated in Twitter’s IPO and then moved into a fulltime Software Engineer role while finishing a set of Stanford graduate CS courses. Busy year.

Twitter, naturally, was a common theme. It’s where I participated in and documented many of the significant parts of my year. Of course, many of my friends don’t use or even understand the service, so to them I’ve dropped off the face of the planet. Inspired by the great 2013.twitter.com retrospective, I thought I’d put together some of my notable moments into a smörgåsbord for those friends to feast upon.

Learn HTTP, damn it

I recently had to debug an issue which required a lot of familiarity with HTTP to debug. There were a lot of random workarounds to the problem (“if I disable feature X it works”) but only when a developer clearly articulated the exact problem with the HTTP response was it possible to trace the error to a consistent reproduction case. The underlying lesson is one I’ve learned at least a few times now. When working with web APIs there will be times where things break at a level where you will be completely helpless unless you know how things work underneath all of the frameworks, toolkits, and client libraries in your application. So learn HTTP, damn it.

Go templates

Go’s html template package has some really powerful safety features but is unfortunately not designed to be as simple as some of the other template packages I’ve used in the past.


A traditional Estonian Christmas dinner includes roast potatoes, creamed sauerkraut, cold beet and potato salad, roast pork, and thick cut bacon. But the centerpiece, while intimidating to newcomers, is undoubtedly the star of the meal. It’s a dark, savory barley and blood sausage known as verivorst—my favorite thing to eat in the month of December.

Another world

(Originally written on August 13, 2012)

I saw this today.

At some point, I’ll walk into some sort of Exploratorium with my child, and amongst the exhibits will be an opportunity to control a Mars rover over the internet for a few minutes, and the child will not appreciate how exhilaratingly wild and astounding that will be.

Racing the Beam

Racing the Beam is kind of like a biography for the Atari systems and their unique underlying circuit design. Actually, it’s kind of like one of those band documentaries where the band is already established so you just follow them around and see their interactions with common folk. Eventually there’s some scene where a band member blows up or throws a tantrum and probably didn’t mean anything at the time but foreshadows the band’s eventual downfall/breakup and so forth.

Post Office

I picked up Post Office by Charles Bukowski at Booksmith because one of the shelves claimed it was hilarious and because I hadn’t read anything relaxed and just funny in a while. I had heard of Bukowski before but wouldn’t have been able to tell you anything beyond that he had a hand in writing Barfly, a movie starring Mickey Rourke which I haven’t gotten around to seeing yet.

Loading Twitter's widgets.js in a Chrome extension

Twitter’s Javascript-based third party offerings include buttons and embedded content, which are handy for putting Twitter content into your website. Unfortunately, they break when included in a Chrome extension, due to the use of protocol-relative URLs. Luckily there’s a way to fix the problem, although it requires a bit of extra code.

The Internet is a universal service

Way back in late 2010 I was lucky enough to visit the remote Google office containing the office of Vint Cerf. He wasn’t there, and apparently spends much of his time traveling, but I still felt honored to be able to see his workspace, knowing that I had the privilege of working in the same company at one time, the same cheaply printed nametag on his office wall as the one which used to mark my own cube in Mountain View.


Is there a formal name for the idea that someone is mostly the sum of their external influences? So much of my day-to-day depends on what movies I’ve watched, which books I’ve read, and what music I’ve listened to. And that’s not entirely because the Twitter Developer Relations team is a hodgepodge of cosmopolitan folks and the references fly fast and furious in our work area, but because everything is so culturally interconnected nowadays.

What to expect

When I redesigned this site I made the decision to remove a post. I felt it did not reflect the level of quality I wanted here. It was a ranty and vague assertion of an unimportant idea, relied upon stock images to make a point, and ended in an inflammatory attack on a unrelated company just to make a joke. You can see the original source if you want, but I’ve decided to remove it from general availability.

This site is now generated and hosted by Go

This update has been a long time coming. Sometime around October 2011 I decided that I would convert this blog to a Bootstrap-based layout, wound up breaking everything with my build process, and decided that the best way to fix things was to rewrite Jekyll from scratch, using Go.

It is now December 2012 and this plan has come to fruition.

Dynamically coloring a favicon

Since starting my job at Twitter, I’ve spent a lot of time on dev.twitter.com, either reading documentation or posting on the discussion group. I’ve also been Tweeting a lot more, and I tend to switch back and forth a lot throughout the work day. My browsing habits tend to lead to a bunch of open tabs in Chrome, and I realized that I was losing productivity.

My First Weeks at Twitter...

… have met and in many cases exceeded the expectations I had when thinking about joining the company. Obviously I’m still in the honeymoon period and things are still moving fast, but the energy and culture of the place have been inspiring. I’ve found a few things particularly worth gushing over:

Interviewing for Fun and Profit

During my 4 years at Google, I conducted over 70 interviews. While there were definite hiring droughts, there were several months where I would have 2-4 interviews a week. Since most interviews are just 45 minutes, an interviewer has to get a good idea of a person’s abilities in a short time span. Usually this means that one major mistake can make the difference between a candidate getting a passing score or a failing score. I’ve certainly had interviews start off really promising, but go quickly downhill when the candidate made a few key errors.

Freedom Week!

With my decision to leave Google to work for Twitter, I am now officially unemployed for the first time in four years, and will be for slightly over one week. I have named this week Freedom Week.

My Last Day at Google...

…was August 25th, 2011. On September 6th, 2011 (four years and two days after I started my first Silicon Valley job at Google) I will be starting a position as Developer Advocate at Twitter.

Simple Go Server

Like I’ve said before, I think the news that Go will be supported on App Engine was my favorite of announcement of I/O this year. I think this is a huge step in getting broader developer support for Go as well as giving a comfortable middle ground between Python and Java for developers who want their App Engine apps to be compact and flexible while retaining some ability to do static analysis and refactoring. *

East Coast GTUG Tour

After an amazing Google I/O session last week, I’m doing a bit of touring around on the East Coast until June. There’s a ton of GTUGs within driving distance of NJ, so I’m hitting up a few.

Google I/O 2011

I’m at Moscone Center in San Francisco this week, as a speaker in this year’s Google I/O conference. My session is tomorrow (May 11th) and as a first, I’ll be livestreamed over the internet. If you’re interested in viewing the session, you should be able to see it here, starting at 10:45am PDT. We’re bringing a lot of great content, and will try to bring the funny as well.

Isolated Worlds

Chrome Extensions have been praised as being really easy to write, especially when compared with writing a Firefox xpi or a plugin for IE. But there’s still a few concepts that trip up developers regularly. One of these is the isolated worlds concept, and it leads to a lot of support questions in the group.

Add-on-Con 2010

Last year between the time that the Chrome web store crazied everything up and the holidays shut everything down, I was invited to give an educational session at Add-on-Con 2010 on the topic of Chrome extensions.

Getting an extension's ID

I’ve gone in-depth on the structure of CRX files, but left out a crucial portion for anyone looking to host their own CRX from a server.

Packaging Google Chrome extensions

I’ve been working at Google for about three years now, and was fortunate enough to transfer onto the Chrome extensions team about a year ago. Mostly, I support developers working on Chrome extensions, but from time to time I work on projects for the team to keep my sanity. A good example of this is the Chrome extensions samples browser. The extension docs are built and hosted automatically from the Chromium source tree so I modified the docs build script to generate the gallery and zip each sample into an easily-downloadable archive.

Before we begin, a little bit about me...

So upon getting here you may be wondering general questions like “what is this”, and “why are they making me read this page” and “why is there suffering in this modern world, what with computers and all”? All excellent questions to be sure, and I figured I’d devote some space to answering them before getting to the process of writing down whatever comes to mind while completing my day-to-day tasks at my nerd job.


Twitter (@kurrik) Github (kurrik) YouTube (kurrik) Linkedin (kurrik) Instagram (roomanna)


arne (13) reviews (12) cinemaclub (9) work (9) twitter (7) chrome (7) games (7) extensions (6) books (5) google (4) html (4) javascript (4) newyear (4) presentations (3) algorithms (3) ludumdare (3) go (3) readinglist (3) appengine (2) estonia (2) management (2) internet (2) http (1) art (1) recipes (1) questions (1) space (1) ciphers (1) product (1)