Segmenting problems into known and unknown parts for clarity
Segmenting a complex problem into known and unknown parts is a powerful technique for boosting clarity and productivity. By defining what you already understand and what still needs to be explored, you can tackle problems with greater efficiency—whether you’re solving a challenging coding question or designing a large-scale system. In this guide, we’ll break down how to systematically identify and separate the known from the unknown, helping you plan smarter and solve faster.
Table of Contents
- Why Segmenting Problems Helps
- Practical Framework for Splitting Known vs. Unknown
- Applying This Approach to Coding Challenges
- Applying This Approach to System Design
- Recommended Resources to Sharpen Your Skills
1. Why Segmenting Problems Helps
-
Clarity
By isolating the parts you already understand, you reduce cognitive overload and can focus on specific unknowns—one step at a time. -
Risk Management
Understanding precisely what you don’t know helps in planning potential workarounds or risk mitigation strategies. -
Efficient Collaboration
If working in a team, clarifying known and unknown segments fosters better communication. Teammates can pick up the parts they know well and collectively brainstorm the missing pieces. -
Faster Learning
Focusing on the unknown sections reveals where you should spend time reading documentation, consulting experts, or experimenting with prototypes.
2. Practical Framework for Splitting Known vs. Unknown
Use this step-by-step approach whenever you face a new or complex problem:
-
Define the Goal
Clearly state the problem you’re trying to solve or the outcome you want to achieve.- Example: “Build a messaging service with real-time notifications.”
-
List the Known Elements
Write down everything you already understand, including constraints, technologies, or partial solutions.- Example: “We know how to use WebSockets for real-time updates,” or “We have a Python backend environment.”
-
Identify the Unknowns
Call out the pieces you’re uncertain about. These could be performance bottlenecks, unfamiliar frameworks, or ambiguous requirements.- Example: “Not sure how to achieve horizontal scaling for millions of concurrent users.”
-
Prioritize
Sort your unknowns from most critical to least critical. This prevents you from drowning in open questions by tackling the highest-impact unknowns first. -
Devise Plans or Experiments
For each unknown, outline how you’ll learn or solve it—research, prototypes, or consultations with domain experts. -
Validate and Iterate
As you resolve unknowns, your known list grows while new questions may arise. Keep updating both lists in an iterative loop.
3. Applying This Approach to Coding Challenges
Example: Dynamic Programming Problem
-
Knowns:
- You understand the concept of overlapping subproblems and memoization.
- You know you’ll likely need an array or table to store intermediate results.
-
Unknowns:
- The optimal way to define the subproblem (e.g., how to break down the bigger problem).
- Edge cases or unusual constraints (e.g., negative indices, memory limits).
By identifying these areas, you can tackle the subproblem definition first—perhaps by sketching out the recurrence relation on paper. Then, once that’s clear, you move on to handling boundary conditions.
4. Applying This Approach to System Design
Example: Building a Social Media Feed
-
Goal:
- Design a scalable feed system that shows user posts and updates in real-time.
-
Knowns:
- Database choices (e.g., NoSQL for user feed data).
- Basic caching strategies to reduce repeated reads.
- API frameworks and load balancers you’re familiar with.
-
Unknowns:
- Handling massive concurrency (possibly millions of users in real-time).
- Partitioning and sharding strategies for the feed data.
- Fine-tuning latency vs. throughput for real-time content delivery.
-
Actions:
- Research large-scale feed systems (e.g., how Twitter or Facebook handle their feed).
- Prototype a sharding strategy on a smaller dataset.
- Conduct load tests to see how the system behaves at scale.
The more systematically you can isolate and address these unknowns, the more robust and future-proof your final design becomes.
5. Recommended Resources to Sharpen Your Skills
Tackling known vs. unknown factors isn’t just about mindset—it’s also about continuously strengthening your coding and system design fundamentals. Here are some must-check resources from DesignGurus.io:
-
Grokking the Coding Interview: Patterns for Coding Questions
- Learn foundational patterns (like two pointers, sliding window, backtracking) that will quickly move many “unknown” coding concepts into the “known” column.
- Great for methodically identifying which algorithms and patterns apply to a given challenge.
-
Grokking the System Design Interview
- Perfect for interview prep and real-world applications. You’ll see how top-tier companies approach large-scale systems, clarifying unknown areas (like caching, data partitioning) with in-depth discussions and diagrams.
- Excellent for building confidence in your ability to dissect system requirements into known and unknown components.
Bonus: Explore Their Blog and YouTube Channel
- Complete System Design Guide for a high-level overview of system design topics.
- DesignGurus YouTube Channel for step-by-step system design demonstrations and coding tutorials. Visual walkthroughs can often help you pinpoint what you do and don’t know in real time.
If you’re looking for tailored advice, don’t forget about the Mock Interviews offered by DesignGurus.io. You’ll get direct feedback from ex-FAANG engineers, including insights on how effectively you’re identifying and solving unknown factors during the interview process.
Conclusion
Segmenting problems into known and unknown parts is like creating a detailed roadmap for your project or coding challenge. It helps you focus your energy, keeps you from being blindsided by hidden complexities, and ensures your learning path is efficient and intentional.
Whether you’re chasing a new feature implementation or prepping for a high-stakes technical interview, this habit of clearly labeling “what I know” vs. “what I need to figure out” helps you move forward with confidence. Combine this technique with robust learning resources, and you’ll be well on your way to solving complex problems systematically and effectively.
GET YOUR FREE
Coding Questions Catalog