# task: my task management habits

like most folks i also have a barrage of ideas, requests, commitments, chores and so on that i just need to do. since i don't have perfect memory, i need a system for managing them. every person manages this differently: some just rely on their memory, some use sticky notes, some use elaborate software, some use bullet journaling, and so on. there's no system that works for everyone. i'll now share what works for me.

first it's important to define what your end goal is. a typical goal is "to be productive". that doesn't work for me. i don't care much about productivity. my primary goal is to become "free" - free of the tasks. ideally my todo list is completely empty. if it's empty then it means i'm pretty much free to do whatever i feel like doing. that is usually daydreaming which usually leads to bunch of new ideas which then fills todo list again. so even though the todo list doesn't stay empty for long, it's super important to be able to occasionally achieve 0 outstanding todo items. if i can't achieve that, then that is a signal to me that i'm doing something wrong and i need to sit down and holistically reevaluate my priorities. keeping the todo list near empty means you can be more flexible, can easily change directions, try new things, be super responsive to people without feeling much dread about all the tasks you need to do. but near 0 outstanding tasks is super hard to achieve regularly. however one can create the illusion of low task load simply by hiding majority of the tasks! not all tasks are the same. i'm not really fond of hierarchies or labeling things but i do have 4 categories for my tasks:

conditional tasks are the best! those are tasks that you want to do but you can't. suppose you need to talk to a person about a topic but that person is traveling. you can't talk to him until they come back. it means this "talk to person x" task has a date condition. you just need to hide the task until a specific date. or you want to remember that you need to do a regular, yearly maintenance on your car. you can just add a task that is triggered on a certain day of the year. you'll see the task in your todo list from that day on until you clear the task. once you complete that task, you readd the condition to the task but with the year bumped.

one might use a calendar for this. however that is wrong! the problem with the calendar is that you'll see all the upcoming tasks if you look at a weekly or monthly view of the calendar. if you see the task, you'll remember that you'll need to do it at some point and you might start stressing about the upcoming burden. and it's all pointless because you might not be able to act on the task since its trigger date has not passed yet. it's really important to keep the conditional task hidden until it's triggered. surprisingly many tasks can be hidden simply behind a date.

on my personal computer i have a ".rems" file standing for "reminders". each line in it has the format of "yyyy-mm-dd some arbitrary text". you might notice that the filename starts with a dot which means it's a hidden file. i don't want to be aware of this file. most of the entries from it shouldn't be triggering, so i shouldn't care or know about them at all anyways. i also have a "todo" script which prints a portion of this reminders file (among other things like checking my email). it prints the lines whose date is in the past. i run my todo script occasionally, yet most of the tasks from the reminders file stay hidden until they are actionable by me. i can completely forget about those tasks and still remain calm that i'll see them in time (unlike the calendar where i'd see the tasks all the time).

furthermore in certain environments one can be even smarter about this. at work we have a relatively simple issue tracking system. each issue can have an assignee field. if you have an issue assigned to you, you are expected to do something about it. fortunately we have a nice robot to which you can reassign these issues with a condition. you can tell it "please assign this back to me once that other issue is fixed" or "please mark this as fixed once that commit is pushed" or "please assign this to person foo when person bar is back from vacation" and gazillion other actions and conditions. if you use this robot well, you can hide a lot of your unactionable tasks. suppose you have an issue assigned about a bug to you and you already created a commit to fix it and sent it to review. at this point you can't do much about the issue, you are waiting for the other person. so you tell the robot to keep the issue hidden until the bugfix is pushed. after the review you push the commit. at that point the issue reappears and you can, say, send out an announcement that you fixed the bug and close the issue. having the issue hidden means cleaner dashboards, smaller todo lists, and simply less mental tax. i love this tool at work and use it to keep my work task count quite small compared to the rest of my colleagues.

you can also use conditionality to spread out tasks. one example is when you have multiple issues that you have to solve in order. you can use the above robot just to chain them up and in any given moment you'll only see the first issue that you need to work on. once you close that, the next one appears immediately. it makes work much streamlined - you always know what to work on. this trick also works for unrelated tasks. there's only so many things you can do at any given moment. you can decide that you create some sort of order over the tasks based on importance and chain them based on that. for instance there's a person i like to chat with and i always come across topics or ideas that i'd like to talk about or just get their general opinion on. but if they are traveling i can't talk to them. at the same time i don't want to forget the topics. i also can't talk about all the topics with them at the same time when they come back. so in such cases i just chain the topics. i mark the first topic to appear in my todo list once they are back and keep it there until i managed have a talk about it. after the talk i go back to my machine and cross it out and the next one appears - which i'll remember the next time i meet them. it's a pretty simple way to keep many things in your todo list without being overloaded by them.

there's one additional benefit of the conditional tasks. the conditions themselves also serve as a communicational tool. it communicates what a task is waiting on. so if somebody is getting impatient with a task's state, they don't need to bug you, but they can look and challenge the condition directly. e.g. if an issue is waiting on a commit and the commit is waiting for a reviewer, then they can ask the reviewer directly when are they going to finish the review.

my next big category is the "stashed tasks" one. some people call these the iceboxed issues. a lot of times a random idea comes to my mind that i'd really like to do, investigate, experiment with further. however often such tasks are not super urgent or important. i just want to be sure i don't forget about them until i completed said task. sometimes i want to keep a thread of thought open somewhere until i make my mind up about something. basically these are tasks that i want to track but not to be reminded about. since i don't look at this list proactively, this list tends to contain a huge number of tasks. but that's fine. i encounter many ideas day to day. if i don't write them down into a safe place, i tend to obsess about the idea a bit because my brain doesn't want to let go of it until it senses some sort of closure. writing it down to my stashed tasks lists gives it that closure.

ideally this list shouldn't be growing unbounded. it would be only consulted when the primary todo list becomes empty just to find new things to do or when i left some notes about some particular topic which i now want to look up. if i'm looking at it because i don't have better things to do then i can either do some of the tasks i always wanted, or just clean up old, irrelevant entries from the stashed tasklist. one always feels pretty good after such a cleanup.

i implement this by having a simple ".ideas" free-form text file on my computer. i just randomly add stuff to it whenever i think of something. it's also a hidden file since i want to keep it out of sight. i do have a little structure to this file since it is quite long. each task has a title and i prepend a "#" sign for those titles. the subsequent lines are the notes related to the task. the nice thing is that this way i can have a quick overview of all my stashed tasks simply by running "grep ^# .ideas". i don't use more structure than this.

at my work there are several ways to achieve stashed tasks. the issue tracking system actually supports two levels of assignments: "assigned" and "accepted". in theory you can assign any issue to anyone and the other person should mark the bug as accepted once they plan to work on it. so technically you could use "assigned" for the stashed work and "accepted" for the work you actually want to work on immediately. however this distinction is not well understood, recognized or used so even though i could use it personally, i don't do it. in fact, i try to avoid stashed tasks at work completely. if i have such work related unimportant idea, i write it to my personal .ideas file. at work i'd just simply close or unassign such an issue. this clearly and unambiguously signals to other people that i do not plan to work on an issue. you can also add issues to a "hotlist". basically it's like twitter hashtagging but for issues. you can add arbitrary issues into arbitrary hotlists. e.g. you could create a "my stashed issues" or "icebox" hotlist, and just add issues of interest into that. you can keep the issues unassigned so people who want to see the status of an issue can clearly see that nobody is working on it. this approach also works on a team level. if a team wants to track some issues but not work on them, they can hoard them in such an icebox hotlist. generally speaking such hoarding is not very healthy but it can make people feel calmer due to having a place to gather thoughts about certain issues.

when one works with documents or source code, they can also leave todo comments in the middle of the document. it's a very low overhead way of tracking tasks. at my work they have the form "todo(username): some text" or "todo(issue/12345): some text". i'd treat "todo(username)" as a queued task (will explain shortly) however "todo(issue/12345)" is less clear. if issue/12345 is a stashed task then that todo comment task can be treated pretty much as stashed as well. you can think of these as mini-issues that block the main issue. at my work we even have a cronjob that periodically crawles the whole source tree looking for such comments and marks such occurrences in the linked issue. for each issue people can see all the outstanding blocking issues and todo comments as well. they shouldn't close the issue until they clean those up. in fact they receive a warning notification if they close an issue nevertheless. but the point is that you can keep tasks right in your primary work documents as long as you have the tooling to manage them.

next up are the queued tasks or active tasks. these are the tasks that you think you'll be able to work on in the next few days. you really should keep this very short. in a perfect environment without disruptions you should be able to finish all of them within a week. if you can't because you have so much or so big items on this list, then the list is pretty much useless. it's useless because then there are tasks on it that will be never addressed, basically tasks that should be stashed. however just because they are in your active tasks you'll see them every day. you very quickly start to ignore those items. if you ignore one item, you'll very quickly start to ignore other items. this then snowballs: you pretty much don't even use this list to guide what you should be working on next. it just drags you down mentally, reminding you that you'll never be able to reach the nirvana of 0 tasks. this is why i prefer the term "queued" tasks. it means you can't allow things to linger in this list. if possible, you should go through the tasks in fifo manner - first in, first out, no matter what the task is. even though it might not sound a super productive strategy but it builds a good habit of not hoarding tasks. i often have some very small idea i want to try. before i forced myself to use the fifo rule, i pretty much procrastinated on such ideas and eventually even dropped them because i got bored by hoarding them in my todo list. with the fifo rule, i'm forced to be more exploratory and i actually learn ton of new stuff this way. simply because i force myself to work on or explore the random unrelated ideas i queue up in my active tasklist.

it's super important to keep this list realistic. only put stuff into that you'll actually get to in the order of days. there's on exception: if your task is big, then it's okay to keep an entry about it in there as long as you chip away at the task every day. you can also put untriaged items into this list. for example you can treat reading your unread email as your queued tasks. some emails might prompt for additional investigation, you might keep this email in your queued tasks until you figure out how to respond to it. the task itself is the fact that you have to figure out the response.

you can even try some psychological tricks to reduce the number of tasks. a lot of my personally generated tasks are just ideas that i really want to explore and experiment with. you could save some time yourself if rather than just jumping right into implementing the demo, you talk about the idea with someone first. this means the task now is not implementing stuff which can take long time and requires a lot of motivation to start, but rather just having a chat about it with your buddy. basically transform the task to scheduling a meeting with your buddy. the original task becomes conditional - the condition is a date that is after your meeting. this is also a great way to get out of your comfort zone and make yourself talk to other people. all being motivated from the fact that you want to keep your queued tasklist small. and not only that, you might even learn new things. your buddy might point to an already existing thing, give you tips on how to simplify things and so on. there's not much to lose from this trick.

management of these tasks should be relatively low overhead. different kinds of tasks need different tools for optimal maintenance. my first tool is an unstructured "todo" file on my computer. i just queue stuff to the end, and pop stuff from the top. popping the top is not a strict rule, but just an ambition. most of my own ideas land in this file. often i write an idea down there, and once i'm done with the initial brainstorming, i just move it to the stashed tasks. however i might not always have an access to my machine. in those case i'll open a draft email in my gmail. gmail adds a quite visible marker if you have a draft so i'm always aware of my drafts. however i strive to move my drafts to my todo file from above once i get back to my personal computer. i do this just to reduce the amount of places i have my tasks.

note that this "todo" file doesn't start with a dot - it's not hidden. making this file present in my home directory reminds me that i have stuff to do. if it were empty, i could just delete it. actually all non-hidden files and directories in my home directory mean some form of outstanding item for me. if i start working on a demo or experiment, i just create a directory for it in my home directory and keep it there until i'm finished with it. then i just either delete it or move it to my ".d" hidden directory which contains all sorts of random stuff. stuff that i need to keep around (e.g. a checkout of my dotfiles git repo) or various random stashed things. "d" stands for "drive" or "disk" suggesting i archive most large things under that directory. if i want to keep something around for later work, i make a note of it in my stashed tasklist, and move it to my ".d" dir. if i want to pick it up again, i can just either move it back or simply symlink the directory from my home.

the next big source of active tasks are the email messages. email management is a huge topic on its own, i probably can't do much justice to it. but let me try to give it a short summary. there are 4 kinds of emails:

the first two categories are fine with me, i'm happy to receive them since they usually mean that i have to act on them. i don't have the 4th item at all. i unsubscribe for all unnecessary updates and alerts. if i don't read it, i won't know i can search for it anyways. at work usually such mails go to google groups archives too so i can just use google groups search to find such emails. i'm quite strict about the third category. i subscribe only to a very few and relevant feeds. if the feed only has an occasional post then it's not bothering me. if it's high volume then i try to make it less high volume by trying to eliminate unnecessary spam from it right at the source (e.g. i ask the robots to stop spamming). if that doesn't work, i just change google groups to send updates in bulk (so my inbox can remain clean) or just unsubscribe entirely and remind myself to check on the group occasionally. i either just rely on my memory to check on the feed - if i forget then it's probably not that interesting anyways, so it's a good riddance and i can enjoy the additional free time i got by not reading the feed. or i might add a date conditioned task to check back on the group - usually for work related stuff i ought to know about. but i try to keep these to the minimum. but it's all a moot discussion since these don't generate tasks for me unless it's a list that i'm supposed to give support on.

anyways, let's get back to the main topic. whenever i see something in my inbox that needs some further action or thought from me, i just simply star it. starred emails are also part of my queued tasks. it might be the case that such an email is either just good but long thread that i don't have the time to read now, or it's blocked on something. in those case my action for that starred email is to make a note of it in either my stashed or in my conditional tasklists and then simply unstar it. that's pretty much my workflow: i read all my email, i star the things i need to something about, and then when i have time, i address the starred items. again, i actually follow up on those emails quite quickly, i don't hoard them.

i also consider issues assigned to me as my active tasks. i either actively work on them, or just reassign them either to someone more knowledgeable or to the robot in case it's blocked on something. one annoyance with the issue tracking system that most updates generate an email to every person cc'd on the issue. however fortunately my work's issue tracking system allows editing some of the comment updates: you can edit your own comments and the issue's first comment. these edits don't generate an email notification. so you can pretty much keep updating an issue's first commit to match the "explain the issue; explain the status; make note of outstanding tasks" format there. and then you make it a personal habit to check and update the first comment before closing an issue.

the next tool i use is our internal code review tool. each commit has an author and a set of reviewers. usually the author and the reviewers exchange comments and changes until everybody is happy with the commit which is then pushed. the tool itself has a very handy "attention tag" feature to manage whose turn it is to respond. it's a boolean flag on the author and each reviewer. when the author sends out the review request, the attention is on the reviewers. when the reviewers respond, the attention moves to the author. people can flip the attention on the individuals manually but by default the tool is quite smart with managing it automatically. whenever i have the attention for a commit, a small browser extension starts glowing. by default it is gray so when it switches to a bright color, i notice that quite quickly but doesn't interrupt me in any way in case i'm in the flow. if a commit has my attention, i treat it as my active task and my goal is to review the commit or respond to the comments depending whether i'm the author or a reviewer. even when i'm the author of a commit, once i send it out for review, it pretty much disappears from my active tasks and i can immediately focus on other things. note that i can send the review request to a robot along with a condition here too. the robot will keep the attention tag on itself until the condition is true. then it assigns back the attention and leaves the review thread. this gamified workflow of attention tag ping-ponging makes it very gratifying to stay on top of the review workflow.

so those are my main channels for the active tasks. again, it's super important to ensure you treat them in timely manner. in fact, it's best if you commit that every day you'll start your day by addressing or making progress on your oldest item from your queued tasks. the benefit of doing this is that you always have a clear task to start the day with. once you do that, you'll feel that you achieved something, and you'll be even more motivated to do more things rather than just procrastinating all day on the internet. however in order for this to work, your tasks in this list must be crystal clear rather than vague. if you have a task which is unclear on how to solve, then your task is to figure out how to solve it. most of the time it means writing to a support list or just scheduling a meeting with your mentor or buddy to give you guidance. reaching out to a person is always relatively easy, so you should always be able to do at least that, no matter what the task is.

next up is the archival of tasks. i neglect this most of the time. however now and then i want to be able to remember that i did something and how i did something. i want to be able to refer back to my old notes. i don't worry about this at work because the issue tracking system will keep all the notes and comments around viewable by anyone. the more interesting question is what to do with the completed personal tasks. the simplest thing to do this is just to have a private journal. every time something comes up, you just append a note to the end. in fact, i hear that doing daily journaling is quite healthy for one's wellbeing. sometimes if i'm in the mood, i do write some notes about every day. but i quickly run out of steam. but if some important happens, i usually always add it to my journal. i keep a ".notes" file in my machine and just write to it. every new year i rotate this notes file. i just put the contents of the journal into an email and send it to my email address. this way i don't have an ever growing file on my machine and i can easily refer back to my notes via the email interface's search facilities.

there are other ways to archive tasks and ideas. one way is to write about them to someone. if i learn about a nice idea or nice article, i often just send it to a buddy along with some personal comments. one, this sometimes starts a nice discussion, two, i can easily refer back on the letter later. the benefit of doing this over the journal is that it's much easier to remember about this because you also talked about it with the other person. so even if you can't remember how to find your notes or article again, you might remember who you talked to about it, and just ask them if they remember anything. basically you are outsourcing your memory to other people. it's also a nice way to keep some social interactions alive.

another alternative is to write a public blog post about the idea. i think this is one the best things you can do if you have the guts to publish stuff online. this forces you think about things very carefully, forces you clear up your thoughts so that they can be put into words. and if you are not shy, you can even share the post with others. once it's published, you can pretty much forget about the idea, unless others come back to you and become interested in your specific idea. it can also act as a nice survey to see how good an idea is. if people don't seem to show interest after you show it to them, maybe it's not worth pursuing it. if they do, that interest can actually act as a motivation to start working on the demo. having said that, i don't popularize my blog. i write a lot of crap here that might be better if people wouldn't know about me. maybe when i'm older, this will become easier and i won't care about all this. it would be awesome if people would ask me about my posts after i wrote them though. but i don't want to keep notifying them about my posts - i want them to learn about the posts because they are interested in the posts and explicitly started following me. i want genuine interest rather than pleasantries. but for that i'd need to learn to write interesting posts, but let's postpone acquiring that skill for a later day.

having said all that, there's no reason you can archive a task only in one place. you could write a post, share it with a friend, and then finally mention it in your journal. in fact, that would be probably the ideal habit if you have the grit for it.

if you see some very old tasks in the stashed lists, then they are very good candidates for archival. in fact often it's best just simply decide not to do some tasks. give some thoughts about it, write down how you would go about them, publish them on the blog, and then just forget about them. at least this way you give yourself the closure that you gave the idea some attention but still didn't waste too much time on it. and since it's on your blog, you know you can always refer back to it from anywhere if you feel nostalgic about an idea. or just point to your blog entry whenever you see somebody else thinking of a similar idea. ask them to take a look at yours to see if they can use that as an inspiration.

anyways, that's pretty much how i manage my tasks currently. although i wrote quite a lot and i need custom tooling, i think my system is relatively simple - mostly consisting of 3-4 unstructured text files for most cases. i wrote a lot because the system is quite powerful and needs lot of explanation to explain said powers. i've seen more complicated systems used by people which eventually turned out to not being very effective for them. especially after they ran out of steam maintaining the required process or structure. task management must be low overhead. and i'd reiterate again, task management won't get you out of unproductivity and procrastination. i'm not using this for that purpose. i'm using this system simply for tracking and making an order of my outstanding tasks and ideas in a relatively low-overhead but featureful system. although i haven't tried, a similar method can scale up for teams as well, not just for individuals, it just needs careful thought. i'll spare the speculation about this aspect for now though. i'm still relatively new to managing my tasks this way (couple months) but let's see if it crumbles down or not.

edit after a few months later: i now have a little structure in my todo files. i start each task with a hash followed by an identifier name. this is optionally followed by a colon and a summary. the rest of the lines can be just details. my todo script only lists the identifiers and their summaries. this means i can add many details to a task, they won't add much visual noise when reviewing them. for identifiers i use the format "[a-z][a-z0-9]\{2,14}" to keep them simple. basically i limit them to 3-15 alphanumerical characters. example content of my todo file:

  #email
  dear recipient!

  here's your email!

  thank you!

  #tell: tell my partner that i finally sent that email!
  #addreminder: do this after sending the email!
  add a reminder to check in with recipient
  that he got the email i wrote in #email.

and when i run my todo script, i get this:

  $ todo
  #email
  #tell: tell my partner that i finally sent that email!
  #addreminder: do this after sending the email!

you can see that in #email i have some longer text yet it's not printed above. and the nice thing about naming the tasks is that i can refer them like i did in #addreminder. i find it quite convenient. and the todo script is incredibly simple too:

  grep '^#[a-z]' todo

the only thing i need to avoid is accidentally starting a line with #. this could be a problem if i would be reformatting lines to 80 characters. but with semantic breaks this is not a problem (see my @/sembr post).

and if you truly do your tasks in fifo manner, then you can add the dependent tasks simply in subsequent lines, and not bother about somehow explicitly marking dependencies to auto-hide them.

i think this is a nice demo about many good practices working together in a way that allows you manage things quite effectively yet in a very simple manner.

# edit

i now put stashed tasks into file called ".backlog" rather than ".ideas". it sounds like a better name for these tasks.

published on 2020-02-01, last modified on 2021-09-29


posting a comment requires javascript.

to the frontpage