Cognitive load shatters development
Focus on what's important
In our day-to-day work as software developers, we are subject to a lot of complexity. This complexity, as I have already discussed in previous articles, affects our development in many ways, making us less productive and efficient when it comes to providing value to our users and our business.
Part of the complexity of our work is influenced by the cognitive load to which we are subjected. The more cognitive load we have, the more difficult it is to focus, which affects our ability to develop and solve problems.
A few months ago I joined a team that, among other things, had a cognitive load problem (although they didn’t know it yet).
A season in which the situation had been difficult, and in which they had had a lot of resilience issues with their products, had led them to do extra things to try to mitigate them. One of the actions they took was to have a weekly checkpoint to review how the sprint was going. They also set up a Friday meeting to discuss the week’s incidents with everyone and come up with actions. During the development of new features they also prepared and organised E2E tests that took hours to define, prepare and run. If these were not enough tasks, they also invested development time in preparing detailed presentations that we have every 15 days with business. They also lacked a Continuous Delivery system and, therefore, each new change had to be deployed by hand (they even created a slack bot that would notify them every morning what had to be uploaded).
I don’t doubt that all those actions weren’t justified in one way or another, but the development team was drowning and it seemed like they didn’t even have time to develop product.
Types of Cognitive Load
There are 3 types of cognitive load that affect us in our day-to-day life when developing:
Intrinsic: This is inherent to the complexity of the task we perform by itself and its context within the business. It’s what happens when we work developing algorithms, when we think about how to structure our code or when we debug an error. It is the endurance we have in the face of a complex task and how much we can bear.
Extrinsic: This is the one related to learning. The burden we have to overcome when we start to discover a new language, a new data structure, or a new development methodology. It’s the one we pay for when it comes to acquiring new skills and understanding things in the long run.
Germane: this is the unnecessary cognitive load, the complexity that is given by our environment or that of the task we are performing. It can be caused by inefficient processes, a poorly configured development environment that hinders rather than helps, or a very manual and complex development pipeline.
As we can intuit, intrinsic and extrinsic cognitive loads are part of the heart of our work. Software development is complex by nature and keeping up with the latest trends and technologies is necessary in a field where we are constantly advancing.
However, we have the other kind of cognitive load, the germane one, the one that exists only to get in our way. The one that arises from the inefficiencies of our processes and our environment. And that’s exactly the one we could attack.
Actions
To fix the situation, we took some measures that would reduce all that cognitive load and allow the team to spend time on what really matters: providing value to users.
We killed the weekly checkpoint, reduced the frequency and who had to attend the meetings on incidents, we reduced the number of E2E and improved the process to make them more sustainable, the development team stopped spending so much time preparing the data for the business meeting and implemented a system of automatic deployments that freed us from that task.
It wasn’t an overnight or one-person process, it was something that took months and we iterated together to see what worked best. Gradually, the team had fewer burdens and more time to devote to development.
Apart from all these things, we also had other types of more organizational changes, but one thing was very clear to me: everything we took away from the team allowed them to focus, but focus for real. Product development improved and incidents were reduced. And I know a lot of that was thanks to reducing that cognitive load.
Reduce cognitive load
Struggling for the IDE to listen to us is cognitive load, the fact that the deployment process is very tedious and fails many times is cognitive load, that we have to spend half an hour trying to guess what a poorly structured code with technical debt does is cognitive load. And it’s cognitive load of the annoying type. The best thing we can do is to remove it to make room for the other more useful types of loads: those of thinking and learning.
Some strategies we can do to reduce this annoying burden are:
Automate configurations: Use tools such as Docker or containerization to automate and standardize the configuration of development environments across teams. To not take us 2 days to get the development environment up using an outdated README.
Consolidate tools: Use tools or platforms that combine multiple functionalities to reduce the need for constant context switching. Jumping between tools that do similar things causes focus and context to be lost.
Automate deployments: Implement CI/CD pipelines to automate build, test, and deploy processes, reducing manual intervention and cognitive load. Forgetting about having to deploy everything by hand every time makes us live better.
Reduce the complexity of your code: Encourage clean code practices and simple design to improve readability and maintainability, reducing the cognitive load when working with code.
Limit meetings and communications: Establish clear communication channels and limit meetings to essential ones to avoid information overload (it could have been an email…).
Standardize workflows: Define and encourage standardized workflows to minimize ad-hoc problem solving. For example, making playbooks or guides for complex processes so that we don’t have to keep everything in our heads.
Actively reducing the cognitive load and getting rid of everything that does not contribute to us will allow us to focus on what is really important: meeting the needs of our users.
TL;DR
The cognitive load in software development directly impacts our productivity and efficiency. It is divided into three types: intrinsic, related to the inherent complexity of our tasks; extrinsic, linked to learning and the acquisition of new skills; and germane, caused by inefficient environments or processes. While inherent complexity and learning-related complexity are critical, unnecessary cognitive load from poor processes and environments hinders our performance.
To optimize our work, it’s crucial to reduce this annoying burden and allow more room for thinking and learning. Automating configurations, consolidating tools, simplifying deployments, improving code quality, limiting communications, and establishing standardized workflows are effective strategies to minimize superfluous cognitive load and enhance our creative and problem-solving capacity as software developers.