Engineering with Utsav

View Original

Productivity as a Software Engineer

What does it mean to be a productive software engineer? I see a lot of folks obsessed about just writing more lines of code or pounding out features, but that isn't really being productive, because when all you care about is the throughput, your quality goes out of the window. Ideally, you want to be effective and efficient — that is what I think being productive is. And there are two sides to that: a habitual side and a technical side. The habitual side, as the name suggests, are a set of core habits that set you up for success when it comes to being productive. This does not necessarily have to do with coding, but how you live your life in general. And the technical side, are things that help you become more efficient and effective from a software engineering standpoint. Each of these probably deserve to be a video on their own — and I may make those in the future. But for now, I will try to give you some tips from both the habitual and technical standpoints to get you started on your journey to becoming a highly productive software engineer.

If you are the video kind, then check out my video on YouTube on the same topic. Otherwise, read on.

1. Organize your week diligently

I am sure you have had days where you had no plans and you got task after task throughout the day, all unexpected, but you took care of all of them like a pure badass. Let me tell you that these kinds of days are one-off and not sustainable in the long run. You are much more likely to be productive in the long run when you know exactly what you will be working on and for how long.

So make a habit of organizing your week. Spend 30 minutes every Sunday to organize the week ahead. You don't need anything fancy, just a simple calendar will do. Once you have a rough outline for the week, spend 10-15 at the end of each day to fine-tune the next day. This will give structure and priority to your day. You will make up with a go-getter mindset and will have a strong game plan on how you want to tackle your day. Of course, things come up sometimes and you will have to adapt. That's okay. But being consistent with organizing and prioritizing your time is the first step in being productive.

And one of the main things you want to do when building your calendar is to create blocks of "focus time," which takes me to tip number two.

2. Work in short bursts

Start time blocking small chunks. This technique is commonly called the Pomodoro Technique. Let's say that you have blocked off 4 hours of focus time in your calendar for coding. Instead of just "coding" for the sake of coding, while one of your eyes is focused on Facebook, and the other one is on YouTube, you won't get much done. Instead the idea is to use your time in short bursts of 30 minute intervals. You work for 25 minutes, take a break for 5 minutes. Keep repeating that until the 4 hours are up. The key here is that you will need to eliminate ALL FORMS of interruptions for the 25-min focus part, and then for the 5 minute break, you can choose to do whatever you like.

There are two kinds of interruptions — ones you control and ones others control. The ones you control are emails, social media, notifications, etc. During your focus time, just turn all of those off. And during your 5-min break, you can check social media, respond to a few emails, or simply do some stretches.

For interruptions that others control - like people trying to chat with you or walking up to your office, you can block off your calendar, wear headphones or even let your team know how you work where you block off focus time.

It takes discipline and practice to nail this habit, but once you do, you will be surprised how good it is at training you to switch on your focus mode.

3. Maintain a backlog

Whether your team has a good task management system or not, you should have one. Break all your tasks into small chunks and put them in your backlog. This does not have to be just for coding. For example, instead of "cleaning the house" have tasks that are "vacuum the house, clean the dishes, mow the lawn" and so on and so forth. That way, the moment you have some spare time, you can quickly knock off a task that fits within your spare time without having to think about what to do, or worse, just doing nothing.

4. Offload any unwanted cognitive load

Having to remember things you need to do, commands, syntaxes, all put a cognitive load on your brain. But there is no reason to. There are apps that will do that work for you. Have a highly organized note taking app - Notion or OneNote or whatever else you prefer - and make that your brain-dump. Throw in anything you may need later, without just relying on your memory. If it's a command you use frequently, repetition of looking it up will take care of the remembering part to a point where you wont need it anymore. If it is an idea or a project design, jot it down instead of trying to recall it at bedtime or in the shower. If it is something simple that you need to remember later, use a reminder app.

Here is a simple rule to follow — if something takes you less than 2 minutes to do, do it right away because creating a reminder for it or jotting it down somewhere takes even more time. If it takes longer, jot it down, set a reminder and forget about it. Let the app do its job.

If you want to build these kinds of keystone habits that are the foundation to you being productive in anything specific - like coding - I can recommend three books:

  1. Atomic Habits by James Clear

  2. Power of Habits by Charles Duhigg

  3. The Productivity Project by Chris Bailey

5. Learn your environment and automate actively

As a software engineer, you use a lot of tools to get your job done. Learn those tools, esp. an IDE. Use an IDE or a Code Editor that works for all your projects, like vscode or something similar. So you don't have to learn your way around a bunch of them.

Stop using the GUI or your mouse. Learn shortcuts, they are much faster. Learning something as simple as Ctrl K, C for commenting, uncommenting can save you a bunch of time over the course of your career. If there isn't a shortcut or a macro for something you do frequently, create one. And make sure you save all your settings so you can import them for a new set up. Most IDEs and Editors have cloud sync these days, so make sure that is enabled.

For repetitive tasks, automate them. You are a software engineer, the last thing you want to do is repeat manual steps. If you have to do something more than twice, automate it. If you have a team that likely does similar things, share your scripts so others can benefit too. Or ask others if they have created automations that you can use.

Follow this same practice for setting up new environments. Think of it, how many times have you had to set up your development machine from scratch? How many of you still choose to install every software, tool or package one at a time, wasting an entire day or more to set up your machine? Automate that stuff, and create a script that does it for you! You can use things like chocolatey for windows and homebrew for mac to make that happen. If you are a new software engineer, you will also learn a thing or two creating those scripts.

Once again, the same idea applies for test environment your projects. If you need a server, database, or some tools installed every time you need to test your project, create an image and use something like docker to create your test sandbox that you can execute with just one command!

The mantra here is automate, automate and automate! And when you are done, automate more! So that you spend less time on meaningless, repeated tasks and more on solving actual problems!

6. Follow Test Driven Development where applicable

I've said this in multiple videos - don't let tests be an afterthought. Learn about test-driven development. Start by writing tests. Then design the implementation to make your tests pass. We always think of tests as simply tools to avoid bugs. But what you don't realize is that well-written tests mock everything. And if any part of code isn't mockable — if it has hidden dependencies, concrete classes that you have to instantiate within the tests - it likely isn't a good design. Tests can force you to think harder about your design and do it well from the get-go, instead of spending weeks or months designing something, only to realize that your structure and dependencies are so much like spaghetti that you either need to refactor a bunch of it, or just skip the test cases because your code isn't very testable. In either case, you will waste a bunch of time in the long run. So, do it once, do it right .

These are the tips I had for today, but being productive isn't about following a few rules or copying what a book says to the T. Being productive is a mindset. There will be days when all your organization and planning goes out of the window and you will have to adapt and handle things as they come. But once you are done, you learn, improve and adjust your methods to account for and adapt to your circumstances, so that your estimates are better in the future. This mindset is what you need to build to eventually be autonomously effective and efficient where you won't have to put much thought into the principles you are following or the habits your are building.