atum@Tencent % cat blog/why-and-how-to-be-full-stack.md

Why and How to Become a Full-Stack Technical Expert Who "Knows Everything"?

Introduction: A Common Technical Dilemma

Many engineers encounter similar dilemmas: faced with the same cross-domain bug, some must stay up all night to find the cause, while others can handle it with ease; some suddenly find themselves "obsoleted by technology" in middle age, yet never understand where the problem lies. Behind this often lies the same fact—being trapped in a single domain.

This trap has two sources:

  • Capital Alienation: Driven by capital, companies create job divisions with labels like "RLHF Engineer," "DBA," or "Security Operations Engineer." Once these labels become rigid, they act like invisible fences, allowing engineers to only cycle within narrow tracks.
  • Self-Imposed Boundaries: Many people actively "draw boundaries around themselves." For example, PWN players only do PWN and won't touch Crypto or AI; AI security researchers only focus on model attack and defense, with no interest in traditional vulnerabilities.

The problem is that the same approach produces vastly different effects in different levels of technical domains.

  • If you're researching foundational domains close to the principle level, such as "building CPUs," "training foundation models," or "studying physics," deep specialization in one area is fine. These directions naturally require extreme expertise.
  • But if you're in application layers or higher domains, such as lithography machine engineering, vulnerability discovery, or AI security, being trapped in a single module for too long will severely limit innovation capability. What you master is often just a small building block, not the ability to assemble an entire tree of blocks. Over time, what eliminates you is often not the technology itself, but the boundaries you've clung to.

Full-Stack Technical Experts Are More Likely to Construct Good Solutions

The essence of technology is a process, method, or apparatus formed to achieve a human purpose. In other words, technology has always served a purpose rather than being the purpose itself.

Therefore, when we attempt to solve a problem with technology, the domain where the problem lies and the domain where the solution resides may be completely different. The problem domain is simply where the problem occurs, while the solution domain is where the answer lies—the two are not necessarily aligned.

Thus, the more comprehensive a person's technical mastery, the more likely they are to construct a good solution.

Problem Domain ≠ Required Solution Domain

For example, the problems we face might be:

  • How to automatically discover vulnerabilities in code repositories;
  • How to complete enterprise post-quantum cryptography migration;
  • How to analyze a complex binary malicious sample;
  • How to make an AI model converge stably.

These problems seem to naturally belong to certain technical domains:

  • Vulnerabilities → Program Analysis;
  • Post-quantum migration → Cryptography;
  • Binary analysis → Reverse Engineering;
  • Model training → AI.

But the key is:

👉 Problem Domain ≠ Can Only Be Solved by Its Corresponding Technical Domain

For example: Binary security traditionally relies on symbolic execution and taint analysis. But today, LLMs can do function annotation and code semantic retrieval, providing entirely new entry points.

Post-quantum migration is nominally a cryptography task, but the real challenges are: how to precisely identify old algorithm calls in a massive codebase, how to safely replace them, and how to smoothly deploy. These challenges span multiple domains including AI, static analysis, and software engineering. The problem domain naturally crosses multiple technical domains, so solving it must be cross-domain.

If you only confine yourself within one domain, you'll miss key building blocks and won't be able to truly solve the problem.

Case Study: Automated Vulnerability Discovery

The problem domain is: "How to automatically discover vulnerabilities in code repositories."

Intuition might make you think this is a program analysis matter, but we can find at least these solution "building blocks":

  • LLM-based Code Retrieval: LLMs can very precisely help you find code meeting complex semantic conditions, such as logic involving permission authentication, but they're slow and expensive—running them means burning money.
  • Vector Retrieval-based Recall: Vector indexing can quickly find semantically similar code snippets, but accuracy is low, often missing key points.
  • Traditional Static Analysis Tools: Static analysis can scan the entire repository in one go, giving a bunch of potential vulnerability hints, but false positives are so numerous they make you doubt life itself.
  • Taint Analysis Tools: Taint analysis can track data flow all the way, checking if source and sink connect, but once it encounters an unfamiliar library function, propagation breaks.
  • Repository-Level LLM Tools like Claude Code: You can chat with it directly, asking "where is the authentication logic in this repository," and it will explore like a little assistant and give you an answer. Effects are stunning for specific questions, but it easily goes off-track for generic questions, and call overhead is large, not suitable for scaling.

No single-domain tool can completely solve the problem.

There are even more "building blocks" to choose from, such as Fuzzing, Reverse Engineering, Symbolic Execution, Formal Verification, etc. If we can combine them rationally based on the characteristics of different types of technology, we can create entirely new technical solutions.

How to Become a Full-Stack Talent?

Human energy is ultimately limited, so does becoming a full-stack expert who masters N domains mean "paying N times the effort"?
The answer is no.

To become a full-stack expert:

  1. Master universal methodologies — The underlying patterns for problem-solving are common across domains;
  2. Understand the recursive structure of technology and use it to master more tech stacks — By dissecting the "technology tree" and grasping the common underlying modules, you can connect different domains and reduce learning complexity from O(N) to close to O(log N).

I. Master Universal Methodologies

Although different domains appear vastly different on the surface, if you break them down, the underlying logic and problem-solving patterns are often common. To illustrate this point, let's look at a few specific examples.

Universal Methodology for Debugging

Debugging seems complex, but actually shares the same thinking process across domains:

  1. Add observability: logs, monitoring, profiling.
  2. Hypothesize causes: Form hypotheses based on observed phenomena.
  3. Verify hypotheses: Design experiments to confirm inferences.
  4. Enhance observability: If verification fails or information is insufficient, continue adding logs and monitoring.
  5. Iterate in loops: Continuously narrow the problem scope until locking onto the root cause.

Cross-Domain Examples:

  • You stack HTTP Basic Auth on JupyterServer, and authentication always fails. The issue isn't "the library is broken," but two authentication systems conflicting.
  • Accessing service.local works in browsers but not in command line. The truth is the difference between browser and system DNS stacks.

Frontend, server-side, and network problems seem different, but all can be solved with this debugging workflow.

Why?
Because in the recursive structure, a bug is essentially "some submodule failing." As long as the methodology is consistent, you can debug across domains, and all you need to do is master the observability tools of different domains.

Universal Methodology for Designing Solutions (Using Post-Quantum Migration as Example)

Take "post-quantum security migration" as an example: Quantum computers may threaten existing encryption systems by 203X, and we need to upgrade to post-quantum safe algorithms. Does this mean everything must be overthrown and redone? Not necessarily.

The pattern for solving complex problems is still similar:

  1. Clarify objectives: For example, fully upgrade cloud vendor business to post-quantum safe versions.
  2. Refine metrics: What accuracy? What cost? What performance indicators? How much participation from business teams needed? How to prevent future algorithm breaches?
  3. Choose building blocks: For example, to identify cryptographic algorithms at risk, you can use LLM code analysis.
  4. Assemble and iterate: The process inevitably involves stumbling, requiring constant refinement of the solution, even adjusting objectives.

Master this methodology, combine it with your existing technical building blocks, and you can solve various cross-domain challenges.

II. Understand the Recursive Structure of Technology and Use It to Master More Tech Stacks

Looking back to here, we can ask a more essential question:

What is the structure of technology?

Actually, technology is a recursive structure. Each technology is composed of sub-technologies, which can be recursively decomposed until the end: either an encapsulation of some principle or programmatic utilization of some phenomenon.

The Recursive Structure of Technology

Each technology is essentially assembled from sub-technologies, which can be further broken down until reaching the recursive end: either an encapsulation of some principle or programmatic utilization of phenomena.

For example, starting from the top-level Vibe Coding experience and breaking it down, you can see modules like Agent scheduling, context engineering, LLM, vector search, etc. Continuing down to LLM, it involves distributed training, model evaluation, data engineering, and other subsystems. Data engineering itself depends on annotation tools, database indexing, and distributed systems. Going further down, you eventually touch compilers, networks, mathematics, and even physics. Technology is like a recursive "building block tree," layer by layer connected.

However, in actual work, you don't need to explore to the bottom of the tree. Most of the time, you only need to go deep enough to the layer required to solve the problem. The key is: to build applications, you must understand the principles of the modules you depend on.

For example: If you want to develop LLM applications, you can't just call APIs; you need to understand basic mechanisms—such as how attention works and how context is modeled. This way, when you encounter "hallucinations" or "insufficient context window," you can understand why solutions like RAG and GraphRAG are needed. If you need further tuning, you also need to master training processes, data cleaning, and alignment methods; if you drill even further down, it might involve distributed systems, computing power scheduling, and even mathematics and hardware.

Optimization of Learning Complexity

From another perspective, the recursive structure can also help us reduce learning complexity.

  • If you learn each technology in isolation, the complexity is approximately O(N);
  • But if you learn according to the "building block tree," mastering some common underlying blocks can cover more upper-layer applications, reducing complexity to close to O(log N).

For example:

  • Vulnerable code identification and cryptographic asset identification are essentially similar "code pattern recognition";
  • The multi-constraint solving process in SDL is similar to optimization thinking for post-quantum migration strategies.

Learn the underlying approach, and you can transfer it to multiple seemingly unrelated tasks.

The Key to Becoming a Full-Stack Talent

Therefore, to become a full-stack talent doesn't mean mastering all domains, but rather grasping three cores:

  • Methodology: Universal design and problem-solving thinking that can transfer across domains.
  • Building Block Tree: Master key nodes in the recursive structure, not just isolated technical points.
  • Combination Ability: Ability to reassemble existing blocks into solutions based on needs, continuously iterating in the process.

True full-stack capability isn't about "learning miscellaneously," but thoroughly understanding structure, mastering building blocks, and knowing how to assemble and build.