{
  "areas": [
    {
      "id": "base",
      "name": "地基",
      "intro": "CS 核心课、数学和每天都用的工具。每样都要有，最可迁移。",
      "skillIds": [
        "cs61a",
        "calculus",
        "linux",
        "python",
        "cs61b",
        "discrete",
        "math",
        "shell",
        "git",
        "docker",
        "dsa",
        "cs61c",
        "prob",
        "optimization",
        "github",
        "testing",
        "sql",
        "java",
        "leetcode",
        "c",
        "csapp",
        "ci",
        "opensource",
        "gdb",
        "networking",
        "writing",
        "english",
        "x-share"
      ]
    },
    {
      "id": "web",
      "name": "Web 开发",
      "intro": "做网站和后端服务：页面、接口、数据库、登录和收款。",
      "skillIds": [
        "html",
        "web-api",
        "postgres",
        "growth",
        "javascript",
        "figma",
        "fastapi",
        "auth",
        "websocket",
        "stripe",
        "typescript",
        "vue",
        "node",
        "browser",
        "e2e",
        "redis",
        "react",
        "build-tools",
        "web-perf",
        "tailwind",
        "nextjs",
        "design-system",
        "indie"
      ]
    },
    {
      "id": "client",
      "name": "客户端与游戏",
      "intro": "做手机 App 和游戏：移动端、图形学、游戏引擎。",
      "skillIds": [
        "swift",
        "kotlin",
        "dart",
        "react-native",
        "csharp",
        "graphics",
        "swiftui",
        "compose",
        "flutter",
        "app-release",
        "shader",
        "threejs",
        "game-engine",
        "gameplay",
        "netcode",
        "physics"
      ]
    },
    {
      "id": "systems",
      "name": "底层系统",
      "intro": "操作系统、编译器、并发和分布式，还有把服务稳定跑起来的运维。",
      "skillIds": [
        "os",
        "cpp",
        "compiler",
        "arch",
        "perf",
        "embedded",
        "nginx",
        "cloud",
        "k8s",
        "concurrency",
        "rust",
        "llvm",
        "kernel",
        "rtos",
        "virtualization",
        "iac",
        "observability",
        "go",
        "mlir",
        "ebpf",
        "driver",
        "distributed",
        "db-internals",
        "incident",
        "kafka",
        "system-design"
      ]
    },
    {
      "id": "security",
      "name": "安全",
      "intro": "找漏洞、补漏洞。",
      "skillIds": [
        "security",
        "crypto",
        "web-security",
        "pwn",
        "pentest",
        "reverse",
        "ctf",
        "fuzzing"
      ]
    },
    {
      "id": "data",
      "name": "数据与量化",
      "intro": "处理和分析数据、做实验，用数据研究市场。",
      "skillIds": [
        "pandas",
        "data-eng",
        "analytics",
        "derivatives",
        "viz",
        "spark",
        "ab-test",
        "timeseries",
        "quant-research",
        "factor",
        "risk",
        "portfolio"
      ]
    },
    {
      "id": "learning",
      "name": "机器学习",
      "intro": "从经典机器学习到深度学习，训练出能用的模型；也用它做科学研究。",
      "skillIds": [
        "numpy",
        "ml",
        "sci-compute",
        "feature",
        "gbdt",
        "dl",
        "recsys",
        "pytorch",
        "rl",
        "ranking",
        "cv",
        "mlops",
        "gnn",
        "pinn",
        "detection",
        "multimodal",
        "molecule"
      ]
    },
    {
      "id": "llm",
      "name": "大模型",
      "intro": "读懂、训练和微调大模型，再用它做应用：RAG、Agent。",
      "skillIds": [
        "nlp",
        "llm-app",
        "vector-db",
        "gpt",
        "hf",
        "prompt",
        "eval",
        "voice",
        "rag",
        "finetune",
        "llm-data",
        "agent",
        "sft",
        "rlhf",
        "scaling",
        "mcp",
        "pretrain-run",
        "llm-eval",
        "distillation",
        "reasoning-rl"
      ]
    },
    {
      "id": "infra",
      "name": "AI Infra",
      "intro": "让模型跑得更快更省：GPU kernel、AI 编译器、推理引擎、分布式训练。",
      "skillIds": [
        "parallel",
        "dlsys",
        "quantization",
        "vllm",
        "gpu-arch",
        "onnx",
        "edge-infer",
        "sglang",
        "spec-decode",
        "serving",
        "dist-infer",
        "cuda",
        "bench",
        "gpu-perf",
        "triton",
        "nccl",
        "trt-llm",
        "cutlass",
        "flash-attn",
        "dist-train",
        "ai-compiler",
        "train-framework",
        "tvm"
      ]
    },
    {
      "id": "robotics",
      "name": "机器人",
      "intro": "让机器动起来：机器人学、仿真、SLAM，具身智能和自动驾驶。",
      "skillIds": [
        "robotics",
        "ros",
        "robot-sim",
        "slam",
        "ad-planning",
        "imitation",
        "ad-perception",
        "vla"
      ]
    }
  ],
  "skills": [
    {
      "id": "cs61a",
      "areaId": "base",
      "name": "编程入门",
      "intro": "会把问题拆成函数、用递归和抽象写清楚，能亲手写出一个小解释器。",
      "icon": "code",
      "parent": null,
      "language": false,
      "weight": 163,
      "prerequisites": [],
      "dependents": [
        "python",
        "cs61b",
        "discrete",
        "html"
      ],
      "steps": [
        "函数和高阶函数",
        "递归和树递归",
        "数据抽象和面向对象",
        "链表、树和生成器",
        "写一个 Scheme 解释器"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS61A",
          "url": "https://cs61a.org/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Composing Programs（SICP Python 版）",
          "url": "https://www.composingprograms.com/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng",
        "test-dev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "security",
        "data-analyst",
        "data",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "calculus",
      "areaId": "base",
      "name": "微积分",
      "intro": "会求导、积分和多元函数的梯度，能看懂梯度下降和反向传播的推导。",
      "icon": "square-function",
      "parent": null,
      "language": false,
      "weight": 75,
      "prerequisites": [],
      "dependents": [
        "math"
      ],
      "steps": [
        "极限和导数",
        "积分",
        "多元函数和偏导",
        "梯度和链式法则",
        "手推一遍反向传播"
      ],
      "resources": [
        {
          "label": "MIT 18.01",
          "url": "https://ocw.mit.edu/courses/18-01sc-single-variable-calculus-fall-2010/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "3Blue1Brown 微积分的本质",
          "url": "https://www.3blue1brown.com/topics/calculus",
          "kind": "视频",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev",
        "security",
        "data-analyst",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "linux",
      "areaId": "base",
      "name": "Linux",
      "intro": "会在命令行里管文件、进程、权限和服务，能独自登上一台服务器排查问题。",
      "icon": "si:linux",
      "parent": null,
      "language": false,
      "weight": 47,
      "prerequisites": [],
      "dependents": [
        "shell",
        "git",
        "docker",
        "os",
        "ros"
      ],
      "steps": [
        "文件和目录操作",
        "权限和用户",
        "进程和服务管理",
        "日志和排查",
        "SSH 远程登录",
        "独立运维一台服务器"
      ],
      "resources": [
        {
          "label": "Missing Semester",
          "url": "https://missing.csail.mit.edu/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng",
        "test-dev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "data",
        "ai-app",
        "inference",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "python",
      "areaId": "base",
      "name": "Python",
      "intro": "会用 Python 写脚本和小项目，能熟练用标准库、虚拟环境和第三方包。",
      "icon": "si:python",
      "parent": "cs61a",
      "language": true,
      "weight": 89,
      "prerequisites": [
        "cs61a"
      ],
      "dependents": [
        "testing",
        "sql",
        "web-api",
        "numpy"
      ],
      "steps": [
        "基本语法和数据类型",
        "函数、模块和包",
        "文件、异常和标准库",
        "虚拟环境和第三方包",
        "写一个实用的命令行工具"
      ],
      "resources": [
        {
          "label": "Python 官方教程",
          "url": "https://docs.python.org/zh-cn/3/tutorial/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng",
        "test-dev",
        "sre",
        "distributed-eng",
        "security",
        "data-analyst",
        "data",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "cs61b",
      "areaId": "base",
      "name": "数据结构",
      "intro": "会选对数据结构，能亲手实现链表、树、哈希表和图并说清复杂度。",
      "icon": "list-tree",
      "parent": "cs61a",
      "language": false,
      "weight": 77,
      "prerequisites": [
        "cs61a"
      ],
      "dependents": [
        "dsa",
        "cs61c",
        "java",
        "swift"
      ],
      "steps": [
        "数组、链表、栈和队列",
        "树和二叉搜索树",
        "哈希表和堆",
        "图和遍历",
        "复杂度分析",
        "实现一个数据结构库"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS61B",
          "url": "https://sp24.datastructur.es/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "mobile",
        "gamedev",
        "test-dev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "security",
        "data",
        "quant",
        "inference",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "discrete",
      "areaId": "base",
      "name": "离散数学",
      "intro": "会用逻辑、集合、图论和归纳法做证明，能读懂算法的正确性证明。",
      "icon": "infinity",
      "parent": "cs61a",
      "language": false,
      "weight": 10,
      "prerequisites": [
        "cs61a"
      ],
      "dependents": [
        "dsa",
        "gnn"
      ],
      "steps": [
        "逻辑和证明",
        "归纳法",
        "集合和计数",
        "图论",
        "离散概率",
        "证明一个算法正确"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS70",
          "url": "https://www.eecs70.org/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "MIT 6.042J",
          "url": "https://ocw.mit.edu/courses/6-042j-mathematics-for-computer-science-fall-2010/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "test-dev",
        "distributed-eng",
        "ai4s"
      ]
    },
    {
      "id": "math",
      "areaId": "base",
      "name": "线性代数",
      "intro": "会做矩阵运算、特征分解和 SVD，能看懂模型里的矩阵推导。",
      "icon": "grid-3x3",
      "parent": "calculus",
      "language": false,
      "weight": 74,
      "prerequisites": [
        "calculus"
      ],
      "dependents": [
        "prob",
        "optimization",
        "graphics",
        "numpy"
      ],
      "steps": [
        "向量和矩阵运算",
        "线性方程组和消元",
        "特征值和特征向量",
        "SVD 和低秩近似",
        "用 SVD 压缩一张图片"
      ],
      "resources": [
        {
          "label": "MIT 18.06",
          "url": "https://ocw.mit.edu/courses/18-06-linear-algebra-spring-2010/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "3Blue1Brown 线性代数的本质",
          "url": "https://www.3blue1brown.com/topics/linear-algebra",
          "kind": "视频",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev",
        "security",
        "data-analyst",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "shell",
      "areaId": "base",
      "name": "Shell 脚本",
      "intro": "会写 Bash 脚本，能用管道、循环和文本工具把重复的活自动化。",
      "icon": "terminal",
      "parent": "linux",
      "language": true,
      "weight": 0,
      "prerequisites": [
        "linux"
      ],
      "dependents": [],
      "steps": [
        "变量、条件和循环",
        "管道和重定向",
        "grep、sed 和 awk",
        "定时任务",
        "写一个自动化脚本"
      ],
      "resources": [
        {
          "label": "Bash 指南",
          "url": "https://mywiki.wooledge.org/BashGuide",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "git",
      "areaId": "base",
      "name": "Git",
      "intro": "会提交、分支、合并和变基，能自己解决冲突、找回误删的提交。",
      "icon": "si:git",
      "parent": "linux",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "linux"
      ],
      "dependents": [
        "github"
      ],
      "steps": [
        "提交和查看历史",
        "分支和合并",
        "变基和改写历史",
        "解决冲突",
        "用 reflog 找回提交"
      ],
      "resources": [
        {
          "label": "Pro Git（中文）",
          "url": "https://git-scm.com/book/zh/v2",
          "kind": "书",
          "free": true
        },
        {
          "label": "Learn Git Branching",
          "url": "https://learngitbranching.js.org/?locale=zh_CN",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng",
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "docker",
      "areaId": "base",
      "name": "Docker",
      "intro": "会写 Dockerfile 打包应用，能用镜像在任何机器上把服务跑起来。",
      "icon": "si:docker",
      "parent": "linux",
      "language": false,
      "weight": 18,
      "prerequisites": [
        "linux"
      ],
      "dependents": [
        "fastapi",
        "cloud",
        "k8s"
      ],
      "steps": [
        "镜像和容器",
        "写 Dockerfile",
        "端口、变量和数据卷",
        "排查容器问题",
        "把自己的项目容器化"
      ],
      "resources": [
        {
          "label": "Docker 官方入门",
          "url": "https://docs.docker.com/get-started/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Dockerfile 最佳实践",
          "url": "https://docs.docker.com/build/building/best-practices/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "product-eng",
        "sre",
        "distributed-eng",
        "data",
        "ai-app",
        "inference"
      ]
    },
    {
      "id": "dsa",
      "areaId": "base",
      "name": "算法",
      "intro": "会用排序、图算法和动态规划解题，能算清时间和空间复杂度。",
      "icon": "arrow-down-wide-narrow",
      "parent": "cs61b",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "cs61b",
        "discrete"
      ],
      "dependents": [
        "leetcode",
        "compiler",
        "db-internals"
      ],
      "steps": [
        "排序和二分",
        "图的搜索和最短路",
        "贪心和分治",
        "动态规划",
        "正确性和复杂度",
        "独立解完一套算法题"
      ],
      "resources": [
        {
          "label": "MIT 6.006",
          "url": "https://ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Hello 算法",
          "url": "https://www.hello-algo.com/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "test-dev",
        "distributed-eng"
      ]
    },
    {
      "id": "cs61c",
      "areaId": "base",
      "name": "计算机组成",
      "intro": "会写 C 和 RISC-V 汇编，能说清缓存和流水线怎么影响程序速度。",
      "icon": "circuit-board",
      "parent": "cs61b",
      "language": false,
      "weight": 66,
      "prerequisites": [
        "cs61b"
      ],
      "dependents": [
        "c",
        "csapp",
        "arch"
      ],
      "steps": [
        "C 和内存模型",
        "RISC-V 汇编",
        "数字电路和 CPU",
        "缓存和流水线",
        "SIMD 和多线程",
        "写一个 RISC-V 处理器"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS61C",
          "url": "https://cs61c.org/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "gamedev",
        "test-dev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "security",
        "data",
        "quant",
        "inference",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "prob",
      "areaId": "base",
      "name": "概率统计",
      "intro": "会用常见分布、期望和假设检验，能判断一个数据结论靠不靠谱。",
      "icon": "dice-5",
      "parent": "math",
      "language": false,
      "weight": 57,
      "prerequisites": [
        "math"
      ],
      "dependents": [
        "crypto",
        "derivatives",
        "ab-test",
        "timeseries",
        "ml"
      ],
      "steps": [
        "概率和条件概率",
        "常见分布",
        "期望、方差和大数定律",
        "假设检验和置信区间",
        "分析一份真实数据"
      ],
      "resources": [
        {
          "label": "Harvard Stat 110",
          "url": "https://projects.iq.harvard.edu/stat110",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "security",
        "data-analyst",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "optimization",
      "areaId": "base",
      "name": "最优化",
      "intro": "会推凸优化、梯度下降和拉格朗日乘子，能说清模型是怎么被训出来的。",
      "icon": "mountain",
      "parent": "math",
      "language": false,
      "weight": 50,
      "prerequisites": [
        "math"
      ],
      "dependents": [
        "portfolio",
        "ml",
        "ad-planning"
      ],
      "steps": [
        "凸集和凸函数",
        "梯度下降",
        "拉格朗日乘子",
        "对偶",
        "随机梯度和 Adam",
        "手写优化器训模型"
      ],
      "resources": [
        {
          "label": "Stanford EE364A",
          "url": "https://web.stanford.edu/class/ee364a/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Boyd《凸优化》",
          "url": "https://web.stanford.edu/~boyd/cvxbook/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "github",
      "areaId": "base",
      "name": "GitHub 协作",
      "intro": "会提 issue、开 PR、做 code review，能和陌生人在同一个仓库里协作。",
      "icon": "si:github",
      "parent": "git",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "git"
      ],
      "dependents": [
        "ci",
        "opensource"
      ],
      "steps": [
        "issue 和讨论",
        "fork 和开 PR",
        "code review",
        "Actions 入门",
        "和别人协作一个项目"
      ],
      "resources": [
        {
          "label": "GitHub 文档",
          "url": "https://docs.github.com/zh",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng",
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "testing",
      "areaId": "base",
      "name": "自动化测试",
      "intro": "会用 pytest 写单元测试和集成测试，能放心改代码而不怕改坏。",
      "icon": "list-checks",
      "parent": "python",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "python"
      ],
      "dependents": [
        "ci",
        "e2e"
      ],
      "steps": [
        "pytest 基础和断言",
        "fixture 和参数化",
        "模拟外部依赖",
        "看测试覆盖率",
        "给自己的项目补齐测试"
      ],
      "resources": [
        {
          "label": "pytest 文档",
          "url": "https://docs.pytest.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "sql",
      "areaId": "base",
      "name": "SQL",
      "intro": "会写查询、连接、分组和子查询，能为一个业务设计表结构。",
      "icon": "database",
      "parent": "python",
      "language": true,
      "weight": 21,
      "prerequisites": [
        "python"
      ],
      "dependents": [
        "postgres",
        "fastapi",
        "db-internals",
        "data-eng",
        "analytics"
      ],
      "steps": [
        "基本查询",
        "连接和分组",
        "子查询和窗口函数",
        "设计表结构",
        "给小网店建库写报表"
      ],
      "resources": [
        {
          "label": "SQLBolt 交互练习",
          "url": "https://sqlbolt.com/",
          "kind": "练习",
          "free": true
        },
        {
          "label": "Select Star SQL",
          "url": "https://selectstarsql.com/",
          "kind": "书",
          "free": true
        },
        {
          "label": "Mode SQL 教程",
          "url": "https://mode.com/sql-tutorial/",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "product-eng",
        "distributed-eng",
        "data-analyst",
        "data",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app"
      ]
    },
    {
      "id": "java",
      "areaId": "base",
      "name": "Java",
      "intro": "会用 Java 写面向对象的程序，能读懂和维护大公司的后端代码。",
      "icon": "si:openjdk",
      "parent": "cs61b",
      "language": true,
      "weight": 9,
      "prerequisites": [
        "cs61b"
      ],
      "dependents": [
        "kotlin",
        "dart",
        "csharp"
      ],
      "steps": [
        "类、接口和继承",
        "集合框架",
        "异常和泛型",
        "Maven 或 Gradle",
        "写一个小型后端服务"
      ],
      "resources": [
        {
          "label": "Java 教程",
          "url": "https://dev.java/learn/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile",
        "gamedev",
        "test-dev"
      ]
    },
    {
      "id": "leetcode",
      "areaId": "base",
      "name": "算法面试",
      "intro": "会在 45 分钟里把一道中等题想清楚、写对，能过技术面试的算法关。",
      "icon": "si:leetcode",
      "parent": "dsa",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "dsa"
      ],
      "dependents": [],
      "steps": [
        "数组、哈希和双指针",
        "滑动窗口和二分",
        "树和图的题型",
        "动态规划题型",
        "限时模拟面试"
      ],
      "resources": [
        {
          "label": "LeetCode",
          "url": "https://leetcode.cn/",
          "kind": "练习",
          "free": true
        },
        {
          "label": "NeetCode 路线",
          "url": "https://neetcode.io/roadmap",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "test-dev"
      ]
    },
    {
      "id": "c",
      "areaId": "base",
      "name": "C",
      "intro": "会用 C 写程序、管内存和指针，能读懂操作系统和底层库的源码。",
      "icon": "si:c",
      "parent": "cs61c",
      "language": true,
      "weight": 36,
      "prerequisites": [
        "cs61c"
      ],
      "dependents": [
        "gdb",
        "cpp",
        "embedded",
        "kernel"
      ],
      "steps": [
        "指针和数组",
        "malloc 和 free",
        "结构体和多文件",
        "Makefile 和链接",
        "写一个命令行小工具"
      ],
      "resources": [
        {
          "label": "Learn C",
          "url": "https://www.learn-c.org/",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev",
        "systems-eng",
        "security",
        "quant",
        "inference",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "csapp",
      "areaId": "base",
      "name": "计算机系统",
      "intro": "会读汇编、懂内存层次和虚拟内存，能看出程序为什么慢、为什么崩。",
      "icon": "computer",
      "parent": "cs61c",
      "language": false,
      "weight": 50,
      "prerequisites": [
        "cs61c"
      ],
      "dependents": [
        "networking",
        "os",
        "compiler",
        "perf",
        "security",
        "parallel",
        "dlsys"
      ],
      "steps": [
        "整数和浮点的表示",
        "汇编和栈帧",
        "缓存和局部性",
        "链接和加载",
        "虚拟内存",
        "实现一个内存分配器"
      ],
      "resources": [
        {
          "label": "CMU 15-213（CSAPP）",
          "url": "https://www.cs.cmu.edu/~213/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "CSAPP 书",
          "url": "https://csapp.cs.cmu.edu/",
          "kind": "书",
          "free": false
        }
      ],
      "requiredBy": [
        "backend",
        "gamedev",
        "test-dev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "security",
        "data",
        "inference"
      ]
    },
    {
      "id": "ci",
      "areaId": "base",
      "name": "CI/CD",
      "intro": "会配 GitHub Actions 这类流水线，能让每次提交自动测试、自动部署。",
      "icon": "si:githubactions",
      "parent": "github",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "github",
        "testing"
      ],
      "dependents": [],
      "steps": [
        "流水线的基本概念",
        "每次提交自动测试",
        "缓存和矩阵构建",
        "自动部署",
        "给项目配好流水线"
      ],
      "resources": [
        {
          "label": "GitHub Actions 文档",
          "url": "https://docs.github.com/zh/actions",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "opensource",
      "areaId": "base",
      "name": "开源贡献",
      "intro": "会读 issue、提 PR、认真回应 review，能让自己的代码合进别人的项目。",
      "icon": "git-pull-request",
      "parent": "github",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "github"
      ],
      "dependents": [
        "writing"
      ],
      "steps": [
        "挑一个合适的项目",
        "读懂贡献指南",
        "从小 issue 开始",
        "认真回应 review",
        "合进第一个 PR"
      ],
      "resources": [
        {
          "label": "First Contributions",
          "url": "https://github.com/firstcontributions/first-contributions",
          "kind": "练习",
          "free": true
        },
        {
          "label": "GitHub 开源指南",
          "url": "https://opensource.guide/zh-hans/",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "gdb",
      "areaId": "base",
      "name": "调试",
      "intro": "会用 GDB 打断点、看内存和调用栈，能几分钟定位一个段错误。",
      "icon": "bug",
      "parent": "c",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "c"
      ],
      "dependents": [
        "pwn"
      ],
      "steps": [
        "断点和单步",
        "看变量、内存和栈",
        "分析 core dump",
        "用 ASan 查内存错误",
        "定位一个真实的段错误"
      ],
      "resources": [
        {
          "label": "GDB 文档",
          "url": "https://sourceware.org/gdb/documentation/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Missing Semester：调试",
          "url": "https://missing.csail.mit.edu/2020/debugging-profiling/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng",
        "security"
      ]
    },
    {
      "id": "networking",
      "areaId": "base",
      "name": "计算机网络",
      "intro": "会讲清 TCP、路由和拥塞控制，能用 Socket 写网络程序。",
      "icon": "router",
      "parent": "csapp",
      "language": false,
      "weight": 16,
      "prerequisites": [
        "csapp"
      ],
      "dependents": [
        "netcode",
        "nginx",
        "k8s",
        "distributed",
        "pentest",
        "nccl"
      ],
      "steps": [
        "分层模型和 HTTP",
        "TCP 可靠传输",
        "拥塞控制",
        "IP 和路由",
        "Socket 编程",
        "手写一个 HTTP 服务器"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS168",
          "url": "https://cs168.io/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Beej 网络编程指南",
          "url": "https://beej.us/guide/bgnet/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "gamedev",
        "sre",
        "systems-eng",
        "distributed-eng",
        "security",
        "data",
        "inference"
      ]
    },
    {
      "id": "writing",
      "areaId": "base",
      "name": "技术写作",
      "intro": "会写博客、文档和设计说明，能把一项技术给外行讲清楚。",
      "icon": "pencil-line",
      "parent": "opensource",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "opensource"
      ],
      "dependents": [
        "english",
        "x-share"
      ],
      "steps": [
        "先想清楚读者",
        "结构和标题",
        "写短句、删废话",
        "配图和示例",
        "写一篇技术博客"
      ],
      "resources": [
        {
          "label": "Paul Graham 谈写作",
          "url": "https://paulgraham.com/writing44.html",
          "kind": "文章",
          "free": true
        },
        {
          "label": "Google 技术写作课",
          "url": "https://developers.google.com/tech-writing",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "english",
      "areaId": "base",
      "name": "技术英语",
      "intro": "会读英文论文和文档，能在 GitHub 和邮件里用英文把事说清楚。",
      "icon": "book-a",
      "parent": "writing",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "writing"
      ],
      "dependents": [],
      "steps": [
        "读英文文档",
        "读论文的方法",
        "写清楚的 issue",
        "英文邮件和沟通",
        "用英文写一篇文档"
      ],
      "resources": [
        {
          "label": "Google 技术写作课",
          "url": "https://developers.google.com/tech-writing/one",
          "kind": "课程",
          "free": true
        },
        {
          "label": "arXiv",
          "url": "https://arxiv.org/",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "x-share",
      "areaId": "base",
      "name": "公开分享",
      "intro": "会在 X 上持续分享自己做的东西，能攒下人脉和分发渠道。",
      "icon": "si:x",
      "parent": "writing",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "writing"
      ],
      "dependents": [
        "growth"
      ],
      "steps": [
        "找到自己的主题",
        "把做的东西写成帖子",
        "配图和演示视频",
        "固定节奏地发",
        "坚持更新三个月"
      ],
      "resources": [
        {
          "label": "例子：Karpathy 的 X",
          "url": "https://x.com/karpathy",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "html",
      "areaId": "web",
      "name": "HTML / CSS",
      "intro": "会用 HTML 和 CSS 写布局，能把一张设计稿做成响应式网页。",
      "icon": "si:html5",
      "parent": "cs61a",
      "language": false,
      "weight": 17,
      "prerequisites": [
        "cs61a"
      ],
      "dependents": [
        "javascript",
        "figma"
      ],
      "steps": [
        "HTML 语义标签",
        "CSS 盒模型",
        "Flex 和 Grid",
        "响应式布局",
        "把设计稿做成网页"
      ],
      "resources": [
        {
          "label": "MDN 学习 Web 开发",
          "url": "https://developer.mozilla.org/zh-CN/docs/Learn",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "mobile",
        "product-eng",
        "test-dev"
      ]
    },
    {
      "id": "web-api",
      "areaId": "web",
      "name": "Web API",
      "intro": "会设计 REST 接口，能用 HTTP 和 JSON 让前后端对上话。",
      "icon": "globe",
      "parent": "python",
      "language": false,
      "weight": 16,
      "prerequisites": [
        "python"
      ],
      "dependents": [
        "fastapi",
        "auth",
        "websocket",
        "stripe",
        "web-security"
      ],
      "steps": [
        "HTTP 方法和状态码",
        "REST 设计",
        "JSON 和数据校验",
        "错误和分页",
        "设计一套完整接口"
      ],
      "resources": [
        {
          "label": "MDN HTTP",
          "url": "https://developer.mozilla.org/zh-CN/docs/Web/HTTP",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "frontend",
        "mobile",
        "product-eng",
        "distributed-eng",
        "security",
        "ai-app"
      ]
    },
    {
      "id": "postgres",
      "areaId": "web",
      "name": "PostgreSQL",
      "intro": "会建表、建索引、写事务，能做备份并排查慢查询。",
      "icon": "si:postgresql",
      "parent": "sql",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "sql"
      ],
      "dependents": [
        "vector-db"
      ],
      "steps": [
        "建表和约束",
        "索引",
        "事务和隔离级别",
        "查询计划",
        "备份和恢复",
        "优化一个慢查询"
      ],
      "resources": [
        {
          "label": "PostgreSQL 教程",
          "url": "https://www.postgresql.org/docs/current/tutorial.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "product-eng",
        "ai-app"
      ]
    },
    {
      "id": "growth",
      "areaId": "web",
      "name": "增长与分发",
      "intro": "会做 SEO、选发布渠道，能让第一批用户找到你的产品。",
      "icon": "megaphone",
      "parent": "x-share",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "x-share"
      ],
      "dependents": [],
      "steps": [
        "找到目标用户",
        "SEO 基础",
        "选择发布渠道",
        "发布和收集反馈",
        "拿到一百个用户"
      ],
      "resources": [
        {
          "label": "Y Combinator：如何获得第一批用户",
          "url": "https://www.ycombinator.com/library",
          "kind": "文章",
          "free": true
        },
        {
          "label": "Product Hunt 发布指南",
          "url": "https://www.producthunt.com/launch",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "javascript",
      "areaId": "web",
      "name": "JavaScript",
      "intro": "会用 JavaScript 操作页面和写异步逻辑，能读懂前端项目的代码。",
      "icon": "si:javascript",
      "parent": "html",
      "language": true,
      "weight": 15,
      "prerequisites": [
        "html"
      ],
      "dependents": [
        "typescript",
        "vue",
        "node",
        "browser",
        "e2e",
        "threejs"
      ],
      "steps": [
        "语法和类型",
        "函数和闭包",
        "DOM 操作",
        "异步编程",
        "模块化",
        "做一个交互小页面"
      ],
      "resources": [
        {
          "label": "现代 JavaScript 教程",
          "url": "https://zh.javascript.info/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "mobile",
        "product-eng",
        "test-dev"
      ]
    },
    {
      "id": "figma",
      "areaId": "web",
      "name": "界面设计",
      "intro": "会用 Figma 画界面和原型，能做出简洁好用的设计稿。",
      "icon": "palette",
      "parent": "html",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "html"
      ],
      "dependents": [
        "design-system",
        "indie"
      ],
      "steps": [
        "画布和图层",
        "自动布局",
        "组件和样式",
        "原型交互",
        "设计一个完整界面"
      ],
      "resources": [
        {
          "label": "Figma 学习",
          "url": "https://help.figma.com/hc/en-us/categories/360002051613",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Refactoring UI",
          "url": "https://www.refactoringui.com/",
          "kind": "书",
          "free": false
        }
      ],
      "requiredBy": [
        "frontend",
        "product-eng"
      ]
    },
    {
      "id": "fastapi",
      "areaId": "web",
      "name": "FastAPI 后端",
      "intro": "会用 FastAPI 写接口、连数据库，能把服务部署上线。",
      "icon": "si:fastapi",
      "parent": "web-api",
      "language": false,
      "weight": 10,
      "prerequisites": [
        "docker",
        "sql",
        "web-api"
      ],
      "dependents": [
        "redis",
        "llm-app"
      ],
      "steps": [
        "路由和参数",
        "数据模型和校验",
        "连接数据库",
        "依赖注入和鉴权",
        "部署一个后端服务"
      ],
      "resources": [
        {
          "label": "FastAPI 教程（中文）",
          "url": "https://fastapi.tiangolo.com/zh/tutorial/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "product-eng",
        "distributed-eng",
        "ai-app"
      ]
    },
    {
      "id": "auth",
      "areaId": "web",
      "name": "登录与鉴权",
      "intro": "会做密码、会话、OAuth 和权限控制，能让登录既好用又安全。",
      "icon": "log-in",
      "parent": "web-api",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "web-api"
      ],
      "dependents": [
        "indie"
      ],
      "steps": [
        "密码存储",
        "会话和 Token",
        "OAuth 登录",
        "权限控制",
        "给应用加完整登录"
      ],
      "resources": [
        {
          "label": "OWASP 认证速查表",
          "url": "https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "mobile",
        "product-eng"
      ]
    },
    {
      "id": "websocket",
      "areaId": "web",
      "name": "实时通信",
      "intro": "会用 WebSocket 和流式输出，能让回答一个字一个字地出来。",
      "icon": "radio",
      "parent": "web-api",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "web-api"
      ],
      "dependents": [],
      "steps": [
        "WebSocket 协议",
        "服务端推送",
        "SSE 流式输出",
        "断线重连",
        "做一个实时聊天"
      ],
      "resources": [
        {
          "label": "MDN WebSocket",
          "url": "https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "stripe",
      "areaId": "web",
      "name": "在线收款",
      "intro": "会接入 Stripe 订阅和一次性付款，能处理退款和发票。",
      "icon": "credit-card",
      "parent": "web-api",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "web-api"
      ],
      "dependents": [
        "indie"
      ],
      "steps": [
        "一次性付款",
        "订阅",
        "Webhook",
        "退款和发票",
        "接好一个收费流程"
      ],
      "resources": [
        {
          "label": "Stripe 文档",
          "url": "https://docs.stripe.com/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "typescript",
      "areaId": "web",
      "name": "TypeScript",
      "intro": "会写类型和泛型，能用 TypeScript 让大项目少出错。",
      "icon": "si:typescript",
      "parent": "javascript",
      "language": true,
      "weight": 8,
      "prerequisites": [
        "javascript"
      ],
      "dependents": [
        "react",
        "build-tools"
      ],
      "steps": [
        "基础类型",
        "接口和类型别名",
        "泛型",
        "类型收窄",
        "给项目加上类型"
      ],
      "resources": [
        {
          "label": "TypeScript 官方手册",
          "url": "https://www.typescriptlang.org/docs/handbook/intro.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "mobile",
        "product-eng"
      ]
    },
    {
      "id": "vue",
      "areaId": "web",
      "name": "Vue",
      "intro": "会用 Vue 写组件和管理状态，能独立做出一个完整的前端页面。",
      "icon": "si:vuedotjs",
      "parent": "javascript",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "javascript"
      ],
      "dependents": [],
      "steps": [
        "模板和响应式",
        "组件和通信",
        "路由",
        "状态管理",
        "做一个完整的单页应用"
      ],
      "resources": [
        {
          "label": "Vue 官方文档",
          "url": "https://cn.vuejs.org/guide/introduction.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "node",
      "areaId": "web",
      "name": "Node.js",
      "intro": "会用 Node.js 写服务端和命令行工具，能管好依赖和异步。",
      "icon": "si:nodedotjs",
      "parent": "javascript",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "javascript"
      ],
      "dependents": [
        "build-tools",
        "nextjs"
      ],
      "steps": [
        "模块和 npm",
        "异步和事件循环",
        "文件和网络",
        "写 HTTP 服务",
        "做一个命令行工具"
      ],
      "resources": [
        {
          "label": "Node.js 入门",
          "url": "https://nodejs.org/zh-cn/learn",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "product-eng"
      ]
    },
    {
      "id": "browser",
      "areaId": "web",
      "name": "浏览器原理",
      "intro": "会讲清渲染流水线、事件循环和缓存，能解释网页为什么卡。",
      "icon": "app-window",
      "parent": "javascript",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "javascript"
      ],
      "dependents": [
        "web-perf"
      ],
      "steps": [
        "从 URL 到页面",
        "渲染流水线",
        "事件循环",
        "缓存和网络",
        "用开发者工具查卡顿"
      ],
      "resources": [
        {
          "label": "浏览器是怎么工作的",
          "url": "https://web.dev/articles/howbrowserswork",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend"
      ]
    },
    {
      "id": "e2e",
      "areaId": "web",
      "name": "端到端测试",
      "intro": "会用 Playwright 写端到端测试，能像真人一样把整个应用点一遍。",
      "icon": "mouse-pointer-click",
      "parent": "testing",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "testing",
        "javascript"
      ],
      "dependents": [],
      "steps": [
        "第一个端到端测试",
        "定位元素和断言",
        "登录和数据准备",
        "在 CI 里跑",
        "覆盖核心用户流程"
      ],
      "resources": [
        {
          "label": "Playwright 文档",
          "url": "https://playwright.dev/docs/intro",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "test-dev"
      ]
    },
    {
      "id": "redis",
      "areaId": "web",
      "name": "Redis",
      "intro": "会用 Redis 做缓存、队列和限流，能让后端扛住更多请求。",
      "icon": "si:redis",
      "parent": "fastapi",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "fastapi"
      ],
      "dependents": [
        "system-design"
      ],
      "steps": [
        "数据结构",
        "缓存策略",
        "队列",
        "限流和分布式锁",
        "给接口加上缓存"
      ],
      "resources": [
        {
          "label": "Redis 文档",
          "url": "https://redis.io/docs/latest/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "distributed-eng"
      ]
    },
    {
      "id": "react",
      "areaId": "web",
      "name": "React",
      "intro": "会用 React 写组件、状态和副作用，能独立做出一个完整的产品界面。",
      "icon": "si:react",
      "parent": "typescript",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "typescript"
      ],
      "dependents": [
        "tailwind",
        "nextjs",
        "design-system",
        "react-native"
      ],
      "steps": [
        "组件和 JSX",
        "状态和事件",
        "副作用",
        "列表和表单",
        "自定义 Hook",
        "做一个完整的应用"
      ],
      "resources": [
        {
          "label": "React 官方教程",
          "url": "https://react.dev/learn",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "mobile",
        "product-eng"
      ]
    },
    {
      "id": "build-tools",
      "areaId": "web",
      "name": "前端工程化",
      "intro": "会配 Vite、打包和代码分割，能让一个大前端项目还好维护。",
      "icon": "si:vite",
      "parent": "typescript",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "typescript",
        "node"
      ],
      "dependents": [],
      "steps": [
        "模块化和打包原理",
        "Vite 配置",
        "代码分割",
        "环境变量和构建",
        "搭一个多页面项目"
      ],
      "resources": [
        {
          "label": "Vite 指南",
          "url": "https://cn.vitejs.dev/guide/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend"
      ]
    },
    {
      "id": "web-perf",
      "areaId": "web",
      "name": "Web 性能优化",
      "intro": "会看 Core Web Vitals，能用懒加载和拆包让页面又快又稳。",
      "icon": "rabbit",
      "parent": "browser",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "browser"
      ],
      "dependents": [],
      "steps": [
        "核心性能指标",
        "资源加载和懒加载",
        "拆包和缓存",
        "渲染性能",
        "把一个页面调到满分"
      ],
      "resources": [
        {
          "label": "web.dev 性能课",
          "url": "https://web.dev/learn/performance",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend"
      ]
    },
    {
      "id": "tailwind",
      "areaId": "web",
      "name": "Tailwind CSS",
      "intro": "会用 Tailwind CSS 写样式，能很快做出干净一致的界面。",
      "icon": "si:tailwindcss",
      "parent": "react",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "react"
      ],
      "dependents": [],
      "steps": [
        "工具类的思路",
        "布局和间距",
        "响应式和状态",
        "主题配置",
        "用它重做一个页面"
      ],
      "resources": [
        {
          "label": "Tailwind 文档",
          "url": "https://tailwindcss.com/docs",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "nextjs",
      "areaId": "web",
      "name": "Next.js 全栈",
      "intro": "会用 Next.js 写页面、接口和服务端渲染，能一个人做完一个全栈应用。",
      "icon": "si:nextdotjs",
      "parent": "react",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "node",
        "react"
      ],
      "dependents": [
        "indie"
      ],
      "steps": [
        "路由和页面",
        "服务端渲染",
        "数据获取",
        "API 路由",
        "部署到 Vercel",
        "做一个全栈应用"
      ],
      "resources": [
        {
          "label": "Next.js 教程",
          "url": "https://nextjs.org/learn",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend",
        "product-eng"
      ]
    },
    {
      "id": "design-system",
      "areaId": "web",
      "name": "组件库",
      "intro": "会设计可复用的组件和规范，能让团队里每个页面长得一致。",
      "icon": "component",
      "parent": "react",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "figma",
        "react"
      ],
      "dependents": [],
      "steps": [
        "设计令牌",
        "基础组件",
        "组件文档",
        "主题和暗色",
        "做一套小组件库"
      ],
      "resources": [
        {
          "label": "Storybook 文档",
          "url": "https://storybook.js.org/docs",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "frontend"
      ]
    },
    {
      "id": "indie",
      "areaId": "web",
      "name": "独立产品上线",
      "intro": "会一个人做完设计、开发、部署和收费，能把产品交到真实用户手里。",
      "icon": "rocket",
      "parent": "nextjs",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "figma",
        "auth",
        "stripe",
        "nextjs",
        "llm-app"
      ],
      "dependents": [],
      "steps": [
        "找到真实需求",
        "设计和开发",
        "部署上线",
        "接入收费",
        "获取第一批用户",
        "做出第一笔收入"
      ],
      "resources": [
        {
          "label": "Vercel 部署",
          "url": "https://vercel.com/docs",
          "kind": "文档",
          "free": true
        },
        {
          "label": "MAKE：独立开发者手册",
          "url": "https://readmake.com/",
          "kind": "书",
          "free": false
        }
      ],
      "requiredBy": [
        "product-eng"
      ]
    },
    {
      "id": "swift",
      "areaId": "client",
      "name": "Swift",
      "intro": "会用 Swift 写 iOS 和 macOS 原生应用，能在苹果设备上跑本地模型。",
      "icon": "si:swift",
      "parent": "cs61b",
      "language": true,
      "weight": 1,
      "prerequisites": [
        "cs61b"
      ],
      "dependents": [
        "swiftui"
      ],
      "steps": [
        "语法和类型",
        "可选值",
        "结构体和协议",
        "async/await",
        "写一个小应用"
      ],
      "resources": [
        {
          "label": "Swift 官方教程",
          "url": "https://www.swift.org/getting-started/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "kotlin",
      "areaId": "client",
      "name": "Kotlin",
      "intro": "会用 Kotlin 写程序，能做 Android 原生开发。",
      "icon": "si:kotlin",
      "parent": "java",
      "language": true,
      "weight": 1,
      "prerequisites": [
        "java"
      ],
      "dependents": [
        "compose"
      ],
      "steps": [
        "语法和空安全",
        "类和数据类",
        "集合和函数式",
        "协程",
        "写一个小工具"
      ],
      "resources": [
        {
          "label": "Kotlin 官方文档",
          "url": "https://kotlinlang.org/docs/getting-started.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "dart",
      "areaId": "client",
      "name": "Dart",
      "intro": "会用 Dart 写程序，能看懂和写 Flutter 应用的代码。",
      "icon": "si:dart",
      "parent": "java",
      "language": true,
      "weight": 1,
      "prerequisites": [
        "java"
      ],
      "dependents": [
        "flutter"
      ],
      "steps": [
        "语法和类型",
        "类和混入",
        "异步和 Future",
        "空安全",
        "写一个命令行小工具"
      ],
      "resources": [
        {
          "label": "Dart 语言之旅",
          "url": "https://dart.dev/language",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "react-native",
      "areaId": "client",
      "name": "移动端 App",
      "intro": "会用 React Native 写界面，能用一套代码做出 iOS 和 Android 应用。",
      "icon": "tablet-smartphone",
      "parent": "react",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "react"
      ],
      "dependents": [
        "app-release"
      ],
      "steps": [
        "组件和样式",
        "导航",
        "原生能力",
        "调试和打包",
        "做一个双端应用"
      ],
      "resources": [
        {
          "label": "React Native",
          "url": "https://reactnative.dev/docs/getting-started",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "csharp",
      "areaId": "client",
      "name": "C#",
      "intro": "会用 C# 写程序，能在 Unity 里写游戏脚本或做 Windows 应用。",
      "icon": "si:dotnet",
      "parent": "java",
      "language": true,
      "weight": 4,
      "prerequisites": [
        "java"
      ],
      "dependents": [
        "game-engine"
      ],
      "steps": [
        "语法和类型",
        "类和接口",
        "LINQ 和集合",
        "异步编程",
        "写一个游戏脚本"
      ],
      "resources": [
        {
          "label": "C# 文档（中文）",
          "url": "https://learn.microsoft.com/zh-cn/dotnet/csharp/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "graphics",
      "areaId": "client",
      "name": "计算机图形学",
      "intro": "会讲清光栅化、着色和光线追踪，能写出一个小渲染器。",
      "icon": "shapes",
      "parent": "cpp",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "math",
        "cpp"
      ],
      "dependents": [
        "shader",
        "threejs",
        "game-engine"
      ],
      "steps": [
        "变换和投影",
        "光栅化",
        "着色和纹理",
        "光线追踪",
        "写一个软光栅渲染器"
      ],
      "resources": [
        {
          "label": "GAMES101",
          "url": "https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html",
          "kind": "课程",
          "free": true
        },
        {
          "label": "LearnOpenGL 中文",
          "url": "https://learnopengl-cn.github.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "swiftui",
      "areaId": "client",
      "name": "SwiftUI",
      "intro": "会用 SwiftUI 写声明式界面，能做出一个完整的 iOS 应用。",
      "icon": "app-window-mac",
      "parent": "swift",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "swift"
      ],
      "dependents": [],
      "steps": [
        "视图和修饰符",
        "状态和数据流",
        "列表和导航",
        "网络和存储",
        "上线一个 iOS 小应用"
      ],
      "resources": [
        {
          "label": "SwiftUI 教程",
          "url": "https://developer.apple.com/tutorials/swiftui",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "compose",
      "areaId": "client",
      "name": "Jetpack Compose",
      "intro": "会用 Jetpack Compose 写声明式界面，能做出一个完整的 Android 应用。",
      "icon": "si:jetpackcompose",
      "parent": "kotlin",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "kotlin"
      ],
      "dependents": [],
      "steps": [
        "可组合函数",
        "状态和重组",
        "列表和导航",
        "ViewModel 和数据",
        "做一个安卓小应用"
      ],
      "resources": [
        {
          "label": "Jetpack Compose 文档",
          "url": "https://developer.android.com/compose?hl=zh-cn",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "flutter",
      "areaId": "client",
      "name": "Flutter",
      "intro": "会用 Flutter 写界面和管理状态，能用一套代码做出 iOS 和 Android 应用。",
      "icon": "si:flutter",
      "parent": "dart",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "dart"
      ],
      "dependents": [],
      "steps": [
        "Widget 和布局",
        "状态管理",
        "路由和导航",
        "网络和本地存储",
        "做一个双端应用"
      ],
      "resources": [
        {
          "label": "Flutter 文档",
          "url": "https://docs.flutter.dev/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "app-release",
      "areaId": "client",
      "name": "应用上架",
      "intro": "会签名、提审、发布到应用商店，能接好崩溃上报和自动更新。",
      "icon": "si:appstore",
      "parent": "react-native",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "react-native"
      ],
      "dependents": [],
      "steps": [
        "证书和签名",
        "应用商店审核规则",
        "提审和发布",
        "崩溃上报和更新",
        "发布一个真实应用"
      ],
      "resources": [
        {
          "label": "App Store 审核指南",
          "url": "https://developer.apple.com/app-store/review/guidelines/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "mobile"
      ]
    },
    {
      "id": "shader",
      "areaId": "client",
      "name": "Shader 编程",
      "intro": "会写顶点和片元着色器，能做出光照、阴影和后处理特效。",
      "icon": "sparkles",
      "parent": "graphics",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "graphics"
      ],
      "dependents": [],
      "steps": [
        "GLSL 基础",
        "顶点和片元着色器",
        "噪声和程序化图案",
        "光照模型",
        "做一个后处理特效"
      ],
      "resources": [
        {
          "label": "The Book of Shaders",
          "url": "https://thebookofshaders.com/?lan=ch",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "threejs",
      "areaId": "client",
      "name": "3D 网页",
      "intro": "会用 Three.js 搭 3D 场景，能在浏览器里做 3D 展示和可视化。",
      "icon": "si:threedotjs",
      "parent": "javascript",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "javascript",
        "graphics"
      ],
      "dependents": [],
      "steps": [
        "场景、相机和渲染器",
        "几何体和材质",
        "光照和阴影",
        "加载模型和动画",
        "做一个 3D 展示页"
      ],
      "resources": [
        {
          "label": "Three.js 手册",
          "url": "https://threejs.org/manual/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "game-engine",
      "areaId": "client",
      "name": "游戏引擎",
      "intro": "会用 Unity 或 Unreal 搭场景、物理和动画，能做出一个能玩的小游戏。",
      "icon": "si:unity",
      "parent": "csharp",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "csharp",
        "graphics"
      ],
      "dependents": [
        "gameplay",
        "netcode"
      ],
      "steps": [
        "场景和组件",
        "物理和碰撞",
        "动画和状态机",
        "UI 和音效",
        "做一个能玩的小游戏"
      ],
      "resources": [
        {
          "label": "Unity Learn",
          "url": "https://learn.unity.com/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Unreal Engine 文档",
          "url": "https://dev.epicgames.com/documentation/zh-cn/unreal-engine",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "gameplay",
      "areaId": "client",
      "name": "玩法编程",
      "intro": "会写输入、状态机和关卡逻辑，能把一个点子做成好玩的机制。",
      "icon": "puzzle",
      "parent": "game-engine",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "game-engine"
      ],
      "dependents": [
        "physics"
      ],
      "steps": [
        "游戏循环",
        "输入和角色控制",
        "状态机",
        "关卡和事件",
        "做一个完整的小关卡"
      ],
      "resources": [
        {
          "label": "游戏编程模式",
          "url": "https://gameprogrammingpatterns.com/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "netcode",
      "areaId": "client",
      "name": "多人联网",
      "intro": "会做状态同步、延迟补偿和回滚，能让多人联网游戏不卡。",
      "icon": "users",
      "parent": "game-engine",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "networking",
        "game-engine"
      ],
      "dependents": [],
      "steps": [
        "客户端和服务器",
        "状态同步",
        "延迟补偿",
        "预测和回滚",
        "做一个联机小游戏"
      ],
      "resources": [
        {
          "label": "Gaffer On Games：联网物理",
          "url": "https://gafferongames.com/categories/networked-physics/",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "physics",
      "areaId": "client",
      "name": "游戏物理",
      "intro": "会做碰撞检测、刚体和角色控制，能让游戏里的东西动得像真的。",
      "icon": "orbit",
      "parent": "gameplay",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "gameplay"
      ],
      "dependents": [],
      "steps": [
        "运动学和积分",
        "碰撞检测",
        "碰撞响应",
        "刚体和约束",
        "写一个 2D 物理引擎"
      ],
      "resources": [
        {
          "label": "Gaffer On Games：游戏物理",
          "url": "https://gafferongames.com/categories/game-physics/",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev"
      ]
    },
    {
      "id": "os",
      "areaId": "systems",
      "name": "操作系统",
      "intro": "会讲清进程、内存和文件系统，能在 xv6 上实现系统调用和页表。",
      "icon": "monitor-cog",
      "parent": "csapp",
      "language": false,
      "weight": 20,
      "prerequisites": [
        "linux",
        "csapp"
      ],
      "dependents": [
        "concurrency",
        "kernel",
        "virtualization"
      ],
      "steps": [
        "进程和调度",
        "系统调用",
        "虚拟内存和页表",
        "文件系统",
        "在 xv6 里加系统调用"
      ],
      "resources": [
        {
          "label": "MIT 6.1810（6.S081）",
          "url": "https://pdos.csail.mit.edu/6.1810/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "OSTEP",
          "url": "https://pages.cs.wisc.edu/~remzi/OSTEP/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "sre",
        "systems-eng",
        "distributed-eng",
        "data",
        "inference"
      ]
    },
    {
      "id": "cpp",
      "areaId": "systems",
      "name": "C++",
      "intro": "会用现代 C++ 写高性能代码，能读懂推理引擎和 CUDA 项目的源码。",
      "icon": "si:cplusplus",
      "parent": "c",
      "language": true,
      "weight": 25,
      "prerequisites": [
        "c"
      ],
      "dependents": [
        "graphics",
        "rust",
        "llvm",
        "parallel",
        "edge-infer",
        "ros"
      ],
      "steps": [
        "现代 C++ 语法",
        "RAII 和智能指针",
        "模板",
        "STL",
        "移动语义",
        "写一个高性能小库"
      ],
      "resources": [
        {
          "label": "LearnCpp",
          "url": "https://www.learncpp.com/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev",
        "systems-eng",
        "quant",
        "inference",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "compiler",
      "areaId": "systems",
      "name": "编译原理",
      "intro": "会写词法和语法分析，能为一门小语言做出完整的编译器。",
      "icon": "braces",
      "parent": "dsa",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "dsa",
        "csapp"
      ],
      "dependents": [
        "llvm"
      ],
      "steps": [
        "词法分析",
        "语法分析",
        "语义分析",
        "中间代码",
        "代码生成",
        "写一个小语言编译器"
      ],
      "resources": [
        {
          "label": "Stanford CS143",
          "url": "https://web.stanford.edu/class/cs143/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Crafting Interpreters",
          "url": "https://craftinginterpreters.com/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "arch",
      "areaId": "systems",
      "name": "计算机体系结构",
      "intro": "会讲清流水线、乱序执行和缓存一致性，能解释 CPU 和 GPU 为什么快。",
      "icon": "building-2",
      "parent": "cs61c",
      "language": false,
      "weight": 12,
      "prerequisites": [
        "cs61c"
      ],
      "dependents": [
        "gpu-arch"
      ],
      "steps": [
        "指令集",
        "流水线",
        "分支预测",
        "乱序执行",
        "缓存一致性",
        "分析一段程序的瓶颈"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS152",
          "url": "https://inst.eecs.berkeley.edu/~cs152/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Onur Mutlu 体系结构课",
          "url": "https://safari.ethz.ch/architecture/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng",
        "inference"
      ]
    },
    {
      "id": "perf",
      "areaId": "systems",
      "name": "性能分析",
      "intro": "会用 perf 和火焰图，能找出程序慢在哪并验证优化有效。",
      "icon": "gauge",
      "parent": "csapp",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "csapp"
      ],
      "dependents": [
        "gpu-perf"
      ],
      "steps": [
        "性能指标",
        "perf 采样",
        "火焰图",
        "缓存和分支",
        "优化并验证效果"
      ],
      "resources": [
        {
          "label": "Brendan Gregg 性能分析",
          "url": "https://www.brendangregg.com/linuxperf.html",
          "kind": "文章",
          "free": true
        },
        {
          "label": "MIT 6.172",
          "url": "https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "gamedev",
        "test-dev"
      ]
    },
    {
      "id": "embedded",
      "areaId": "systems",
      "name": "嵌入式开发",
      "intro": "会操作寄存器、中断和外设，能在单片机上写出能跑的固件。",
      "icon": "radio-receiver",
      "parent": "c",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "c"
      ],
      "dependents": [
        "rtos"
      ],
      "steps": [
        "GPIO 和寄存器",
        "中断",
        "定时器",
        "串口和总线",
        "写一个固件"
      ],
      "resources": [
        {
          "label": "Making Embedded Systems",
          "url": "https://www.oreilly.com/library/view/making-embedded-systems/9781098151539/",
          "kind": "书",
          "free": false
        },
        {
          "label": "STM32 文档",
          "url": "https://www.st.com/zh/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng"
      ]
    },
    {
      "id": "nginx",
      "areaId": "systems",
      "name": "Nginx",
      "intro": "会配反向代理、负载均衡和 HTTPS，能把服务安全地暴露到公网。",
      "icon": "si:nginx",
      "parent": "networking",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "networking"
      ],
      "dependents": [],
      "steps": [
        "配置结构",
        "静态文件",
        "反向代理",
        "负载均衡",
        "HTTPS",
        "给服务配好网关"
      ],
      "resources": [
        {
          "label": "Nginx 入门",
          "url": "https://nginx.org/en/docs/beginners_guide.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "sre"
      ]
    },
    {
      "id": "cloud",
      "areaId": "systems",
      "name": "云平台",
      "intro": "会在 AWS 或 GCP 上开机器、配网络和权限，能把服务部署上去并控住成本。",
      "icon": "cloud-cog",
      "parent": "docker",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "docker"
      ],
      "dependents": [
        "iac"
      ],
      "steps": [
        "账号、区域和权限",
        "云主机和网络",
        "对象存储",
        "托管数据库",
        "监控和账单",
        "把服务部署到云上"
      ],
      "resources": [
        {
          "label": "AWS 入门",
          "url": "https://aws.amazon.com/getting-started/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "sre",
        "data"
      ]
    },
    {
      "id": "k8s",
      "areaId": "systems",
      "name": "Kubernetes",
      "intro": "会写 Deployment 和 Service，能在一群机器上部署、扩容和自动恢复服务。",
      "icon": "si:kubernetes",
      "parent": "docker",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "docker",
        "networking"
      ],
      "dependents": [
        "observability"
      ],
      "steps": [
        "Pod 和部署",
        "服务和入口流量",
        "配置和密钥",
        "扩缩容和自愈",
        "部署一个完整应用"
      ],
      "resources": [
        {
          "label": "Kubernetes 教程（中文）",
          "url": "https://kubernetes.io/zh-cn/docs/tutorials/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "sre",
        "inference"
      ]
    },
    {
      "id": "concurrency",
      "areaId": "systems",
      "name": "并发编程",
      "intro": "会用线程、锁和原子操作，能写出没有竞争和死锁的并发程序。",
      "icon": "split",
      "parent": "os",
      "language": false,
      "weight": 15,
      "prerequisites": [
        "os"
      ],
      "dependents": [
        "go",
        "distributed",
        "db-internals",
        "vllm"
      ],
      "steps": [
        "线程和竞争",
        "锁和条件变量",
        "信号量",
        "原子操作",
        "死锁",
        "写一个线程安全队列"
      ],
      "resources": [
        {
          "label": "信号量小书",
          "url": "https://greenteapress.com/wp/semaphores/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "sre",
        "systems-eng",
        "distributed-eng",
        "data",
        "inference"
      ]
    },
    {
      "id": "rust",
      "areaId": "systems",
      "name": "Rust",
      "intro": "会用所有权和借用写 Rust，能写出内存安全又快的系统程序。",
      "icon": "si:rust",
      "parent": "cpp",
      "language": true,
      "weight": 0,
      "prerequisites": [
        "cpp"
      ],
      "dependents": [],
      "steps": [
        "所有权和借用",
        "生命周期",
        "trait 和泛型",
        "错误处理",
        "并发",
        "写一个命令行工具"
      ],
      "resources": [
        {
          "label": "Rust 程序设计语言（中文）",
          "url": "https://kaisery.github.io/trpl-zh-cn/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "llvm",
      "areaId": "systems",
      "name": "LLVM",
      "intro": "会写 LLVM pass，能为编译器做优化或接一个新后端。",
      "icon": "si:llvm",
      "parent": "compiler",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "cpp",
        "compiler"
      ],
      "dependents": [
        "mlir"
      ],
      "steps": [
        "LLVM IR",
        "Pass 框架",
        "写一个优化 pass",
        "后端和代码生成",
        "给一门语言接 LLVM"
      ],
      "resources": [
        {
          "label": "LLVM 教程",
          "url": "https://llvm.org/docs/tutorial/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "kernel",
      "areaId": "systems",
      "name": "Linux 内核开发",
      "intro": "会编译和调试 Linux 内核，能改模块、驱动和内存管理的代码。",
      "icon": "binary",
      "parent": "os",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "c",
        "os"
      ],
      "dependents": [
        "ebpf",
        "driver"
      ],
      "steps": [
        "编译和启动内核",
        "内核模块",
        "调试内核",
        "内存管理",
        "提交一个内核补丁"
      ],
      "resources": [
        {
          "label": "Linux 内核文档",
          "url": "https://docs.kernel.org/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "内核新手指南",
          "url": "https://kernelnewbies.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng"
      ]
    },
    {
      "id": "rtos",
      "areaId": "systems",
      "name": "实时操作系统",
      "intro": "会在 FreeRTOS 或 Zephyr 上做任务调度，能保证程序按时响应。",
      "icon": "clock",
      "parent": "embedded",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "embedded"
      ],
      "dependents": [],
      "steps": [
        "任务和调度",
        "队列和信号量",
        "中断和实时性",
        "内存管理",
        "做一个实时系统"
      ],
      "resources": [
        {
          "label": "FreeRTOS",
          "url": "https://www.freertos.org/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Zephyr 文档",
          "url": "https://docs.zephyrproject.org/latest/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng"
      ]
    },
    {
      "id": "virtualization",
      "areaId": "systems",
      "name": "虚拟化",
      "intro": "会讲清 KVM、命名空间和 cgroups，能解释虚拟机和容器底下怎么隔离。",
      "icon": "boxes",
      "parent": "os",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "os"
      ],
      "dependents": [],
      "steps": [
        "CPU 虚拟化",
        "内存虚拟化",
        "KVM",
        "命名空间",
        "cgroups",
        "手写一个迷你容器"
      ],
      "resources": [
        {
          "label": "Linux 命名空间",
          "url": "https://man7.org/linux/man-pages/man7/namespaces.7.html",
          "kind": "文档",
          "free": true
        },
        {
          "label": "KVM",
          "url": "https://linux-kvm.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "iac",
      "areaId": "systems",
      "name": "基础设施即代码",
      "intro": "会用 Terraform 写云资源，能让机器和网络可复现、可审查。",
      "icon": "si:terraform",
      "parent": "cloud",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "cloud"
      ],
      "dependents": [],
      "steps": [
        "Terraform 基础",
        "状态管理",
        "模块",
        "多环境",
        "用代码管一套环境"
      ],
      "resources": [
        {
          "label": "Terraform 教程",
          "url": "https://developer.hashicorp.com/terraform/tutorials",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "sre"
      ]
    },
    {
      "id": "observability",
      "areaId": "systems",
      "name": "监控与可观测",
      "intro": "会用 Prometheus 和 Grafana 搭监控，能盯住延迟、吞吐和显存并设告警。",
      "icon": "scan-eye",
      "parent": "k8s",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "k8s"
      ],
      "dependents": [
        "incident",
        "serving"
      ],
      "steps": [
        "指标、日志和追踪",
        "Prometheus 采集",
        "Grafana 看板",
        "告警规则",
        "给服务搭一套监控"
      ],
      "resources": [
        {
          "label": "Prometheus 入门",
          "url": "https://prometheus.io/docs/introduction/overview/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "sre",
        "inference"
      ]
    },
    {
      "id": "go",
      "areaId": "systems",
      "name": "Go",
      "intro": "会用 Go 写并发的网络服务，能做出云原生的基础设施工具。",
      "icon": "si:go",
      "parent": "concurrency",
      "language": true,
      "weight": 0,
      "prerequisites": [
        "concurrency"
      ],
      "dependents": [],
      "steps": [
        "语法和类型",
        "接口",
        "并发：goroutine",
        "channel 通信",
        "写一个网络服务"
      ],
      "resources": [
        {
          "label": "Go 语言之旅",
          "url": "https://go.dev/tour/",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "sre",
        "distributed-eng"
      ]
    },
    {
      "id": "mlir",
      "areaId": "systems",
      "name": "MLIR",
      "intro": "会读写 MLIR 的方言和 pass，能参与 AI 编译器的开发。",
      "icon": "git-graph",
      "parent": "llvm",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "llvm"
      ],
      "dependents": [
        "ai-compiler"
      ],
      "steps": [
        "MLIR 核心概念",
        "方言",
        "操作和类型",
        "Pass 和降级",
        "写一个 Toy 方言"
      ],
      "resources": [
        {
          "label": "MLIR 教程",
          "url": "https://mlir.llvm.org/docs/Tutorials/Toy/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "ebpf",
      "areaId": "systems",
      "name": "eBPF",
      "intro": "会写 eBPF 程序，能不改内核就做观测、网络过滤和性能分析。",
      "icon": "radar",
      "parent": "kernel",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "kernel"
      ],
      "dependents": [],
      "steps": [
        "eBPF 原理",
        "bpftrace",
        "用 libbpf 写程序",
        "网络过滤",
        "写一个观测工具"
      ],
      "resources": [
        {
          "label": "ebpf.io",
          "url": "https://ebpf.io/zh-hans/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "driver",
      "areaId": "systems",
      "name": "驱动开发",
      "intro": "会处理设备树、中断和 DMA，能给一块硬件写出 Linux 驱动。",
      "icon": "usb",
      "parent": "kernel",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "kernel"
      ],
      "dependents": [],
      "steps": [
        "字符设备",
        "设备树",
        "中断处理",
        "DMA",
        "写一个设备驱动"
      ],
      "resources": [
        {
          "label": "Linux 设备驱动（LDD3）",
          "url": "https://lwn.net/Kernel/LDD3/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "systems-eng"
      ]
    },
    {
      "id": "distributed",
      "areaId": "systems",
      "name": "分布式系统",
      "intro": "会实现 Raft 和分片键值存储，能让很多台机器像一台一样可靠。",
      "icon": "server",
      "parent": "networking",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "networking",
        "concurrency"
      ],
      "dependents": [
        "kafka",
        "system-design",
        "spark",
        "dist-infer",
        "dist-train"
      ],
      "steps": [
        "时钟和一致性",
        "复制",
        "Raft 共识",
        "分片",
        "分布式事务",
        "实现 Raft 键值库"
      ],
      "resources": [
        {
          "label": "MIT 6.5840（6.824）",
          "url": "https://pdos.csail.mit.edu/6.824/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "DDIA",
          "url": "https://dataintensive.net/",
          "kind": "书",
          "free": false
        }
      ],
      "requiredBy": [
        "backend",
        "distributed-eng",
        "data",
        "inference"
      ]
    },
    {
      "id": "db-internals",
      "areaId": "systems",
      "name": "数据库内核",
      "intro": "会讲清存储、索引和事务，能亲手实现一个小数据库的核心。",
      "icon": "hard-drive",
      "parent": "sql",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "dsa",
        "sql",
        "concurrency"
      ],
      "dependents": [],
      "steps": [
        "存储和页",
        "缓冲池",
        "B+ 树索引",
        "查询执行",
        "并发控制和恢复",
        "写一个小存储引擎"
      ],
      "resources": [
        {
          "label": "CMU 15-445",
          "url": "https://15445.courses.cs.cmu.edu/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "distributed-eng"
      ]
    },
    {
      "id": "incident",
      "areaId": "systems",
      "name": "故障响应",
      "intro": "会值班、定位和止血，能在线上出事时把损失降到最小并写好复盘。",
      "icon": "siren",
      "parent": "observability",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "observability"
      ],
      "dependents": [],
      "steps": [
        "值班和告警",
        "定位问题",
        "止血和回滚",
        "对内对外沟通",
        "写一份复盘"
      ],
      "resources": [
        {
          "label": "Google SRE：事故管理",
          "url": "https://sre.google/sre-book/managing-incidents/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "sre"
      ]
    },
    {
      "id": "kafka",
      "areaId": "systems",
      "name": "Kafka",
      "intro": "会用 Kafka 生产和消费消息，能设计一条高吞吐的数据管道。",
      "icon": "si:apachekafka",
      "parent": "distributed",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "distributed"
      ],
      "dependents": [],
      "steps": [
        "主题和分区",
        "生产者",
        "消费者和消费组",
        "副本和可靠性",
        "搭一条消息管道"
      ],
      "resources": [
        {
          "label": "Kafka 文档",
          "url": "https://kafka.apache.org/documentation/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "distributed-eng",
        "data"
      ]
    },
    {
      "id": "system-design",
      "areaId": "systems",
      "name": "系统设计",
      "intro": "会拆服务、加缓存、分库分表，能设计一个扛得住流量的后端并讲清取舍。",
      "icon": "drafting-compass",
      "parent": "distributed",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "redis",
        "distributed"
      ],
      "dependents": [],
      "steps": [
        "需求和容量估算",
        "负载均衡",
        "缓存",
        "数据库扩展",
        "消息队列",
        "设计一个短链服务"
      ],
      "resources": [
        {
          "label": "System Design Primer",
          "url": "https://github.com/donnemartin/system-design-primer",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "backend",
        "distributed-eng"
      ]
    },
    {
      "id": "security",
      "areaId": "security",
      "name": "计算机安全",
      "intro": "会讲清内存安全、密码学、网络和 Web 安全，能找出系统的薄弱点。",
      "icon": "lock",
      "parent": "csapp",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "csapp"
      ],
      "dependents": [
        "crypto",
        "web-security",
        "pwn"
      ],
      "steps": [
        "威胁模型",
        "内存安全",
        "密码学基础",
        "网络安全",
        "Web 安全",
        "完成一组攻防实验"
      ],
      "resources": [
        {
          "label": "UC Berkeley CS161",
          "url": "https://cs161.org/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "crypto",
      "areaId": "security",
      "name": "密码学",
      "intro": "会用对称加密、公钥、哈希和签名，能避开最常见的误用。",
      "icon": "key-round",
      "parent": "security",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "prob",
        "security"
      ],
      "dependents": [
        "ctf"
      ],
      "steps": [
        "对称加密",
        "哈希和 MAC",
        "公钥和签名",
        "密钥交换",
        "常见误用",
        "做完一组密码学挑战"
      ],
      "resources": [
        {
          "label": "Dan Boneh 密码学",
          "url": "https://www.coursera.org/learn/crypto",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Cryptopals",
          "url": "https://cryptopals.com/",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "web-security",
      "areaId": "security",
      "name": "Web 安全",
      "intro": "会找 SQL 注入、XSS 和越权，也能在自己的代码里防住它们。",
      "icon": "shield-check",
      "parent": "security",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "web-api",
        "security"
      ],
      "dependents": [
        "pentest"
      ],
      "steps": [
        "SQL 注入",
        "XSS",
        "CSRF",
        "越权和访问控制",
        "SSRF",
        "在靶场打通一组漏洞"
      ],
      "resources": [
        {
          "label": "PortSwigger Web 安全学院",
          "url": "https://portswigger.net/web-security",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "pwn",
      "areaId": "security",
      "name": "二进制漏洞",
      "intro": "会利用栈溢出、堆漏洞和 ROP，能把内存漏洞变成控制程序的能力。",
      "icon": "skull",
      "parent": "security",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "gdb",
        "security"
      ],
      "dependents": [
        "reverse",
        "ctf",
        "fuzzing"
      ],
      "steps": [
        "栈溢出",
        "格式化字符串",
        "ROP",
        "堆利用",
        "拿到一个 shell"
      ],
      "resources": [
        {
          "label": "pwn.college",
          "url": "https://pwn.college/",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "pentest",
      "areaId": "security",
      "name": "渗透测试",
      "intro": "会按授权范围系统地测试，能找出一个系统能被怎么攻破并写出报告。",
      "icon": "crosshair",
      "parent": "web-security",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "networking",
        "web-security"
      ],
      "dependents": [],
      "steps": [
        "信息收集",
        "漏洞扫描",
        "漏洞利用",
        "提权",
        "写渗透报告",
        "打下一台靶机"
      ],
      "resources": [
        {
          "label": "Hack The Box",
          "url": "https://www.hackthebox.com/",
          "kind": "练习",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "reverse",
      "areaId": "security",
      "name": "逆向工程",
      "intro": "会用 Ghidra、IDA，能读懂没有源码的程序在做什么。",
      "icon": "scan-search",
      "parent": "pwn",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "pwn"
      ],
      "dependents": [],
      "steps": [
        "读汇编",
        "静态分析",
        "动态调试",
        "去混淆",
        "逆向一个程序"
      ],
      "resources": [
        {
          "label": "Ghidra",
          "url": "https://ghidra-sre.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "ctf",
      "areaId": "security",
      "name": "CTF 竞赛",
      "intro": "会在限时内解 Web、Pwn、逆向和密码学题，能和队友打完一场 CTF。",
      "icon": "flag",
      "parent": "pwn",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "crypto",
        "pwn"
      ],
      "dependents": [],
      "steps": [
        "Web 题",
        "Pwn 题",
        "逆向题",
        "密码学题",
        "打完一场比赛"
      ],
      "resources": [
        {
          "label": "CTFtime",
          "url": "https://ctftime.org/",
          "kind": "练习",
          "free": true
        },
        {
          "label": "CTF Wiki",
          "url": "https://ctf-wiki.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "fuzzing",
      "areaId": "security",
      "name": "模糊测试",
      "intro": "会用 AFL、libFuzzer 这类工具，能自动找出程序里隐藏的崩溃。",
      "icon": "shuffle",
      "parent": "pwn",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "pwn"
      ],
      "dependents": [],
      "steps": [
        "模糊测试原理",
        "写 harness",
        "覆盖率引导",
        "分析崩溃",
        "找到一个真实漏洞"
      ],
      "resources": [
        {
          "label": "AFL++",
          "url": "https://aflplus.plus/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "security"
      ]
    },
    {
      "id": "pandas",
      "areaId": "data",
      "name": "pandas",
      "intro": "会用 pandas 清洗、整理和统计表格数据，能快速回答一个数据问题。",
      "icon": "table-2",
      "parent": "numpy",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "numpy"
      ],
      "dependents": [
        "viz",
        "timeseries",
        "feature"
      ],
      "steps": [
        "DataFrame 基础",
        "选择和过滤",
        "分组聚合",
        "合并和透视",
        "时间序列处理",
        "回答一个数据问题"
      ],
      "resources": [
        {
          "label": "10 分钟入门 pandas",
          "url": "https://pandas.pydata.org/docs/user_guide/10min.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "data-analyst",
        "quant",
        "ml-algo"
      ]
    },
    {
      "id": "data-eng",
      "areaId": "data",
      "name": "数据管道",
      "intro": "会写爬虫、ETL 和定时任务，能把散落的数据变成能用的数据产品。",
      "icon": "database-backup",
      "parent": "sql",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "sql"
      ],
      "dependents": [
        "spark",
        "llm-data"
      ],
      "steps": [
        "爬虫和接口采集",
        "ETL",
        "数据建模",
        "调度和监控",
        "搭一条数据管道"
      ],
      "resources": [
        {
          "label": "Scrapy",
          "url": "https://docs.scrapy.org/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Data Engineering Zoomcamp",
          "url": "https://github.com/DataTalksClub/data-engineering-zoomcamp",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "data",
        "llm-algo"
      ]
    },
    {
      "id": "analytics",
      "areaId": "data",
      "name": "数据分析与埋点",
      "intro": "会埋点和看漏斗，能找出用户在哪一步流失并据此改产品。",
      "icon": "chart-column",
      "parent": "sql",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "sql"
      ],
      "dependents": [
        "ab-test"
      ],
      "steps": [
        "埋点设计",
        "漏斗和留存",
        "用户分群",
        "数据看板",
        "找出一个流失点"
      ],
      "resources": [
        {
          "label": "PostHog 文档",
          "url": "https://posthog.com/docs",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "data-analyst",
        "ml-algo"
      ]
    },
    {
      "id": "derivatives",
      "areaId": "data",
      "name": "衍生品定价",
      "intro": "会用 Black-Scholes 和蒙特卡洛，能给期权和期货定价。",
      "icon": "percent",
      "parent": "prob",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "prob"
      ],
      "dependents": [],
      "steps": [
        "期权基础",
        "二叉树定价",
        "Black-Scholes",
        "希腊字母",
        "蒙特卡洛定价",
        "给一个期权定价"
      ],
      "resources": [
        {
          "label": "MIT 18.S096 金融中的数学",
          "url": "https://ocw.mit.edu/courses/18-s096-topics-in-mathematics-with-applications-in-finance-fall-2013/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "viz",
      "areaId": "data",
      "name": "数据可视化",
      "intro": "会选对图、去掉噪音，能用一张图把数据讲清楚。",
      "icon": "chart-pie",
      "parent": "pandas",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "pandas"
      ],
      "dependents": [],
      "steps": [
        "选对图表",
        "Matplotlib 基础",
        "去掉多余元素",
        "配色和标注",
        "用一张图讲清结论"
      ],
      "resources": [
        {
          "label": "Matplotlib 教程",
          "url": "https://matplotlib.org/stable/tutorials/index.html",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Fundamentals of Data Visualization",
          "url": "https://clauswilke.com/dataviz/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "data-analyst",
        "quant"
      ]
    },
    {
      "id": "spark",
      "areaId": "data",
      "name": "Spark 大数据",
      "intro": "会写 Spark 作业，能在一群机器上处理 TB 级的数据。",
      "icon": "si:apachespark",
      "parent": "data-eng",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "distributed",
        "data-eng"
      ],
      "dependents": [],
      "steps": [
        "RDD 和数据帧",
        "Spark SQL",
        "分区和 Shuffle",
        "性能调优",
        "处理一份大数据集"
      ],
      "resources": [
        {
          "label": "Spark 文档",
          "url": "https://spark.apache.org/docs/latest/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "data"
      ]
    },
    {
      "id": "ab-test",
      "areaId": "data",
      "name": "A/B 实验",
      "intro": "会设计实验、算显著性，能判断一个改动是不是真的有用。",
      "icon": "test-tubes",
      "parent": "prob",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "prob",
        "analytics"
      ],
      "dependents": [],
      "steps": [
        "实验设计",
        "样本量和功效",
        "显著性检验",
        "常见陷阱",
        "分析一次真实实验"
      ],
      "resources": [
        {
          "label": "Trustworthy Online Controlled Experiments",
          "url": "https://experimentguide.com/",
          "kind": "书",
          "free": false
        }
      ],
      "requiredBy": [
        "data-analyst",
        "ml-algo"
      ]
    },
    {
      "id": "timeseries",
      "areaId": "data",
      "name": "时间序列",
      "intro": "会算收益率、波动率和自相关，能对随时间变化的数据建模。",
      "icon": "chart-line",
      "parent": "prob",
      "language": false,
      "weight": 4,
      "prerequisites": [
        "prob",
        "pandas"
      ],
      "dependents": [
        "quant-research",
        "factor"
      ],
      "steps": [
        "收益率和波动率",
        "平稳性",
        "自相关",
        "ARIMA",
        "预测和评估",
        "预测一条真实序列"
      ],
      "resources": [
        {
          "label": "Forecasting: Principles and Practice",
          "url": "https://otexts.com/fpp3/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "quant-research",
      "areaId": "data",
      "name": "量化研究",
      "intro": "会用历史数据做回测，能判断一个交易想法站不站得住。",
      "icon": "chart-candlestick",
      "parent": "timeseries",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "timeseries"
      ],
      "dependents": [
        "risk"
      ],
      "steps": [
        "数据和清洗",
        "把想法变成策略",
        "回测框架",
        "过拟合和前视偏差",
        "回测一个完整策略"
      ],
      "resources": [
        {
          "label": "QuantConnect 学习",
          "url": "https://www.quantconnect.com/learning",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "factor",
      "areaId": "data",
      "name": "因子研究",
      "intro": "会构造和检验因子，能分辨一个信号是真有效还是巧合。",
      "icon": "sigma",
      "parent": "timeseries",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "timeseries"
      ],
      "dependents": [],
      "steps": [
        "因子构造",
        "IC 和分层回测",
        "中性化",
        "衰减和换手",
        "检验一个因子"
      ],
      "resources": [
        {
          "label": "Alphalens",
          "url": "https://github.com/quantopian/alphalens",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "risk",
      "areaId": "data",
      "name": "风险管理",
      "intro": "会控仓位、回撤和对冲，能让策略先活下来再谈收益。",
      "icon": "shield-alert",
      "parent": "quant-research",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "quant-research"
      ],
      "dependents": [
        "portfolio"
      ],
      "steps": [
        "仓位管理",
        "回撤和止损",
        "VaR",
        "对冲",
        "给策略加上风控"
      ],
      "resources": [
        {
          "label": "Riskfolio-Lib",
          "url": "https://riskfolio-lib.readthedocs.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "portfolio",
      "areaId": "data",
      "name": "组合优化",
      "intro": "会把多个策略和资产配成组合，能同时权衡收益、波动和相关性。",
      "icon": "briefcase",
      "parent": "risk",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "optimization",
        "risk"
      ],
      "dependents": [],
      "steps": [
        "均值方差模型",
        "有效前沿",
        "风险平价",
        "约束和再平衡",
        "配一个多策略组合"
      ],
      "resources": [
        {
          "label": "PyPortfolioOpt",
          "url": "https://pyportfolioopt.readthedocs.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "quant"
      ]
    },
    {
      "id": "numpy",
      "areaId": "learning",
      "name": "NumPy",
      "intro": "会用向量化和广播写数值计算，能不写循环地处理矩阵。",
      "icon": "si:numpy",
      "parent": "python",
      "language": false,
      "weight": 60,
      "prerequisites": [
        "python",
        "math"
      ],
      "dependents": [
        "pandas",
        "ml",
        "sci-compute",
        "robotics"
      ],
      "steps": [
        "数组和形状",
        "索引和切片",
        "广播",
        "向量化代替循环",
        "用 NumPy 写线性回归"
      ],
      "resources": [
        {
          "label": "NumPy 入门",
          "url": "https://numpy.org/doc/stable/user/absolute_beginners.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "data-analyst",
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "ml",
      "areaId": "learning",
      "name": "机器学习",
      "intro": "会用回归、分类和正则化建模，能判断过拟合并正确评估模型。",
      "icon": "chart-scatter",
      "parent": "numpy",
      "language": false,
      "weight": 47,
      "prerequisites": [
        "prob",
        "optimization",
        "numpy"
      ],
      "dependents": [
        "feature",
        "gbdt",
        "dl"
      ],
      "steps": [
        "线性和逻辑回归",
        "过拟合和正则化",
        "交叉验证和评估",
        "树模型和集成",
        "聚类和降维",
        "完成一个 Kaggle 比赛"
      ],
      "resources": [
        {
          "label": "Stanford CS229",
          "url": "https://cs229.stanford.edu/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "吴恩达 机器学习",
          "url": "https://www.coursera.org/specializations/machine-learning-introduction",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "quant",
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "sci-compute",
      "areaId": "learning",
      "name": "科学计算",
      "intro": "会数值方法解方程和微分方程，能用 Python 写一个物理过程的模拟并检查结果对不对。",
      "icon": "square-pi",
      "parent": "numpy",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "numpy"
      ],
      "dependents": [
        "pinn"
      ],
      "steps": [
        "浮点误差和稳定性",
        "线性方程组求解",
        "常微分方程",
        "偏微分方程和有限差分",
        "模拟一个热传导过程"
      ],
      "resources": [
        {
          "label": "MIT 18.085 计算科学与工程",
          "url": "https://ocw.mit.edu/courses/18-085-computational-science-and-engineering-i-fall-2008/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "SciPy 教程",
          "url": "https://docs.scipy.org/doc/scipy/tutorial/index.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ai4s"
      ]
    },
    {
      "id": "feature",
      "areaId": "learning",
      "name": "特征工程",
      "intro": "会把原始数据变成特征，能用特征工程明显提升模型效果。",
      "icon": "wrench",
      "parent": "pandas",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "pandas",
        "ml"
      ],
      "dependents": [],
      "steps": [
        "缺失值和异常值",
        "类别特征编码",
        "数值变换",
        "特征选择",
        "用特征提升一个模型"
      ],
      "resources": [
        {
          "label": "Kaggle 特征工程课",
          "url": "https://www.kaggle.com/learn/feature-engineering",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo"
      ]
    },
    {
      "id": "gbdt",
      "areaId": "learning",
      "name": "梯度提升树",
      "intro": "会用 XGBoost、LightGBM 建模和调参，能在表格数据上做出强基线。",
      "icon": "tree-deciduous",
      "parent": "ml",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "ml"
      ],
      "dependents": [],
      "steps": [
        "决策树",
        "梯度提升原理",
        "XGBoost 实践",
        "调参和早停",
        "做出一个强基线"
      ],
      "resources": [
        {
          "label": "XGBoost 文档",
          "url": "https://xgboost.readthedocs.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "quant",
        "ml-algo"
      ]
    },
    {
      "id": "dl",
      "areaId": "learning",
      "name": "深度学习",
      "intro": "会推反向传播，能搭出卷积和循环网络并用常见技巧把它训好。",
      "icon": "brain",
      "parent": "ml",
      "language": false,
      "weight": 44,
      "prerequisites": [
        "ml"
      ],
      "dependents": [
        "recsys",
        "pytorch",
        "rl"
      ],
      "steps": [
        "反向传播",
        "多层感知机",
        "卷积网络",
        "循环网络",
        "归一化和正则化",
        "从零训一个图像分类器"
      ],
      "resources": [
        {
          "label": "动手学深度学习",
          "url": "https://zh.d2l.ai/",
          "kind": "书",
          "free": true
        },
        {
          "label": "Stanford CS231n",
          "url": "https://cs231n.stanford.edu/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "recsys",
      "areaId": "learning",
      "name": "推荐系统",
      "intro": "会搭召回、排序和特征，能做出一个信息流或电商推荐的原型。",
      "icon": "star",
      "parent": "dl",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "dl"
      ],
      "dependents": [
        "ranking"
      ],
      "steps": [
        "推荐系统架构",
        "召回",
        "排序",
        "特征和样本",
        "做一个推荐原型"
      ],
      "resources": [
        {
          "label": "Google 推荐系统课",
          "url": "https://developers.google.com/machine-learning/recommendation",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Microsoft Recommenders",
          "url": "https://github.com/recommenders-team/recommenders",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo"
      ]
    },
    {
      "id": "pytorch",
      "areaId": "learning",
      "name": "PyTorch",
      "intro": "会用 PyTorch 搭建、训练和调试神经网络，能自己写数据加载和训练循环。",
      "icon": "si:pytorch",
      "parent": "dl",
      "language": false,
      "weight": 40,
      "prerequisites": [
        "dl"
      ],
      "dependents": [
        "cv",
        "mlops",
        "gnn",
        "pinn",
        "nlp",
        "dlsys",
        "quantization",
        "triton",
        "imitation"
      ],
      "steps": [
        "张量和自动求导",
        "nn.Module 搭模型",
        "数据集和加载器",
        "训练循环和保存",
        "GPU 训练和调试",
        "复现一篇经典论文"
      ],
      "resources": [
        {
          "label": "PyTorch 官方教程",
          "url": "https://pytorch.org/tutorials/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    },
    {
      "id": "rl",
      "areaId": "learning",
      "name": "强化学习",
      "intro": "会推策略梯度和 PPO，能训练一个智能体在环境里学会决策。",
      "icon": "gamepad-2",
      "parent": "dl",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "dl"
      ],
      "dependents": [
        "rlhf"
      ],
      "steps": [
        "马尔可夫决策过程",
        "价值函数和 Q 学习",
        "策略梯度",
        "PPO",
        "训一个会玩游戏的智能体"
      ],
      "resources": [
        {
          "label": "OpenAI Spinning Up",
          "url": "https://spinningup.openai.com/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "Hugging Face 强化学习课",
          "url": "https://huggingface.co/learn/deep-rl-course",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo",
        "embodied"
      ]
    },
    {
      "id": "ranking",
      "areaId": "learning",
      "name": "排序模型",
      "intro": "会做精排和多目标排序，能用离线和线上指标判断排序变好了没有。",
      "icon": "arrow-up-wide-narrow",
      "parent": "recsys",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "recsys"
      ],
      "dependents": [],
      "steps": [
        "点击率预估",
        "特征交叉",
        "多目标排序",
        "离线和线上指标",
        "做一个精排模型"
      ],
      "resources": [
        {
          "label": "DeepCTR",
          "url": "https://github.com/shenweichen/DeepCTR",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo"
      ]
    },
    {
      "id": "cv",
      "areaId": "learning",
      "name": "计算机视觉",
      "intro": "会训练图像分类、检测和分割模型，能在自己的数据上调出可用的效果。",
      "icon": "eye",
      "parent": "pytorch",
      "language": false,
      "weight": 5,
      "prerequisites": [
        "pytorch"
      ],
      "dependents": [
        "detection",
        "multimodal",
        "slam"
      ],
      "steps": [
        "图像分类",
        "数据增强",
        "迁移学习",
        "检测和分割",
        "在自己的数据上训模型"
      ],
      "resources": [
        {
          "label": "Stanford CS231n",
          "url": "https://cs231n.stanford.edu/schedule.html",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo",
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "mlops",
      "areaId": "learning",
      "name": "实验管理",
      "intro": "会用 W&B 这类工具记录实验，能让每次训练的配置和结果都可复现。",
      "icon": "flask-conical",
      "parent": "pytorch",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "pytorch"
      ],
      "dependents": [],
      "steps": [
        "记录超参和指标",
        "对比实验",
        "数据和模型的版本",
        "可复现的训练脚本",
        "搭一套实验看板"
      ],
      "resources": [
        {
          "label": "Weights & Biases 入门",
          "url": "https://docs.wandb.ai/quickstart",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "gnn",
      "areaId": "learning",
      "name": "图神经网络",
      "intro": "会消息传递和常见的图网络结构，能用 PyG 在分子或社交图上训练一个预测模型。",
      "icon": "share-2",
      "parent": "pytorch",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "discrete",
        "pytorch"
      ],
      "dependents": [
        "molecule"
      ],
      "steps": [
        "图的表示",
        "消息传递",
        "GCN 和 GAT",
        "等变网络",
        "训一个分子性质预测模型"
      ],
      "resources": [
        {
          "label": "Stanford CS224W",
          "url": "https://web.stanford.edu/class/cs224w/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "PyG 文档",
          "url": "https://pytorch-geometric.readthedocs.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ai4s"
      ]
    },
    {
      "id": "pinn",
      "areaId": "learning",
      "name": "物理信息神经网络",
      "intro": "会把物理方程放进神经网络训练，能用 PINN 或神经算子求解一个偏微分方程。",
      "icon": "waves",
      "parent": "sci-compute",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "sci-compute",
        "pytorch"
      ],
      "dependents": [],
      "steps": [
        "用网络逼近函数",
        "把方程写进损失",
        "PINN 求解偏微分方程",
        "神经算子：FNO",
        "学一个流体模拟的替代模型"
      ],
      "resources": [
        {
          "label": "DeepXDE",
          "url": "https://github.com/lululxvi/deepxde",
          "kind": "项目",
          "free": true
        },
        {
          "label": "neuraloperator",
          "url": "https://github.com/neuraloperator/neuraloperator",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "ai4s"
      ]
    },
    {
      "id": "detection",
      "areaId": "learning",
      "name": "目标检测",
      "intro": "会训练 YOLO、DETR 这类检测模型，能在自己的图片上把物体框准。",
      "icon": "scan",
      "parent": "cv",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "cv"
      ],
      "dependents": [
        "ad-perception"
      ],
      "steps": [
        "检测任务和指标",
        "YOLO",
        "DETR",
        "标注和数据增强",
        "在自己的数据上训检测"
      ],
      "resources": [
        {
          "label": "Ultralytics 文档",
          "url": "https://docs.ultralytics.com/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ml-algo",
        "autodrive"
      ]
    },
    {
      "id": "multimodal",
      "areaId": "learning",
      "name": "多模态模型",
      "intro": "会训练和微调图文模型，能让模型同时看图和读字回答问题。",
      "icon": "image",
      "parent": "cv",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "cv",
        "nlp"
      ],
      "dependents": [
        "vla"
      ],
      "steps": [
        "图像编码器",
        "图文对齐：CLIP",
        "视觉指令微调",
        "多模态评测",
        "微调一个图文问答模型"
      ],
      "resources": [
        {
          "label": "LLaVA",
          "url": "https://llava-vl.github.io/",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied"
      ]
    },
    {
      "id": "molecule",
      "areaId": "learning",
      "name": "分子与蛋白质建模",
      "intro": "会用 AI 做分子和蛋白质的表示、预测和生成，能跑通结构预测并筛选候选分子。",
      "icon": "dna",
      "parent": "gnn",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "gnn"
      ],
      "dependents": [],
      "steps": [
        "SMILES 和分子图",
        "用 RDKit 处理分子",
        "分子性质预测",
        "蛋白质结构预测",
        "给一个靶点筛选候选分子"
      ],
      "resources": [
        {
          "label": "RDKit 入门",
          "url": "https://www.rdkit.org/docs/GettingStartedInPython.html",
          "kind": "文档",
          "free": true
        },
        {
          "label": "AlphaFold",
          "url": "https://github.com/google-deepmind/alphafold",
          "kind": "项目",
          "free": true
        },
        {
          "label": "DeepChem",
          "url": "https://github.com/deepchem/deepchem",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "ai4s"
      ]
    },
    {
      "id": "nlp",
      "areaId": "llm",
      "name": "Transformer",
      "intro": "会讲清注意力、位置编码、编码器和解码器，能读懂 Transformer 的代码。",
      "icon": "languages",
      "parent": "pytorch",
      "language": false,
      "weight": 21,
      "prerequisites": [
        "pytorch"
      ],
      "dependents": [
        "multimodal",
        "gpt",
        "hf",
        "flash-attn"
      ],
      "steps": [
        "词向量和分词",
        "注意力机制",
        "多头和位置编码",
        "编码器和解码器",
        "读懂一份完整实现"
      ],
      "resources": [
        {
          "label": "Stanford CS224n",
          "url": "https://web.stanford.edu/class/cs224n/",
          "kind": "课程",
          "free": true
        },
        {
          "label": "图解 Transformer",
          "url": "https://jalammar.github.io/illustrated-transformer/",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo",
        "ai-app",
        "inference",
        "embodied"
      ]
    },
    {
      "id": "llm-app",
      "areaId": "llm",
      "name": "大模型应用",
      "intro": "会调用大模型 API、写提示词，能让模型的输出稳定可用。",
      "icon": "messages-square",
      "parent": "fastapi",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "fastapi"
      ],
      "dependents": [
        "indie",
        "prompt",
        "eval",
        "voice",
        "rag"
      ],
      "steps": [
        "调用 API",
        "提示词基础",
        "结构化输出",
        "流式输出",
        "错误处理和重试",
        "做一个大模型小应用"
      ],
      "resources": [
        {
          "label": "Claude 开发文档",
          "url": "https://docs.anthropic.com/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng",
        "ai-app"
      ]
    },
    {
      "id": "vector-db",
      "areaId": "llm",
      "name": "向量检索",
      "intro": "会用 pgvector 存向量，能做出又快又准的相似度搜索。",
      "icon": "database-zap",
      "parent": "postgres",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "postgres"
      ],
      "dependents": [
        "rag"
      ],
      "steps": [
        "向量和相似度",
        "pgvector 的用法",
        "IVF 和 HNSW 索引",
        "混合检索",
        "做一个语义搜索"
      ],
      "resources": [
        {
          "label": "pgvector",
          "url": "https://github.com/pgvector/pgvector",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng",
        "ai-app"
      ]
    },
    {
      "id": "gpt",
      "areaId": "llm",
      "name": "从零实现 GPT",
      "intro": "会亲手写注意力、训练一个小 GPT，能说清大模型每一层在算什么。",
      "icon": "brain-circuit",
      "parent": "nlp",
      "language": false,
      "weight": 16,
      "prerequisites": [
        "nlp"
      ],
      "dependents": [
        "finetune",
        "llm-data",
        "vllm"
      ],
      "steps": [
        "分词器",
        "自注意力",
        "Transformer 块",
        "训练和采样",
        "从零训一个小 GPT"
      ],
      "resources": [
        {
          "label": "Karpathy Zero to Hero",
          "url": "https://karpathy.ai/zero-to-hero.html",
          "kind": "视频",
          "free": true
        },
        {
          "label": "Stanford CS336",
          "url": "https://stanford-cs336.github.io/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo",
        "ai-app",
        "inference"
      ]
    },
    {
      "id": "hf",
      "areaId": "llm",
      "name": "Hugging Face",
      "intro": "会用 Transformers 加载和调用开源模型，能把自己的模型和数据集发到 Hub。",
      "icon": "si:huggingface",
      "parent": "nlp",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "nlp"
      ],
      "dependents": [
        "finetune"
      ],
      "steps": [
        "加载和调用模型",
        "分词器和管道",
        "Datasets 处理数据",
        "用 Trainer 训练",
        "把模型发到 Hub"
      ],
      "resources": [
        {
          "label": "Hugging Face 课程",
          "url": "https://huggingface.co/learn/llm-course/zh-CN/chapter1/1",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo",
        "ai-app"
      ]
    },
    {
      "id": "prompt",
      "areaId": "llm",
      "name": "提示词工程",
      "intro": "会写清指令、给例子、拆步骤，能让模型稳定地做对一件事。",
      "icon": "wand-sparkles",
      "parent": "llm-app",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "llm-app"
      ],
      "dependents": [],
      "steps": [
        "写清楚指令",
        "给例子",
        "拆分步骤",
        "控制输出格式",
        "迭代和评测",
        "写一个稳定的提示词"
      ],
      "resources": [
        {
          "label": "Anthropic 提示词指南",
          "url": "https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ai-app"
      ]
    },
    {
      "id": "eval",
      "areaId": "llm",
      "name": "模型评测",
      "intro": "会给大模型应用建测试集，能量化地判断改动是变好还是变坏。",
      "icon": "clipboard-check",
      "parent": "llm-app",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "llm-app"
      ],
      "dependents": [],
      "steps": [
        "定义成功标准",
        "建测试集",
        "自动打分",
        "用模型做评审",
        "搭一套评测流程"
      ],
      "resources": [
        {
          "label": "Anthropic 评测指南",
          "url": "https://docs.anthropic.com/en/docs/test-and-evaluate/develop-tests",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ai-app"
      ]
    },
    {
      "id": "voice",
      "areaId": "llm",
      "name": "语音应用",
      "intro": "会接语音识别和语音合成，能做出一个能对话的语音产品。",
      "icon": "mic",
      "parent": "llm-app",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "llm-app"
      ],
      "dependents": [],
      "steps": [
        "语音识别",
        "语音合成",
        "实时对话流",
        "打断和延迟",
        "做一个语音助手"
      ],
      "resources": [
        {
          "label": "Whisper",
          "url": "https://github.com/openai/whisper",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "rag",
      "areaId": "llm",
      "name": "RAG 检索",
      "intro": "会切块、向量化和检索，能让模型基于自己的资料准确回答。",
      "icon": "file-search",
      "parent": "llm-app",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "llm-app",
        "vector-db"
      ],
      "dependents": [
        "agent"
      ],
      "steps": [
        "跑通最简单的 RAG",
        "切块和向量化",
        "混合检索和重排序",
        "回答带出处",
        "给自己的文档做问答"
      ],
      "resources": [
        {
          "label": "LangChain RAG 教程",
          "url": "https://python.langchain.com/docs/tutorials/rag/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Anthropic：Contextual Retrieval",
          "url": "https://www.anthropic.com/news/contextual-retrieval",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "product-eng",
        "ai-app"
      ]
    },
    {
      "id": "finetune",
      "areaId": "llm",
      "name": "模型微调",
      "intro": "会用 LoRA 在自己的数据上微调开源模型，能判断微调后有没有变好。",
      "icon": "sliders-horizontal",
      "parent": "hf",
      "language": false,
      "weight": 5,
      "prerequisites": [
        "gpt",
        "hf"
      ],
      "dependents": [
        "sft",
        "rlhf"
      ],
      "steps": [
        "准备微调数据",
        "LoRA 原理",
        "用 PEFT 微调",
        "评估微调效果",
        "微调一个领域模型"
      ],
      "resources": [
        {
          "label": "PEFT 文档",
          "url": "https://huggingface.co/docs/peft/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo",
        "ai-app"
      ]
    },
    {
      "id": "llm-data",
      "areaId": "llm",
      "name": "预训练数据",
      "intro": "会抓取、清洗、去重和配比数据，能做出一份可以训练的预训练语料。",
      "icon": "list-filter",
      "parent": "gpt",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "data-eng",
        "gpt"
      ],
      "dependents": [
        "scaling"
      ],
      "steps": [
        "网页抓取",
        "文本清洗",
        "去重",
        "质量过滤",
        "数据配比",
        "做一份预训练语料"
      ],
      "resources": [
        {
          "label": "FineWeb 数据集说明",
          "url": "https://huggingface.co/spaces/HuggingFaceFW/blogpost-fineweb-v1",
          "kind": "文章",
          "free": true
        },
        {
          "label": "Dolma",
          "url": "https://github.com/allenai/dolma",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "agent",
      "areaId": "llm",
      "name": "Agent 开发",
      "intro": "会让模型调用工具、规划多步任务，能做出一个真能干活的 Agent。",
      "icon": "waypoints",
      "parent": "rag",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "rag"
      ],
      "dependents": [
        "mcp"
      ],
      "steps": [
        "工具调用",
        "多步规划",
        "记忆和上下文",
        "错误恢复",
        "做一个能干活的 Agent"
      ],
      "resources": [
        {
          "label": "Anthropic：构建高效的 Agent",
          "url": "https://www.anthropic.com/engineering/building-effective-agents",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "ai-app"
      ]
    },
    {
      "id": "sft",
      "areaId": "llm",
      "name": "指令微调",
      "intro": "会准备指令和对话数据，能把基座模型微调成会听话的助手。",
      "icon": "message-square-text",
      "parent": "finetune",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "finetune"
      ],
      "dependents": [
        "llm-eval",
        "distillation"
      ],
      "steps": [
        "指令数据格式",
        "对话模板",
        "数据质量",
        "训练和评估",
        "微调一个对话助手"
      ],
      "resources": [
        {
          "label": "Hugging Face TRL：SFT",
          "url": "https://huggingface.co/docs/trl/sft_trainer",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "rlhf",
      "areaId": "llm",
      "name": "RLHF 对齐",
      "intro": "会训练奖励模型，能用 PPO 或 DPO 按人类偏好对齐模型。",
      "icon": "thumbs-up",
      "parent": "finetune",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "rl",
        "finetune"
      ],
      "dependents": [
        "reasoning-rl"
      ],
      "steps": [
        "偏好数据",
        "奖励模型",
        "PPO 对齐",
        "DPO 对齐",
        "对齐一个小模型"
      ],
      "resources": [
        {
          "label": "Hugging Face TRL",
          "url": "https://huggingface.co/docs/trl/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "RLHF 书",
          "url": "https://rlhfbook.com/",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "scaling",
      "areaId": "llm",
      "name": "扩展规律",
      "intro": "会用小模型实验拟合扩展规律，能预测大模型该怎么配参数、数据和算力。",
      "icon": "chart-no-axes-combined",
      "parent": "llm-data",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "llm-data"
      ],
      "dependents": [
        "pretrain-run"
      ],
      "steps": [
        "扩展规律",
        "算力预算",
        "小模型实验",
        "拟合曲线",
        "预测大模型的损失"
      ],
      "resources": [
        {
          "label": "Chinchilla 论文",
          "url": "https://arxiv.org/abs/2203.15556",
          "kind": "论文",
          "free": true
        },
        {
          "label": "Scaling Laws 论文",
          "url": "https://arxiv.org/abs/2001.08361",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "mcp",
      "areaId": "llm",
      "name": "MCP 服务器",
      "intro": "会写 MCP 服务器，能把自己的工具和数据接给任何一个 AI 助手。",
      "icon": "plug",
      "parent": "agent",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "agent"
      ],
      "dependents": [],
      "steps": [
        "MCP 协议概念",
        "工具和资源",
        "本地调试",
        "接入 AI 助手",
        "写一个 MCP 服务器"
      ],
      "resources": [
        {
          "label": "Model Context Protocol",
          "url": "https://modelcontextprotocol.io/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "ai-app"
      ]
    },
    {
      "id": "pretrain-run",
      "areaId": "llm",
      "name": "从零预训练",
      "intro": "会在多卡上从零训十亿参数级的基座模型，能盯住损失和训练稳定性。",
      "icon": "flame",
      "parent": "scaling",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "scaling"
      ],
      "dependents": [],
      "steps": [
        "模型和训练配置",
        "学习率和预热",
        "处理损失尖峰",
        "检查点和恢复",
        "训一个十亿级基座"
      ],
      "resources": [
        {
          "label": "Llama 3 论文",
          "url": "https://arxiv.org/abs/2407.21783",
          "kind": "论文",
          "free": true
        },
        {
          "label": "OLMo 论文",
          "url": "https://arxiv.org/abs/2402.00838",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "llm-eval",
      "areaId": "llm",
      "name": "能力评测",
      "intro": "会用基准和人工评测，能量出模型哪里强、哪里弱，不被刷榜骗。",
      "icon": "trophy",
      "parent": "sft",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "sft"
      ],
      "dependents": [
        "reasoning-rl"
      ],
      "steps": [
        "常见基准",
        "评测框架",
        "人工和模型评审",
        "数据污染",
        "给模型出评测报告"
      ],
      "resources": [
        {
          "label": "lm-evaluation-harness",
          "url": "https://github.com/EleutherAI/lm-evaluation-harness",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "distillation",
      "areaId": "llm",
      "name": "模型蒸馏",
      "intro": "会用大模型的输出训练小模型，能用很少的成本保住大部分能力。",
      "icon": "filter",
      "parent": "sft",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "sft"
      ],
      "dependents": [],
      "steps": [
        "知识蒸馏原理",
        "用大模型生成数据",
        "数据筛选和配比",
        "训练小模型",
        "蒸馏出一个小助手"
      ],
      "resources": [
        {
          "label": "蒸馏论文",
          "url": "https://arxiv.org/abs/1503.02531",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "reasoning-rl",
      "areaId": "llm",
      "name": "推理强化学习",
      "intro": "会用 GRPO 这类方法训练，能让模型一步步想清楚再回答。",
      "icon": "lightbulb",
      "parent": "rlhf",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "rlhf",
        "llm-eval"
      ],
      "dependents": [],
      "steps": [
        "思维链",
        "可验证的奖励",
        "GRPO",
        "训练稳定性",
        "训一个会推理的小模型"
      ],
      "resources": [
        {
          "label": "DeepSeek-R1 论文",
          "url": "https://arxiv.org/abs/2501.12948",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": [
        "llm-algo"
      ]
    },
    {
      "id": "parallel",
      "areaId": "infra",
      "name": "并行计算",
      "intro": "会用多线程、SIMD 和 GPU 写并行程序，能说清加速比卡在哪。",
      "icon": "layout-grid",
      "parent": "csapp",
      "language": false,
      "weight": 12,
      "prerequisites": [
        "csapp",
        "cpp"
      ],
      "dependents": [
        "gpu-arch"
      ],
      "steps": [
        "多线程和同步",
        "SIMD 向量化",
        "GPU 编程模型",
        "加速比和瓶颈",
        "把一个程序提速十倍"
      ],
      "resources": [
        {
          "label": "Stanford CS149",
          "url": "https://gfxcourses.stanford.edu/cs149/fall24",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "dlsys",
      "areaId": "infra",
      "name": "深度学习系统",
      "intro": "会从零写一个深度学习框架，能实现自动求导、算子和 GPU 后端。",
      "icon": "blocks",
      "parent": "pytorch",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "csapp",
        "pytorch"
      ],
      "dependents": [
        "dist-train"
      ],
      "steps": [
        "自动求导",
        "张量和算子",
        "优化器和训练",
        "CPU 和 GPU 后端",
        "从零写一个小框架"
      ],
      "resources": [
        {
          "label": "CMU 10-414",
          "url": "https://dlsyscourse.org/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "quantization",
      "areaId": "infra",
      "name": "模型量化",
      "intro": "会用 INT8、FP8、4-bit 量化模型，能在精度几乎不掉时让它变小变快。",
      "icon": "shrink",
      "parent": "pytorch",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "pytorch"
      ],
      "dependents": [
        "onnx",
        "edge-infer"
      ],
      "steps": [
        "数值格式和量化原理",
        "训练后量化",
        "GPTQ 和 AWQ",
        "FP8 推理",
        "量化一个模型并测精度"
      ],
      "resources": [
        {
          "label": "Hugging Face 量化指南",
          "url": "https://huggingface.co/docs/transformers/quantization/overview",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "vllm",
      "areaId": "infra",
      "name": "vLLM 推理",
      "intro": "会部署和调优 vLLM，能讲清 PagedAttention、连续批处理和 KV cache。",
      "icon": "zap",
      "parent": "gpt",
      "language": false,
      "weight": 6,
      "prerequisites": [
        "concurrency",
        "gpt"
      ],
      "dependents": [
        "sglang",
        "spec-decode",
        "serving",
        "dist-infer",
        "trt-llm"
      ],
      "steps": [
        "跑起一个推理服务",
        "KV cache 和分页",
        "连续批处理",
        "前缀缓存和分块预填充",
        "压测并调优一个模型"
      ],
      "resources": [
        {
          "label": "vLLM 文档",
          "url": "https://docs.vllm.ai/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "vLLM 博客：PagedAttention 的来历",
          "url": "https://blog.vllm.ai/2023/06/20/vllm.html",
          "kind": "文章",
          "free": true
        },
        {
          "label": "PagedAttention 论文",
          "url": "https://arxiv.org/abs/2309.06180",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "gpu-arch",
      "areaId": "infra",
      "name": "GPU 架构",
      "intro": "会讲清 SM、warp、显存层次和 Tensor Core，能据此判断 kernel 该怎么写。",
      "icon": "memory-stick",
      "parent": "parallel",
      "language": false,
      "weight": 11,
      "prerequisites": [
        "arch",
        "parallel"
      ],
      "dependents": [
        "cuda"
      ],
      "steps": [
        "SM 和 warp",
        "显存层次",
        "Tensor Core",
        "占用率和调度",
        "分析一个 kernel 瓶颈"
      ],
      "resources": [
        {
          "label": "CUDA 编程指南：硬件实现",
          "url": "https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#hardware-implementation",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Modal GPU 术语表",
          "url": "https://modal.com/gpu-glossary",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "onnx",
      "areaId": "infra",
      "name": "ONNX 部署",
      "intro": "会把模型导出成 ONNX，能在不同推理后端上跑通并对齐精度。",
      "icon": "si:onnx",
      "parent": "quantization",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "quantization"
      ],
      "dependents": [],
      "steps": [
        "导出 ONNX",
        "图检查和简化",
        "ONNX Runtime",
        "精度对齐",
        "部署到另一个后端"
      ],
      "resources": [
        {
          "label": "ONNX Runtime",
          "url": "https://onnxruntime.ai/docs/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "edge-infer",
      "areaId": "infra",
      "name": "端侧推理",
      "intro": "会用 llama.cpp 这类工具，能在笔记本和手机上跑起大模型。",
      "icon": "smartphone",
      "parent": "quantization",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "cpp",
        "quantization"
      ],
      "dependents": [],
      "steps": [
        "GGUF 和模型转换",
        "量化等级的取舍",
        "CPU 和 Metal 加速",
        "在手机上跑模型",
        "在笔记本上跑 7B 模型"
      ],
      "resources": [
        {
          "label": "llama.cpp 构建与使用",
          "url": "https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "sglang",
      "areaId": "infra",
      "name": "SGLang",
      "intro": "会部署 SGLang，能用 RadixAttention 和结构化输出优化推理。",
      "icon": "git-compare",
      "parent": "vllm",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "vllm"
      ],
      "dependents": [],
      "steps": [
        "部署和接口",
        "RadixAttention",
        "结构化输出",
        "性能调优",
        "用 SGLang 上线服务"
      ],
      "resources": [
        {
          "label": "SGLang 文档",
          "url": "https://docs.sglang.ai/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "spec-decode",
      "areaId": "infra",
      "name": "投机解码",
      "intro": "会用小模型草拟、大模型验证，能在同样的显卡上让模型出字更快。",
      "icon": "fast-forward",
      "parent": "vllm",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "vllm"
      ],
      "dependents": [],
      "steps": [
        "投机解码原理",
        "草稿模型的选择",
        "接受率和加速比",
        "在 vLLM 里开启",
        "测出加速效果"
      ],
      "resources": [
        {
          "label": "投机解码论文",
          "url": "https://arxiv.org/abs/2211.17192",
          "kind": "论文",
          "free": true
        },
        {
          "label": "vLLM 投机解码",
          "url": "https://docs.vllm.ai/en/latest/features/spec_decode.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "serving",
      "areaId": "infra",
      "name": "推理服务运维",
      "intro": "会把推理引擎跑成线上服务，能做扩缩容、灰度发布和故障恢复。",
      "icon": "cloud",
      "parent": "vllm",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "observability",
        "vllm"
      ],
      "dependents": [
        "bench"
      ],
      "steps": [
        "推理服务的架构",
        "容器化部署",
        "扩缩容",
        "灰度发布",
        "故障恢复演练",
        "上线一个推理服务"
      ],
      "resources": [
        {
          "label": "vLLM 生产部署",
          "url": "https://docs.vllm.ai/en/latest/deployment/k8s.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "dist-infer",
      "areaId": "infra",
      "name": "分布式推理",
      "intro": "会用张量并行和流水线并行，能把一个大模型拆到多张卡上跑起来。",
      "icon": "network",
      "parent": "vllm",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "distributed",
        "vllm"
      ],
      "dependents": [],
      "steps": [
        "张量并行",
        "流水线并行",
        "多卡通信开销",
        "多机部署",
        "把 70B 模型跑在多卡上"
      ],
      "resources": [
        {
          "label": "vLLM 文档（并行与扩展一节）",
          "url": "https://docs.vllm.ai/en/latest/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "cuda",
      "areaId": "infra",
      "name": "CUDA",
      "intro": "会用 CUDA 写 kernel，能用线程块、共享内存和访存合并把它写快。",
      "icon": "si:nvidia",
      "parent": "gpu-arch",
      "language": true,
      "weight": 10,
      "prerequisites": [
        "gpu-arch"
      ],
      "dependents": [
        "gpu-perf",
        "triton",
        "nccl",
        "trt-llm"
      ],
      "steps": [
        "线程、块和网格",
        "全局和共享内存",
        "访存合并",
        "同步和原子操作",
        "手写矩阵乘 kernel"
      ],
      "resources": [
        {
          "label": "CUDA 编程指南",
          "url": "https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "bench",
      "areaId": "infra",
      "name": "推理压测",
      "intro": "会测首字延迟、吞吐和成本，能用数字比较两套推理方案。",
      "icon": "timer",
      "parent": "serving",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "serving"
      ],
      "dependents": [],
      "steps": [
        "TTFT 和 TPOT",
        "构造真实负载",
        "压测工具",
        "成本核算",
        "写一份对比报告"
      ],
      "resources": [
        {
          "label": "vLLM 基准测试",
          "url": "https://docs.vllm.ai/en/latest/contributing/benchmarks.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "inference"
      ]
    },
    {
      "id": "gpu-perf",
      "areaId": "infra",
      "name": "GPU 性能调优",
      "intro": "会用 Nsight 分析 kernel，能判断卡在算力还是访存并对症优化。",
      "icon": "activity",
      "parent": "cuda",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "perf",
        "cuda"
      ],
      "dependents": [
        "cutlass"
      ],
      "steps": [
        "Nsight 基本用法",
        "Roofline 模型",
        "访存瓶颈",
        "计算瓶颈",
        "把一个 kernel 调快"
      ],
      "resources": [
        {
          "label": "Nsight Compute",
          "url": "https://docs.nvidia.com/nsight-compute/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "GPU MODE 讲座",
          "url": "https://github.com/gpu-mode/lectures",
          "kind": "视频",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "triton",
      "areaId": "infra",
      "name": "Triton 算子",
      "intro": "会用 Triton 写 GPU kernel，能用 Python 写出接近手写 CUDA 的性能。",
      "icon": "microchip",
      "parent": "cuda",
      "language": false,
      "weight": 3,
      "prerequisites": [
        "pytorch",
        "cuda"
      ],
      "dependents": [
        "flash-attn",
        "ai-compiler"
      ],
      "steps": [
        "编程模型和块",
        "写向量加法",
        "写 softmax",
        "写矩阵乘",
        "自动调参",
        "写一个融合算子"
      ],
      "resources": [
        {
          "label": "Triton 教程",
          "url": "https://triton-lang.org/main/getting-started/tutorials/index.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "nccl",
      "areaId": "infra",
      "name": "集合通信",
      "intro": "会用 AllReduce、AllGather 这些集合通信，能说清多卡之间的数据怎么流。",
      "icon": "arrow-left-right",
      "parent": "cuda",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "networking",
        "cuda"
      ],
      "dependents": [
        "dist-train"
      ],
      "steps": [
        "集合通信原语",
        "环形和树形算法",
        "带宽和延迟",
        "拓扑和 NVLink",
        "测出多卡通信带宽"
      ],
      "resources": [
        {
          "label": "NCCL 文档",
          "url": "https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "trt-llm",
      "areaId": "infra",
      "name": "TensorRT-LLM",
      "intro": "会用 TensorRT-LLM 编译模型，能在 NVIDIA 显卡上跑出更高吞吐。",
      "icon": "square-stack",
      "parent": "vllm",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "vllm",
        "cuda"
      ],
      "dependents": [],
      "steps": [
        "模型编译",
        "量化和插件",
        "推理服务",
        "性能调优",
        "编译部署一个模型"
      ],
      "resources": [
        {
          "label": "TensorRT-LLM 文档",
          "url": "https://nvidia.github.io/TensorRT-LLM/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "cutlass",
      "areaId": "infra",
      "name": "CUTLASS",
      "intro": "会用 CUTLASS 和 CuTe 写矩阵乘，能把它调到接近硬件峰值。",
      "icon": "grid-2x2",
      "parent": "gpu-perf",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "gpu-perf"
      ],
      "dependents": [],
      "steps": [
        "CUTLASS 的结构",
        "CuTe 布局",
        "Tensor Core 编程",
        "流水线和调优",
        "写一个高性能 GEMM"
      ],
      "resources": [
        {
          "label": "CUTLASS",
          "url": "https://github.com/NVIDIA/cutlass",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "flash-attn",
      "areaId": "infra",
      "name": "注意力算子",
      "intro": "会手写融合注意力 kernel，能讲清 FlashAttention 为什么快。",
      "icon": "focus",
      "parent": "triton",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "nlp",
        "triton"
      ],
      "dependents": [],
      "steps": [
        "标准注意力的瓶颈",
        "分块和在线 softmax",
        "前向 kernel",
        "反向传播",
        "手写融合注意力"
      ],
      "resources": [
        {
          "label": "FlashAttention 论文",
          "url": "https://arxiv.org/abs/2205.14135",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "dist-train",
      "areaId": "infra",
      "name": "分布式训练",
      "intro": "会用数据并行、FSDP 和混合精度，能用多张卡训练一个模型。",
      "icon": "layers",
      "parent": "dlsys",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "distributed",
        "dlsys",
        "nccl"
      ],
      "dependents": [
        "train-framework"
      ],
      "steps": [
        "数据并行",
        "混合精度",
        "FSDP 和 ZeRO",
        "梯度累积和重算",
        "用多卡训一个模型"
      ],
      "resources": [
        {
          "label": "PyTorch 分布式概览",
          "url": "https://pytorch.org/tutorials/beginner/dist_overview.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "ai-compiler",
      "areaId": "infra",
      "name": "AI 编译器",
      "intro": "会讲清图优化、算子融合和代码生成，能把模型编译成高效的 kernel。",
      "icon": "workflow",
      "parent": "mlir",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "mlir",
        "triton"
      ],
      "dependents": [
        "tvm"
      ],
      "steps": [
        "计算图和中间表示",
        "图优化和算子融合",
        "调度和代码生成",
        "torch.compile",
        "编译一个模型提速"
      ],
      "resources": [
        {
          "label": "torch.compile 教程",
          "url": "https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html",
          "kind": "文档",
          "free": true
        },
        {
          "label": "MLIR",
          "url": "https://mlir.llvm.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "train-framework",
      "areaId": "infra",
      "name": "大模型训练框架",
      "intro": "会用 DeepSpeed、Megatron-LM，能训练几十亿参数的模型。",
      "icon": "dumbbell",
      "parent": "dist-train",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "dist-train"
      ],
      "dependents": [],
      "steps": [
        "DeepSpeed ZeRO",
        "Megatron 并行",
        "3D 并行",
        "检查点和容错",
        "训一个十亿参数模型"
      ],
      "resources": [
        {
          "label": "DeepSpeed",
          "url": "https://www.deepspeed.ai/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Megatron-LM 文档",
          "url": "https://docs.nvidia.com/megatron-core/developer-guide/latest/index.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "tvm",
      "areaId": "infra",
      "name": "TVM",
      "intro": "会用 TVM 描述算子，能为不同硬件自动生成和调优代码。",
      "icon": "route",
      "parent": "ai-compiler",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "ai-compiler"
      ],
      "dependents": [],
      "steps": [
        "张量表达式",
        "调度原语",
        "自动调优",
        "多硬件后端",
        "为一个算子调出性能"
      ],
      "resources": [
        {
          "label": "Apache TVM",
          "url": "https://tvm.apache.org/docs/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": []
    },
    {
      "id": "robotics",
      "areaId": "robotics",
      "name": "机器人学基础",
      "intro": "会算机械臂的正逆运动学和简单控制，能让仿真里的机械臂按指令走到目标位置。",
      "icon": "axis-3d",
      "parent": "numpy",
      "language": false,
      "weight": 7,
      "prerequisites": [
        "numpy"
      ],
      "dependents": [
        "ros",
        "robot-sim",
        "slam",
        "ad-planning"
      ],
      "steps": [
        "刚体位姿和坐标变换",
        "正运动学",
        "逆运动学和雅可比",
        "PID 和轨迹控制",
        "让机械臂走到目标点"
      ],
      "resources": [
        {
          "label": "Modern Robotics",
          "url": "https://hades.mech.northwestern.edu/index.php/Modern_Robotics",
          "kind": "书",
          "free": true
        },
        {
          "label": "MIT Underactuated Robotics",
          "url": "https://underactuated.csail.mit.edu/",
          "kind": "课程",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "ros",
      "areaId": "robotics",
      "name": "ROS 2",
      "intro": "会用 ROS 2 写节点、话题和服务，能把传感器、算法和电机连成一个能跑的机器人系统。",
      "icon": "si:ros",
      "parent": "robotics",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "linux",
        "cpp",
        "robotics"
      ],
      "dependents": [],
      "steps": [
        "节点、话题和服务",
        "写一个 C++ 节点",
        "坐标变换 TF2",
        "Launch 和参数",
        "让小车跑通感知到控制"
      ],
      "resources": [
        {
          "label": "ROS 2 官方教程",
          "url": "https://docs.ros.org/en/jazzy/Tutorials.html",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied",
        "autodrive"
      ]
    },
    {
      "id": "robot-sim",
      "areaId": "robotics",
      "name": "机器人仿真",
      "intro": "会用 MuJoCo 或 Isaac 搭仿真环境，能在仿真里批量采数据、训练和测试机器人策略。",
      "icon": "rotate-3d",
      "parent": "robotics",
      "language": false,
      "weight": 2,
      "prerequisites": [
        "robotics"
      ],
      "dependents": [
        "imitation"
      ],
      "steps": [
        "物理引擎和模型文件",
        "搭一个仿真场景",
        "传感器和相机",
        "并行环境",
        "在仿真里训一个抓取策略"
      ],
      "resources": [
        {
          "label": "MuJoCo 文档",
          "url": "https://mujoco.readthedocs.io/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "Isaac Lab",
          "url": "https://isaac-sim.github.io/IsaacLab/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied"
      ]
    },
    {
      "id": "slam",
      "areaId": "robotics",
      "name": "SLAM 与 3D 视觉",
      "intro": "会多视图几何和点云处理，能用相机或激光跑通 SLAM，边走边建图并定位自己。",
      "icon": "map",
      "parent": "cv",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "cv",
        "robotics"
      ],
      "dependents": [
        "ad-perception"
      ],
      "steps": [
        "相机模型和标定",
        "特征点和多视图几何",
        "点云处理",
        "后端优化",
        "跑通一个视觉 SLAM"
      ],
      "resources": [
        {
          "label": "视觉 SLAM 十四讲",
          "url": "https://github.com/gaoxiang12/slambook2",
          "kind": "书",
          "free": true
        }
      ],
      "requiredBy": [
        "autodrive"
      ]
    },
    {
      "id": "ad-planning",
      "areaId": "robotics",
      "name": "规划与决策",
      "intro": "会路径规划、行为决策和轨迹优化，能让仿真里的车安全地变道、跟车和避障。",
      "icon": "spline",
      "parent": "optimization",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "optimization",
        "robotics"
      ],
      "dependents": [],
      "steps": [
        "车辆运动模型",
        "路径搜索：A* 和采样",
        "行为决策",
        "轨迹优化和 MPC",
        "在 CARLA 里跑通变道"
      ],
      "resources": [
        {
          "label": "Self-Driving Cars 专项课",
          "url": "https://www.coursera.org/specializations/self-driving-cars",
          "kind": "课程",
          "free": false
        },
        {
          "label": "CARLA",
          "url": "https://carla.org/",
          "kind": "文档",
          "free": true
        }
      ],
      "requiredBy": [
        "autodrive"
      ]
    },
    {
      "id": "imitation",
      "areaId": "robotics",
      "name": "模仿学习",
      "intro": "会用示范数据训练机器人策略，能用行为克隆或 Diffusion Policy 让机械臂学会一个动作。",
      "icon": "footprints",
      "parent": "robot-sim",
      "language": false,
      "weight": 1,
      "prerequisites": [
        "pytorch",
        "robot-sim"
      ],
      "dependents": [
        "vla"
      ],
      "steps": [
        "采集示范数据",
        "行为克隆",
        "动作分块和扩散策略",
        "评测和失败分析",
        "让机械臂学会叠一块布"
      ],
      "resources": [
        {
          "label": "LeRobot",
          "url": "https://github.com/huggingface/lerobot",
          "kind": "项目",
          "free": true
        },
        {
          "label": "Diffusion Policy",
          "url": "https://diffusion-policy.cs.columbia.edu/",
          "kind": "论文",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied"
      ]
    },
    {
      "id": "ad-perception",
      "areaId": "robotics",
      "name": "自动驾驶感知",
      "intro": "会多传感器融合和 BEV 感知，能从相机和雷达数据里检测出车、人和车道并跟踪它们。",
      "icon": "view",
      "parent": "slam",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "detection",
        "slam"
      ],
      "dependents": [],
      "steps": [
        "相机、激光雷达和毫米波",
        "3D 目标检测",
        "BEV 和多相机融合",
        "多目标跟踪",
        "跑通一个 3D 检测"
      ],
      "resources": [
        {
          "label": "nuScenes",
          "url": "https://www.nuscenes.org/",
          "kind": "文档",
          "free": true
        },
        {
          "label": "BEVFormer",
          "url": "https://github.com/fundamentalvision/BEVFormer",
          "kind": "项目",
          "free": true
        }
      ],
      "requiredBy": [
        "autodrive"
      ]
    },
    {
      "id": "vla",
      "areaId": "robotics",
      "name": "VLA 模型",
      "intro": "会用视觉-语言-动作模型做机器人控制，能微调一个 VLA，让机器人听懂指令去操作物体。",
      "icon": "hand",
      "parent": "imitation",
      "language": false,
      "weight": 0,
      "prerequisites": [
        "multimodal",
        "imitation"
      ],
      "dependents": [],
      "steps": [
        "从图文模型到动作输出",
        "动作的表示和解码",
        "机器人数据集",
        "在自己的数据上微调",
        "让机器人按一句话完成任务"
      ],
      "resources": [
        {
          "label": "OpenVLA",
          "url": "https://openvla.github.io/",
          "kind": "论文",
          "free": true
        },
        {
          "label": "π0",
          "url": "https://www.physicalintelligence.company/blog/pi0",
          "kind": "文章",
          "free": true
        }
      ],
      "requiredBy": [
        "embodied"
      ]
    }
  ],
  "categories": [
    {
      "id": "dev",
      "name": "开发",
      "intro": "做产品：网站、App 和游戏，从界面到接口。",
      "subIds": [
        "backend",
        "frontend",
        "mobile",
        "gamedev",
        "product-eng"
      ]
    },
    {
      "id": "qa-ops",
      "name": "测试与运维",
      "intro": "保证东西不出错、一直在线：测试、部署、监控。",
      "subIds": [
        "test-dev",
        "sre"
      ]
    },
    {
      "id": "systems",
      "name": "系统",
      "intro": "贴近硬件和底层：嵌入式、存储、消息队列。",
      "subIds": [
        "systems-eng",
        "distributed-eng"
      ]
    },
    {
      "id": "security",
      "name": "安全",
      "intro": "找漏洞、补漏洞。",
      "subIds": [
        "security"
      ]
    },
    {
      "id": "data",
      "name": "数据",
      "intro": "和数据打交道：分析、处理，用数据研究市场。",
      "subIds": [
        "data-analyst",
        "data",
        "quant"
      ]
    },
    {
      "id": "ai",
      "name": "AI",
      "intro": "做 AI：训练模型、用模型做应用、让模型跑得更快，让机器人和汽车动起来，用 AI 做科研。",
      "subIds": [
        "ml-algo",
        "llm-algo",
        "ai-app",
        "inference",
        "embodied",
        "autodrive",
        "ai4s"
      ]
    }
  ],
  "subs": [
    {
      "id": "backend",
      "categoryId": "dev",
      "name": "后端开发工程师",
      "intro": "写业务接口和数据库，让一个产品的服务稳定地跑起来。",
      "brief": "写接口和数据库",
      "icon": "server",
      "anchor": "postgres",
      "items": [
        "接口",
        "数据库",
        "缓存"
      ],
      "topics": [
        "设计接口和数据表",
        "加缓存和队列",
        "排查线上问题"
      ],
      "projects": [
        {
          "label": "ByteByteGo",
          "url": "https://bytebytego.com/"
        }
      ],
      "requirements": [
        "ci",
        "postgres",
        "system-design"
      ],
      "bonus": [
        "java",
        "go"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "postgres",
          "step": 4
        },
        {
          "skillId": "fastapi",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "redis",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "distributed",
          "step": 7
        },
        {
          "skillId": "system-design",
          "step": 8
        }
      ]
    },
    {
      "id": "frontend",
      "categoryId": "dev",
      "name": "前端开发工程师",
      "intro": "做网页和 Web 应用的界面。",
      "brief": "做网页和 Web 应用",
      "icon": "layout-template",
      "anchor": "design-system",
      "items": [
        "React",
        "TypeScript",
        "全栈"
      ],
      "topics": [
        "做交互复杂的页面",
        "做组件库",
        "一个人做完全栈应用"
      ],
      "projects": [
        {
          "label": "Full Stack Open",
          "url": "https://fullstackopen.com/zh/"
        }
      ],
      "requirements": [
        "ci",
        "auth",
        "e2e",
        "build-tools",
        "web-perf",
        "nextjs",
        "design-system"
      ],
      "bonus": [
        "fastapi",
        "vue",
        "tailwind",
        "threejs"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "html",
          "step": 2
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "javascript",
          "step": 3
        },
        {
          "skillId": "figma",
          "step": 3
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "auth",
          "step": 4
        },
        {
          "skillId": "typescript",
          "step": 4
        },
        {
          "skillId": "node",
          "step": 4
        },
        {
          "skillId": "browser",
          "step": 4
        },
        {
          "skillId": "e2e",
          "step": 4
        },
        {
          "skillId": "react",
          "step": 5
        },
        {
          "skillId": "build-tools",
          "step": 5
        },
        {
          "skillId": "web-perf",
          "step": 5
        },
        {
          "skillId": "nextjs",
          "step": 6
        },
        {
          "skillId": "design-system",
          "step": 6
        }
      ]
    },
    {
      "id": "mobile",
      "categoryId": "dev",
      "name": "客户端开发工程师",
      "intro": "做 iOS 和 Android 应用。",
      "brief": "做 iOS 和安卓应用",
      "icon": "smartphone",
      "anchor": "app-release",
      "items": [
        "iOS",
        "Android",
        "跨平台"
      ],
      "topics": [
        "做原生 App",
        "做跨平台 App",
        "上架应用商店"
      ],
      "projects": [
        {
          "label": "React Native",
          "url": "https://github.com/facebook/react-native"
        }
      ],
      "requirements": [
        "ci",
        "auth",
        "swiftui",
        "compose",
        "app-release"
      ],
      "bonus": [
        "dart",
        "flutter"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "html",
          "step": 2
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "java",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "javascript",
          "step": 3
        },
        {
          "skillId": "swift",
          "step": 3
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "auth",
          "step": 4
        },
        {
          "skillId": "typescript",
          "step": 4
        },
        {
          "skillId": "kotlin",
          "step": 4
        },
        {
          "skillId": "swiftui",
          "step": 4
        },
        {
          "skillId": "react",
          "step": 5
        },
        {
          "skillId": "compose",
          "step": 5
        },
        {
          "skillId": "react-native",
          "step": 6
        },
        {
          "skillId": "app-release",
          "step": 7
        }
      ]
    },
    {
      "id": "gamedev",
      "categoryId": "dev",
      "name": "游戏开发工程师",
      "intro": "用游戏引擎和图形学做出能玩的游戏。",
      "brief": "用引擎做能玩的游戏",
      "icon": "gamepad",
      "anchor": "physics",
      "items": [
        "引擎",
        "图形学",
        "玩法"
      ],
      "topics": [
        "写游戏玩法",
        "做渲染效果",
        "优化帧率"
      ],
      "projects": [
        {
          "label": "Godot",
          "url": "https://github.com/godotengine/godot"
        }
      ],
      "requirements": [
        "ci",
        "shader",
        "netcode",
        "physics",
        "perf"
      ],
      "bonus": [],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "java",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "csharp",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "perf",
          "step": 5
        },
        {
          "skillId": "graphics",
          "step": 6
        },
        {
          "skillId": "shader",
          "step": 7
        },
        {
          "skillId": "game-engine",
          "step": 7
        },
        {
          "skillId": "gameplay",
          "step": 8
        },
        {
          "skillId": "netcode",
          "step": 8
        },
        {
          "skillId": "physics",
          "step": 9
        }
      ]
    },
    {
      "id": "product-eng",
      "categoryId": "dev",
      "name": "全栈 / 独立开发",
      "intro": "前后端一个人包，能把产品从设计做到上线收费。",
      "brief": "一个人做产品到收费",
      "icon": "laptop",
      "anchor": "indie",
      "items": [
        "产品",
        "分发",
        "收入"
      ],
      "topics": [
        "做一个付费产品",
        "在 X 上分发",
        "用自部署模型压成本"
      ],
      "projects": [
        {
          "label": "Pieter Levels",
          "url": "https://levels.io/"
        },
        {
          "label": "Indie Hackers",
          "url": "https://www.indiehackers.com/"
        }
      ],
      "requirements": [
        "growth",
        "indie",
        "rag"
      ],
      "bonus": [
        "tailwind",
        "react-native",
        "nginx",
        "data-eng",
        "analytics",
        "vllm"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "html",
          "step": 2
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "javascript",
          "step": 3
        },
        {
          "skillId": "figma",
          "step": 3
        },
        {
          "skillId": "opensource",
          "step": 4
        },
        {
          "skillId": "postgres",
          "step": 4
        },
        {
          "skillId": "fastapi",
          "step": 4
        },
        {
          "skillId": "auth",
          "step": 4
        },
        {
          "skillId": "stripe",
          "step": 4
        },
        {
          "skillId": "typescript",
          "step": 4
        },
        {
          "skillId": "node",
          "step": 4
        },
        {
          "skillId": "writing",
          "step": 5
        },
        {
          "skillId": "react",
          "step": 5
        },
        {
          "skillId": "llm-app",
          "step": 5
        },
        {
          "skillId": "vector-db",
          "step": 5
        },
        {
          "skillId": "x-share",
          "step": 6
        },
        {
          "skillId": "nextjs",
          "step": 6
        },
        {
          "skillId": "rag",
          "step": 6
        },
        {
          "skillId": "growth",
          "step": 7
        },
        {
          "skillId": "indie",
          "step": 7
        }
      ]
    },
    {
      "id": "test-dev",
      "categoryId": "qa-ops",
      "name": "测试开发工程师",
      "intro": "写自动化测试和测试平台，保证上线不出错。",
      "brief": "写自动化测试",
      "icon": "clipboard-check",
      "anchor": "e2e",
      "items": [
        "自动化测试",
        "接口测试",
        "性能测试"
      ],
      "topics": [
        "写自动化测试用例和脚本",
        "搭测试平台，接进 CI",
        "做接口测试和性能压测"
      ],
      "projects": [
        {
          "label": "pytest",
          "url": "https://github.com/pytest-dev/pytest"
        },
        {
          "label": "Playwright",
          "url": "https://github.com/microsoft/playwright"
        }
      ],
      "requirements": [
        "shell",
        "java",
        "leetcode",
        "ci",
        "e2e",
        "perf"
      ],
      "bonus": [
        "observability",
        "fuzzing"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "discrete",
          "step": 2
        },
        {
          "skillId": "shell",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "html",
          "step": 2
        },
        {
          "skillId": "dsa",
          "step": 3
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "java",
          "step": 3
        },
        {
          "skillId": "javascript",
          "step": 3
        },
        {
          "skillId": "leetcode",
          "step": 4
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "e2e",
          "step": 4
        },
        {
          "skillId": "perf",
          "step": 5
        }
      ]
    },
    {
      "id": "sre",
      "categoryId": "qa-ops",
      "name": "运维 / SRE 工程师",
      "intro": "管线上服务：部署、监控、扩容和故障处理。",
      "brief": "部署、监控、处理故障",
      "icon": "life-buoy",
      "anchor": "incident",
      "items": [
        "Kubernetes",
        "监控",
        "云"
      ],
      "topics": [
        "搭监控和告警",
        "管 Kubernetes 集群",
        "处理线上故障"
      ],
      "projects": [
        {
          "label": "Google SRE 书",
          "url": "https://sre.google/books/"
        }
      ],
      "requirements": [
        "shell",
        "ci",
        "nginx",
        "iac",
        "go",
        "incident"
      ],
      "bonus": [
        "virtualization",
        "ebpf"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "shell",
          "step": 2
        },
        {
          "skillId": "git",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "github",
          "step": 3
        },
        {
          "skillId": "testing",
          "step": 3
        },
        {
          "skillId": "cloud",
          "step": 3
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "ci",
          "step": 4
        },
        {
          "skillId": "iac",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "nginx",
          "step": 6
        },
        {
          "skillId": "k8s",
          "step": 6
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "observability",
          "step": 7
        },
        {
          "skillId": "go",
          "step": 7
        },
        {
          "skillId": "incident",
          "step": 8
        }
      ]
    },
    {
      "id": "systems-eng",
      "categoryId": "systems",
      "name": "嵌入式工程师",
      "intro": "写贴近硬件的软件：单片机、驱动、内核。",
      "brief": "写贴近硬件的软件",
      "icon": "server-cog",
      "anchor": "rtos",
      "items": [
        "单片机",
        "驱动",
        "RTOS"
      ],
      "topics": [
        "写单片机和 RTOS 固件",
        "写驱动、调内核",
        "用调试器排查硬件问题"
      ],
      "projects": [
        {
          "label": "Linux",
          "url": "https://github.com/torvalds/linux"
        },
        {
          "label": "Zephyr",
          "url": "https://github.com/zephyrproject-rtos/zephyr"
        }
      ],
      "requirements": [
        "gdb",
        "networking",
        "cpp",
        "arch",
        "concurrency",
        "rtos",
        "driver"
      ],
      "bonus": [
        "compiler",
        "perf",
        "rust",
        "llvm",
        "ebpf"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "arch",
          "step": 4
        },
        {
          "skillId": "gdb",
          "step": 5
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "embedded",
          "step": 5
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "kernel",
          "step": 6
        },
        {
          "skillId": "rtos",
          "step": 6
        },
        {
          "skillId": "driver",
          "step": 7
        }
      ]
    },
    {
      "id": "distributed-eng",
      "categoryId": "systems",
      "name": "基础架构工程师",
      "intro": "做别的团队用的底座：存储、消息队列、数据库。",
      "brief": "做存储和消息队列",
      "icon": "earth",
      "anchor": "kafka",
      "items": [
        "共识",
        "存储",
        "数据库"
      ],
      "topics": [
        "做复制和分片",
        "写存储引擎",
        "保证一致性"
      ],
      "projects": [
        {
          "label": "etcd",
          "url": "https://github.com/etcd-io/etcd"
        },
        {
          "label": "PostgreSQL",
          "url": "https://github.com/postgres/postgres"
        }
      ],
      "requirements": [
        "go",
        "db-internals",
        "kafka",
        "system-design"
      ],
      "bonus": [
        "java",
        "leetcode",
        "cloud"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "discrete",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "dsa",
          "step": 3
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "fastapi",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "redis",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "go",
          "step": 7
        },
        {
          "skillId": "distributed",
          "step": 7
        },
        {
          "skillId": "db-internals",
          "step": 7
        },
        {
          "skillId": "kafka",
          "step": 8
        },
        {
          "skillId": "system-design",
          "step": 8
        }
      ]
    },
    {
      "id": "security",
      "categoryId": "security",
      "name": "安全工程师",
      "intro": "找漏洞、补漏洞：Web、二进制、渗透都会。",
      "brief": "找漏洞、补漏洞",
      "icon": "fingerprint",
      "anchor": "reverse",
      "items": [
        "Web 安全",
        "二进制",
        "CTF"
      ],
      "topics": [
        "渗透测试",
        "漏洞挖掘",
        "参加 CTF"
      ],
      "projects": [
        {
          "label": "OWASP",
          "url": "https://owasp.org/"
        }
      ],
      "requirements": [
        "pentest",
        "reverse",
        "ctf",
        "fuzzing"
      ],
      "bonus": [],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "gdb",
          "step": 5
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "security",
          "step": 5
        },
        {
          "skillId": "crypto",
          "step": 6
        },
        {
          "skillId": "web-security",
          "step": 6
        },
        {
          "skillId": "pwn",
          "step": 6
        },
        {
          "skillId": "pentest",
          "step": 7
        },
        {
          "skillId": "reverse",
          "step": 7
        },
        {
          "skillId": "ctf",
          "step": 7
        },
        {
          "skillId": "fuzzing",
          "step": 7
        }
      ]
    },
    {
      "id": "data-analyst",
      "categoryId": "data",
      "name": "数据分析师",
      "intro": "用 SQL 和统计回答业务问题，做实验和报表。",
      "brief": "用数据回答业务问题",
      "icon": "chart-pie",
      "anchor": "ab-test",
      "items": [
        "SQL",
        "统计",
        "A/B 实验"
      ],
      "topics": [
        "写 SQL 取数、做报表",
        "设计和分析 A/B 实验",
        "搭指标体系，找出业务问题"
      ],
      "projects": [
        {
          "label": "Metabase",
          "url": "https://github.com/metabase/metabase"
        },
        {
          "label": "Apache Superset",
          "url": "https://github.com/apache/superset"
        }
      ],
      "requirements": [
        "viz",
        "ab-test"
      ],
      "bonus": [
        "timeseries",
        "feature"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "pandas",
          "step": 4
        },
        {
          "skillId": "analytics",
          "step": 4
        },
        {
          "skillId": "viz",
          "step": 5
        },
        {
          "skillId": "ab-test",
          "step": 5
        }
      ]
    },
    {
      "id": "data",
      "categoryId": "data",
      "name": "数据开发工程师",
      "intro": "搭数据管道和数仓，用 Spark 处理大数据。",
      "brief": "搭数据管道和数仓",
      "icon": "database",
      "anchor": "spark",
      "items": [
        "ETL",
        "Spark",
        "数仓"
      ],
      "topics": [
        "搭数据管道",
        "处理大规模数据",
        "做数据报表和分析"
      ],
      "projects": [
        {
          "label": "Apache Airflow",
          "url": "https://github.com/apache/airflow"
        },
        {
          "label": "dbt",
          "url": "https://github.com/dbt-labs/dbt-core"
        }
      ],
      "requirements": [
        "cloud",
        "kafka",
        "spark"
      ],
      "bonus": [
        "analytics",
        "viz",
        "timeseries"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "cloud",
          "step": 3
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "data-eng",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "distributed",
          "step": 7
        },
        {
          "skillId": "kafka",
          "step": 8
        },
        {
          "skillId": "spark",
          "step": 8
        }
      ]
    },
    {
      "id": "quant",
      "categoryId": "data",
      "name": "量化研究员",
      "intro": "用数据研究市场，做出能实盘的策略。门槛高、招的人少。",
      "brief": "用数据做交易策略",
      "icon": "chart-spline",
      "anchor": "portfolio",
      "items": [
        "回测",
        "因子",
        "风控"
      ],
      "topics": [
        "做回测",
        "研究因子",
        "控制风险"
      ],
      "projects": [
        {
          "label": "Qlib",
          "url": "https://github.com/microsoft/qlib"
        }
      ],
      "requirements": [
        "sql",
        "cpp",
        "derivatives",
        "viz",
        "factor",
        "portfolio",
        "gbdt"
      ],
      "bonus": [],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "pandas",
          "step": 4
        },
        {
          "skillId": "derivatives",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "viz",
          "step": 5
        },
        {
          "skillId": "timeseries",
          "step": 5
        },
        {
          "skillId": "gbdt",
          "step": 5
        },
        {
          "skillId": "quant-research",
          "step": 6
        },
        {
          "skillId": "factor",
          "step": 6
        },
        {
          "skillId": "risk",
          "step": 7
        },
        {
          "skillId": "portfolio",
          "step": 8
        }
      ]
    },
    {
      "id": "ml-algo",
      "categoryId": "ai",
      "name": "机器学习算法工程师",
      "intro": "做推荐、搜索、广告、视觉这些线上模型，用模型直接提升业务指标。",
      "brief": "做推荐、搜索、广告",
      "icon": "target",
      "anchor": "ranking",
      "items": [
        "推荐",
        "视觉",
        "特征"
      ],
      "topics": [
        "做召回和排序模型",
        "做图像识别",
        "分析线上实验"
      ],
      "projects": [
        {
          "label": "scikit-learn",
          "url": "https://github.com/scikit-learn/scikit-learn"
        },
        {
          "label": "Ultralytics YOLO",
          "url": "https://github.com/ultralytics/ultralytics"
        }
      ],
      "requirements": [
        "ab-test",
        "feature",
        "gbdt",
        "ranking",
        "detection"
      ],
      "bonus": [
        "rl",
        "mlops",
        "multimodal"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "pandas",
          "step": 4
        },
        {
          "skillId": "analytics",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "ab-test",
          "step": 5
        },
        {
          "skillId": "feature",
          "step": 5
        },
        {
          "skillId": "gbdt",
          "step": 5
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "recsys",
          "step": 6
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "ranking",
          "step": 7
        },
        {
          "skillId": "cv",
          "step": 7
        },
        {
          "skillId": "detection",
          "step": 8
        }
      ]
    },
    {
      "id": "llm-algo",
      "categoryId": "ai",
      "name": "大模型算法工程师",
      "intro": "从零预训练基座模型，再用指令微调和强化学习把它调成好用的助手。",
      "brief": "训练和调教大模型",
      "icon": "atom",
      "anchor": "reasoning-rl",
      "items": [
        "预训练",
        "后训练",
        "评测"
      ],
      "topics": [
        "清洗和配比训练数据",
        "做指令微调和偏好优化",
        "训练推理模型"
      ],
      "projects": [
        {
          "label": "OLMo",
          "url": "https://github.com/allenai/OLMo"
        },
        {
          "label": "Hugging Face TRL",
          "url": "https://github.com/huggingface/trl"
        }
      ],
      "requirements": [
        "pretrain-run",
        "reasoning-rl"
      ],
      "bonus": [
        "english",
        "distillation",
        "dlsys",
        "dist-train",
        "train-framework"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "data-eng",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "rl",
          "step": 6
        },
        {
          "skillId": "nlp",
          "step": 7
        },
        {
          "skillId": "gpt",
          "step": 8
        },
        {
          "skillId": "hf",
          "step": 8
        },
        {
          "skillId": "finetune",
          "step": 9
        },
        {
          "skillId": "llm-data",
          "step": 9
        },
        {
          "skillId": "sft",
          "step": 10
        },
        {
          "skillId": "rlhf",
          "step": 10
        },
        {
          "skillId": "scaling",
          "step": 10
        },
        {
          "skillId": "pretrain-run",
          "step": 11
        },
        {
          "skillId": "llm-eval",
          "step": 11
        },
        {
          "skillId": "reasoning-rl",
          "step": 12
        }
      ]
    },
    {
      "id": "ai-app",
      "categoryId": "ai",
      "name": "AI 应用工程师",
      "intro": "用大模型做应用：RAG、Agent、评测。",
      "brief": "把大模型做成产品",
      "icon": "bot-message-square",
      "anchor": "mcp",
      "items": [
        "RAG",
        "Agent",
        "后端"
      ],
      "topics": [
        "做问答和检索",
        "做 Agent 工作流",
        "接进业务系统"
      ],
      "projects": [
        {
          "label": "LangGraph",
          "url": "https://github.com/langchain-ai/langgraph"
        },
        {
          "label": "MCP 服务器",
          "url": "https://github.com/modelcontextprotocol/servers"
        }
      ],
      "requirements": [
        "prompt",
        "eval",
        "finetune",
        "mcp"
      ],
      "bonus": [
        "testing",
        "websocket",
        "system-design",
        "multimodal",
        "voice"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "sql",
          "step": 3
        },
        {
          "skillId": "web-api",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "postgres",
          "step": 4
        },
        {
          "skillId": "fastapi",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "llm-app",
          "step": 5
        },
        {
          "skillId": "vector-db",
          "step": 5
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "prompt",
          "step": 6
        },
        {
          "skillId": "eval",
          "step": 6
        },
        {
          "skillId": "rag",
          "step": 6
        },
        {
          "skillId": "nlp",
          "step": 7
        },
        {
          "skillId": "agent",
          "step": 7
        },
        {
          "skillId": "gpt",
          "step": 8
        },
        {
          "skillId": "hf",
          "step": 8
        },
        {
          "skillId": "mcp",
          "step": 8
        },
        {
          "skillId": "finetune",
          "step": 9
        }
      ]
    },
    {
      "id": "inference",
      "categoryId": "ai",
      "name": "AI Infra 工程师",
      "intro": "让模型训练和推理跑得更快更省：推理引擎、GPU 算子、分布式。",
      "brief": "让模型跑得更快更省",
      "icon": "circle-gauge",
      "anchor": "dist-infer",
      "items": [
        "推理引擎",
        "GPU",
        "分布式"
      ],
      "topics": [
        "部署和优化推理服务",
        "写和调优 GPU 算子",
        "让多卡训练和推理跑得稳"
      ],
      "projects": [
        {
          "label": "vLLM",
          "url": "https://github.com/vllm-project/vllm"
        },
        {
          "label": "llama.cpp",
          "url": "https://github.com/ggml-org/llama.cpp"
        },
        {
          "label": "Triton",
          "url": "https://github.com/triton-lang/triton"
        }
      ],
      "requirements": [
        "quantization",
        "dist-infer",
        "cuda",
        "bench"
      ],
      "bonus": [
        "mlir",
        "onnx",
        "edge-infer",
        "sglang",
        "spec-decode",
        "gpu-perf",
        "triton",
        "nccl",
        "trt-llm",
        "cutlass",
        "flash-attn",
        "ai-compiler",
        "tvm"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "docker",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "csapp",
          "step": 4
        },
        {
          "skillId": "arch",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "networking",
          "step": 5
        },
        {
          "skillId": "os",
          "step": 5
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "k8s",
          "step": 6
        },
        {
          "skillId": "concurrency",
          "step": 6
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "parallel",
          "step": 6
        },
        {
          "skillId": "observability",
          "step": 7
        },
        {
          "skillId": "distributed",
          "step": 7
        },
        {
          "skillId": "nlp",
          "step": 7
        },
        {
          "skillId": "quantization",
          "step": 7
        },
        {
          "skillId": "gpu-arch",
          "step": 7
        },
        {
          "skillId": "gpt",
          "step": 8
        },
        {
          "skillId": "cuda",
          "step": 8
        },
        {
          "skillId": "vllm",
          "step": 9
        },
        {
          "skillId": "serving",
          "step": 10
        },
        {
          "skillId": "dist-infer",
          "step": 10
        },
        {
          "skillId": "bench",
          "step": 11
        }
      ]
    },
    {
      "id": "embodied",
      "categoryId": "ai",
      "name": "具身智能算法工程师",
      "intro": "让机器人在真实世界里看、想、动：用示范数据和大模型教它抓取、操作和走路。",
      "brief": "让机器人学会干活",
      "icon": "bot",
      "anchor": "vla",
      "items": [
        "机器人",
        "模仿学习",
        "VLA"
      ],
      "topics": [
        "采集和清洗机器人数据",
        "训练和微调操作策略",
        "在仿真和真机上测试"
      ],
      "projects": [
        {
          "label": "openpi",
          "url": "https://github.com/Physical-Intelligence/openpi"
        },
        {
          "label": "OpenVLA",
          "url": "https://github.com/openvla/openvla"
        }
      ],
      "requirements": [
        "rl",
        "ros",
        "vla"
      ],
      "bonus": [
        "edge-infer",
        "slam"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "robotics",
          "step": 4
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "robot-sim",
          "step": 5
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "rl",
          "step": 6
        },
        {
          "skillId": "ros",
          "step": 6
        },
        {
          "skillId": "cv",
          "step": 7
        },
        {
          "skillId": "nlp",
          "step": 7
        },
        {
          "skillId": "imitation",
          "step": 7
        },
        {
          "skillId": "multimodal",
          "step": 8
        },
        {
          "skillId": "vla",
          "step": 9
        }
      ]
    },
    {
      "id": "autodrive",
      "categoryId": "ai",
      "name": "自动驾驶算法工程师",
      "intro": "做自动驾驶的感知、预测和规划，让车在真实道路上安全地自己开。",
      "brief": "让车自己看路开车",
      "icon": "car",
      "anchor": "ad-perception",
      "items": [
        "感知",
        "规划",
        "BEV"
      ],
      "topics": [
        "训练感知和融合模型",
        "写规划和决策",
        "分析路测和仿真里的问题"
      ],
      "projects": [
        {
          "label": "Apollo",
          "url": "https://github.com/ApolloAuto/apollo"
        },
        {
          "label": "openpilot",
          "url": "https://github.com/commaai/openpilot"
        }
      ],
      "requirements": [
        "ros",
        "ad-planning",
        "ad-perception"
      ],
      "bonus": [
        "rl",
        "quantization",
        "cuda"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "linux",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "cs61b",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "cs61c",
          "step": 3
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "c",
          "step": 4
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "robotics",
          "step": 4
        },
        {
          "skillId": "cpp",
          "step": 5
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "ad-planning",
          "step": 5
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "ros",
          "step": 6
        },
        {
          "skillId": "cv",
          "step": 7
        },
        {
          "skillId": "detection",
          "step": 8
        },
        {
          "skillId": "slam",
          "step": 8
        },
        {
          "skillId": "ad-perception",
          "step": 9
        }
      ]
    },
    {
      "id": "ai4s",
      "categoryId": "ai",
      "name": "AI4S 算法工程师",
      "intro": "用 AI 做药物、材料和物理研究：预测分子性质和蛋白质结构，替代昂贵的模拟。多要硕博和一门理科背景。",
      "brief": "用 AI 加速科学研究",
      "icon": "microscope",
      "anchor": "molecule",
      "items": [
        "分子",
        "蛋白质",
        "科学计算"
      ],
      "topics": [
        "训练分子和材料模型",
        "跑结构预测和虚拟筛选",
        "和化学、生物的同事一起验证结果"
      ],
      "projects": [
        {
          "label": "Uni-Mol",
          "url": "https://github.com/deepmodeling/Uni-Mol"
        },
        {
          "label": "DeePMD-kit",
          "url": "https://github.com/deepmodeling/deepmd-kit"
        }
      ],
      "requirements": [
        "pinn",
        "molecule"
      ],
      "bonus": [
        "scaling",
        "dist-train"
      ],
      "plan": [
        {
          "skillId": "cs61a",
          "step": 1
        },
        {
          "skillId": "calculus",
          "step": 1
        },
        {
          "skillId": "python",
          "step": 2
        },
        {
          "skillId": "discrete",
          "step": 2
        },
        {
          "skillId": "math",
          "step": 2
        },
        {
          "skillId": "prob",
          "step": 3
        },
        {
          "skillId": "optimization",
          "step": 3
        },
        {
          "skillId": "numpy",
          "step": 3
        },
        {
          "skillId": "ml",
          "step": 4
        },
        {
          "skillId": "sci-compute",
          "step": 4
        },
        {
          "skillId": "dl",
          "step": 5
        },
        {
          "skillId": "pytorch",
          "step": 6
        },
        {
          "skillId": "gnn",
          "step": 7
        },
        {
          "skillId": "pinn",
          "step": 7
        },
        {
          "skillId": "molecule",
          "step": 8
        }
      ]
    }
  ]
}
