First Principles Thinking
First Principles Thinking
By Sunil Sadasivan Date: September 23, 2026
Recently, I've found myself returning to Sunil Pai's piece on the "senior engineer death spiral." It has struck a chord with me because the feeling of being "stuck" is a nearly universal experience for veteran engineers.
The paradox is that as you gain expertise, the very experience that made you successful can become a barrier, making it difficult to pivot or approach problems from a fresh perspective.
Note: I am still processing the fact that there is another "Sunil" making waves in the software engineering world.
The Power of Momentum
Pai argues that we should prioritize momentum over specific outcomes. I couldn't agree more. When I hit a wall, my strategy is to decompose the project into the most microscopic, achievable tasks possible.
My "Get Unstuck" Checklist:
- Identify the absolute smallest next step.
- Execute that single action.
- Use the result to inform the next tiny step.
- Repeat until the path is clear.
Completing a small task often acts as a catalyst, revealing the subsequent steps that were previously hidden.
Defining the "Great" Engineer
Throughout my career managing and collaborating with top-tier senior engineers, I've noticed a recurring pattern. Regardless of their origin story, the best engineers possess an innate sense of what actually needs to happen.
Their backgrounds are often eclectic:
- Former customer support or professional services specialists.
- Self-taught programmers.
- Former designers.
- Serial entrepreneurs.
Despite these diverse paths, they all share a commitment to first principles thinking. They don't just write code; they interrogate the why behind the feature and the value it provides to the end-user. They bridge the gap between the source_code and the real-world impact.
Mindset Comparison
| Traditional Thinking | First Principles Thinking |
|---|---|
| "We've always done it this way." | "Why are we doing this at all?" |
| Focuses on technical constraints. | Focuses on the desired outcome. |
| Relies on analogy and precedent. | Deconstructs to fundamental truths. |
| Prioritizes the how. | Prioritizes the what and why. |
Navigating the Agentic Era
We are currently transitioning into an era of agentic development. In my discussions with peers, it's clear that those who are thriving are the ones already practicing first principles.
This feels like a massive "simulation switch-up." It requires a humbling admission: I don't know everything. The engineers who are staying relevant are those willing to temporarily "box up" their existing knowledge to experiment with AI agents.
They are willing to assume old constraints still apply test the waters before deciding something is impossible.
The Mental Process of Unlearning
To truly innovate, one must be able to do the following:
- Take your accumulated experience.
- Set aside your current beliefs about "truth."
- Look at the problem with a blank slate.
If I let a previous project's failure or a known technical limitation dictate my current answer, I stop thinking. But when I ask, "What are we actually trying to achieve?" the number of viable paths forward increases exponentially.
AI and the Learning Loop
There is a constant debate about whether AI is "real" or just "hype." However, if you approach it with fresh eyes, there is an incredible amount to admire and rethink.
First principles thinking means starting with the objective and then asking: "How can AI facilitate this?" rather than getting enamored with the tool before defining the goal.
When you have a deep understanding of the objective, taking a small step and iterating feels natural. In the context of AI agents, this creates a high-velocity feedback loop.
We can represent this relationship as a function of momentum:
By leveraging agents, we accelerate the "back-and-forth" of learning, allowing us to maintain momentum while staying anchored in a fundamental understanding of the problem.
def solve_problem(goal):
knowledge_base = "set_aside()"
while not goal.achieved:
step = get_smallest_action(goal)
result = agent.execute(step)
update_understanding(result)
# Momentum increases as the loop tightens
return goal.success