Final Version Perfected: An Underused Execution Algorithm

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm

Contents

TLDR

Introduction

Execution is the Last Mile Problem of productivity infrastructure. You can put as much effort as you like into organising your goals, organising your To-Do lists, organising your calendar, but sooner or later you will be presented with more than one thing you could reasonably be doing with your time. When that happens, you will need some sort of method for choosing what that thing will be, and actually getting started. Most people, I think, face this problem by either just doing the thing that is top-of-mind or looking through their To-Do list and picking something out. This works fine when the next thing to do is obvious, and you have no problems getting started on it. But when you have many potential things to do and aren’t sure which is best, or when you kind of know what the best next thing is but are avoiding it for one reason or another, you need a better system. That system needs to be quick to execute, easy to remember, and effective at actually having you do the best next task. It needs to be robust to your psychological weaknesses, minimising procrastination, indecision, and ugh fields. It needs to be efficient, requiring as little work as possible to identify the most valuable task. Enter Final Version Perfected.

The FVP Algorithm

The algorithm for executing tasks under FVP is pretty simple. You can find a description of it by the designer here, but here’s my version:

A long-ish example

Let’s say this is my to-do list for today:

FVP: Why and why not

The usefulness of FVP depends on a few key assumptions.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=u8kruiQyqWw37D2oR

I’ve just updated Complice to give it primitive support for FVP directly! A user sent me this article and asked about some changes to Complice that would make it easier to use FVP. I took a different approach than he suggested (creating a filter to only show starred actions) but I came up with something that I think works substantially better. First I added a new hotkey (d) to mark a dot next to an intention in your list, which is sort of the bare minimum needed to implement FVP or Mark Forster’s other systems, which people have tried using the star ★ feature for. So select an intention with the arrow keys or j/​k, then press d to dot it. Pressing d again clears the dot. Then it became clear that the usual assumption Complice makes about your "next action" (that it’s the top item on today’s list that you haven’t yet done) is completely backwards for Forster mode. So I changed it so that if you’ve put dots next to any intentions, it’ll treat the lowest dotted item on the list (that you haven’t done yet) as your next action. Then I made sure that that algorithm worked on the backend too so that this same next action is used for the new tab page extension as well. I’ve added some styles to visually diminish the items between the dotted ones, since those sort of aren’t in consideration. I’m intending to make a mode where it hides those altogether, but that’s a larger project at this point. There are still a few other improvements to make, like clearly disambiguating between "do" mode and "prioritize" mode, and at the moment the UI doesn’t guide you through the process whatsoever so you need to already know how you’re using the dots, by eg reading this guide above. If anyone has used other systems by Mark Forster and can comment on which are compatible or incompatible with what I’ve done so far, that would be great. I know he has dozens but I’ve barely dabbled with them at all. And of course I’m also interested in hearing other ways that this system could be improved. If you’re new to Complice, know that it’s very opinionated about a few things, and one of them is that you start with a fresh list every day. That’s not likely to change anytime soon, which technically goes against FVP but ultimately seems compatible with what Will describes above where he starts fresh about daily. And it has tons of other people features for tracking progress towards specific goals, and doing daily-weekly-monthly reviews based on what you’ve worked on in those periods.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=nA9j8WfrgRTELZGWz

I use Complice, so this is exciting news for me!

Comment

Awesome, let me know what you think of it!

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=LmAzHqdA3HzQyMnKX

This is basically the algorithm I use when trying to get my 4yo to make a choice. I can tell you it works even with just 2 options! I choose a default (usually based on what I want), and then go through the other option(s) one at a time asking, "do you like this one better than the current default". If yes, that becomes the new default. I weed out the bad choices myself (based mostly on time and safety) and simply don’t present them at all. At the end of the list, even if the kid is acting like a brat and refusing to participate at all, I still have a default option to execute on.

I’ve always figured it works because of that initial choice of default option. It’s easier to compare how much we want to do one thing vs. another than it is to pick from a large list, and even more so if we clearly define and commit to an option that will trigger if we don’t choose otherwise. Using (variously arbitrary) defaults makes it very obvious that refusing to choose is choosing to let somebody else make the decision for you (even if "somebody else" is just the random order of the list). I’ve also noticed this method also doesn’t induce decision fatigue as fast as other methods.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=ym83Bps6QEY3MLd7y

Nice, this sounds like a good system.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=W9Luqf2bmqgzaJEpr

So it seems like there’s a bunch of great things about this technique, including avoiding overwhelm and thinking abougt prioritization. At least partially it seems like part of the benefit of the system forces you to look at and confront things that you’ve been trying to avoid. In my own life and also in my work as a procrastination coach, I’ve found these sorts of methods that through brute force cause you to have to look at things you’re avoiding often have a shelf-life. Eventually, it seems like people’s avoidance mechanisms reassert themselves through meta-avoidance like avoiding using the technique, or avoiding adding certain items to your list. I’m curious how long you’ve been using this algorithm, and if you’ve encountered any of this meta-avoidance.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=yzWXrA7RqxCioyxAq

At least partially it seems like part of the benefit of the system forces you to look at and confront things that you’ve been trying to avoid. Definitely agree with this. In my own life and also in my work as a procrastination coach, I’ve found these sorts of methods that through brute force cause you to have to look at things you’re avoiding often have a shelf-life. Eventually, it seems like people’s avoidance mechanisms reassert themselves through meta-avoidance like avoiding using the technique, or avoiding adding certain items to your list. I’m curious how long you’ve been using this algorithm, and if you’ve encountered any of this meta-avoidance. My usage of FVP has fluctuated a fair amount over time; I used it a lot in the last year of my PhD, then not much in the year after that, then have since started using it regularly again. I think this is at least partly due to my life in the intervening time being very unstable, which disrupted a lot of my systems. I don’t think I’ve started avoiding adding items to the list. I do think my usage of FVP may have become gradually less effective at having me do difficult tasks. As using the technique becomes more routine, I become less agent-y while doing it, which leads to that aspect of the technique becoming less effective. In particular, if the same item is on the list day after day, it becomes increasingly easy to skip over it until the rest of the list is empty (which never happens). I don’t think this decay effect is all that strong so far: I think I’m still substantially better at doing important-but-aversive tasks with FVP than I’d be without it. But I wouldn’t be too surprised if the decay was stronger than I thought, or gets substantially stronger in the future. I do think I could probably "refresh" this aspect of the technique’s effectiveness if I put some effort into it, e.g. by forcing myself to use an explicit verbal question to choose between tasks, or mixing up the phrasing of that question.

Comment

Sometimes I have to let a to-do item sit for a while before I can be more real with myself about why it’s important. FVP still seems like the best way of tackling such things because the structure lends itself to creating mental leverage in easy, but noticeable, ways.Maybe a small change like writing a number next to each item list representing the number of days it’s been on the list would help draw your focus to items that have been lingering a long time. Just start by writing 0 next to a new list item, and adding 1 to the number next to any list item that gets substantially repeated from the previous day. You don’t necessarily have to feel bad about list items that have large numbers next to them, but a larger number can create extra weight for prioritizing it.Another reason this might work is that, much like Space Repetition Systems (SRS) used in reviewing e.g. information on flashcards, there is some logic to dropping cards that you have difficulty incorporating into memory after a certain number of times failing to incorporate it. The logic is that that particular piece of information is either not as relevant to the rest of the set (hard to form associations with "nearby" information), not as relevant to your own interests, or simply too difficult for you at that moment in time. Programs for doing SRS flashcard reviews include code to stop showing those cards again, and you have to manually specify to put them back into the review stack. Basically, it’s a sideloop to identify things that actually do require more conscious processing without clogging the rest of the process, which seems to be the main point of FVP.Combining the two prior points, if you track the number of days on the list, you could have a hard cutoff, like 14, where you take that item off the list altogether. Not sure how to reincorporate it in a streamlined way, though. Having a separate list and maintaining two of them seems onerous.

Comment

Apropos SRS and needing a second list: I’m currently experimenting with using Anki as a to-do tool. (Every task becomes a card, I "learn" the deck, and for each task get the choice of Again/​Hard/​Good/​Easy with listed intervals, e.g. <15min, 1d, 6d, 27d. If I want to see the task again quickly (Again/​Hard), I have to spend at least 5 minutes on it before clicking the button. Otherwise, it’s ok to bury it by clicking ‘Easy’ on it.)

This deals nicely with "nice-to-haves" that I don’t want to kill yet. Whenever they come up, I just send them away to next month/​quarter/​year/​… - that way, I don’t ever have to make the hard decision to kill the idea, I could always change my mind about this later, because I know that I will be reminded eventually. These "non-tasks" are also eating a fraction of the mental capacity that they’d otherwise require, because (a) I don’t get a growing list of "things that would be nice to do eventually" that I’d have to manually comb through (instead every couple of days there will be 1 or 2 of them mixed in with the review), and (b) I know that they’ll pop back up eventually, so I don’t have to worry about keeping track of them or finding them again if I ever change my mind. (To a lesser degree, it also forces me to start early on tasks due in several months, to keep the interval growth in check.)

The only problem I had so far was tasks that are inactionable right now (e.g. taking out the trash at 5am, because noisy) needed to be ‘skipped’ and reviewed later, leading to "ugh not in the mood right now" skips of actually actionable tasks, leading to less stuff getting done.

FVP looks like it might fix this. So for the month of December I’ll be running the following modified algorithm:

  • Go through the list of tasks in Anki, for each either do it right away or put it on the (paper) list, or delegate it to future-me (i.e. pick the long interval Good/​Easy option).

  • Do FVP on the paper list.

  • 3-strikes rule for "list leftovers": If I say I do it but don’t get around to it, the counter increases. Once it hits three, I must "delegate to future me". (Counter resets whenever I explicitly declare not to work on it, not sure yet if it should also reduce for streaks… For the experiment, I’ll go with yes and 3-days streaks for removing one mark.)

Let’s see how long I’ll stick to this.

This sounds like it could work. I might well try this. Thanks!

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=QuXJpRyusuqkhGjgc

This is my favorite kind of lesswrong post—a quick rationality technique that I can *immediately *go try and report back on. I was able to prototype it quickly in my notes list by using a dedicated symbol as the marker. It looks like any weird/​unused symbol could be used as this. Seems like a quick hack to work with any digital list (I used §). Question about non-stationarity: How often is the "stable" prerequisite violated in practice? E.g. if a bunch of items are physically exhausting, and a bunch are not, I might want to not do physically exhausting items in sequence. I didn’t run into this personally in my tiny trial, so at least the answer isn’t "all the time".

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=oZa8LhygN6iT5tnS4

Can you clarify your question? I started writing a response, but then realised I wasn’t sure if I was interpreting it correctly.

Comment

I interpreted it as… suppose the items are, in order: play video games, rearrange furniture, work out. That’s the reverse of the order I want to do them in right now, so I mark them all and go work out. Then after working out, I’m supposed to rearrange furniture. But if I started from scratch here, I’d want to play games first, to rest. How often does that sort of thing happen?

Sure! It seems like the prerequisite assumptions are likely to be violated sometimes (in general most assumptions aren’t total rules). My question is about the rate of violations to this prerequisite assumption. A few ways to cut at it (feel free to answer just one or none of them):

  • When going through a list subsequent times, how often do you notice/​feel internally that your views on a past item have shifted?

  • How often do you make a new list and start the process anew, even though you have an existing list that could be continued on?

  • How often do you go back and erase or modify marks on a list while using this process? I think I find my internal experience (and relation to stuff on my to-do list) changes pretty significantly over the course of a day.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=ygvvP8a5P5QNw7QH8

Thanks for presenting this algorithm! I had not heard about it, and might try it at some point. One thing I’m curious about is its interpretation as a sorting algorithm. Because basically what you are doing is sorting your list using pairwise comparisons. It cannot be better than the classical sorting algorithms, because comparison based sorting takes at least O(n log(n)). But maybe the benefits is that it’s more intuitive to do for a human being than quicksort or mergesort? Or that it require a weaker sense of transitivity than those? Also, I wonder if this isn’t a known sorting algorithm.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=g8ZxSANobGpAWXYxu

My take is that quicksort, merge sort and all other common sorts involve physically rearranging memory in a way that would be a bad fit for a list on paper. This one doesn’t change the original list, it just emits its elements one at a time in order.

This is worst-case O(n^2) - if they’re currently in order (i.e. sorted from highest to lowest priority), you’d do {n(n-1) \over 2} comparisons. Best case O(n) comparisons, if they’re currently in reverse order. (You could interpret it as high priority elements being high in the sort order, but then the algorithm emits elements one at a time in reverse order.) Memory use is O(n) pointers/​indexes (the list of marked elements), n bools (a list of which items have already been crossed off) and O(1) bookkeeping.

You could see it as a variant on selection sort—in particular it has the same property of "find the least element, then the next least, and so on" that lets you stop part way through if you only want to do three tasks. But because of the "emit items instead of changing the original list" behaviour, instead of just keeping track of the current minimum, we can keep track of a descending subsequence of the original list.

In pseudocode, I think we get something like...

let input: [Task] be the input list (n elements) initialize: emitted: [Bool] = [False, False, ..., False] (n elements) descending-stack: [Int] = [-1] current-min: (Infinity | Task) = Infinity last-pop: Int = -1

repeat: for i from last-pop + 1 to n-1: if not emitted[i] and input[i] < current-min: push(descending-stack, i) current-min = input[i]

last-pop = pop(descending-stack)
if last-pop == -1:
    finished()

emit(input[i])
emitted[i] = True

Comment

Thanks a lot for the thoughtful reply! Not having to move the items around could indeed help to lower the cognitive burden.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=Npc5HLjXcQJENdFbM

For "what task should I do next," it’s O(n), because you just go down the list once doing a pairwise comparison. "What task should I do next" seems more important for actually doing things than sorting the entire list at first to avoid deliberation time /​ indecision /​ harder 3-way value comparisons.

Comment

Right, for a single pass it’s a find-the-maximum-element algorithm in O(n). I think if you eventually do every task on the list it’s equivalent to sorting the list? But this basically never happens to me. Presumably intermediate states (doing e.g. half the items) is of intermediate efficiency? But my grasp of the underlying theory here is pretty weak.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=FysxKQRcKzPtqPwNi

Seems like it’s a lazy sort to me (with obvious wrinkles from the fact that the list can grow). It also seems to be a variant of drop sort (which is O(n) via cheating) designed for repeated passes on the remaining list

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=ypSZKrKg2pg247fs7

This algorithm seems like it can be generalized for any human decision algorithm. For instance, I’m usually pretty indecisive while trying to order food, but I’d bet that implementing this algorithm would speed up my decision making immensely, while guaranteeing I’d be selecting the best option available.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=owsgjCSFvFRmZ4Dx9

I haven’t used it for that, but it sounds like a good application; and in this case, you only need to select one thing, so you can do it memorylessly (just keep your finger on the active dish).

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=bkQ8x2TuqnkNKaavz

This seems useful and sensible, thanks!

asking whether the new task is something you want to do more than the old task

Why not just say "whether the new task is a better thing to do than the old task"? Like, there’s the rule to start your day with whatever has the biggest "ugh field", i.e. whatever is most painful. I get that you’re using "want to do more than" broadly, but still, it carries the wrong connotation for me. :-)

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=hzgKSNp9rMscteZa5

Mark Forster (who originated the technique) puts a lot of emphasis on the exact phrasing of the question you use to decide between tasks. I’m sceptical that it’s all that important; I think it’s fine to experiment with different phrasings and see what works for you. There might even be benefits to switching up the exact phrasing from time to time, e.g. to keep you focused and agent-y while doing it. After using the technique extensively, it’s become more of a nonverbal feeling for me than an explicit question. It’s nontrivial for me to exactly describe the feeling: some combination of desire, obligation, and endorsed choice-worthiness. The nonverbal version is both faster and mentally easier, but it’s plausible to me that explicitly switching back to a verbal question from time to time is worth it.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=dTPb44vwwKcj9iaAc

I suspect that there’s something important about being able to actually make the reverse decision. If you actually WANT to not do the "better" task because you’re not in a good state for it, it’s important to be able to make taht decision.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=eGig6SgthNJWAAoGN

I modified this slightly lately: sometimes, there’s one task (task A) that I have a strong desire to do on one dimension, but I have a strong desire on another dimension to do not that. In this case, I can have a hard time making good comparisons- once I get to task A, I highlight it, then every comparison afterwards becomes very hard- in one way I would like to do task A, but in another way, I’d rather do the other thing. Since I do a similar comparison multiple times, comparing task A to several other tasks that have a cloudy preference, this puts me at high risk (double jeopardy) of accidentally marking another task at some point as higher-priority, even though task A might have been the better choice.

To avoid this, and to reduce the number of difficult comparisons, once I identify a task that feels high-priority along some dimension, I will use a new marking to highlight task A, then restart the process starting with the next two items. I will then ignore the extra-marked task (task A) until I’ve gotten all the way through the list, then compare the final result of the second half against task A, meaning I only have to make the hard comparison once, both saving mental effort, and reducing the chance of accidentally skipping the most important task.

Comment

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=CLE3ngQYNCQHkmZh9

Yeah, I can imagine this being useful. One does sometimes encounter cases where unclear preferences lead to accidentally skipping endorsedly-best tasks.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=a69tYZ7BWW6pRGs66

Thanks for posting this, it seems like a system that will help me stay on top of things that need doing, at least on some days. I’ve applied this today to my todos, and it has already helped me do some useful things today, in a way that felt less overbearing than other approaches to todos I’ve used in the past.

As someone who both has spent a nontrivial amount of time thinking about todo lists, and has experience with programming, I’m somewhat surprised that I’ve never done this exact approach before, since the procedure here is very similar to the code I would write when I need to find the element of a list that maximizes some property, which is a very common task.

(By the way, are you still working on your aging sequence? I enjoyed the first two posts you wrote there, but it’s been half a year since I’ve seen anything in that sequence)

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=P4QuEvZ8fAPxmRsJD

How would you say this approach relates to https://​​www.lesswrong.com/​​posts/​​dJQ7BFz9ZPqstP3an/​​urgent-and-important-how-not-to-do-your-to-do-list? You wrote that it’s important for your preferences to be fairly stable. I’ve been using a prioritizing grid (e.g. https://​​www.beverlyryle.com/​​prioritizing-grid) to go through my entire do list in 1 fell swoop. I wonder if that’s more or less efficient than your approach.

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=F8KLhFGFTsJ84CAZC

Had some fun making a simple python implementation (text-based, no fancy GUI). I uploaded it to GitHub here

https://www.lesswrong.com/posts/xfcKYznQ6B9yuxB28/final-version-perfected-an-underused-execution-algorithm?commentId=2GZDtpEo3GZbFaDzQ

While I absolutely agree that an unsorted to-do list is a minefield, I intuitively feel that FVP is a more-wrong approach to To-Do lists. I also feel that it might work for very small, short term lists but would struggle to scale. Tasks are extremely varied things and so not always easily comparable, for example when comparing the task "Buy milk" and "Finish term Paper", the term paper is probably more important in the longer term, but in the short term you wont have any milk for your breakfast. Unless extremely time crunched, breakfast comes first. *Edit—After some reflection I think the main disadvantage of FVP is when you have to put in the decision making effort. You have to make a decision just before you do the task. Better to rank an issue as you write them on the list, that way you can separate the effort of doing the task from the effort of writing it on your to do list, see below for my favoured solution. I use and love this, Urgent & important: How (not) to do your to-do list—LessWrong.
My algorithm is:

  • Write task description

  • Decide if I "Must", "Should or "Could" do it

  • Decide if I should do it "Today" or "Later"

  • Assign how long it might take me (optional)

  • Use my spreadsheet to sort by rank (right click A column and sort A-Z)

  • Do tasks from top to bottom

  • When a Task is complete, replace "Must", "Should or "Could" with "Done" Here is my spreadsheet, I hope it serves you well. To do list I would love to receive feedback.