Managing time while working on multiple parallel streams

Aswin Rajeev
6 min readMay 26, 2024

--

Illustration of a person sitting at a desk multitasking with a computer. The person is surrounded by various icons and elements representing different tasks, including a calendar, clock, documents, communication tools, and reminders. The workspace is organized, featuring a cup of coffee, plants, and a desk lamp. The background includes visuals of a CPU and task threads, symbolizing efficient time management and context-switching. The overall theme conveys productivity and balancing professional

One of the main challenges I initially faced while working at Amazon was that there is no single thing you’re working on at any given point in time. Amazon’s work culture pivots on ownership. So just like running a house, there are many things that need your attention and require you to work on. One thing cannot be prioritized over another, so you’ll have to balance both, making incremental progress in all the work streams. And that boils down to managing time really well, and being able to context-switch quite often.

I am the primary caregiver for my preschooler. I have to drop her at playschool, pick her back, play with her, bath her, make dinner for her and at times put her to sleep too. That often leaves me with a 9.00–5.00 schedule for work. I’ll try to cover a few techniques I could leverage in being able to handle multiple streams of work (almost) effectively, albeit the time constraints.

Time-sharing by working in the voids

Before I start on the actual techniques, I want to give some intuition on managing multiple streams by taking the example of a CPU. You must have heard of time-sharing on a single CPU core, right? If there is only one core, how can it do multiple things in parallel? The trick is to work in voids! There is a lot of CPU cycles (time) wasted while on hold — waiting for IO operations, awaiting network response, etc. The CPU utilizes this time to do another task (or thread).

When I’m managing a single task in a day, I find that most often I am actively working only for 50% of the available time. In software development, this includes build time, deployment time, awaiting others’ response, CR review delays etc. If I could effectively use this time, that would mean I can parallelize another task.

Set aggressive screen limits

In the past when time was abundant, I would initiate a build that usually takes 10–15 mins and I would gravitate towards checking Instagram feed or browsing the catalog in Amazon or Youtube. I realized that this when I found that my screen-time was around 3–4 hours a day on average, and that exceeded the quality time when I work. Now all I had to find was a mechanism such that I could make effective use of this time and that would let me handle a secondary “thread”.

While getting rid of screen time was nearly impossible, I decided to set a limit to it. I used my iPhone’s screen time limit feature to set an overall screen time of 1 hour per day. That means I would save 3 hours a day, if I adhere to it. It was initially difficult and I would exceed that limit before mid-day, but eventually I reduced my screen time to around 50 minutes a day (except Fridays and the weekends).

Knowing what to do in the voids

Setting that screen time and being cautious meant I would not be distracted by my phone during the “voids”. But what should I do instead to effectively make use of that time? That became the next hurdle. I used to spend a good 5 minutes thinking about what to do in this time.

The solution to this was really simple — at the beginning of every day I started to jolt down what I want to finish by the end of the day, as granular as possible in the order of priority. I used Microsoft To Do for this, where I maintain the backlog of all things I have to deliver and pick the things I want to do on a day to “My Day”, in the order of their priority. Whenever I complete a task, I strike the task off the board.

Now all I have to do is to take a look at whatever is at the top of the “My Day” list when my code is compiling or getting deployed. The key here is to list the tasks as granular (small) as possible.

Timing the voids

The initial effectiveness of the technique nudged me to think further — is it possible to time these voids such that they could be more effective? The intuition was sometimes delaying some work so that the wait time could align with my away-times, which would help me save more time.

Soon I found myself optimising the time management by perfectly timing the voids. For example, I try to make sure my computer is working when I go for a coffee break — say building or cleaning. Similarly I can trigger a time-taking build, CR overage analysis or even system updates before I set out for lunch. And if I want some inputs from others, usually I try to send my queries over chat before I leave for lunch or a break, so that I would most likely have the required response by the time I am back.

Another trick was to check emails, chats etc. when passively listening in meetings.

Scheduling focus time appointments

At times, the biggest impediment to productivity is staggered meetings, and sometimes not being able to start of a planned task due to inertia from another task/discussion. One thing I found helpful was explicitly scheduling focus time on days when dedicated time for something important is really a necessity.

Basically, I block my own calendar through “only-me” appointments with a description of what needs to be done in that focus time. Doing so provides two benefits: One, the reminders for the event help break the inertia and often let us excuse ourselves from discussions. And two, it blocks (at least discourages) others from scheduling meetings during those time slots. Whenever there are some meetings overlapping with these scheduled slots, I try to decline or not to join those unless absolutely necessary.

Batching Similar Tasks Together

This is a technique that I shamelessly copied from a Senior SDE in our team. I noticed him often designating a specific day for certain streams. When I asked him, he gave an invaluable tip — it takes a lot of cognitive effort for context switching and stacking related work items to a contiguous timeframe would helps minimise this context-switching effort and thus time spent.

I am not very successful in implementing this yet. Effectively using of this technique would also require some authority over the scheduling discussions and delivery timelines. However, with whatever I have tried out so far, this is a game-changing suggestion. I now try to align my secondary streams (which often don’t have a strict need for day-to-day progress) on a specific days of the week.

Take enough breaks

This might seem counter-intuitive, but is probably the most important aspect. Without sufficient breaks, we can go only so far and get burned out soon. If the productivity improvement is not consistent, it’s seldom going to help in the long run. For me, I try to take enough breaks during the day, and once the work-load is light, even skip a day from work. This keeps me motivated for another day of sprint.

Conclusion

In my opinion, we all waste a lot of time doing things that are seldom useful in any way. I do not advocate taking out little joys of life to increase the efficiency of work, but doom-scrolling definitely is not going to give joy. Managing work this way indeed helped me get more contiguous “me-time” and improved my mood at the end of the day by a lot.

I hope this article helps someone and if you find this interesting, please do let me know in the comments below. Also if you have effectively used these techniques or if they didn’t work for you, please do reach out to me. Feedback like those would make me happy and help me ease my imposter syndrome 🙈.

--

--

Aswin Rajeev

Software Development Engineer (SDE II) at Amazon with over 10 years of experience in software engineering. https://www.aswin.me