As engineers, we're often eager to jump straight into coding when presented with a new project or feature. The thrill of quickly delivering a solution is tempting, especially for junior and mid-level engineers looking to make their mark. While speed can be valuable, especially in fixing well-defined bugs, this approach can be detrimental when designing new systems or features.
The Temptation of Quick Solutions
It's natural to believe that jumping into a problem and finding a rapid solution is what everyone wants. Sometimes, you might even be praised for swiftly building a solution. This skill is commendable in the context of bug fixes, where issues are clear-cut and the root cause is identifiable.
However, rushing to a solution when it comes to new features or entire systems can lead to problems. Imagine investing time and resources into building something, only to discover that it doesn't address the actual issue. Your solution, although well-crafted, becomes unnecessary — a waste of development time and effort.
Becoming an Investigator
This is where patience and a shift in mindset are crucial. Instead of immediately coding, becoming an investigator of the problem space is essential. You aim to understand the problem so thoroughly that you could write a detailed report about it.
Isn't That Someone Else's Job?
You might wonder, isn't it the role of product managers, designers, or researchers to delve into the problem? Shouldn't engineers focus solely on implementation? While cross-functional teams play a significant role, understanding the issue yourself is vital to designing effective systems.
Customers often provide feedback based on their current understanding, which might limit the scope of potential solutions. They might ask for a "faster horse" when what they need is a car. As an engineer, you have the expertise to envision innovative solutions that meet and exceed user expectations.
Strategies for Effective Investigation
Consider the following strategies to truly grasp the problem at hand. Remember to take detailed notes throughout this process — they'll be invaluable later.
Find actual users experiencing the problem and observe them as they navigate it. This practice, often called empathy sessions, allows you to witness firsthand the challenges they face. By seeing the problem yourself, you gain insights into the true issues rather than relying on secondhand interpretations.
Experience the Problem Yourself
Use the product as a user would and feel the pain points personally. There's no substitute for firsthand experience when it comes to understanding the nuances of a problem. While this might not always be possible due to project constraints, it's immensely beneficial when feasible.
Consult with Other Teams
Reach out to colleagues or teams who have previously worked on similar problems. This step is frequently overlooked but can save you considerable time. Others may have valuable insights, documentation, or lessons learned that can inform your approach.
- Don't adopt their solutions outright. Treat this as an information-gathering exercise.
- Avoid judging past efforts based on outcomes. There are many reasons why previous projects may not have succeeded. Focus on the information they provide, not the result.
Synthesizing Your Findings
After your investigation, you'll likely have a wealth of scattered notes. The next step is to synthesize this information into a coherent document that encapsulates your understanding of the problem — without jumping to solutions.
Why Spend Time Writing This?
You might ask, "Why should I spend a day writing this?" Documenting solidifies your comprehension and creates an artifact that others can reference. It also ensures everyone involved has a shared understanding of the problem before moving forward.
Leveraging AI Tools
This step doesn't have to be time-consuming in the era of Large Language Models (LLMs). You can utilize AI to help summarize and organize your notes efficiently.
Example Prompt
"You are an expert in [domain] and a staff software engineer. You have been tasked to understand a particular problem space because you will build a system that provides a solution. You have investigated the problem space to understand the problem better. Please summarize the notes below, organized with logical subheadings, to describe 1) what the problem is and 2) how that problem has been impacting the user.
Please include the following sections:
- Summary
- Background
- Information
Thank you!"
You can quickly generate a comprehensive document by inputting your notes into a quality chatbot with a prompt like this. This approach allows you to focus on critical thinking rather than on the mechanics of writing.
Conclusion
Taking the time to thoroughly investigate and understand the problem before coding leads to better-designed systems and more effective solutions. It prevents wasted effort on unnecessary features and ensures your solutions truly address user needs.
So, before you dive into coding, put on your investigator's hat. Delve deep into the problem space, engage with users, collaborate with colleagues, and synthesize your findings using modern tools. Embracing this approach will enhance your skills as an engineer and contribute to building better systems end to end.
By transforming from coders into investigators, we not only solve problems — we solve the right problems.
Ready to learn more about systematic approaches to system design? Check out the free preview course or explore Course I: Universal Building Blocks.