Computers and software systems are complex and there are a myriad of ways things can go wrong. One way to realign ourselves with the fundamental factors that guide our decision-making and the foundation of our understanding is by returning to first principles when solving problems. I was recently reminded of the importance of applying a disciplined, no-assumption-left-unquestioned, first-principles approach while troubleshooting some client networking challenges. I wanted to share this reminder.
This blog post will discuss the concept of first principles and how to recognize when it’s necessary to start from the most basic of foundations.
What do we mean by first principles?
First principles represent the fundamental truths or building blocks that form the basis of our understanding in any domain. Instead of relying on analogies, accepted wisdom, or conventional methods, first principles involve questioning every assumption and breaking down complex problems into their most basic components. By distilling problems to their core, we can address their root causes and find fundamentally sound solutions that do not necessarily depend on the constraints of experience or the status quo. (Thanks, ChatGPT)
In my own words, it means verifying all the little pieces of the puzzle you either thought were fine or weren’t sure could impact the problem you’re trying to solve. Taken to the extreme, there’s an obvious scope problem — we can’t document and verify the nanometer-scale physics happening inside a CPU in some cloud data center when our code throws an exception. But, most of us have some intuition about where to start and how far might be too far.
Here are signs you should start working from first principles.
When faced with a challenge, it might be time to return to first principles if:
There is no map.
It’s difficult to mentally iterate through possible causes if you don’t understand the context and factors at play. Having a map of the area surrounding a problem in some concrete form is an incredibly useful grounding tool. The more complex the problem and the more factors at play, the more important this map becomes.
There is no compass.
Given a compass, I can walk north one mile without a map. But someone else had to build the compass and tell me how far and in which direction to walk. Obtaining a troubleshooting guide in the middle of a complex technical problem can be a lot like that compass, guiding the team without needing to map the whole area. But without a provided compass, the team needs to determine those plans on their own.
The experimental search space is large.
There are numerous unknowns and potential solutions. That makes exploring alternatives challenging without a fundamental understanding of what drives the problem. Simply put, you’re not lucky to guess your way out of it. Every hypothesis is a one-in-a-million chance. (So, you’re saying there’s a chance!)
Here’s how to approach problem-solving from first principles.
To leverage the power of first principles thinking, follow these steps:
Identify the problem.
Clearly define the challenge you are facing, specifying the scope and implications. Stay away from solutions at this step. Describe the problems based on real observations, not assumptions. Gather more data about the problem from logs, users, etc. Do your best to make the problem known and reproducible.
Break it down to its most basic components.
Dissect the problem into its fundamental elements, making it simpler to address each part individually. You may not feel certain at this point whether you’re dealing with one or multiple problems, but at least you can separate problems based on separate manifestations.
Question and scrutinize all underlying assumptions. Spend more time on the less proven assumptions (e.g., suspect your own code before Microsoft’s DNS implementation). Document them so you can question them again later.
Develop foundational principles.
Establish core truths or concepts that lie at the heart of the issue, based on evidence and logical reasoning. Make diagrams, document proven assumptions, and run experiments to flesh out the context around the problem. This is the world-building phase — writing the Silmarillion if you will — where all the foundation you require is laid out, even if most people only care about the fruit it bears. (Is it fixed? Great!)
Hypothesize a solution and test it.
Create a solution hypothesis that aligns with your established foundational principles. Ensure that it addresses the root causes of the problem. Do good science and test your hypotheses until you’re confident in the solution. Be sure to consider what problems could be caused by fixing the current one.
Go back to first principles.
First principles thinking offers a powerful, systematic approach to problem-solving. By analyzing fundamental assumptions and breaking down complex problems into simpler components, we can develop solutions based on sound reasoning and aligned with our most basic understanding of the problem at hand. The time and effort invested in returning to first principles may very well provide the clarity and direction necessary to navigate through uncertainty and complex problems. Importantly, this type of disciplined problem-solving is much more repeatable than counting on luck and good guesses.