offer 谈判与职业路径:TC 拆解、级别匹配与长期成长
0. 元信息
- 主题路径:
docs/topics/career-and-interview/subtopics/offer-negotiation-and-growth/README.md - 父主题:
career-and-interview - 适合对象:拿到 1+ 个 offer 的工程师;尤其是”怕谈崩”或”不知该不该接”的人
- 建议周期:1~2 周
- 前置知识:已完成父主题前 4 阶段(策略 / 简历 / 算法 / 系统设计 + 行为)
- 最终目标:完成 1 次真实 offer 谈判(提升 ≥ 10% TC);完成 offer 比较表与入职 30/60/90 计划;建立 2 年成长地图
1. 学习路线
TC 拆解(base / bonus / RSU / sign-on / relocation)
→ 级别匹配(L4 / L5 / L6 / E4 等)
→ offer 比较矩阵(6 维度评分)
→ 谈判脚本(4 要素 + counter offer)
→ 跳槽时机与长期成长(18 个月规则 + 30/60/90 计划)
每一步都是下一步的前置:不会 TC 拆解就被 HR 数字游戏;不会级别匹配就接错 offer;不会谈判就亏 10~30%。
2. 阶段周数分配
| 阶段 | 1 周方案 | 2 周方案 | 备注 |
|---|---|---|---|
| 1. TC 拆解 + 级别匹配 | 0.5 | 0.5 | base / bonus / RSU / sign-on / relocation |
| 2. offer 比较矩阵(6 维度加权评分) | 0 | 0.5 | 至少 2 个 offer 比较 |
| 3. 谈判脚本 + counter offer | 0.5 | 0.5 | 4 要素分别谈(邮件 + 口头) |
| 4. 跳槽时机 + 30/60/90 + 2 年成长地图 | 0 | 0.5 | 入职前可向未来经理汇报 |
| 合计 | 1 | 2 |
1 周方案面向已锁 1 个 offer、需快速决策的工程师;2 周方案面向 ≥ 2 个 offer 待选 / 想转 TL 的求职者。综合项目(offer 包 + 入职计划)作为求职 Sprint 的子模块。
3. 核心知识 / 产出 / 标准表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. TC 拆解 | base / bonus / RSU / sign-on / relocation / 401k / 医保 | 一份 TC 拆解表 | 能讲清每个数字的实际值(折现 + vest) |
| 2. 级别匹配 | L4/L5/L6(FAANG)、E4/E5/E6、IC1/IC2/IC3 | 1 份级别对照表 | 能讲清目标公司 L5 的能力要求 |
| 3. offer 比较矩阵 | Base / Bonus / RSU 现值 / Sign-on / 团队 / 学习曲线,6 维度评分 | offer 比较表(≥ 2 个 offer) | 能讲清每个 offer 的优劣 |
| 4. 谈判脚本 | 4 要素分开谈 / 表达热情 + 给数据 / 不主动开价 / 留缓冲 | 1 份谈判脚本 | 完成 1 轮谈判录音 |
| 5. 跳槽时机 | 18 个月规则 / 学习曲线平台期 / 项目交付后 | 1 份跳槽判断清单 | 能讲清”现在该不该跳” |
| 6. 长期成长 | 30/60/90 天计划 / 1:1 / on-call / 技术品牌 | 1 份入职计划 + 2 年成长地图 | 入职前 1 周可向经理汇报 30 天目标 |
4. 第一周任务
Day 1 约定:本计划以”TC 拆解 + 级别对照 + 谈判脚本 + 30/60/90 + 复盘”为最小循环。所有产出必须有可见证据(TC 表、级别表、谈判邮件、HR 回复、30/60/90 计划)。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 拆解拿到的 offer:base / bonus / RSU / sign-on / relocation / 401k / 医保,算 Year 1 实际收入 + 4 年 TC(含 Excel 公式) | TC 拆解表(含折现) |
| Day 2 | 用 levels.fyi + Blind 锚定目标公司 L4/L5/L6 / E4/E5/E6 / IC1/IC2/IC3 级别匹配(能力要求 + 典型 TC) | 级别对照表 |
| Day 3 | 写 4 要素谈判脚本(表达热情 / 给数据 / 提诉求 / 给缓冲),2 个版本(邮件 + 口头) | 谈判脚本 |
| Day 4 | 用邮件模板发起第 1 轮谈判,HR 回复后 24 小时内评估 + 准备 counter | 第 1 轮谈判邮件 + HR 回复记录 |
| Day 5 | 评估跳槽时机:18 个月规则 + 学习曲线 + TC 差距 + 团队变动 + 个人目标(5 维度打分) | 跳槽判断清单 |
| Day 6 | 写 30/60/90 天计划(30 观察 + 60 小交付 + 90 独立产出),每阶段 ≥ 3 个 deliverable | 30/60/90 计划 |
| Day 7 | 步骤 A:跑通 TC 表 + 级别表 + 谈判脚本 + 30/60/90;步骤 B:补齐 4 类边界(未谈 / 谈崩 / RSU 没折现 / 30/60/90 无量化) | 谈判工具包 v0.1 + 4 类问题清单 |
Day 7 步骤 A 把谈判 + 入职资产跑通;步骤 B 每类问题先在文档里复现,再讲清补救路径。
5. 阶段通用验收
- 不看笔记 60 秒内讲清任意 1 个 offer 的 TC 拆解(base / bonus / RSU / sign-on / relocation 折现);
- 6 维度 offer 比较矩阵(Base / Equity / Team / Learning / Location / Culture)能算出加权评分并复现决策;
- 谈判脚本版本 ≥ 2(邮件 + 口头),含 4 要素(热情 / 数据 / 诉求 / 缓冲);
- 测 4 类边界:未谈 / 谈崩 / RSU 没折现 / 30/60/90 无量化(每类问题先复现再讲补救路径);
- 准备 ≥ 1 个 counter offer 脚本(即使没真发,要写完演练过);
- 跳槽判断清单 5 维度全打分(学习曲线 / TC 差距 / 团队 / 个人目标 / 时间点),每维度 0~10 分;
- 30/60/90 计划每阶段 ≥ 3 个 deliverable,可与未来经理 1:1 校准对齐。
6. 最终验收
- 完成 ≥ 1 个 offer 的 TC 拆解表(Year 1 + 4 年 TC 折现,包含 Excel 公式 / Markdown 表格);
- 完成级别对照表(目标公司 L4/L5/L6 / E4/E5/E6 / IC1/IC2/IC3 各 1 个能力要求);
- 完成 offer 比较矩阵(≥ 2 个 offer,6 维度加权评分,可复现决策);
- 完成 1 次真实谈判(脚本 + 邮件 + HR 回复记录),拿到提升 ≥ 10% TC;
- 完成 30/60/90 天计划,每阶段 ≥ 3 个 deliverable,可向未来经理汇报;
- 完成 2 年成长地图(IC vs Manager 路径选择 + 18 个月评估节点);
- 完成跳槽判断清单(5 维度打分 ≥ 4 个维度)。
7. 综合项目
首选:求职 Sprint 的 offer + onboarding 子模块(必做:TC 拆解 + 级别对照 + 比较矩阵 + 谈判 + 30/60/90 + 2 年成长地图)。
- 输入:≥ 1 个 offer(或目标公司 offer 模板)、未来岗位 / 团队信息;
- 输出:必输出(1)TC 拆解表(Excel / Markdown,含 4 年 TC 折现公式);(2)级别对照表(L4/L5/L6 / E4/E5/E6 / IC1/IC2/IC3 + 能力要求);(3)offer 比较矩阵(6 维度加权评分);(4)谈判脚本(邮件 + 口头,4 要素);(5)第 1 轮谈判邮件 + HR 回复记录;(6)30/60/90 计划(30 观察 / 60 小交付 / 90 独立产出);(7)2 年成长地图;(8)跳槽判断清单 + retrospective;
- 关键指标:谈判 TC 提升 ≥ 10%、6 维度加权评分能复现决策、30/60/90 可与经理 1:1 校准、2 年成长地图节点清晰;
- 进阶可选:startup 期权估值(清算优先权 + 4 年 vest + 1 年 cliff)+ 远程工作的税收 / 生活成本测算 + 副业 / 技术品牌延展。
备选:2 年成长路线(个人品牌 + 技术深度 + 影响力 + TL/Manager 路径选择 + 18 个月评估节点),适合”已签 offer 准备长期规划的”求职者。
任何综合项目都必须包含:
- TC 拆解(base / bonus / RSU / sign-on / relocation,含 4 年折现);
- 级别匹配(L4/L5/L6 / E4/E5/E6 / IC1/IC2/IC3 + 能力要求);
- offer 比较矩阵(6 维度加权评分,权重可调);
- 谈判脚本(4 要素 + counter offer 演练);
- 跳槽判断清单(5 维度评分);
- 30/60/90 天计划(3 阶段 deliverable,每阶段 ≥ 3 项);
- README(含 offer window、目标、产出、复盘);
- retrospective.md(含教训、改进、下一轮)。
notes/ 与 README 存放规范
所有”TC 拆解 / 级别对照 / 谈判脚本 / 30/60/90 / 成长地图”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:
notes/tc-decompose.md:TC 拆解表(Excel / Markdown + 4 年折现公式 + RSU vest 假设);notes/level-mapping.md:L4/L5/L6 / E4/E5/E6 / IC1/IC2/IC3 级别对照(能力要求 + 典型 TC 范围);notes/offer-matrix.md:6 维度加权评分矩阵(权重 + 评分 + 计算过程);notes/negotiation-script.md:谈判邮件 + 口头脚本 + HR 回复记录(4 要素结构);notes/30-60-90.md:入职计划(30 观察 / 60 小交付 / 90 独立产出,每阶段 ≥ 3 个 deliverable)。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 全部 | 经典书 | Haseeb Qureshi《My Ten Rules for Negotiating a Job Offer》 | https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/ | 谈判 10 条军规 |
| 全部 | 经典书 | Haseeb Qureshi《Senior Engineer Salary Negotiation》 | https://haseebq.com/how-not-to-bomb-your-offer-negotiation/ | 谈判完整流程 |
| 1 | 数据 | levels.fyi | https://www.levels.fyi/ | 真实 TC 数据锚定 |
| 1 | 数据 | Glassdoor | https://www.glassdoor.com/ | 薪资 + 公司评价 |
| 1 | 数据 | Pave | https://www.pave.com/ | 薪资基准(公司向) |
| 3 | 谈判 | Blind | https://www.teamblind.com/ | 真实 offer 数据 + 谈判经验 |
| 3 | 谈判 | Lara Hogan《Resilient Management》 | https://resilientmanagement.com/ | 谈判与影响力(选读) |
| 5 | 成长 | Michael Lopp《Managing Humans》 | https://lopp.com/ | 入职与 1:1 |
| 5 | 成长 | Tanya Reilly《The Staff Engineer’s Path》 | https://staffeng.com/ | Staff+ 路径(进阶) |
| 5 | 观察 | Pragmatic Engineer Newsletter | https://newsletter.pragmaticengineer.com/ | 职业路径与行业观察 |
默认使用顺序:拿到 offer 后立刻读 Haseeb Qureshi《My Ten Rules》→ 用 levels.fyi 锚定目标公司 TC → 写 TC 拆解表与 4 要素谈判脚本 → 用 Blind 调研 HR 反应 → 发起第 1 轮谈判(邮件 / 口头)→ 签 offer 后写 30/60/90 计划 → 入职后读《Managing Humans》/《The Staff Engineer’s Path》做长期成长 → 用 Pragmatic Engineer Newsletter 持续观察行业。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
offer 谈判是工程师最容易亏钱的地方。Haseeb Qureshi 2017 年发表的《My Ten Rules for Negotiating a Job Offer》是事实标准;levels.fyi 2018 年后建立了 TC 数据众包平台。今天每一个 senior 工程师都把谈判当 sprint 来做:拿到 first offer 不签、target 至少 2 个 offer、用 4 要素分别谈。
9.2 概念地图
flowchart LR
Offer[拿到 offer] --> Decompose[TC 拆解]
Decompose --> Level[级别匹配]
Level --> Compare[offer 比较矩阵]
Compare --> Negotiate[谈判]
Negotiate --> Sign[签约]
Sign --> Onboard[入职 30/60/90]
Onboard --> Grow[长期成长]
Grow -. 18 个月 .-> Jump[跳槽]
关系说明:TC 拆解是数字基础,级别匹配是定位锚点,比较矩阵是决策工具,谈判是动作,入职是新起点,成长是循环。
9.3 基础知识讲解
9.3.1 谈判经典
| 资料 | 影响 | 用法 |
|---|---|---|
| Haseeb Qureshi, My Ten Rules for Negotiating a Job Offer | 谈判 10 条军规 | 必读 |
| Haseeb Qureshi, Senior Engineer Salary Negotiation | 谈判完整流程 | 必读 |
| levels.fyi 数据 | 真实 TC | 谈薪必查 |
| Blind(匿名职场) | 真实 offer 数据 + 谈判经验 | 必看 |
| Pat Kua, Talking Tech | tech leadership 谈判 | 选读 |
| Lara Hogan, Resilient Management | 谈判与影响力 | 选读 |
| Ramit Sethi, I Will Teach You to Be Rich | 谈判与个人财务 | 选读 |
9.3.2 TC 拆解公式
实际年收入(Year 1):
= base
+ bonus(base × bonus%)
+ sign-on(一次性)
+ RSU Year 1(grant × 4 年 vest 的 25%)
+ relocation(一次性)
实际年收入(Year 2~4):
= base + bonus + RSU(grant × 25%)
4 年总包(TC):
= 4 × (base + bonus) + 4 × RSU grant + sign-on + relocation
注意:RSU 现值用授予日股价折现
9.3.3 4 要素谈判法
1. 表达热情:"I'm very excited about this role and the team."
2. 给数据:"Based on my research (levels.fyi + comparable offers),
the median L5 at this company is $X."
3. 提诉求:"I'd like to discuss base / sign-on / RSU to close the gap."
4. 给缓冲:"If base is fixed, can we increase sign-on / RSU?"
9.3.4 18 个月跳槽规则
判断是否跳槽:
1. 当前公司是否还有学习曲线?(平台期 = 18 个月)
2. 当前项目是否还有影响力?(没新项目 = 跳槽)
3. 当前 TC 与市场差距是否 > 30%?(跳槽)
4. 团队 / manager 是否变动?(变动 = 评估)
5. 个人目标(IC vs TL vs Manager)是否变化?(变化 = 跳槽)
每 18 个月评估一次;如果 4 个维度都满意,可留 2~3 年。
9.4 经典问题与经典案例
| # | 问题 | 重要性 | 最简答案 |
|---|---|---|---|
| 1 | 何时该开始谈判? | 决定动作时机 | 收到 offer 后立刻;不要在 HR 首次报价时接受 |
| 2 | HR 压价怎么应对? | 决定谈判结果 | 用 levels.fyi 数据 + 同级别 offer 反压 |
| 3 | Sign-on 怎么算? | 决定实际收入 | 一次性,分 1~2 年发;纳入 4 年 TC 折算 |
| 4 | RSU 怎么估值? | 决定长期价值 | 用授予日股价;4 年 vest 每年 25%;离职未 vest 失效 |
| 5 | Startup 期权怎么评估? | 决定风险 | 4 年 vest + 1 年 cliff + 清算优先权 + 公司 runway |
| 6 | 远程 vs onsite 的 TC 差异? | 决定 base | 远程通常降 10~30%;但省去通勤与城市溢价 |
| 7 | 何时该 counter offer? | 决定谈判上限 | 同时有 2 个 offer 才能 counter |
| 8 | 跳槽频繁 vs 稳定? | 决定简历 | 18 个月规则;学习曲线平台期可跳 |
| 9 | 选大厂 vs startup? | 决定路径 | 大厂 = 安全 + 学习 + 品牌;startup = 高 TC 风险 + 速度 |
| 10 | 怎么评估 startup 风险? | 决定 offer | runway > 18 月 + funding + 产品市场契合度 |
| 11 | 30/60/90 计划是什么? | 决定入职信用 | 30 天:观察 + 学习;60 天:小交付;90 天:独立产出 |
| 12 | 入职第一周做什么? | 决定 on-call | 装环境、配权限、跑通 build、约 1:1 |
| 13 | 何时该转 TL / Manager? | 决定路径 | 看 impact 偏好 + 团队需求 + 个人目标 |
| 14 | 何时该回大厂? | 决定回流 | startup 上市后 / 个人想稳 / TC 持平 |
| 15 | 长期成长怎么规划? | 决定 5 年路径 | 18 个月评估 + IC vs Manager 选择 + 技术品牌 |
9.5 学习难点
- 概念难点:RSU / 期权 / sign-on 折现不直观;用 Excel 公式算清楚。
- 思维难点:怕谈崩 / 怕失去 offer;记住 HR 不会因为谈判撤回 offer。
- 工程难点:offer 比较矩阵怎么打分;用加权评分(6 维度 × 权重)。
9.6 技术标准与接口
Entity
TC 拆解表、级别对照表、offer 比较矩阵、谈判脚本、入职 30/60/90 计划、2 年成长地图。
Scope
offer 谈判与职业路径不替代实际工作能力,只解决”签对 offer + 入职成功 + 长期成长”。
Structure
- TC 拆解:base / bonus / RSU / sign-on / relocation / 401k / 医保;
- 级别对照:L4/L5/L6(FAANG)、E4/E5/E6、IC1/IC2/IC3;
- offer 比较矩阵:6 维度 × 权重 × 评分;
- 谈判脚本:4 要素 + counter offer;
- 30/60/90:30(观察 + 学习)+ 60(小交付)+ 90(独立产出)。
Ecosystem
- 数据:levels.fyi、Glassdoor、Blind、Pave;
- 谈判参考:Haseeb Qureshi、Blind 帖子、朋友经验;
- 财务:Excel、Google Sheets、Personal Capital;
- 入职规划:Notion、Google Docs、Obsidian。
Depth Tiers
- L0:知道 TC 与谈判存在;
- L1:能拆解 1 个 offer;
- L2:能比较 2 个 offer;
- L3:能完成 1 轮谈判 + 写 30/60/90 计划;
- L4:能指导他人谈判与入职。
本子主题要求:L3。
Source
- Haseeb Qureshi 谈判 10 条军规:谈判事实标准;
- levels.fyi:真实 TC 数据;
- Blind:匿名 offer 与谈判经验;
- The Pragmatic Engineer Newsletter:职业路径观察;
- 版本快照日期:2026-07-30。
9.7 关键代码
9.7.1 TC 拆解器
# 9.7.1 TC 拆解:base + bonus + sign-on + RSU + relocation → 4 年 TC
from dataclasses import dataclass
@dataclass
class Offer:
company: str
base: float # 年 base
bonus_pct: float # 0.0 ~ 1.0
rsu_grant: float # 4 年总 grant
sign_on: float # 一次性
relocation: float # 一次性
rsu_share_price: float # 折现假设
def year1_total(o: Offer) -> float:
return (o.base
+ o.base * o.bonus_pct
+ o.sign_on
+ o.rsu_grant * 0.25 * o.rsu_share_price
+ o.relocation)
def four_year_tc(o: Offer) -> float:
y1 = year1_total(o)
y2_4 = 3 * (o.base + o.base * o.bonus_pct + o.rsu_grant * 0.25 * o.rsu_share_price)
return y1 + y2_4
if __name__ == "__main__":
stripe = Offer("Stripe", 180_000, 0.10, 300_000, 20_000, 15_000, 100)
airbnb = Offer("Airbnb", 170_000, 0.15, 250_000, 25_000, 0, 100)
for o in (stripe, airbnb):
print(f"{o.company}: Year 1 = ${year1_total(o):,.0f}, "
f"4Y TC = ${four_year_tc(o):,.0f}")
9.7.2 offer 比较矩阵 + 加权评分
# 9.7.2 offer 比较矩阵:6 维度加权评分
from dataclasses import dataclass
@dataclass
class OfferScore:
company: str
base_score: float # 0~10
equity_score: float # 0~10
team_score: float # 0~10
learning_score: float # 0~10
location_score: float # 0~10
culture_score: float # 0~10
WEIGHTS = {
"base_score": 0.25,
"equity_score": 0.20,
"team_score": 0.20,
"learning_score": 0.15,
"location_score": 0.10,
"culture_score": 0.10,
}
def weighted(o: OfferScore) -> float:
return sum(getattr(o, k) * w for k, w in WEIGHTS.items())
if __name__ == "__main__":
a = OfferScore("Stripe", 9, 9, 8, 9, 7, 8)
b = OfferScore("Airbnb", 8, 8, 9, 8, 8, 9)
for x in (a, b):
print(f"{x.company}: {weighted(x):.2f}")
9.7.3 谈判脚本生成器
# 9.7.3 谈判脚本:4 要素表达模板
def negotiation_email(company: str, role: str, current_offer: dict,
target_offer: dict, evidence: str) -> str:
"""生成谈判邮件模板(4 要素 + 数据)"""
return f"""Subject: {role} at {company} - Compensation Discussion
Hi {{RECruiter}},
Thank you for the {role} offer at {company}. I'm very excited about
the team and the work on {{PROJECT}}.
After reviewing the offer ({current_offer}), I did some research:
{evidence}
I'd like to discuss the following:
- Base: ${target_offer['base']:,} (vs ${current_offer['base']:,})
- Sign-on: ${target_offer['sign_on']:,} (vs ${current_offer['sign_on']:,})
- RSU: ${target_offer['rsu']:,} over 4 years (vs ${current_offer['rsu']:,})
If base is fixed at the current level, would there be flexibility
on sign-on or RSU to close the gap?
I'm confident we can find a number that works for both sides. Looking
forward to your response.
Best,
{{YOUR_NAME}}
"""
if __name__ == "__main__":
print(negotiation_email(
"Stripe", "Senior Engineer L5",
current_offer={"base": 170000, "sign_on": 15000, "rsu": 250000},
target_offer={"base": 185000, "sign_on": 25000, "rsu": 320000},
evidence="Levels.fyi shows L5 at Stripe median is $185k base; I have 2 competing offers at this level.",
)[:500])
10. 常见误区
- 拿到 first offer 直接签,不谈判(损失 10~30% TC);
- 谈判时主动开价(“我想要 X”),应让 HR 先给范围;
- 用情绪谈判(“我不爽”),应用数据谈判(levels.fyi);
- Sign-on 不算入 4 年 TC 折算,被 HR 数字游戏;
- RSU 用授予日股价估值,没考虑 vest 失败风险;
- 选 startup 不看 4 年 vest + 1 年 cliff;
- 选 startup 不看清算优先权(普通股可能被优先股稀释);
- 跳槽只看 TC,不看学习曲线与团队;
- 入职前不做 30/60/90 计划;
- 入职第一周就开始重构代码(应先观察 + 学习);
- 入职 90 天还没产出,被 manager 标记为低绩效;
- 18 个月规则当教条,不评估个人情况;
- 把”大厂镀金”当目的,忽略个人成长;
- 选 remote 不算税收与生活成本;
- 把 negotiation 当对抗,实际是双赢;
- 谈判中泄露现有 offer 细节,被 HR 压价;
- 签 offer 后不做 IC vs Manager 路径规划。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
本计划归属:项目与职业能力 主。
本主题贡献
- 职责:拆解 offer 的 TC 结构并比较现金与股权;评估 RSU/bonus 的兑现条件与风险;结合 relocation 约束制定 negotiation 策略。
- 交付物:TC 拆解与四年折现表;RSU/bonus 评估及 relocation 成本表;含 counter offer 的 negotiation 策略脚本与 30/60/90 计划。
- 指标:至少比较 2 个 offer 且 TC 计算可复现;谈判目标 TC 提升 ≥10%;完成 1 次正式 counter offer,并将 relocation 成本纳入总评。