Flow and Developer Productivity
August 10, 2022
Photo by Randy Fath on Unsplash
We live in a culture obsessed with productivity. We want to read the morning routines of successful people. We analyze our calendars to avoid wasting a single minute. We track our output over time and learn every trick to increase it daily.
While I caution against such an obsession, I also recognize the need to be productive. To produce something of value rather than consuming something made by someone else is part of being human. It’s one of the reasons I have this blog. I wanted to use some of my free time to create and spur thought rather than watching too much TV.
I also recognize the need for rest. We can’t be “on” all of the time; we need at least a few hours on our schedules that are left empty. We need space to let our minds wander, moments of solitude, and times to connect with friends.
We need a balance of all of this to be whole.
As software engineers, we risk falling into the productivity trap. In an industry where many of the best engineers go to startups with 80-hour work weeks and managers asked to review proposals overnight, there is a real risk of not working all the time. At least it seems that way.
But the truth is that we can’t work all the time. Some may be able to push further than others, and it varies widely from person to person. However, one truth applies to everyone: not all of our time is created equal.
Let me explain.
Structured Time and Unstructured Time
Have you ever had a day with back-to-back meetings? You have maybe 5-minute breaks (just enough time to grab a water and run to the restroom) between each. You end the day exhausted but possibly unsure of what you accomplished that day.
You can’t produce anything meaningful (at least as an engineer) on such a day. Sure, you might have had a really good discussion and made a decision about a direction. You might have gained consensus about a technical design. You could have even been doing an extensive review of someone’s RFC and contributed great feedback.
But it isn’t the same as when your developing or writing. It isn’t the same as when you are slinging code left and right to build a new feature. It doesn’t feel as rewarding as when you wrote, edited, re-wrote, and refined a document pitching a new idea for your team.
The differences here are the differences between structured and unstructured time. Structured time has agendas, talking points, a schedule, etc. Meetings, crank time, and even short coding tasks are all forms of structured time.
Unstructured time is when you have space. You get to decide how to use your time. You can think; you can code. You can write; you can read the latest research.
You can also waste it. Because unstructured time is just that - unstructured - it is up to you to decide what to do with it. Most of us will sadly surf the internet or half-heartedly work on a document.
Instead, we need to see our unstructured time as an opportunity for deep work.
Shallow Work and Deep Work
Deep Work comes from writer and professor Cal Newport. Cal has written several books focused on productivity, with Deep Work being one of his best.
He argues that real value in the marketplace these days doesn’t come from running to meetings, staying on top of your email, or building an online presence. It comes from times of deep thinking and focused work.
He cites how leaders like Bill Gates would have whole weeks to just think. How authors like Malcolm Gladwell intentionally stay off social media. How Donald Knuth famously said
Email is a wonderful thing for people whose role in life is to be on top of things. But not for me; my role is to be on the bottom of things.
The whole point of the book is that being “productive” isn’t about producing widgets; it’s about creating value.
Now getting back to my original point that time isn’t created equal, as an engineer, you need to find ways to capitalize on your ability to do deep work. Find blocks of hours (preferably days) in which you have time to perform deep work on a task or idea. Work with your team to have the majority of your meetings on one or two days a week and the rest of the time, have unstructured time to perform deep work.
Many of you are already exclaiming, “I can’t do that! I must get things done according to our perfectly planned project schedule!” I hear you.
First, there is no such thing as a perfectly planned project schedule. Moving on…
Second, you are right. We do need to turn work in. We need to finish our work items within reasonable timelines to keep the project moving forward. We can’t disappear for two-three days every work week and claim it was for deep work.
But what if there was a way to help supercharge just a few hours into deep work?
Enter Flow.
Flow
Flow is an exciting phenomenon. It’s a mental state in which people feel energized and immersed in the task in front of them. It often includes losing track of time, having complete focus, and being immune to distraction.
The benefits of Flow are that you can achieve much more during a few hours of Flow than many more hours working outside of it. The natural question then is how to get into a state of Flow.
Flow often happens right at the edge of our current ability. If a task is too difficult, we can’t fully engage in it because we don’t feel capable enough. If the task isn’t challenging enough, we can’t fully engage because we don’t need to dedicate our full attention to the task.
Likewise, defining a specific goal and removing distractions will go a long way (nothing new or insightful there!). If possible, select a place where you feel relaxed and motivated and return to the same place each day. This will help fall into Flow much easier. Consider having a “pre-flow routine” with the same music, coffee, etc. to act as queues that you are about to
Putting it All Together
I’ve taken these ideas and created patterns that help me be what Cal calls a “bimodal” form of deep work. I usually have one or two days a week (the same days each week) where I have long stretches of unstructured time and schedule large blocks each afternoon to focus and fall into Flow.
To help me fall into a state of Flow, I’ll spend the morning noodling around on what I want to focus on in the afternoon. I’m often surprised about what comes to my mind when I have space to explore and chase the proverbial squirrel. I’ll realize I need to focus on coding something that before didn’t seem important the day before. Or I’ll realize that I should spend the day doing deep research rather than creating or coding.
To help me fall into Flow, I use the same playlist every day. Some days, I’ll even put one song on repeat for hours. It might sound crazy, but after the fourth or fifth time through, it becomes essentially white noise and drowns out everything else but my inner thoughts.
All this to say, in a world where developer productivity is scrutinized more and more, don’t just work harder or longer. Use tools like unstructured time, deep work, and Flow to maximize your available time each week. You’ll be amazed at how much you can do.
Happy coding!
If you enjoyed this article, you should join my newsletter! Every other Tuesday, I send you tools, resources, and a new article to help you build great teams that build great software.
Dan Goslen is a software engineer, climber, and coffee drinker. He has spent 10 years writing software systems that range from monoliths to micro-services and everywhere in between. He's passionate about building great software teams that build great software. He currently works as a software engineer in Raleigh, NC where he lives with his wife and son.