#41 - Decision-Making Without Full Context
Applying Software Patterns to Make Quick, Effective Decisions
Intro
In my last post, I highlighted how context improves decision-making. This time, I’ll focus on decision-making and how to proceed when context is lacking.
While context is necessary, we must avoid analysis paralysis and prioritize making decisions and taking action.
Let’s explore some software design concepts that help tackle this issue.
Lazy Loading
Do you sometimes experience a web page where more content loads as you scroll, or images start blurry and gradually sharpen? That's lazy loading in action.
The system identifies which components are essential (required context) to display immediately, while other elements can be deferred and loaded later. This approach improves performance by working with minimal context.
You can "lazy load" in life, like learning a new language. If you're planning a trip to France, you might start by learning basic phrases to get around. Later, you can pick up vocabulary related to food and shopping. You "load" new words only when needed, avoiding the overwhelm of learning everything upfront and moving forward gradually.
Circuit Breaker
Imagine a product team overwhelmed with work—top-priority projects, critical bugs, and more. As frustration builds, a key team member falls ill. Pushing the team harder won’t necessarily help. Instead, using a “circuit breaker” approach, you acknowledge the disruption and pause new requests to the team. You check in daily to monitor their status, resuming work only when they return to normal.
This pattern protects systems from crashing, improves resilience, and isolates problems. It shows how, even without full context or resources, quick decisions can still be made and more considerable setbacks prevented.
Concurrency Control
Imagine a restaurant (yes, food again!) where each time a customer orders, everyone else must wait until that order is completed before the next one can be taken. Why? This is to avoid the situation where you order something unavailable because someone else just ordered the last one.
Not very efficient, right? This approach is called Pessimistic Concurrency Control. It assumes there will be conflicts between orders, so they must be processed one at a time. In other words, you need the full context (what everyone else has ordered) to take a new order.
Alternatively, the Optimistic alternative assumes that there won't be conflicts most of the time. Here, everyone can take orders at their own pace, but when an order is submitted to the system, it might turn out that a dish you ordered is no longer available ("We're sorry, the Mediterranean Garden Delight is sold out"). This approach avoids exhaustive checks, allowing faster action even if you occasionally lack full context.
Avoid Analysis Paralysis
While seeking more context is essential, moving forward and making decisions is even more crucial. Overthinking and overanalyzing waste resources can lead to missed opportunities. Instead, try these tips:
Clear Criteria: Define what is essential to move forward and what is merely nice to have.
Imperfection is Perfection: Recognize that striving for perfection is unnecessary, so choose your battles wisely.
Always End Meetings with Action Items: Set a rule that no meeting ends without clear action items. It’s better to make a decision, even if it’s wrong, than to make none.
Iterate: All the examples above allow for mistakes, iterations, and improvements. The first attempt may not be perfect but will lead to a better solution.
Conclusion
Context is valuable in decision-making, but action is essential to avoid stagnation. Techniques like lazy loading, circuit breakers, and optimistic concurrency control in software design show how to proceed efficiently even with limited context by focusing on progress and adaptability.