The Subtle Art of Task Prioritization for Developers

Prioritizing tasks is not easy, and we all tend to fall sometimes into the hole of picking up too much work at the same time and getting overwhelmed by it. Alongside communication skills, task prioritization is another skill that every developer should master in order to be seen as someone who delivers results.

The 4 Known Priority Mindset

Every time I try to prioritize my tasks, I come up with something that I call the 4 Known Priority Mindset (well, naming is hard) here's the 4KPMS:

Know Your Team's Priorities

This is probably the most important one from the 4KPM, in order to understand what should be your priorities first understand what are your team's priorities.

We all (do we?) want to focus on cross-team projects and cause a huge impact on the entire organization, but what we have to keep in mind is that your team's priorities should be your top priority (this should not be the case for Staff+ level engineers).

So start there, you should at first know your team's priority, and if you don't, try to figure it out right now, ask your direct manager to make it visible to you and to your team. You can also help them make this visible by creating a page with the roadmap and priorities for the team (I believe that something similar should already exist in your organization & team, but if not, ask your manager how they can make this more visible for the team).

Now that you know your team's priorities, they should be organized in order of priority taking into consideration which one delivers value to the customer.

Disclaimer: Even for teams that are very autonomous with a board with all tasks already prioritized, someone already did this prioritization (probably our manager or the product manager) so go ahead and from time to time align the expectations with them.

Know When to Say NO

When you just join a company it's easy to say YES to everything, and trust me, as I can't count the number of times that someone asked me to do a simple task which turned into a snowball and took me off the course of my team's objectives. That's true as well for the team's objectives; it's easy to pick the small and easy ones to be done first.

Know when and how to say NO in a respectful way. If you are really overwhelmed, people will understand, and you can also give them the directions on which team's or people can help them with the task.

Know When to Delegate

When time is not a constraint, I believe that every task is an opportunity to learn something new, even the ones with technologies or domains that you've never worked with before. But sometimes, when time is a constraint and deadlines are defined, you should be able to call to action and delegate tasks to team members who have more context and can probably ship them faster. It's an exchange... you can pick some tasks from them and them from you... and you will still learn about the problem as you review their pull/merge requests.

Know When to Ask for Help

Be transparent and clear with your team whenever you feel overwhelmed and ask who can help you by dividing the workload or even splitting the tasks. Functional teams tend to work very well on this.

4KPM Questions

Here's a list of questions that you should ask yourself whenever someone asks you to do a task:

  1. Is this a P0? (e.g., is it a bug on production or something that is blocking a customer?)
  2. Is this task aligned with my team's objectives? If not, try to understand better why you're requested to do this task and how this will impact the organization.
  3. What's the urgency of the request? Sometimes people tend to exaggerate how urgent a task is, and by picking non-urgent tasks and putting them first, you are risking making your team delayed.

Strategies

These are strategies that I have been using over the last years/months working as a software developer.

  1. Have an external TODO app: I have been using Todoist for many years (not sponsored by them... I just love the product) and besides your team's Kanban, you should have a way to document and prioritize your current tasks.
  2. Know your priorities for the day before: I have been doing this for several months, and it's a real relief for me every time that I start my day at work, and everything that I'm going to work on is already defined and prioritized. Sometimes when you start working, there are new priorities for you (like fixing a production bug), but then it's just a matter of deprioritizing other tasks.
  3. Do the most important thing first: it sounds cliché, but it really works... every time that I start my day doing the most important thing first, even if by the end of the day I haven't finished more than that or even haven't finished it, I get a sense of completion by the end of the day.
  4. Limit your workload, but have a work buffer: I limit every day with three tasks that I'm going to work on based on the priority of them... some days I finish them all, and some days I can't finish even the first one... for the days that I've finished everything I just pick other tasks from my Work Buffer, which is a list on Todoist with tasks that I can pick next. They could be simple tasks that we tend to never do (like document something, create a script to automate some team's recurring task). For the days that I haven't made significant progress, I usually end my day with a reflection: "What went wrong today that I can fix to make tomorrow a better day?"

A phrase that I first saw from Ali Abdaal's videos was:

What do you need to say no to so that you have space for what you really want to say yes to?

So, by the end of each day, I finish by doing three simple tasks:

Todoist end of day tasks
  1. Fill Work Log: I just write in a document what I've done on this day, interactions, support requests, etc., everything that is related to my work. I found this technique very useful to be used with my managers during the performance review cycle and also to understand how I'm working day by day.
  2. Plan Each Minute of Next Day: This is a simple one, but very powerful. I just go to my calendar, check for all work commitments (weeklies, dailies, team alignments, coffee chats, etc.) and personal commitments (like doctor appointments)... and I say NO to the meetings or events where my presence is not necessary, and if I find that it's a day with too many meetings, I tend to reschedule some of them to have more time for Deep Work. This is useful as well to understand how many hours on the next day I have to really focus on deep work (e.g., coding, writing documentation).
  3. List Only 3 Top Tasks for Next Day (Do The Most Important Thing First): Like the name says, and as I mentioned before, I just list the top three tasks that I'm going to work on the next day, and since I already know how many hours of deep work I could have, it's easier to list those tasks based on their size and priority.

Conclusion

There's no simple system that works for everyone, and we should adapt everything based on your needs. I personally use a mix of the Eisenhower matrix, Inbox zero with the GTD method all together on my Todoist app.

Remember that being organized is great, but time to rest is also essential, so plan ahead your breaks during the day between your tasks in order to avoid burnout and the mindset of toxic productivity.

Happy Coding :)