**Stop reading code from top to bottom.
Seriously.** I spent three hours watching a Principal Engineer at a major fintech giant navigate a 50,000-line legacy mess last week, and he didn’t open a single source file for the first twenty minutes.
While the rest of us were squinting at brackets and trying to trace variable logic, he was performing what he called "Contextual Archaeology." He wasn't looking at what the code *is*—he was looking at what it *became*.
In a world where Claude 4.6 and ChatGPT 5 can spit out a thousand lines of perfectly formatted React in seconds, the "what" of code has become cheap.
The "why" is where the six-figure salaries are earned, and most developers are looking for it in the wrong place.
I was sitting in a cramped coffee shop in San Francisco’s Hayes Valley with "Sarah," a staff engineer who’s spent the last decade cleaning up after "move fast and break things" startups.
She watched me struggle to understand a complex authentication module.
"You’re reading it like a novel," she said, pointing at my screen with a half-eaten croissant. "But code isn't a book; it's a crime scene where the evidence has been tampered with for five years."
Sarah explained that 99% of developers treat a source file as the ultimate truth. They open `auth.ts`, start at line one, and try to build a mental model of how it works right now.
**This is a fundamental mistake.**
The file you see today is just the most recent frame in a long-running movie. If you don't see the previous frames, you won't understand why the characters are screaming.
"Most people use `git blame` to find out who to yell at," Sarah told me, "but that only tells you who touched a line last. It doesn't tell you the story of that line."
She showed me her first secret: `git log -L`. Instead of looking at a whole file, she targets a specific function or a range of lines.
This command filters out the noise of the rest of the file and shows you every single time *that specific logic* changed.
**This is the difference between reading a Wikipedia summary and watching the security footage.** When you run this, you see the function grow, shrink, and adapt to bugs.
"If I see a weird `if` statement that makes no sense," Sarah explained, "I don't just guess why it's there. I look at the commit that added it three years ago."
Often, that "weird" code was a hotfix for a 2 a.m. server meltdown. Knowing that context changes how you refactor it today.
You realize that "clean code" might actually break a specific edge case that was solved in 2023.
There’s a growing rift in the dev community right now. I spoke with "Marcus," a CTO at a Series B AI startup, who thinks this "archaeology" is a waste of time.
"We move too fast for history," Marcus argued over a Zoom call. "With Claude 4.6, we can rewrite an entire module in ten seconds.
If the code is confusing, we don't study the history; we just have the LLM explain it and then we refactor it."
But Marcus’s approach has a hidden cost that Sarah sees every day. **AI is incredibly good at explaining what code does, but it's terrible at explaining why it was done that way.**
An LLM can't know that your lead architect had a specific grudge against a certain library in 2025, or that a specific hack was required because of a limitation in a legacy database that you still use.
The data backs Sarah up.
A 2025 study from the Developer Velocity Institute found that engineers who utilized version history for comprehension resolved bugs **34% faster** than those who relied solely on IDE navigation and AI summaries.
The second secret is about finding the invisible threads. Most devs use `grep` or "Find in Files" to see where a variable is used. But that only shows you the *current* state.
Sarah uses `git log -S`, also known as the "Pickaxe." This command searches through the history of the entire codebase for every time a specific string appeared or disappeared.
**This is how you find the ghosts in the machine.** If you’re looking at a variable and wondering where its "twin" went, the Pickaxe will find the exact commit where the twin was deleted.
"I use this to find the 'Blast Radius' of architectural decisions," Sarah said.
"If I see that a specific error code was deleted from ten different files in one commit back in 2024, I know exactly which systems are tightly coupled."
It reveals the hidden architecture that isn't documented in any README. It shows you how the system *actually* behaves under pressure, rather than how the original architect hoped it would behave.
The third secret solves the "file moved" mystery. We’ve all been there: you’re looking at a file’s history, and it only goes back six months.
You know the project is five years old, but the trail goes cold.
"Files are like people," Sarah joked. "They change names, they move to different neighborhoods, and they pretend their past doesn't exist."
By default, Git stops tracking history when a file is renamed or moved. But using `git log --follow` forces Git to look past the rename.
**This allows you to see the "DNA" of a file from the very first commit.** You might find that the "new" modern microservice you're working on is actually just a renamed version of a "temporary" script written during a hackathon in 2021.
When you see the original name of a file, you often find the original *intent*.
A file named `temporary_fix_for_billing.py` that is now named `CoreBillingProcessor.java` tells you a very different story about the reliability of your system.
The industry is currently obsessed with "Development Velocity." We measure how many PRs are merged and how many lines are shipped. But we rarely measure "Comprehension Velocity."
As of April 2026, the average codebase is 40% larger than it was two years ago, thanks to AI-assisted boilerplate generation. We are drowning in "what," and the "why" is becoming a premium skill.
I looked at the internal metrics of a mid-sized engineering team last month. They had integrated Claude 4.5 into their workflow and saw a 50% increase in code output.
**However, their "time to first fix" for regressions actually went up by 15%.**
The reason? The engineers didn't understand the history of what they were overriding. They were shipping "perfect" code that ignored the "messy" context of the past.
They were reading the code, but they weren't reading the *intent*.
If you want to move from a "coder" to an "architect," you have to stop being a passive reader. You have to become a detective.
Tomorrow morning, before you start your first task, try this:
1. Pick the most confusing function in your current ticket.
2. Run `git log -L` on it.
3. Read the commit messages from the last three people who changed it.
**You will likely learn more in five minutes of log-reading than in an hour of staring at the source.** You'll see the trade-offs. You'll see the "we'll fix this later" comments that never got fixed.
You'll see the soul of the software.
We are entering an era where writing code is something a machine can do. But understanding the messy, human, political, and technical history of *why* that code exists?
That is still a uniquely human superpower.
The code is the map, but the Git history is the terrain. 99% of devs are staring at the map and wondering why they're lost. It’s time to look at the ground.
**Do you find yourself relying on AI to explain code more than the actual Git history lately, or is it just me? Let’s talk about how "Contextual Archaeology" is changing in the comments.**
Hey friends, thanks heaps for reading this one! 🙏
Appreciate you taking the time. If it resonated, sparked an idea, or just made you nod along — let's keep the conversation going in the comments! ❤️