Home Archive Wiki About
Home Archive Wiki About


2018-09-12 - Review heuristic: Call out bad code

Code health tradeoffs in larger codebases

When people program, they often need to make tradeoffs between what will fix the current problem quickly, and what will make for a healthy codebase. Examples of such a tradeoff is:

I found a function which does almost what I want, but not quite. Do I wait for its maintainer to let me refactor it so I can reuse it, or do I just copy-paste? Or - if it’s just a 5-line chunk, do I extract it into a function if it will require a bunch of boilerplate (maybe it would necessiate adding a new module)?

It’s often a question of “do I pay the bigger upfront cost now, or do I make future-me front it”. These days I often work in a really big codebase, where there ends up being a bunch of those.

My review tip for copy-pasted code

When you review someone’s code that adds similar technical debt, you might not want to force the author to go and dig in 4 files just to extract out a function. It might frustrate them. And also, often it’s really not the best thing to do. If you really only duplicate the same 5-line chunk in two places, and it’s not often changed and not tricky, it might really be less costly to copy it than to agressively share such code.

So the request I often give in code reviews is: “if you duplicate code, add a TODO that the code is duplicated” (preferably to both copies).

This way, you allow the reviewer to quickly go along their day. But also you leave a “hey, this is a known bit of technical debt” affordance in the code.

When someone ends up copy-pasting the same code a third time, you will be much more likely to look and say “hey time to extract a function, there is this TODO which says it’s not the first time we’re doing this”.

General heuristic: “feel the pain”

There is a more general heuristic, which I use, that I call “feel the pain”. The heuristic is that bad things should be obviously painfully bad. Other instances of “feel the pain” are:

  • Let’s say someone breaks the contract of your Frobnicate RPC and sometimes doesn’t pass a required parameter foo, and you need to fix your service to accept that. Fine. But don’t do it like this:

    void HandleFrobnicateRPC(const string& foo, const string& bar) {
      if (foo.empty()) {
        foo = ComputeDefaultFoo(bar);

    Do it like this:

      if (foo.empty()) {
        // NOTE: As of 2018-09-12, the Bazinator service calls Frobnicate with
        // an empty 'foo'. The Frobnicate service cannot be easily fixed to pass
        // the 'foo' itself, because it does not currently have access to the
        // backend which can find the right foo for the bar. If the bar has
        // multiple associated foos, this will only return the last written foo.
        // Other clients SHOULD NOT rely on this.
        foo = ComputeDefaultFoo(bar);
    Why? Because that way, people are less likely to build more hacks on top of this hack, because there is a long paragraph full of scary words.
  • Let’s say that you inherited 1 million LOC from someone in a hurry, and at some point, they made a misguided architectural decision that makes your code clunky and hard to understand. Create a central bug for this in your bug tracking system, and whenever you write new code that would be made better by fixing the bug, add a note like:

    // TODO(agentydragon): Once we resolve b/12345, we'll be able to replace the
    // Frobnicator with a mock for tests, so our tests won't need such
    // complicated fixtures.
    Why? Because that way once you get around to fixing b/12345, you will be able to grep all places where this hurt some code, and fix them one by one. Also, let’s say some kind soul needs to change this code 2 years after you’re done with it, and finds that TODO. (That person might be you.) When they see this TODO, they might go “hmmm, that bug number looks quite low. aha, it’s been filed 2 years back, and it’s fixed now. yay! that means that I can fix this now and the diff for my new feature will be about 20% less horrible!”
  • Let’s say your code processes two different kinds of things, which both happen to be sort-of-strings (indulge me for a second and assume your code does not use strong types for such things). Think “URLs and street addresses”. For some hacky reason, which you hope to get rid of at some point, you are computing one from the other. What I would do in that case is make that code obviously painful and horrible using devices like variable and function names and type aliases. Not like this:

    string GetResult(const string& input) {
      return UrlEncode(input + "-autogenerated");

    More like this:

    using StreetAddress = string;
    using Url = string;
    // Long and verbose comment about why this is necessary and what it should be
    // replaced with and when.
    Url BuildFallbackUrlFromStreetAddress(const string& address) {
      return UrlEncode(address + "-autogenerated");

Even generaler heuristic: “Call out problems”

There is actually an even more general heuristic than this, which is “call out problems”. I also use it in other contexts.

  • Let’s say I am writing a design document, and I notice that I did not actually verify some assumption that I’m making, let’s say, “when a customer frobnicates a Foo without also having a Bar, Frobnicator service will not give them cake”.

    When I notice that and don’t have time to immediately verify it, I’ll openly say, “I believe that when …, then … happens, but did not verify that.” This is good for when your future-self might be going over your notes later, and, reading that doc, starts assuming that the doc is an authoritative source on the particularities of customers getting cake from the Frobnicator service.

    Same about your colleagues. If you say “I did not verify this”, someone who has nagging doubts might be much more likely to say “hey I’m not sure because I’m a human and I forget but I think I got some cake last month when I tried a different thing”, instead of thinking “huh. so he says Frobnicator service does not give cake in this case. I guess they changed it or I don’t remember it correctly.”.

  • Let’s say that I’m talking with someone and they raise a counterpoint to my preferred opinion that I never considered yet. Instead of immediately rushing to defend myself, I sometimes try to instead take in the new thing, and sit there for a bit with the dissonance (“but but but I want to be right so this thing must be wroooong aaaaaaaah”, or maybe “but but but I don’t want to have to redo this 3k line change that I love aaaaaarrrhh”). And instead of “Hmm, but your proposal would not address the …insert ad-lib…”, say, “Huh. I didn’t think of that yet. I’ll need to think about that.”

“Call out problems” feels sort of close to non-violent communication. I feel much less like openly communicating problems if it feels like the environment will hurt me if I do that. That happens to me with some strong personalities, or with people who (probably mostly unknowingly) trigger my sense of “argh I’m being bullied I want to curl up in a corner”. On the other hand, I usually try to call out problems more often than people around me, because I want to nudge culture towards cooperation. (Google culture is pretty blameless, so I don’t feel I’m acting against my interests.)

2018-09-11 - Trying "Things to learn" and "Documented systems"

It’s been a long silence for me on this homepage. Stuff has been happening, but somehow I didn’t find the time to write much.

I’m trying out a new thing. I have a lot of stuff I want to learn some day, but I don’t have the time to learn all of it (and often I also don’t have the leftover energy to do personal-development type stuff, but that is another problem). I’ve had a bunch of systems to remember the interesting things I want to learn - a file on my disk, then a more complex file on my disk, then my laptop crashed, then Google Keep.

So the new thing I’m trying is that I’m adding a new page here called Things to learn. When I find a new thing I want to deeply understand some day, I write it into the list. And when I (some day) feel like diving into a thing, I will pick one up from the list, spend a bunch of time learning it, and then I’ll write a thing, put it on my website and link it from there.

Why this might be good:

  • I won’t hopefully end up forgetting and then relearning the same stuff.
  • Writing something down makes it easier to spot confusion or weak spots in understanding. (Maybe it’s because I spend a lot of time reviewing code. Seeing something written in monospace font makes me go like “huh I’m not sure please write a test”.)
  • I will produce stuff :)

Let’s see how it goes.

Documented systems

Oh by the way, there is a more general thing I’ve been trying which I think might be useful for me.

So CFAR teaches this thing they call “systematization”. (CFAR - Putting Names on Things ™) Examples are:

  • Having your underwear in the top shelf, then the socks, then shorts, etc., and keeping it that way.
  • A checklist you follow when you need to pack up for a flight.
  • Putting all your appointments and other fixed commitments into Google Calendar.

Systems are useful, because they standardize things. Preparing a flight checklist once and then following it 10 times is easier than figuring out if there’s anything important you’re forgetting 10 times at different occassions.

I have a few systems. They have come to be mostly “on their own”, and I might not remember the reason they turned out the way they are.

I want to try making my systems explicit - by writing down a documentation for what each system looks like, what problems does it solve, and such. I want that because:

  • It makes sure the system actually is there for something. This prevents a failure mode I’ve been in after my CFAR workshop, which I once called “cargo cult rationality”. It’s running around beating at random things with CFAR techniques, trying to be a great and conscientious rationalist. (I guess “cargo cult rationality” is also a thing worth writing about some day…)
  • It stores the system out of my mind. For example, I have a system for which things to have in my backpack and where. It tends to deteriorate, and when the chaos threatens to overwhelm my backpack, I can just refer to the explicit description of what goes where, and maybe update it if needed. I don’t have to solve the problem of “figure out the optimal things to put into my backpack and where to put them” every time it gets too messy.
  • It enables debugging.

The way I think of it right now is to have a “source code for my systems”, sort of. Right now I have a like 5-page Google doc with a mix of where things go in my apartment, how to pack for things, and where things go in my backpack, and the motivation and open problems for each.

2018-03-24 - When I use my touchpad to scroll and then press Ctrl, Chrome starts zooming in/out. How to fix that?

This has been plaguing me for a few days (I just got a new Lenovo X1 Yoga laptop), and I think I now figured it out. The Synaptics touchpad driver has a CoastingSpeed option (see man 4 synaptics).

The issue is that when I start two-finger scrolling on a webpage, the driver interprets that to mean “oh and when I take my fingers off the touchpad, please continue scrolling for a few more seconds in the same direction, while slowing down until you stop scrolling”.

Guess what? When you press Ctrl in Chrome and the touchpad driver keeps sending the “ooh we’re scrolling!” message, Chrome starts changing the font size, which is what “Ctrl + scroll” does.

Quoting from the manual:

Your finger needs to produce this many scrolls per second in order to start coasting. The default is 20 which should prevent you from starting coasting unintentionally. 0 disables coasting. Property: “Synaptics Coasting Speed”

I found a command at the Ubuntu community wiki article about Synaptics touchpads which disables this: synclient CoastingSpeed=0. But I guess that won’t stay between restarts.

I’ll add this to a new file in /etc/X11/xorg.conf.d/99-custom.conf:

Section "InputClass"
  # Disable annoying "zoom after two-finger scroll" in Chrome.
  Identifier "touchpad disable coasting"
  MatchDriver "synaptics"
  Option "CoastingSpeed" "0"

And I’ll report back if that doesn’t work. (So if this text is still here, you can assume it did and I was too lazy to update this post :p)

2018-03-21 - Triage

I am tired and feel like I shouldn’t go to sleep yet. The Soylent thing has been working only very very slowly. I assume the first few days were just losing the contents of my bowels and now I just want to keep it up. Maybe in the hope that it will remove the habit of snacking when I feel stressed/bad.

The thing about feeling stressed at work has gotten a little bit better. But somehow I don’t feel that much like I’m winning.

Tomorrow a pretty useful thing would be to wake up reasonably early, then ~8 hours of work. I could really use some emotional support. Something’s wrong, actually a bunch of things feel wrong. I feel lonely. I don’t want to be fat. Work sucks and looks like my attempts to hoist myself into an AI safety, or at least AI-related position might fall flat. I might have reached beyond what I am currently good enough for.

I guess the last part feels pretty close to it. Work sucks. If I could do anything with my life, I would do X. Solve for X.

My feelings about it are, … I feel like I kind of grew up with the implicit assumption that work matters. Like, when you are the best at school or at work, people will like you and you will be happy. I want to feel, …, okay? loved? like, I want to cry about how hard and painful things are. Speaking of which, dental pain sucks.

So what’s so painful. First answer is “the fact that I feel I don’t have anyone to cry to”. (At this time. Growth mindset I guess.) I guess compared with that the other things which come up are much lesser. Actually maybe not. I also feel that I have no idea where I’m running, but I’m running there as fast as I can. And stopping where I am, or even the entire idea of stopping, feels dangerous and scary and I don’t want that.

Huh. It would be pretty funny if the function of snacking was to make this cluster of things not hurt. On the other hand, I might still be in the period where going off SSRI’s can do funny chemical things to your head, so there’s that. I guess there might be some fancy antidepressant I could start on to make me itch less right now, but would I want this to stop itching? Maybe not medicating it and not trying to shut it down might be good signal to do something differently…

With that off my chest, it’s still almost midnight and I feel like there are things I should be doing tomorrow. I have a pretty good idea of work things that need doing.

Things on my mind are:

  • Work on my master’s thesis.
  • Check that my mass transit card in ZRH still works (been here a year, it might run out).
  • Buy batteries for my bank’s card reader 2FA machine.

Feeling of having to come up with more stuff.

  • Errrr…

  • I guess, I’m still fat, what do I do about it? Well, that feels kind of forced…
  • I don’t really want to do anything exercise-typey tomorrow. I even have a semi-good excuse for why not to, my ankle is still swollen.
  • But I feel that makes me bad.

Huh. Does it? It feels like it makes me bad, though S2 would publicly say it doesn’t. I also feel tired so probably not gonna IDC on that… Bookmark I guess.

I’m probably not going to reach a point of “yeah I have a plan for tomorrow and it’s a plan which totally resonates”, because I’m pretty tired.


Let’s also put some things into Complice. Record weight, eat just Soylent. (Hmm. My calendar reminders are also getting a bit unwieldy. Maybe cancel some of them. Or reevaluate why they’re there. Or start behaving by them…?)

Get the goddamn batteries. And while I’m getting the goddamn batteries, also get some (goddamn) laundry detergent. And check out what other things I’m missing. Lowest-effort way to do that would be coop’s delivery service to the Google office. Yeah, sure, that sounds good.

My room is again slowly becoming a mess. That felt good fixing last time, let’s add that.

Feeling of having to do more.

Okay, when I’m home, I’m going to try to write some Python code that will run in Kubernetes on Google’s cloud to download a dump of Wikipedia for my master’s thesis. Oh, also, I might be able to download it in chunks so it doesn’t have to be loaded into the backing store (probably some kind of BigTable or whatever) in a single thread.

Actually let’s change around my Complice goals, too.

I should also make plans for Easter break. Not sure about what’s the deliverable for that. There’s a bunch of ways I could spend Easter. Baseline, lounging around in Prague chatting with friends. Working intensely on my master’s thesis. (That sounds good in some way.)

Triage done? Argh doesn’t feel entirely like it. I should also make some better plans for one of my partners visiting Zurich.

Itch. But well, I guess this triage will do. The parts which are most important on it are keeping on track with not overeating or snacking, and making some progress on the thesis.

Part of me feels like this is just not enough. Just getting that one Kubernetes script done in one day? Hah, don’t make me laugh. At this rate, you’ll be stumbling around at roughly the same spot in the thesis until time runs out.

Oh, and also, I want to some day go and implement a bunch of ML papers so I can learn TensorFlow and get the confidence to say “I can write AI”. That might actually have higher priority than the master’s thesis, if I were to only care about getting a job in AI.

Sigh. 3, 2, 1, chaaaaaaaarge, and let’s go to sleep. And if we can’t, maybe we can try to probe this “nothing is enough” thing.

2018-03-15 - Against goals

First off, it’s morning so I want to plan out today. An unexpected thing that happened yesterday was misstepping on my run down the stairs when I was going to work, and spraining my ankle. My right ankle, in which I had arthroscopic surgery some years ago. So I had to go to see (another) doctor, and probably will be working from home until the swelling stops. Hopefully it’s just a simple sprain and will be alright in a couple of weeks.

Because I had been home and not at work, I didn’t have Joylent available - I just grabbed the ~1/4th a packet I had at home for breakfast, and then when I came back from having myself drilled in the mouth and touched on the legs, I had been hungry. And I ended up just very quickly cooking whatever was in the kitchen, which was a big can of beans from Denner, 5 eggs and a packet of Chinese noodles. (Since I switched to not cooking and going with Joylent instead, my kitchen is mostly free of any ingredients of my own…) I munched all of that down very quickly, and then felt bad, because my stomach was disturbed and I felt that I had slipped into bad eating habits. I think it was the beans - they were not very good, predictably. When I started cooking the stuff, I did not have much agency, and had the opposite of reflection and mindfulness. I had entered some mode like “gaah eat all the food”. It was lucky for me to not have much actual food at hand, otherwise I might have eaten much more. I actually think I still was under the 2000 kcal I’m getting daily from the Joylent.

I don’t really know what to do next time. I guess something like a TAP like “omg want food → remember to breathe and not eat everything in sight”. Doing mindful eating on the meal would probably also stop it.

Rationality Zurich went fine yesterday. Just 3 people, but we had a nice conversation about an alternative system of self-development brought up by my roommate. My summarization of it is:

Goals are pleasant when you meet them, but painful if you don’t. If you tell yourself “today I will run a mile” and then you don’t, you get an “ow”. The “ow” makes you feel bad, and so the consequence of missing the goal is is feeling bad about yourself for a while. If you can stay on a streak of successfully doing all the things you commit to doing, you will ride a nice wave of “yay I’m doing all the things and I’m doing well”. But miss once, and now you’re a bad bad person (ow) and if you’re like me, on a deep level, you just want to curl up and cry.

Also, my goals are sometimes about “forcing myself to do things good for the long-term, even if they are aversive in the short-term”. That can feel like the part of me which set the goal is grabbing control of everything and dragging along all parts which might be protesting, which is painful.

An alternative is looking at self-development as a process. In that process, you do not set goals which you have to achieve or it’s bad. You don’t try to create a master plan with 34 steps that will perfectly fix everything if you follow them perfectly. Instead, you do small things in the now which are available to you, things which you want to do (or might enjoy doing but aren’t sure yet) that will bring you a very short distance in the general direction of where you want to be. “Where you want to be” might also best be thought of as kind of an emotional “this is who I really am, this is what is really important to me” - not a S2-type explicit list of SMART goals like “I want to weight <= 90 kg by 2019-01-01”.

I really like some things about this view. It’s comparatively very non-violent, and it natually allows for “okay, so a year ago I thought I wanted to be more fit, and I started swimming because I like it, and I met this person and talked with them and changed my goals, so now I want something a bit different”, and you can change what you are “aiming for” (though “aiming for” in a very weak sense, more like “what kind of thing would feel right”) without feeling you’re betraying an earlier commitment.

On the other thing, parts of me seems to want some enforcement device - like the pain you get from missing a goal. Like for some reason I don’t want to stop feeling bad if I e.g. overeat. Maybe a way to make this part feel better about it would be building some self-trust, or what the internal family systems model calls “Self-leadership”. Having some Self which makes sure that parts get along without being violent at each other, and which makes sure that everyone’s needs are met and that parts don’t enter prolonged conflicts. Like, part of me wants to make sure I do get fit, and it’s afraid that if it lets punishing me for not getting fit, I will not get fit.

So, as for today. I’m staying home to nurse my ankle and having a MRI and a chat with a friend in the evening. My plan today is to go on one container of Soylent. I should probably also add another luggage to my flight home.

Part of me feels like this is “a bit too little”. Like “I should also argh be finishing this master’s thesis and argh getting fitter”.

Well, actually I’m doing really good so far. I feel good about the new system/the new process I’m putting into place. Writing about how yesterday went and thinking about the things I will do today felt nice, and I am now not in traps in which I used to be (e.g., the “feel bad → overeat” trap).

I just realized there’s one trap which I haven’t mentioned here yet, and maybe it’s one for which I don’t yet know how would I avoid it long-term. It’s the trap of the work environment pressuring me into acting not fully authentically in it.

Say that I am feeling stressed because there’s too much noise in my office and it hurts and I stayed up all night because I was playing Civilization 5. And what I really want at this point is to go get some sleep.

But it’s work, and if you are not at your post without explanation, your boss will reproach you for that.

But if you tell your boss “hey, sorry, I stayed up all night playing Civilization 5 and I feel really bad about it and I just want to sleep please”, that costs you social points. Because you’re socially-supposed to be a strong independent adult, and strong independent adults are not fragile. And also, you don’t want to show how fragile you are, because you have already had your fragility abused by others plenty of times.

So (barring the opportunity to actually get some sleep), you stay at your post, and you feel bad about yourself, and you just want everyone in your open space to shut up, but you can’t, because they’re allowed to talk at their work place, so aaaaaaaa :’(

Google’s research into effective teams identified this attribute called “psychological safety”, which seems to predict lots of good things, and it seems to me like the belief that it’s okay to make mistakes, that you will not be personally-judged for what you do, that you are not on thin ice, that you are free to be yourself here. I’m not sure if it’s supposed to be mostly work-related - i.e., “it’s okay to break the build for a few days and we won’t be mad at you”. What I think would make me feel better at work and more free to be authentic (and also like it more, because I would not feel forced into putting up a performance of a solid worker drone that I actually am not) would be a kind of “psychological safety” less about the content of my work and more about “it’s okay to be fragile, it’s okay to be disturbed by people talking a lot, it’s okay to cry if you’re overwhelmed”.

Feeling psychologically unsafe is also kind of self-perpetuating. If you don’t feel safe to e.g. express an overwhelming sadness when you feel you’ve done something wrong, and hence you don’t do it, you will use it later as more evidence that you are not psychologically safe here.

Maybe if my current work environment is actually supportive of everything like that and most of my fears/expectations-of-judgement are from this kind of self-driven feedback loop, some CoZE-type experiments could help. Like, maybe when I tell my boss I’m feeling bad, don’t say it while wearing the mask of “I’m an efficient worker and emotions are my slaves”, and instead let it drop and shed a few tears or let my voice break. Meh. Probably actually something weaker than that. This would already feel unsafe.

There’s a thought lingering in my head about the “think of it as a process” thesis. Maybe things which you have to force yourself into doing (by way of e.g., Complice or calendar reminders or willpower or what not) are not really worth it. Because being forced into something hurts. And maybe the thing to do instead is to start with where I am, and making progress through a sequence of comfortable expansions at the margins, all of which feel good and not forced and don’t make me feel bad if I don’t end up doing them.

2018-03-14 - Murphy-jitsu for today

An experiment in writing out and publishing my Murphy-jitsu for today. I have put this in as a reminder for the last ~5 days. The implementation so far has been just “grab a tablet and plan out the day, without real Murphy-jitsu”. Let’s see what happens if I give it some more structure.

What am I planning to do today?

  • I want to eat just 1 packet of Joylent today.
  • I have to go to the dentist.
  • I am organizing a Rationality Zurich meetup tonight.

I need to remember around 13:00 that I have the dental appontment, and to go home by ~18:00 so I am around by the time people start appearing. Let’s set an alarm at 13:00 and 18:00. Done.

The way eating just 1 packet of Joylent might go wrong is:

I feel frustrated and tired and depresssed sitting at my desk, and I default to going for a snack.

What has helped me avoid such situations the last ~5 days was instead going to a sleep pod and having an hour or so of sleep.

I feel annoyed by the feeling of hunger, and also I have slight heartburn for some reason. It would be nice to solve both of those.

Yesterday, I decided to work on implementing a new system. Let this be one step. But still, there’s things which I am not working on towards today. Like maybe getting some exercise to burn off more calories, and I am also not doing anything about my master’s thesis. Part of me feels a bit annoyed, but I think it’s actually fine that I’m not doing anything about those things today. I have a full-time job, a dentist appointment and a meetup in the evening.

I feel that there’s more I could be doing as the current organizer of Rationality Zurich. Maybe there needs to be some soul-searching. I currently don’t actively care as much about rationality-as-actively-trying-to-believe-true-things. Good things I like are tribe-type feelings and what could help could be accountability and goal-setting and stuff. However, those things are pretty different from epistemic-rationality things some rationalists do, like explicitly betting on beliefs. After I arrive home, I could see if I can come up with some cool thing people could do at today’s meetup.

Actually a good thing would be building a scaffolding of “you can always do better than you are doing and that’s a thing to celebrate”.

So, plan for today:

  • Go to work, skip Milliway’s (name of cafe at Google’s ZRH-BRA-110 site where I work), sit at desk, make some Joylent, break fast.
  • I will count how much Joylent is there left in my Joylent box, and probably order more.
  • If I feel overwhelmed and need some quiet, go to a nap room and have a nap.
  • What do I plan to work on today, actually…?
    • There is a task that I could get fully handed off to me from my teammate, and when that’s done, that will give me a nice chunk of useful work to do.
  • If I notice I’m working on some refactoring, I’ll go sit on a couch and think about whether there’s something more useful I could be doing.
    • There’s at least one minor change I could make in another teammate’s project.
  • In the afternoon, I’m going to the dentist.
  • At 18:00, I am leaving work to go back home.
  • Before the Rationality Zurich meetup, I’ll unwind and think about whether there’s some cool thing we could be doing today.

Intentions are entered into Complice, and I can look over them in the evening to see how things went.

2018-03-13 - I need a new system

It’s now March 2018. I have been working at Google for a year. A few days after I started, my personal laptop broke, along with all my meticulously tuned personal infrastructure. I have procrastinated on getting a new one, mostly because I hoped I would fix it myself, or because I did not want to make a big purchase like that.

There’s a lot of problems that keep bugging me and that I need to solve, and after that’s done and my head stops screaming bloody anxiety at me, there’s aspirations. I feel that I need a strategy. It’s useful to take a step back to think about what things are important, what’s working for me and what’s not working, and such. Over the last year I have had a few times where I picked up a piece of paper and started scribbling some strategical stuff on it, but it was always spare moments and not very connected to other such times. I would always start from scratch.

That’s bad. I am obese and need to change that, and changing a thing like that can’t be done by getting a spark of inspiration one day, running on an agenty high for 10 hours, and then it’s fixed. I weigh 124 kg, which is very near my lifelong maximum. The Internet says that you lose 1 pound of fat by burning 3500 kcal (of course, not a figure to take seriously, goodness, I’m just doing a Fermi calculation here, leave me alone), so to get to my optimal weight of let’s-say-78-kg, I’d need to lose 353 500 kcal. The last 5 days I’ve been trying to attack the snacking habits through which I balooned to this weight by eating just a Soylent packet a day. A Soylent packet is 2082 kcal and my basal metabolic rate is 2300 kcal. At this rate, I would get down to 78 kg in… 4.4 years :/ (And that’s not accounting for the fact that BMR decreases the with weight. But on the other hand, I am not completely sessile.)

A goal like this needs some system for coming back to the drawing board every now and then, learning from which things work and which don’t, safety nets for not losing hope and determination if I inevitably fall short at some point. And of course there’s other things in which I could use more wisdom/strategy.

For example, at work. A thing which often happens is that I spend most of the day kind of switching between not-very-useful tasks, like some refactorings or minor features, and feel very frustrated when I get blocked. And I don’t often take a moment to step back to prioritize, and I recognize that if I want to optimize for promotions and recognition (which I do want, among other things), I have gotten myself into a trap.

Or, happiness - optimizing for being happy, being with people I love.

And when things I want conflict, without the opportunity to “detach” from the conflicted parts and allow for some higher-level strategy or prioritization, I just burn cycles feeling bad because of something I also do. Example: I want to move to the Bay, because I think I’ll like the rationalist and furry communities there, but I also feel scared of looking for a new team within Google or scoping for options outside. I want to work in AI safety (part of it is probably about feeling it’s a super high-prestige thing to do), but I also want to be rich and have an upwards career trajectory. And such stuff.

And often, when I feel bad about something, I find myself walking through some conflict I have walked through many times before. Maybe I have walked through that conflict before even with a piece of paper and doing some kind of exercise to reduce internal conflict (like compassion with parts or internal double crux) but somehow that piece of paper is never anywhere to be found.

So, I want a new system for strategical stuff and I want to turn it into a kind of keystone habit which I have. Let this post be a commitment that I want to flesh this out. I’m setting up a weekly 2-hour goal in Google Calendar called “Systems Maintenance”.

What I want from the system

I’ll try to put into words what I want from this system.

I want the system to align my short-term wants (e.g., “I want a cupcake”) with my long-term goals (“I want to lose weight”).

I want the system to track the really important things. I don’t want the system to track things just for the sake of tracking things, or just for the sake of “getting good-boy points for doing an agenty-looking thing”.

If, on reflection, it turns out that a thing that I am doing because of the system is a thing I don’t really want to be doing, then sometimes that will be a fault of the system for picking that thing - not of me for not doing it.

The system is not a system for losing weight or for tracking work.

Some specific things that are bugging me at this time

Here’s a few candidates for things the system might, but also might not lead to me making some progress on. Here, I am deliberately using non-commital language. I am not going to say that I absolutely have to do something. I have found that commitment-mechanism-bombs are sometimes self-blackmail and end up to me causing violence to myself.

But there’s a few ideas for things which often bug me. They do often bug me now, but that does not necessarily mean that dealing with them directly on their own terms is a good idea. Maybe some of them point at problems I actually on reflection want to address. Maybe some of them are distractions, to which the correct solution might be “just stop worrying about it” or “get some fancy antidepressant / do a mind hack to realize those things are not important”.

  • Weight.
  • Unfinished master’s thesis.
  • I want a “feeling that I’m home” - a feeling like “I am safe, I won’t be hurt, things are fine and not fragile, I don’t have to try hard to fight off bad things”. This one feels important.
  • More generally, long-term non-depressed mood.
  • Stress at work. “I have no idea what’s going on higher-level. I am not in control. I feel like a small gear/pawn in a machine.”
  • Feelings of being forced into things by myself.
  • On the other hand, there is a specific thing which I’ve felt the last few days (though I’ve not always been feeling all that well), and which is associated with happiness and also productivity: something like “I can do this”, “things are actually okay”, “I am doing a good job”. “I have committed to a thing and look, I am actually making progress on it.”

There’s also a few aspirational things in mind, which might be candidate goals, but might also be distractions which should be abandoned or shelved. Actually, now that I think about it, they’re mostly “maybe I want to work in AI safety research” and “maybe I want to do some serious EA-planning”. Right now, I’m mostly feeling like setting those aside and focusing on getting myself in order and feeling good without trying to string on specific goals like that.

Sidenote: I don’t think I want to be religious in a certain sense

Relatedly, I’ve gotten somehow less certain about EA stuff - in particular, the role that I want it to play in my life. I have been a religious effective altruist (for a wide sociological take on religion). Independently of whether or not do I want to continue or discontinue some EA-type behaviors (like identifying as an EA, going to EA/rationality meetups, etc.), it’s not healthy to be too identified with a particular belief system.

In my understanding, religions are community plus belief system plus value system. Hang out in the community, and you’re prone to soak up all the rest. And you may see your own (possibly implicit) value system and belief system come into conflict with that of the community. And if you don’t want to leave the community, maybe because you by now know few people outside of the in-group and because you (like me) are deeply pained by loneliness, the part of you which wants to do the right in-group signalling is going to fight the parts of you which want something else.

Say that you identify as an EA and a rationalist and to get social points, the right thing to say is “I want to work on AI safety in the Bay Area”. That’s called a load-bearing belief by analogy with a load-bearing wall: if it comes down, you can lose a lot.

And earlier this year, largely due to talking with a person highly critical of rationality/EA, I have become worried of the fact that I apparently have load-bearing beliefs about EA and rationality. Note that a belief being load-bearing does not imply that it’s false. (Though after reading The Elephant in the Brain, I wouldn’t be surprised if there were some argument for why group-cohesion-beliefs would tend to be outlandish, honest-costly-signalling-something.) So I have become concerned that I might be acting out some beliefs because they’re load-bearing for my need for community and acceptance. I think what’s warranted is a gentle de-identification from the community, by mixing with more people who are not in it and diversifying, and a kind of retracing of my steps in how I came to do EA things.

If I remember correctly, they came mostly from moments when I expanded my empathy over the suffering of all things, and wanted to make things okay, and I expect I will still prefer to try to make the world better on reexamination. But a sort of scary thing is that I think it would feel bad if I came to discover I don’t really care about making the world better.

On the other hand, the general form of this reasoning is: “Huh. Maybe I don’t actually want X. And the thought ‘Maybe I don’t actually want X’ makes me feel bad. That’s a reason to re-examine whether I want X.” Substituting for “X” anything I care about will have the effect of making me doubt whether I actually do, and I’ve had this particular security hole exploited by the said person-critical-of-rationality/EA.

Something for me to maybe think over when I feel like it. But after this writing-it-out, I don’t feel the need for doing anything in particular about it.

Back to the system.

Broad failure modes I want the system to avoid

I know about at least two failure modes I want to avoid.

First, I want to avoid the failure mode where some bump makes the system fall apart.

That is, I want the system to fail gracefully and recover. If part of me wants the system to fail for some reason, the means I should bring things into harmony not by forcing the part to behave, but by accomodating the system to meet the needs of all relevant parts.

Second, I want to avoid the failure mode of “doing all the rationality techniques just so I can get the points for doing self-improvement”.

After attending my CFAR workshop in May 2017, I fell into the second one. I’ve had a document with TAPs that I practiced every day. When I started using Complice, I picked ~5 goals and didn’t revise them, and felt bad when I stopped working on them. I want to put the system in place so I can be awesome. If I am doing self-improvement-type things just because I would feel bad if I would skip them, I have fallen into a trap.

Specific tools that could figure in the system and their failure modes

Every TODO system that grows with time ends in bankrupcy

Something that I guess maybe?? Miranda Dixon-Luinenburg might have remarked on in a document that I have no idea how to Google now (a document discussing productivity tools by some members of the CFAR alumni community) is that everything which looks like a TODO list or inbox is doomed to fail. My Google Inbox, my Google Keep and all the other places which I have used to try to keep track of tactical concerns have over time become full of items which I don’t want to address immediately, but also don’t want to shelve indefinitely. The system’s working memory has to stay constant-size over time. Not keeping the system’s working memory constant-size would lead to the second failure mode, in which obsolete tactical concerns end up dominating, and the system becomes a bother to keep running. The inevitable consequence is that some day, I would declare bankrupcy and start over from scratch.

The thoughts which come to mind upon seeing this are:

  • Zero is the limit of constant-size working memory. Perhaps just regularly reflecting would be better than trying to keep explicit track of all tactical concerns. Maybe my brain will automatically garbage-collect.
  • On the other hand, the principle of Getting Things Done is that the brain does not automatically garbage-collect, and that putting “okay some day I should learn crotcheting” into a TODO list lets the brain be like “okay, now it’s in the TODO list and it won’t get lost, so I can stop thinking about it randomly at 2 in the morning”.
  • A thing which could be good would be explicitly keeping just a few “live tactical concerns”, and keeping everything else in non-working memory. I’m thinking of a DAG growing to the right in time, and keeping a few of the leaf nodes as “working on this”. A thing I tried before my laptop went “lol I won’t turn on now” was storing my collection of personal notes in a git repo, so I could even safely delete from them without losing the things forever.

Writing things down is useful

Yep. It lets reasoning be explicit. When I write down my thoughts, I’m more likely to notice thinking going askew.

Publishing things for other people to look at feels nice and works as a commitment mechanism slash reward signal. On the other hand, things I publish go through my social filter. Probably some balance to strike here.

Too much automation is bad, but I also want the system be my own

As I mentioned, I used to have a whole scaffolding of scripts on my old laptop which would do things like plot my net worth over time, try to mount and unmount an encrypted partition (mostly because of NSFW stuff in it), synchronize Anki decks with a human-readable Git repo of information, and such. And over time, this scaffolding tended to accumulate bugs, like when a service I was relying on changed its API.

I like to program, but time spent programming the system is time not spent being object-level awesome.

I have tried to reduce the custom scaffolding I used (partially out of necessity, because I just didn’t have access without a personal laptop), by supplementing with Keep and such, but I ended up not, for example, keeping up with writing my diary. The more I use general tools, the less will they fit my personal idea of ergonomy.

Also: I’m a programmer and I love programming a nice system. That’s both a blessing and a trap.

Taking up too much time is bad

The system I had in place some time after CFAR accumulated more and more small things, which I would check off every day. The final version was something like: every morning, do a boot-up with a few free-text questions, pick up ~5 Complice daily tasks and maybe put in a few extra Complice goals. Every evening, do a self-improvement round which lasted probably more than 1 hour. It included practicing TAPs, a kind of Murphy-jitsuing around possible problems in my daily routine (a free-form text exercise) and checking in with some of my parts (also free-form text).

I have kind of hard-committed into doing all of this daily, and when it crossed some threshold, I just stopped doing all of it at once.

A way I could have avoided this would be keeping the “mandatory” part constant-time. And also having a looser schedule, in which I could easily spend, say, a whole evening reflecting and improving the routine (as opposed to having very little time and so not feeling like I have the time for meta-stuff, so just chugging along the overly long routine). And by coming into peace with the fact that there are 24 hours in a day, and that if my self-improvement routine takes 2 hours, those are 2 hours less of sleep or fun or whatever.

That feels important. Time is a scarce resource.

It has to be okay to stop doing some things

If I have decided at some point that I want to, say, write a diary entry every day and I end up not doing that, that does not mean that I have failed. If I today decide that something is important, but tomorrow I no longer think it is, that’s okay. I have the right to revise what is important - in fact, revisions are good and welcome.

At one point, I felt that I could change a bunch of bad habits by doing TAPs. But later, the TAP practice routine became very long, but I felt bad about the prospect of just saying “this is no longer the thing to be doing and so I will stop doing that”. A more productive and less conflict-producing way to look at it would be: “I am not feeling like doing this TAP routine, and that’s okay. I deserve rest.”

Tactics are contingent on being useful.


  • Need a new system
    • System to do good things
    • System to keep me doing well and feeling well
    • System to enact long-term plans
  • Want system to recover from bumps in motivation/mood
  • Specific possible goals:
    • Weight
    • Unfinished master’s thesis
    • Internal conflicts
    • Feeling good
  • Known antipatterns:
    • System becomes a boring chore
    • System bloats over reasonable size
    • System stops tracking what’s the thing to be doing
    • Overly strict commitments
  • Ideas to leverage:
    • Writing
    • Automation, but not too much of it
    • Time is a scarce resource
    • Changes are good

Wall of text ends here

I have an idea of how could a software implementation of a part of the system look like for me - something like a versioned directed graph where nodes would be free text, ideas, tactical priorities, or resources like links to websites, or nodes grouping events or people. It would probably be very fun to implement. However, also time-consuming.

I’ll let my thoughts sit in my mind, and my next action is to sit down in a few days and think some more.

2017-09-19 - Cost of spaced repetition

Spaced repetition is a technique for efficiently memorizing things developed by smart people who noticed that when you get reminded of something after not having seen it for some time, you remember it longer next time. You represent things you want to memorize as two-sided “cards”, which have a prompt on one side (e.g., “Population: Asia”) and the answer on the other side (“4.4 B”). Each card has an interval attached to it, and it starts as a small constant, say, 1 day. When you study a card, you look at the prompt, try to remember the answer, and then flip over the card. If you answered correctly, you exponentially increase the interval, say, multiply it by two. If you answered incorrectly, you return the interval back to the minimum. Different systems have slightly different algorithms.

Spaced repetition is really good for learning large amounts of raw information. I have been using it for about a year now, for example for German words, for studying for my master’s final exam, for country names and flags, and for flags and command line options of tools I use. I use the spaced repetition program Anki.

I have noticed that I sometimes use spaced repetition even if I probably could be doing something more fun, or more productive. It is addictive, sort of like playing Mafia Wars on Facebook in high school was addictive or like checking my stock portfolio every day was addictive - seeing the number of due cards going down has a nice feeling like “I am winning the game” and “I feel smart”.

The cost of Anki addiction is opportunity cost: time I am spending on Anki is time I am not using to do more important things. I want to have a rule of thumb I can use when I consider whether to add stuff to Anki, or whether to keep it there, so I can deliberate: “What is more valuable to me? Having X more hours of free time, or remembering the atomic number of every element?”


How much time does learning one Anki card consume? My rule of thumb is 250 seconds per card over the first year. That means that learning a stack of 100 cards will take about 7 hours.

Read on for how I came up with that.

My process

I will simplify Anki’s algorithm to make the estimate. Let’s assume:

  • A single review takes r = 6 seconds. As of today, I have done on average 542.1 reviews per day and studied on average 54.7 minutes per day, so it works out to about 6 seconds per review.
  • It takes l = 4 reviews to get a card from “learning” to “young” (i.e., from “I have not seen this card or I forgot it” to “I am reviewing it, starting with an interval of 1 day”). I have pulled the number 4 out of my hat.
  • If a card is “young” (i.e., its interval is less than 21 days), I have a 16% chance of getting it wrong and resetting its interval to 1 day (p1 = 0.16). 16% is from my Anki statistics.
  • If a card is “mature” (i.e., its interval is more than 21 days), I have only a 10% chance of getting it wrong (p2 = 0.1).
  • Card intervals multiply by 2 if I get the card right, or drop back to 1 day.

I want to know how much review time will a card cost me over the next 365 days. I start with a card that is unreviewed.

Try 1: Markov chain stationary distribution

I will model it as a Markov chain. The first state is the state of a card being forgotten/in learning, the second state is the state of an interval of 2 days, then 4 days, etc., up to 256 days. (I don’t care about longer intervals for the purpose of 1 year. I’ll pretend a card doesn’t get an interval longer than 256 days.) I will figure out its stationary distribution, and then assume each day I’m paying l × r seconds if I’m in the learning state, r seconds for an interval of 1 day, r/2 for an interval of 2 days, etc. So, I have 8 states.

A Markov chain is only a good model if the long term (where the probability distribution converges to the stationary distribution) accounts for most of the learning cost. This might not necessarily be the case.

I’ll create a transition matrix and get its eigenvector in Octave.

p1 = 0.16;
p2 = 0.1;
M = zeros(8);
M(1:5,1) = p1;
for i = 1:5; M(i,i + 1) = 1 - p1; endfor
M(6:8,1) = p2;
for i = 6:7; M(i,i + 1) = 1 - p2; endfor
M(8,8) = 1 - p2;

I want to find a vector x such that Mx=x and the sum of the components of x is 1:

x = [M' - eye(8); ones(1, 8)] \ [zeros(8, 1); 1];

I got: x = [0.127905; 0.107440; 0.090250; 0.075810; 0.063680; 0.053491; 0.048142; 0.433281]

Now to compute the cost.

r = 6;
w = zeros(1, 8);
w(1) = r * l;
for i = 2:5
  w(i) = (l * r * p1 + (1 - p1) * r) / (2 ** (i - 1));
for i = 6:8
  w(i) = (l * r * p2 + (1 - p1) * r) / (2 ** (i - 1));
time_daily = w * x;

That adds up to 3.9 seconds daily.

I noticed the probability mass on the last interval size (0.433) is high. This means that in the stationary distribution, there are many cards with intervals over 256 days, so in the first year of studying a card, the distribution will be more heavily weighted on the smaller intervals.

I decided to try again.

Try 2: Change the assumptions a bit

I’ll slightly change the assumptions of the model. Let’s say that if a card’s interval is x days, it doesn’t mean that it will show up exactly in x days - only that in each following day, it has a 1/x chance of coming up.

Let’s create a matrix of transition probabilities:

p1 = 0.16;
p2 = 0.1;
M = zeros(8);
for i = 1:8;
  p_change = 1 / (2 ** i);
  % Fill in probabilities of reviewing and then forgetting.
  if i <= 5
    M(i,1) = p1 * p_change;
    M(i,1) = p2 * p_change;
  % Fill in probabilities of reviewing and then getting it right.
  if i < 8
    if i <= 5
      M(i,i+1) = (1 - p1) * p_change;
    else i < 8
      M(i,i+1) = (1 - p2) * p_change;
    % Fill in probability of staying in the same state.
    M(i,i) = 1 - M(i,1) - M(i,i+1);
    M(i,i) = 1 - M(i,1);
% Fix for the first row.
M(1,1) = p1;
M(1,2) = 1 - p1;

We are going to pay for transitioning from state A to a different state B. Transitioning from A to A+1 or from A to 1 costs r seconds, and transitioning from 1 to 2 costs r × l seconds. Let’s create a cost matrix.

r = 6;
l = 4;
C = zeros(8);
for i = 2:8;
  if i < 8
    C(i,i+1) = r;
  C(i,1) = r;
C(1,1) = r;
C(1,2) = r * l;

We start with the card in state 1 with probability 1, and we have paid no costs yet. I will represent the costs as a vector of costs paid entering a given state. At the beginning, we have paid nothing.

pd1 = [1 0 0 0 0 0 0 0]';
c1 = [0 0 0 0 0 0 0 0]';

I will want to get the total costs by doing matrix multiplication. After 1 day, the probability distribution will change, and we will incur some costs.

pd2 = M' * pd1;
c2 = (C' \.* M') \* pd1 + c1;

This change is linear, and we will represent the state as a combination of the probability distribution vector and the costs paid so far.

In Octave, I will create a matrix transitioning from one state to another and a vector representing the entire state:

T = [M', zeros(8); M' .* C', eye(8)];
s0 = [1; zeros(7, 1); zeros(8, 1)];

So, after 365 days, we have paid these daily costs:

daily_costs = sum((T**365 * s0)(9:16)) / 365;

This model gives me 0.32 seconds per day. This is 117.69 seconds per year, of which 58 are spent transitioning from state 1 to state 2. The probability distribution was also heavily skewed towards the higher intervals - 64% of cards were in the last state. That means this model is just overly optimistic; there is no way 60% of cards in the unsimplified algorithm could have an interval this long after just 1 year (they would first have to go through the 128 + 256 days). This tells me this model might be way off and broken.

Try 3: Python

And at this point, I’m like “fuck this, I’m better at Python than at math”. So I wrote a thing in Python:


import random
import numpy

p1 = 0.16
p2 = 0.1
review_time = 6
reviews_to_learn = 4

def simulate_cost_of_card_over_year():
  next_day = 0
  interval = 0
  cost = 0
  while next_day < 365:
    if interval == 0:
      cost += reviews_to_learn * review_time
      interval = 1
      cost += review_time
      if interval < 21:
        if random.random() < p1:
          interval = 0
          interval *= 2
        if random.random() < p2:
          interval = 0
          interval *= 2
    next_day += interval
  return cost

tries = [simulate_cost_of_card_over_year() for _ in range(1000)]
print numpy.mean(tries)

And I got these results:

30 81.804
365 159.438
3650 252.15
18250 367.38

That tells me that over the first year, I will spend about 0.43 seconds per day reviewing the card. I trust this result more than I trust my previous hacky math.

Why all the estimates are bullshit

At this point, I was thinking about to declare “victory, it’s about 0.43 seconds per day, and let me now also say why exactly the number is bullshit”:

  • Anki actually doesn’t use a constant interval multiplier of 2; it uses 2.5 by default, and it also adjusts the interval as it goes.
  • You can also answer cards as “Easy”, which makes the interval even bigger.
  • The estimate of “it takes 4 tries to learn a new card” was totally made up.

And then I realized I can actually fix the last point, and that it’s probably also the most significant problem - most of the time spend on a given card will be learning it, not reviewing it.

Fixing the reviews per learning constant

Anki says I did ~35k “Again” responses on cards in learning, and ~65k “Good” responses (and a negligible amount of “Easy” responses). This means that on an attempt to answer a card in the learning phase, I have a p=0.62 chance to get it right. I have Anki setup such that a card graduates to reviewing after I get it right 3 times.

Denote e0, e1, e2 the expected number of attempts it will take me to get a card graduated, given that I have successfully answered it the last 0, 1, or 2 times.

We have: e2 = p × 1 + (1-p)× (1 + e0), e1=p× (1 + e2) + (1-p)× (1 + e0), e0 = p× (1 + e1) + (1-p)(1 + e0). Splashing that around a little bit, I get e0 = 1/p + 1/p2 + 1/p3, which means: e0 = 8.44.

So, that entails some corrections.

Correcting for that in the Python program (setting reviews_to_learn = 8.44) yields:

30 135.76992
365 252.52464
3650 364.75824
18250 502.50888

This means 0.69 seconds per day in the first year, and a total of 250 seconds in the first year, and ~2 minutes in the first month.


  • Learning a new keyboard shortcut is worth it if it will save me 0.7 seconds per day over the following year. (Or 250 seconds in total).
  • My German deck, which has 26 241 cards, would take roughly a whooping 1822 hours over the next year. That’s a full 227 workdays.
  • Rai has an Anki problem.

2017-01-02 - 2016


2016 abridged













































So, a year ago, I said:


How’d it go?

  • I co-founded the Czech Association for Effective Altruism and led the organization of EAGxPrague. “Contribute to projects and causes that actually matter”: Check.
  • I developed deeper relationships and fought my social awkwardness, and while it’s still an uphill crawl, I’m winning.
  • I got back in touch with old friends, especially my friends from high school. Thanks to dropping all the stupid fears of not being liked, I am now much more proactive.
  • I didn’t do urban exploration or geocaching. I did not jump out of any more airplanes, because nowadays I’d want to calculate the risk much more explicitly since I started valuing my own life. I learned mindfulness meditation and meditate a few times each week. I don’t think I’ll be touching illegal drugs anytime soon.
    I do, on the other hand, feel much happier nowadays, without necessarily doing anything extreme.
  • I was pretty healthy the first half of 2016, but somehow, my weight crept back up and the habit of running didn’t stick. That’s something for me to keep working on.
  • I did learn lots about things I wanted to learn about. I read 45 books in 2016, coming short of the goal of 50. I’m toning that down to 40 in 2017. I started building a stack of Anki cards (currently at 1549) from books and articles I read, English terms I don’t understand, constants and concepts I want to learn and so on, and I think it’s very useful for me. I also revamped my personal note-taking system – see http://github.com/MichalPokorny/public-notes for the public part.
  • Did I think things over and figure out how do I imagine my twenties and thirties? The answer to this question is “just stop worrying and enjoy life”. Through my long-term plan is still uncertain, I now spend too much time being happy to worry about it so much.
  • Am I happier? Quite. Am I a better person? That is in the eye of the beholder. In my view, yes.

Best books I read in 2016

  • Reasons and Persons by Derek Parfit. This book touched on several very important topics and was very important for the development of my current view on morality and personal identity.
  • Worm by Wildbow. This is an epic rationalist fiction about superheroes, which tells the full story of Taylor Hebert, a bullied high-school girl, who develops superpowers and has to deal with often having to do bad things for good reasons. It totals roughly 1,680,000 words; roughly 26 typical novels in length. I absolutely loved it.
  • More than Two by Franklin Veaux and Eve Rickert. This book explains all the ins and outs of polyamory, frequently with personal stories collected by the authors. Reading this book was the last nudge I needed to publicly come out as polyamorous. Polyamorous relationships are not about wanting to sleep around or fear of commitment. They are about open communication, about the courage to trust the other person not to hurt you even if you allow them to, the strength to stand up for yourself and the wisdom to make your own decisions even when it’s not easy. 5 stars.
  • Friendship is Optimal by iceman. It’s a fanfic crossover between My Little Pony and the Singularity. I highly recommend it if you’re rationality/futurist-minded. It also has very nice recursive fics - I read Caellum est Conterrens and Always Say No.
  • The Hedonistic Imperative by David Pearce. This is an enlightening and persuasive manifesto advocating a program to reduce suffering in sentient beings until, at some point, nanotechnology and genetic engineering allows us to eradicate suffering altogether.
  • Superintelligence: Paths, Dangers, Strategies by Nick Bostrom. Many thinkers (and many EAs) believe that developing a superintelligence not entirely aligned with our interests is likely to happen and that it would have catastrophic consequences for the human race. This book explains, in accessible language, the nature of the problem, some proposed options for dealing with it and long-term strategical concerns.

What now?






So, what goals do I set for myself for 2016?




As they say in CFAR:



The bright yellow is the time between then and today.

Gist on GitHub


2016-11-01 - October summary, mostly on EA efforts

As some of you might know, yours truly along with my friends Jirka Nádvorník and Radim Lacina founded the Czech Association for Effective Altruism a few months back. Dan Hnyk is not an official member yet, but he’s doing a lion’s share of the work. We were also very lucky to bring along Honza, who used to work on fundraising at the Forum 2000 foundation and who is helping us with many areas we had little experience with before he came onboard. Our goals are to establish an EA community in Czech Republic and to be the hub of its long-term viability.

Executive summary:

  • Effective altruism in Czech Republic is doing well. We have a medium-term plan around movement growth.
  • EAGxPrague is happening on December 10 and you are encouraged to apply (Czech application, English application) and please report your experience and feedback (the more verbose the better) to prague@eaglobalx.org
  • I encourage you to seek answers to certain questions by using surveys and basic statistics. It’s fun, easy and powerful.
  • We have very little information on which to estimate how many people will apply to the conference. I am curious as to how high will the actual number be once we launch distribution.
  • I talk about the importance of good planning.
  • Personally, my depression’s back, I am not OK, but who knows, maybe I’ll be OK one day.

Effective altruism

If you haven’t heard about Effective Altruism yet, it is a philosophy and social movement, which aims to 1) do good, and 2) do it as efficiently as possible. You yourself probably try to good in your own life: you probably help people close to you, and you might sometimes do an altruistic thing for someone not so close to you: donate a few dollars to this charity or other, give some clothing you no longer need to someone who does, and so on.

Early EAs have observed one very important and somewhat counterintuitive fact: it matters a great lot where do you put your resources. If you give $3500 to a charity that trains guide dogs for the blind, it will train roughly one tenth of a dog (they cost 32,400 GBP apiece to train). If you give $3500 to the Against Malaria Foundation, you will, on expectation, save someone’s life, and that is a pessimistic estimate (it only counts infants who would die of malaria infection that will not die thanks to an installed insecticide-laced mosquito net, not older children saved from infection, or prevented suffering from malaria attacks).

So, it matters a great deal that you put your resources where they have as much effect as possible. When you’re looking for ways to transport yourself to work and back, you research options. How much would a car cost? How much would I pay for gas? What if I bike? Would the extra risk of traffic accidents be worth it? How about mass transport? Would the extra time be worth the money I save? Maybe I could work remotely for a day every week?

For some reason, people usually don’t think about charity this way. But it makes perfect sense. If you decide you want to help people with, say, $1000 of your money, or maybe 7 days of your time, you should do some research to ensure you aren’t just burning money. If your work is 3 blocks from where you live, you wouldn’t buy a car to go there. You would probably just walk or ride a station or two on a bus. Then why are people, for some reason, comfortable throwing money into a random charity without knowing what they’re buying for it?

(The actual reason has to do with the way our brain circuitry gives us warm fuzzies in biased ways which are uncorrelated with how good our actions actually are. Some people don’t pull the lever in the trolley problem because they would feel like murderers, which leaves them with two dead bodies instead of one. Other examples include the identifiable victim effect: you are much more likely to donate to some specific African kid whose name and story you know than to support the same intervention when presented as a statistic. People are bad at naively making moral judgement. Our brains were built for stone-age hunter-gatherer tribes, where the only moral impact your actions had was on people you could actually meet and see. Obviously, this is no longer the case today. Which is why many people would rather give $100 so that Jane the blind child from across the street can afford a $35000 guide dog, rather than support a charity which can save a human life for $3500, with the only caveat being that you will probably never meet said saved human. Which makes you saving them and their parents and family from suffering and the victim’s death no less real. Only less emotionally salient to you.)

So, step one. It matters a lot what you do with your resources if your goal is to help others. (Actually, it matters a lot what you do with your resources if you have any particular goal at all.)

Step two (at least for me) is: If it’s THIS easy to help others, how the hell isn’t Effective Altruism a global project with 50 years of history and billions pledged in unanimous international support? Why are our smartest people working on optimizing ads on Facebook instead of on how to fix Earth? And believe me, once you start looking, you see things to fix everywhere. For starters: millions in poverty, diseases, cancer. Possible future risks we know next to nothing about. Aging, degenerative brain disease, death, depression, malnutrition, nuclear stockpiles that could destroy the planet X times over if some immature narcissist in charge pushes the button one day, risk of bioterrorism, and I could go on for another hour.

Read Doing Good Better. The eminent philosopher Will MacAskill gives the topic the attention it deserves.

I hereby swear that if I ever find myself writing a short intro to EA again, I will just make it an article on our association’s website :)

Our plan

Please excuse me if the previous paragraphs have been just me preaching to the choir. I have been very vocal about my support of EA among my friends.

The first step in the Czech Association for Effective Altruism’s plan is organizing EAGxPrague 2016 - the first conference on effective altruism in Czech Republic. We are cooperating with the Centre for Effective Altruism to make it happen, and the cooperation is so fruitful I wouldn’t hesitate to claim it added a degree of magnitude to our expected impact. It will be on December 10, 2016 in Paralelní Polis.

My role is currently Director of the CAEA and Event Director of EAGxPrague 2016.

Yesterday, we finished every necessary preparation and we have just opened applications (in Czech, in English). If you’d like to find out about how can you contribute to making the world better and if you’re fairly close to Prague, I highly encourage you to apply. We would be happy to meet you and talk.

I would be also very happy to hear any feedback from you at prague@eaglobalx.org, especially:

  • Do you know the important info? When and where will the conference be? What will it be about? What should you do if you want to go there?
  • Do you want to attend the conference given what you see on the website?
  • Did you find any parts of the application hard to understand?
  • Do you think some information you are looking for is hard to find on the website?
  • Is there anything about the website that confuses you, or makes you go “ugh”?
  • Do you know someone we should definitely talk to?
  • Do you have any suggestions for us?

The next steps in our plan are, roughly:

  • Do the conference and gather contacts to interested people there.
  • Do post-conference engagament - e.g., one-off talks, discussions, meet-ups, where we get to know each other better, and talk about our longer-term plans and strategy. Grow our member base.
  • Engage students at universities - teach them about Effective Altruism and invite them to our events.
  • Produce more EA material in Czech and post it on social media.
  • Think about longer-term strategy. For example: We will need to approach influencers at some point and try to persuade them. When will be the right time and how should we do that? Our operations will need some monetary resources. How can we gather those?

Our longer-term plan is mostly a black confused void, but that is OK. We are not in a position to formulate sophisticated high-level strategy given our current knowledge and manpower. Sophisticated high-level strategy is important, but it’s just fine if we define it and refine it step by step. Unless there’s some very unlikely crucial consideration we missed (e.g., promoting EA in Czech Republic might actually be a bad thing), most high-level strategies would benefit from having more manpower, more resources and more social backing for the EA idea. And this is an instrumental goal our conference is pursuing. More proximally, the conference will innoculate some influential and smart people with thinking about could we improve the world, which is good (again, barring some exotic and unlikely crucial consideration like “if smart people try to do good, they usually end up doing bad”).

So far, we’re doing great.

I have a few observations I’d like to share.

Doing quick research

I have never worked on organizing a big event before, or did anything entrepreurial-like or product-like.

One tool I have never used before, but that I’m starting to really enjoy using, is asking people what do they think. Doing researchy and sciency things to questions I’d like answered.

For example, yesterday we were thinking about which tagline would be best for the conference. We had a short-list of 7 and couldn’t choose among ourselves, so I asked 9 of my friends to rate each on a 1-5 cool-uncool scale.

My methodology was the following:

  • For each friend, tell them the story (“So, you’re walking down the uni hallway and you see a poster saying EAGxPrague with this tagline…”) and I send them a random permutation of the answers to rate. The random permutation is important because people are highly biased to the order of information presentation and since we’ll pick just one tagline, we want to remove this bias.
  • Then, we take their answers, average them out, and pick the best one.

One nice thing about this is that it doesn’t matter that the participants don’t use the same scale: one participant might use the whole cool-uncool range of 1 to 5, another one might be just like “meh” and use just 3’s or 4’s. There’s no need to account for this. Because every study subject rates every tagline, every subject’s individual bias or scaling has the same effect on every tagline’s average score.

However, this means you can’t really plot the final scores on a consistent linear cool-to-uncool scale, because that would be a hodgepodge of several different scales with different variances and means. The way I use the final averages is twofold: A) see the relative ordering of taglines from good to bad, and B) roughly eyeball the size of the difference.

The scores of the different taglines were as follows: (N = 9. I acknowledge a possible methodological gap in not calculating and working with the variances. 1 = cool, 5 = uncool.)

  • “Chytře za lepším světem” (“Smartly towards a better world”): 3.11
  • “Dělejme dobro lépe” (“Let’s do good better”): 2.66
  • “Konference o efektivní pomoci” (“An conference on effective aid”): 3.0
  • “Máme úžasnou příležitost pomoci stovkám lidí. Jak na to?” (“We have a great opportunity to help hundreds of people. How can we do it?”): 3.22
  • “Skutečná řešení na skutečné problémy” (“Real solutions to real problems”): 3.0
  • “Skutečné problémy a jejich efektivní řešení” (“Real problems and their effective solutions”): 2.66
  • “Skutečné problémy, efektivní řešení” (“Real problems, effective solutions”): 3.0

Some things that surprised me here:

  • The size of the gap between “Real problems and their effective solutions” and “Real problems, effective solutions”. Come on, it’s just two short words versus a comma! Surprisingly, some subjects gave these two taglines a difference of a full 2 points.
  • That “Real problems and their effective solutions” did better than “Real problems, effective solutions”. We (the 3 of us in the room at the time) liked the sound of the second one a bit better.

I’m afraid I’m unable to properly calculate the p-values for either of these claims. They might very well be just noise. Our sample size is shit.

Still, we ended up going with “Real problems and their effective solutions”, at least for now, and I like playing the statistician/data scientist. It’s nice to have data to support your decision. One of my big TODO’s for the future is to get a better understanding of statistical tests, experiment design and scientific methodology. Since math and CS at our uni was mostly “definition, theorem, proof, repeat”, we didn’t get much of a background in how does one formulate and test a hypothesis, and I think it’s a very useful and transferrable skill to have.

We used a pretty similar system to select which topics should we focus on at the conference, and I’m glad we did. Initially, we thought we’d rather not talk too much about far-future outcomes and global risks and that it would be better to play up the animal advocacy angle, because our target group (students and non-profits) would be easier to attract that way. Our survey’s results surprised me by putting animal advocacy well below global prioritization and far-future outcomes. I have updated my belief in the sophistication of our attendees upwards.

Estimating number of applicants

One problem we have had with the conference is that since it’s the first EA event in Czech Republic, there is little info from which we can infer how many people will come. Also, it is a problem with many variables: the amount depends on how aggressively do we market the event, how high do we set the ticket cost, and so on.

To make the amount of applicants as high as possible, we set the price low by covering the losses with our own money and with sponsorships: standard price is just 400 CZK, and students and people from the non-profit sector pay just 150 CZK (~$7).

The room we booked fits up to ~120 people and we would like to, ideally, fill it.

Other pieces of information we have are:

  • We did a pre-conference event that we marketed minimally, just by sharing an event invitation by 3 people on Facebook. 15 people came there, we collected their e-mails and they were enthusiastic about the EAGxPrague idea.
  • The LessWrong Group Prague on Facebook has 97 members. I’d guess about 10 or so people come to most meetups.
  • The Czech EA group on Facebook has 55 members. There’s not too much intersection with the LW group.
  • Our venue, Paralelní Polis, will promote the event on their Facebook page, which has ~11K likes.

Our hive-mind’s estimates were that we could, optimistically, get about 80 people to attend. I am fairly certain this is a number that’s based on anchoring to the ~120-person capacity figure and then adjusting down to account for not expecting to fully succeed.

I am optimistic. We are doing as much as we can. We shall see later how well were we able to draw inferences on relatively little information.


The most important tool CEA gave us was a clear framework to use to plan the goals of our conference, choose our target audience based on the goals, choose a program that would fit and attract the target audience, and so on. This transformed our fuzzy confused thinking into a clear picture where it’s easy to understand why exactly are we doing something. Where we previously had “Oh, so we want to do a conference on EA and invite students, and I guess it would be nice to also have some entrepreneurs and maybe do a giving game”, we now have “We want to build a solid EA base. To do that, we need people who have time and energy to put into that. These are mostly students and non-profit workers. To attract them, we need to do thing X, Y, Z and market through A, B, C.”

The importance of planning cannot be underestimated. I wish we started planning properly as soon as the idea of a conference emerged. We would have saved months of time spent doing less than effective work.

Personal status update

In the last ~2 weeks, I have been getting lots of self-esteem boosts, mostly I’d guess from how well things are going for me work-wise and conference-wise and thanks to some instances of unexpected acceptance, which had a soothing therapeutic effect. My psychiatrist also recently doubled my citalopram to 40 mg a day.

Unfortunately, in the last few days, I realized I made a huge mistake that caused people I really care about a lot of pain, and that I had to fix it. Now, I hate myself A) because I made the mistake in the first place, B) because I hurt people by making the mistake, C) because the mistake was probably just rooted in me trying to use other people to boost my self-esteem and fear of abadonment, D) because I was too much of a coward to even own up to my mistake and apparently subconsciously tried to shift responsibility. At least that would be my interpretation. My depression came back really hard in the last few days.

I have a few pieces of advise I want to give others who might be in a similar position as me, that is, confusion about personal relationships:

  • Don’t try to ignore away any nagging feelings in the back of your mind.
  • Never say anything like “I like you” or “I love you” or perform any actions associated with affection or love unless you are absolutely sure you are expressing your sincere emotion and that the message being broadcasted and the message being received are both as accurate as possible.
  • Never lie about your feelings to people you care about. Lying doesn’t always feel like lying. Sometimes it just feels like a little pause before you say something, or a word you say while slightly twisting its meaning inside your head. Or it may be an action that carries an implicit meaning you may not realize.
  • Others may understand your emotions better than you yourself do. I haven’t done that, but if you feel confused about what do you feel, you may try asking your friends. You may not notice verbal or behavioral clues you yourself broadcast, and others might.

The level of how OK I am depends on how much do I think about how stupid, hurtful, abadoned, unacceptable and unlovable I am, and how much do I think about the chances of that ever getting better. Right now, my level of OK-being fluctuates between “too devastated to get up from the floor” and “so immersed in exciting work that everything looks fine”. I’m not sure how long will this last, but I might be somewhat-acceptably-OK-most-of-the-time again in a few weeks.

Until next time. Onwards!

You can find more in the archive.