skip to content
Leadership Garden Logo Leadership Garden
Navigating Uncertainty: Software Engineering and Epistemic Learned Helplessness

Navigating Uncertainty: Software Engineering and Epistemic Learned Helplessness

/ 19 min read

Understanding Epistemic Learned Helplessness

Epistemic learned helplessness is when you realize that you can be convinced by arguments, even if they’re not true. In simple terms, it happens when you hear strong arguments that contradict each other, and it makes you doubt your ability to find the real truth. It means that behind every good argument, there’s usually another one that’s just as good, which can make you feel stuck and unsure.

This isn’t just a fancy idea; it happens in real life. For example, think about history. You might believe in one theory, but then you hear another one that makes sense too. This can make you feel like it’s impossible to know the “real” truth.

In everyday life, you can see this when people change their minds about diets, with each diet backed by convincing research. It also shows up in politics, where both sides have strong arguments. The main thing about epistemic learned helplessness is realizing that while being open to persuasive arguments can help you find the truth, it can also be a problem when you don’t know much about a topic.

This background is important when we talk about software engineering because it sets the stage for understanding how software engineers deal with this challenge. They work in a field where things change quickly, and they have to figure out what’s true and what’s not, which can be tough.

Application in Software Engineering

In the fast-paced world of software engineering, epistemic learned helplessness isn’t just a fancy theory, it’s a real issue that people working in the field often deal with. The software development world is packed with so many technologies, ways of working, and different approaches. This can be really overwhelming and sometimes makes people feel stuck or just keep doing things the way they always have. Let’s check out how this shows up in different parts of software engineering:

Overwhelming Choice of Technologies

The wide range of programming languages, frameworks, and tools out there can be really overwhelming. Often, software engineers end up choosing options that are popular or commonly used. However, this means they might miss out on new technologies that could actually be a better fit for what they need.

Let’s say a software engineering team is tasked with developing a web application for a client. The team has primarily worked with a popular JavaScript framework like React in the past, and they’re comfortable with it. However, they’ve heard about a newer, less-known JavaScript framework called Svelte, which is gaining popularity for its performance benefits.

In this scenario, the team may choose to stick with React simply because it’s what they’re familiar with and what’s commonly used in the industry. They may not explore or consider Svelte, even though it could potentially offer a more efficient and suitable solution for their project. This decision is influenced by the learned helplessness of always relying on the tried-and-true options, potentially missing out on the benefits of emerging technologies.

Paradox of Expertise

Software engineers who have honed their skills over time might often lean towards tried-and-tested solutions. Their extensive expertise, while valuable, can sometimes limit their perspective, keeping them from trying out fresh, potentially more effective approaches.

Imagine a senior software engineer who has been working with a specific relational database management system (RDBMS) like MySQL for the majority of their career. They are highly skilled in optimizing queries, troubleshooting issues, and maintaining MySQL databases. When faced with a new project that requires database functionality, they automatically choose MySQL without considering alternative database systems.

In this scenario, the engineer’s extensive expertise in MySQL might lead them to overlook other database solutions like PostgreSQL or even explore newer database technologies like CockroachDB for distributed SQL databases. These alternatives could offer better performance or scalability for the specific project requirements, but the engineer’s learned helplessness in sticking with what they know best prevents them from exploring these possibilities.

Conflicting Programming Paradigms

Software engineers face a tough choice due to the many different programming paradigms out there, each backed by its own group of supporters. This situation often leads them to stick closely to the paradigms they already know. As a result, they might miss out on trying other programming methods that could turn out to be more effective.

Consider a software engineer who has spent most of their career working with object-oriented programming (OOP) languages like Java and C#. They are deeply familiar with the OOP paradigm, its design principles, and best practices. When they encounter a project that requires developing a highly concurrent and distributed system, they default to using their familiar OOP languages.

In this scenario, the engineer’s extensive experience with OOP might lead them to overlook other programming paradigms like functional programming (e.g., using languages like Haskell or Scala) or event-driven programming (e.g., using Node.js). These alternative paradigms could provide a more efficient and maintainable solution for the specific project’s requirements, but the engineer’s learned helplessness in sticking with what they know best hinders them from exploring these possibilities.

Dependence on Stack Overflow and Similar Resources

Depending heavily on websites like Stack Overflow for solutions can lead to only a basic understanding of problems. This kind of dependence might discourage really digging deep and fully understanding the issues, which can contribute to a kind of epistemic helplessness. Imagine what happens when someone like this needs to solve or debug something that doesn’t have a ready answer.

Rapidly Changing Best Practices

The ever-changing best practices in software engineering can create a feeling that it’s pointless to try to stay current. This often leads to sticking with older methods, even when it’s clear that they’re not the best option anymore.

Imagine a software development team that has been using traditional manual testing methods for years. They have a team of dedicated testers who manually verify every feature and functionality in the software. However, the industry has shifted towards automated testing practices and continuous integration/continuous deployment (CI/CD) pipelines to improve software quality and release cycles.

In this scenario, the team may be hesitant to embrace modern testing techniques and automated testing tools. They might perceive the transition as too challenging or time-consuming and continue relying on manual testing, even when it’s evident that automated testing can save time and reduce the risk of human error.

Framework and Library Overreliance

Relying too much on the convenience of libraries and frameworks can decrease the ability to program certain things from the ground up. This can result in a diminished understanding of the basic mechanics involved.

Imagine a front-end developer who frequently uses a popular CSS framework like Bootstrap or Foundation to style and layout web applications. These CSS frameworks offer pre-designed components and responsive grids, simplifying the process of creating visually appealing websites.

However, this developer might rely heavily on these CSS frameworks for all their projects, even for relatively simple websites. They use the provided classes and components without fully understanding the core principles of CSS, such as box model, flexbox, or CSS grid. Consequently, their ability to create custom and highly optimized styles from scratch is limited.

In this scenario, the developer’s learned helplessness in depending on front-end CSS frameworks can hinder their fundamental understanding of CSS and web design. This limitation may become problematic when they encounter projects with unique design requirements or when they need to optimize web performance beyond what the framework provides.

Analysis Paralysis in Tool Selection

The huge number of tools and technologies available for every part of software development can lead to decision fatigue. Often, engineers might choose tools they’re already familiar with instead of taking the time to consider new options that could be better.

Consider a software development team tasked with setting up a continuous integration/continuous deployment (CI/CD) pipeline for their project. They have experience using Jenkins, a widely used automation tool for CI/CD.

In this scenario, the team might be overwhelmed by the plethora of CI/CD tools available, each with its own features and advantages. Faced with decision fatigue and the urgency of getting the pipeline up and running, they opt for Jenkins without exploring newer alternatives like CircleCI or GitLab CI/CD.

This decision reflects learned helplessness as they stick with what they know rather than investing time to evaluate newer options that could potentially offer more streamlined workflows, better integration, or cost-efficiency.

Burnout from Constant Learning

Imagine a dedicated software engineer who is passionate about staying updated with the latest technologies and constantly improving their skills. They work long hours, attend numerous conferences, and frequently take online courses to stay ahead in their field.

However, due to the constant pressure to learn and the demanding nature of their job, they eventually experience burnout. They become physically and mentally exhausted, leading to a loss of motivation and enthusiasm. As a result, they withdraw from actively seeking out new technologies or methods and start relying solely on their existing knowledge and skills.

In this scenario, the engineer’s experience of burnout has led to a state of learned helplessness, where they feel incapable of continuing their learning journey. They may no longer actively seek opportunities to expand their knowledge or engage in professional development activities.

To overcome this learned helplessness, individuals who have experienced burnout should prioritize self-care, set realistic learning goals, and gradually rekindle their passion for learning. Seeking support from mentors or peers can also help them regain their confidence and motivation to stay current in the ever-evolving field of software engineering.

Echo Chambers in Tech Communities

Let’s say a software engineer has been an active member of the Ruby on Rails community for several years. They have contributed to open-source Rails projects, attended Rails conferences, and participated in online forums and discussion groups dedicated to Ruby on Rails.

As a result of their deep involvement in the Ruby on Rails community, this engineer has developed a strong affinity for the Ruby programming language and the Rails framework. They have come to believe that Ruby on Rails is the best choice for web development projects and that the community’s practices and conventions are the gold standard.

Over time, this engineer may become less inclined to explore other programming languages or frameworks, even when alternative technologies might be more suitable for certain project requirements. Their strong attachment to the Ruby on Rails community and its beliefs can create a sense of learned helplessness, limiting their willingness to consider different methodologies or technologies.

(no, I have nothing against Ruby, it’s just an example)

Fear of Failure in Experimentation

In high-stakes or fast-paced work environments, the fear of failing can discourage trying new things. This fear might make engineers stick to familiar ways, even when trying something new could be really helpful.

Imagine a software engineering team working for a financial institution. Their primary responsibility is to maintain and update a critical financial software system that handles millions of transactions daily. Due to the high stakes and strict regulations in the financial industry, there’s a pervasive fear of system failures or errors.

In this environment, the engineers may become extremely risk-averse. They stick to well-established technologies and coding practices that have a proven track record, even if newer, more efficient technologies and methodologies are available. They avoid experimenting with new approaches or innovative solutions because of the fear that any failure could result in significant financial losses or compliance issues.

This fear of failure can lead to learned helplessness, where the engineers are reluctant to step out of their comfort zone and explore potentially beneficial new methods or technologies. They become trapped in a cycle of avoiding change, hindering their ability to adapt to evolving industry standards or deliver more efficient solutions.

Additional factors contributing to epistemic learned helplessness in software engineering include:

  • Legacy System Conformity: Working on legacy systems can create a mindset resistant to integrating new technologies or methodologies.
  • Overemphasis on Precedent Solutions: Relying on past solutions can hinder innovation.
  • Impostor Syndrome: Feeling inadequate despite skills, leading to deferring to others’ opinions or industry norms.
  • Cognitive Overload from Continuous Updates: The volume of updates can lead to sticking with outdated knowledge.
  • Misplaced Trust in Authority or Trends: Following industry leaders or trends without critical evaluation.
  • Fear of Deviating from Industry Standards: Concern about non-compliance can inhibit innovation.
  • Peer Pressure and Groupthink in Teams: Conformity to team opinions suppresses individual critical thinking.
  • Underestimating the Importance of Soft Skills: Software engineers often focus heavily on technical skills, but neglecting soft skills like critical thinking and problem-solving can lead to a narrower approach to challenges. Developing these skills is crucial for innovative problem-solving and effective communication within teams.
  • Over-reliance on Data-Driven Decision-Making: While data is vital in software engineering, an excessive dependence on it can overshadow the importance of qualitative analysis and creativity, particularly in situations demanding innovation.
  • Discomfort with Ambiguity and Uncertainty: Looking for definite answers might make software engineers hesitant to explore areas without clear right or wrong answers, but these areas can lead to important insights and innovations.

All these issues add up to create a situation where it’s getting harder and harder to make confident and well-informed decisions. With new information always coming in and the need to keep up with the latest, engineers might find themselves stuck, unable to decide, or they might just fall back on familiar, tried-and-tested methods, even if they’re not the most efficient or creative solutions.

In the next section, we’ll delve into strategies to balance skepticism with openness, enabling software engineers to navigate this complex landscape more effectively.

Balancing Skepticism and Openness in Software Engineering

To succeed in the fast-paced world of software engineering, where new technologies and methods are always popping up, it’s important to have both a healthy skepticism and an openness to new ideas. Here’s how to strike that balance:

Continuous Learning with a Critical Eye

The field of software engineering is always changing, with new languages, frameworks, and tools popping up regularly. It’s important for software engineers to keep learning, but they should do so in a critical way. Instead of just following every new trend, it’s better to evaluate technologies for their relevance and how well they solve specific problems.

Take the example of the ever-growing number of new JavaScript frameworks. A thoughtful approach means evaluating each framework’s performance, the support from its community, and how well it fits the project you’re working on. In this context, a software engineer might choose to stick with a well-known framework like React, which has a huge support ecosystem and a strong track record, rather than going for the latest, buzz worthy frameworks.

Develop a Framework for Evaluation

Software engineers should develop a personal set of criteria to objectively assess new tools and methodologies. This framework might include technical aspects, community support, long-term viability, and alignment with current project needs.

For example, when evaluating a new database technology, an engineer might consider factors like scalability, ease of integration with existing systems, support for concurrent transactions, and community support. By applying these criteria, they can make an informed decision rather than being swayed by current trends or peer preferences.

Encourage Open Dialogue and Debate

A healthy engineering culture is one where it’s encouraged to share and discuss different points of view. This kind of open conversation helps everyone understand various technologies and methods better and prevents the formation of echo chambers.

In team meetings, it’s beneficial to have conversations about the pros and cons of different architectural styles, like microservices versus monoliths. These discussions can provide valuable insights into which approach might be better suited for the specific needs of the current project.

Learn from Failures and Successes

A culture that values learning from both successes and failures is key to encouraging innovation and experimentation. It’s just as important to understand what didn’t work as it is to know what did.

For example, after adding a new feature, it’s helpful to hold a retrospective to talk about what worked well and what didn’t. If the feature involved using a new technology, assess how that technology affected the project’s success or the challenges faced. These reflections can help in making better technology decisions in the future.

Focus on Problem-Solving, Not Tools

It’s important to focus more on the problem that needs solving rather than the tools being used. This mindset leads to choosing the most suitable tool for the specific job.

For example, if a project involves processing large amounts of data in real-time, the choice of technology (like a specific database or backend language) should be based on which tool can best meet these needs, rather than just going with what the team is most comfortable with.

Prioritize Soft Skills Development

In software engineering, there’s a lot of focus on technical skills, but soft skills like critical thinking, communication, and problem-solving are just as important. These skills help engineers see situations from different angles and work well with diverse teams.

A software engineer might be great at coding, but might not be as good at explaining their decisions to people who aren’t technical. Improving communication skills can help bridge this gap, making sure that the technical choices are clearly explained and aligned with the overall goals of the project.

Balance Data with Intuition and Experience

While relying on data for decision-making is crucial, it’s also important to balance this with intuition and experience. This combination leads to more nuanced and contextually appropriate decisions, especially in situations where data doesn’t provide the full picture.

For example, an engineer might have data showing that a certain framework is faster, but based on their experience and understanding of the project’s specific needs, they might find that another framework is a better choice. This could be due to reasons like easier maintenance or better compatibility with existing systems.

Stay Informed About How The Industry Evolves

Staying updated on changing industry rules is crucial. But it’s also important to know why these rules exist and when it’s right to use new methods.

For example, most people use RESTful APIs, but if you’re a software engineer who knows what’s new, you might check out GraphQL for some tasks where it’s better, like loading data faster.

Seek Diverse Perspectives

It’s a good idea to listen to different viewpoints, whether they come from your field or not. This can help you understand things better and come up with creative solutions.

For example, a software team that usually works on the technical side could learn a lot from a UI/UX designer. This might lead to making software that’s more user-friendly.

Approach to Learning and Problem-Solving

In software engineering, it’s helpful to start with the idea that you don’t know everything. This way, you can learn new things and come up with better ideas.

Think about what a famous thinker like Aristotle did. He looked at what most people thought and what experts said to get a full picture. When we admit that we don’t know everything, we can be more open to new ideas. This can lead to better and more creative solutions in software development.

Hint: read my post about 10 useful mental models to improve your toolbox.

Iterative Learning Process

A good way to learn about new areas in software engineering is to try solving problems on your own before looking at what others have done. When you do this, you can get a feel for the problem and the subject.

After that, you can do some research and keep improving your solutions. This way, you can really understand the problem and why people have certain solutions. You might also find out if there are things people missed or made too simple.

This way might take longer, but it helps you understand things better and see how complex the field can be.

On Confidence And Correctness

In software engineering, it’s important to know that just because someone sounds sure of their idea, it doesn’t mean it’s right. There are lots of confident people in this field, but not all of their ideas are good.

It’s also important to remember that science and technology can be tricky and not always clear-cut. So, it’s good to be a bit skeptical and judge new information based on how good it is, not just how it’s presented.

The Dynamic Nature of Knowledge

In software engineering, as in other areas, what’s seen as the best way to do things can change over time. What’s good today might not be good tomorrow.

This idea comes from thinkers like David Hume. It means that we should be ready to change and try new things, even if they go against what we’re used to.

Pragmatic Decision-Making

In software engineering, making decisions is a mix of being sure and being practical about time. You have to pick the best option based on what you know, even if you’re not 100% sure.

This way, you can keep making progress, even when you’re not completely sure about everything.

Junior Developers and Problem-Solving

For junior developers, it’s important to figure out when to solve problems on your own and when to ask for help. It’s good to struggle a bit because that helps you learn and get better.

But sometimes, when you’re dealing with really specific stuff, it’s better to ask for help. It can save time and help you learn faster.

Senior developers can help with this. They can tell juniors when it’s okay to ask for help and when they should try on their own, so they can grow as professionals.

Senior developers in general play a big role in helping their software teams learn and improve. They can do this by asking junior members to write down what they learn and their experiences, so everyone can benefit from it.

It’s also important to let juniors make mistakes because that’s how they learn. When you do this, it shows that learning is more important than avoiding errors.

By doing these things, senior developers help the team become better, smarter, and always improving.

Conclusion

In the fast-paced world of software engineering, dealing with constant change is a challenge. It’s important to find the right balance between always following new trends and sticking with what you know.

This blog post has talked about ways to handle this challenge. It highlights the need to keep learning, think critically, and be open to growth.

We’ve explored how having a personal way to judge new technologies is crucial. We’ve also seen the value of talking openly and debating in teams, and how learning from both successes and failures is important. It’s about focusing on solving problems rather than just using tools and being good at soft skills.

Making decisions based on data but also trusting your gut and experience, staying updated on industry rules, and getting different viewpoints are all important for making good decisions.

In software engineering, you need to be adaptable and make informed choices. By understanding and dealing with the challenge of constant change, you can stay effective and creative. This doesn’t just help you do better, but also pushes the field forward.

The journey in software engineering is ongoing. You need to be ready for change, value different opinions, and keep up with new tech. By using the strategies we talked about, you can navigate this journey better. This way, your work stays useful, has an impact, and keeps up with the latest needs and progress.