As Software Engineers, we are not measured by how much we know about computer science, data structures and algorithms, at least not after we pass the interview. At the job the story is completely different, we can be the best programmers in the company, we can know our way around the languages we work on and write code with the eyes closed but, none of that matters if we produce no value. Our value comes in many forms, code and working, scalable and robust software is one of those ways, but we can't forget we are part of an engineering team and also keep in mind that Software Engineering is more than writing code
Most of our value comes in the form of working software, performance and resources optimizations, architecture and software design RFCs and so on, these tasks require a high level of concentration which means our ability to produce high value work is constrained by the amount of continuous uninterrupted time we have. Along with that, we also produce value in meetings, by aligning priorities and work with other engineering teams and also within our team when we work with other engineers, by reviewing code and other forms of collaborative work.
Ideally, we need to maximize the amount of high impact work we do as engineers, this usually has to do with the tasks that require a higher level of focus, but we can't neglect the other kinds of work we need to do as well. To do this, we need to maximize the amount of uninterrupted time we have during our working hours.
Here are seven practices that have worked for me, hopefully they will work for you too. Let's get it on:
This looks like a no-brainer, right? and yet, a lot of people seems to fail in using them. I love lists, I make lists for almost everything: my daily work, my personal projects, what I need when I go to the supermarket...
I keep a daily TODO list and I manage priorities with colors:
I usually mark in bold the ones that require deep focus to be done, these visual conventions help me navigate my list easier than P1, P0 and P2 or a numeric approach to set priorities.
I don't finish my TODO list every day, to be honest, there are always a lot of things to tackle and it's impossible to get everything done in one day, plus, every day something new comes up, someone has a new request, someone writes a new RFC I need to read and comment, so, I keep adding tasks to the list as they come up and prioritize them later unless they're explicitly urgent. Whatever I can't finish today gets spilled for tomorrow's list.
I also do my lists in advance, I prepare tomorrow's list today by end of day, that way I don't have to do it tomorrow and I can just review it, and get to it after I have my coffee in the morning.
Of course, you'll need to keep your lists somewhere, for this, really, whatever floats your boat, some people use Notion, some others prefer Evernote, Google Keep also seems to be a very popular option. At Careem we use Confluence internally as a knowledge base solution for all things documentation, the thing I like about Confluence is that it gives every user a personal space, I keep my daily TODO in my personal space as private notes for myself, it's very convenient because I don't have to have yet another tool, it's work and it's protected by all the security measures we have at Careem and I'm usually logged in.
This system helps me keep focused and by creating a new page every day, I can look back and keep track of everything I've worked on and when while also making sure I focus only on unfinished tasks and remove the noise of finished tasks from my view.
Have you ever wondered how it is possible to deliver so much stuff at school or uni and why we're not able to deliver as much at work?, the answer is, we had a routine, more or less. We knew every day we were going to have Calculus I from 10:00 to 12:30, then Algorithms II from 13:00 to 14:30, then 3 hours free, then back to classes from 18:00 to 19:45, it was predictable, we would use those 3 hours to study, work on a project, have lunch, socialize or a combination of those, every day was planned and we could schedule in advance what to do. At work it's a bit more difficult, we have 8 hours of semi-random activities. When I realized this, I thought it makes sense to give some order to that chaos and make a routine for myself so that I could use my time in a more predictable manner.
One book that changed the way I think and reason about time is Master your time master your life by productivity coach Brian Tracy. In this book, Tracy mentions that there are multiple types of time in life and one needs to be able to identify what kind of time you have at the moment to know how you should use it as well as what kind of time a task requires in order to know when to do it.
At Careem we have what we call focus time, which are blocks where no group meetings are allowed, only pairing for problem-solving or making progress on a task, we also have a no-meetings day, so, I schedule all my high-focus work at those times. Before we had these policies, I used to schedule 2 hours every day where I didn't accept any meetings or interruptions, muted all notifications and just focused on that type of tasks, whether it was writing code, working on some architecture or designing a solution to implement it later, I just focused on that during the time I blocked for this high focus work.
Now, I do all my collaborative work on the rest of the time I have, we usually have some time in-between meetings so I use that to read RFCs, review code and sometimes socialize.
If you're taking nothing else from this blog post, take only this point, Be Intentional with your time, time is too limited and too precious to use it in a random way, be intentional.
Do you often find yourself attending more meetings than you feel you should?, or stuck in a meeting having no idea why you're there?. Learning to say no is a skill you need to master, I had some hard time mastering this skill for many reasons, our inner nature is to help others, at least mine, I used to say no very rarely and as a result I was usually swamped with work, meetings and other commitments. Now, if I find a reason to say no, I say no. It's usually for a reason. I have a limited amount of time every day and I have to use it wisely.
For meetings, if I have a clashing event, I directly reject the invitation. All my current commitments take precedence with respect to new requests. If the meeting doesn't have a clear objective or agenda I ask for it to be added, if it's not added, and I have no way to know what's expected in the meeting, I let the organizer know I won't attend. If the meetings are spilling, I call that into attention and leave if I have other things to do. This might seem rude as attending meetings is part of the job but so it organizing and running them, if a meeting has no information about what to expect, it means someone is not doing their job organizing it. If the meeting is spilling, it means someone is not doing their job running it effectively.
Remember, as an IC (Individual Contributor) your time is your most valued resource, don't give it to everyone.
This might seem an obvious one, but It's incredible the number of people I know who just know the basics of everything they use. I spend most of my time... well... writing, so, my text editor is where I spend most of my productive time. It doesn't matter what editor you use, whether it's vim or Emacs, vs-code or an IDE, learn how to use the advanced features. I use vim for most of the things that has to do with text: coding, writing docs in markdown, notes, etc. I'm constantly improving my vim config so that I can write code faster and navigate projects more efficiently. For larger codebases I'm not very familiar with, I do use an IDE, we have an IntelliJ license through Careem, so, that's the IDE I use until I'm familiar with the project so that I can navigate my way through the code, it's convenient to learn the key shortcuts.
The other thing I spend most of my time now is the office chat, we use Slack, so, it's also worth learning how to use it properly, all the key shortcuts as well as learning to use the search, it's very powerful and you can find almost anything you can by using the search box instead of navigating through the chats.
By becoming a power user of all the things you use, you can then create systems to help you become more productive, for example, I often mark slack messages with reactions I can later search for, or set reminders on Slack about something a colleague said so that I can take action about it. Investing some time in becoming a power user at work often pays off.
This might seem counterintuitive but taking breaks makes you more productive just because you give your brain some chance to breath, what does this mean?. Have you ever been working on a feature, debugging an issue and felt blocked? like, you don't know what to do, what else to try or that the next step should be?, this is usually because you're locked inside the problem you're trying to solve, think of it as a box, it's very difficult to find something when you're inside the box, it's better to take some distance and look at it from a different perspective that lets you see what you're searching for. It's very difficult to find a failure anywhere if you're looking at it too closely, you might be looking at the wrong place, taking some distance and looking at it from afar makes it easier to spot anomalies and then just zoom-in there again.
That's exactly what happens when you take a break, you take some distance from the problem, allowing your brain to look at it from afar, your unconscious mind will continue working on the problem while you drink a cup of coffee or read some other material or (if you work from home and have kids) go change some diapers. Once you come back to the thing you were working on, it will be more clear or, at least, you'll have some hints on where to go next.
As I mentioned on a previous post, I often use the pomodoro technique on my day to day work, I set a timer and I commit to work on a task for, say, 30-40 minutes, I focus on the task at hand and only on that, when the time is finished, I take a 5min break and then come back to the task for another 30-40min block, this way I make taking breaks part of my work routine and avoid dawning myself in a problem.
This also applies to taking vacations, at Careem we have unlimited vacations policy, this is great because I can take 1 or 2 days off whenever I feel I'm burnt out and come back refreshed to work. When you're too tired or burnt out by work, your motivation decreases and your work doesn't come out as easy or with the same quality, this is also when you consider switching jobs. Taking a couple of days off to rest and disconnect from work when a weekend is not enough to recover is a wise time investment, for me, after one of those hard-deadline, time-sensitive, critical projects I try to take extend the weekend, at least 1 day, then I come back fresh and ready for another round. I'm not saying you should abuse these kind of policies, rather use them for your well-being and mental sanity, take a break when you feel you need it, your body and your employer will thank you for it.
This one might sound odd, if you want to be productive you should actually avoid meetings, right? as long as I'm sitting on a meeting I'm not doing my job, hence, I'm not producing value. We can agree on part of the statement for sure but it's not entirely true, meetings are an essential part of the job, we work with other fellow humans to tell machines what to do, so meeting with other people is essential to create alignment and decide on further steps, and make decisions about the underlying tech we are working on.
Meetings can't be avoided for sure, we can reduce them as much as we want/need but some kinds of meetings are just unavoidable and we need to learn to live with that. Not everything is lost, now that we accepted meetings are part of our life, we can choose to get the most out of them and make them efficient so that we don't have to meet too many times to discuss the same topics over and over again.
This might take a bit of discipline and agreement with your team, but with a few general practices in your meetings you can make them more efficient:
Meetings are a necessary evil, but with discipline you can tame the monster and make them more effective.
Yes, this is the most important advice. We often see Engineers working until late evening, it's not about the hours, it's about the quality of the time you put into everything you do, I'd rather work 20min on something but really focused than 4 hours but all over the place.
Work will always be there, it never ends, if you start and stop working on time you're not doing anything wrong, it's just the way it should be. Working remotely this is especially tricky because you don't have the pressure of commuting, you can stretch a few minutes to wrap up, but that's it!, when it's time, close your laptop and go to your family, otherwise working after-hours becomes a habit and you won't be productive during office hours because you'll be thinking on finishing after-hours.
Time management is vital and a very difficult soft skill to develop, it's all about routines and rituals to me, it takes a lot of will power and discipline to actually put these personal processes in place but, in my own experience, it's totally worth the effort, if I miss doing my TODO list one day, I feel bad and a bit lost and I'm not fully productive that day because I don't have a clear picture of the priorities. Writing everything down helps you take it out of your system and take the tasks one by one without the fear of forgetting something.