简历与 GitHub 作品集:STAR 项目叙事与 ATS 关键词
0. 元信息
- 主题路径:
docs/topics/career-and-interview/subtopics/resume-and-portfolio/README.md - 父主题:
career-and-interview - 适合对象:简历被 HR 跳过、ATS 关键词不匹配、GitHub 作品集空白、或想换方向的工程师
- 建议周期:1~2 周
- 前置知识:有 ≥ 1 个完整工程交付经验(项目 / 实习 / 开源 / 论文)
- 最终目标:产出 1 份打磨好的 1 页简历(中文 + 英文),能在 ATS 系统跑出 ≥ 80% 关键词匹配;GitHub 有 ≥ 3 个有 README 的项目仓库
1. 学习路线
自我盘点(项目素材库)
→ STAR 项目叙事改写(3 个强项目)
→ 简历骨架(Summary + Experience + Projects + Skills + Education)
→ ATS 关键词匹配(Jobscan + JD 提取)
→ GitHub 作品集(README 模板 + demo + 文档)
→ 1 页 vs 2 页取舍(资深工程师)
每一步都是下一步的前置:没有素材就写 STAR 是空想;没有 STAR 就改简历是堆动词;没有关键词就投是石沉大海。
2. 阶段周数分配
| 阶段 | 1 周方案 | 2 周方案 | 备注 |
|---|---|---|---|
| 1. 项目素材库 + STAR 卡片 | 0.5 | 0.5 | 列 8~10 项目,筛 3 个强项目 |
| 2. 简历骨架 v1(Summary + Experience + Projects) | 0.5 | 0.5 | LaTeX / Markdown 双版本 |
| 3. ATS 关键词匹配(Jobscan ≥ 80%) | 0 | 0.5 | JD 高频词嵌入 Skills + Experience |
| 4. GitHub 作品集(≥ 3 个 README 完整 repo) | 0 | 0.5 | 动机 + 技术栈 + 架构图 + demo + 启动 |
| 合计 | 1 | 2 |
1 周方案面向已有成熟简历、改写 STAR 与补 GitHub 的工程师;2 周方案面向简历重写 + ATS 调优 + GitHub 冷启动的转岗 / 应届求职者。综合项目(求职 portfolio)作为求职 Sprint 的子模块。
3. 核心知识 / 产出 / 标准表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 项目素材库 | 列 8~10 个项目,按影响力 / 量化 / 技术深度筛 3 个 | 一份项目清单 | 能 60 秒讲清每个项目的 1 句话定位 |
| 2. STAR 项目叙事 | Situation / Task / Action / Result + 量化指标 | 3 个项目的 STAR 卡片 | 每张卡能用 90 秒讲完,Result 含数字 |
| 3. 简历骨架 | Summary 3 行 / Experience 4 段 / Projects 2 段 / Skills / Education | 1 页简历 v1 | 资深面试官 6 秒内能看出亮点 |
| 4. ATS 关键词 | Jobscan ≥ 80% 匹配 / JD 高频词 / 行业术语 | 关键词清单 + 简历 v2 | ATS 检查 ≥ 80% 匹配 |
| 5. GitHub 作品集 | 3 个 README 完整仓库 / demo 截图 / 文档 / CI | 3 个有 README 的 repo | 面试官点开能 5 分钟看懂项目 |
| 6. 1 页 vs 2 页取舍 | 资深(8+ 年)可 1.5 页 / 应届严格 1 页 / 转行可 2 页 | 最终简历 v3 | 给 3 个朋友看,能复述亮点 |
4. 第一周任务
Day 1 约定:本计划以”STAR 项目叙事 + 简历打磨 + ATS 关键词 + GitHub 作品集”为最小循环。所有产出必须有可见证据(STAR 卡片、简历 PDF、ATS 报告、GitHub README)。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 列 8~10 个项目,按影响力 / 量化 / 技术深度筛 3 个强项目,写每个项目的 1 句话定位 | 项目清单 + 3 个强项目选定 |
| Day 2 | 给 3 个强项目写 STAR 卡片(S/T 各 30 秒,A 2 分钟,R 30 秒 + 量化指标) | 3 张 STAR 卡片 v1 |
| Day 3 | 搭简历骨架 v1(Summary 3 行 + Experience 4 段 + Projects 2 段 + Skills + Education),格式 LaTeX(moderncv)或 Markdown(jsonresume) | 简历 v1(中文 + 英文) |
| Day 4 | 爬 5 个目标 JD,提取高频关键词(python / kubernetes / aws / system design),合并到简历 Skills + Experience 段 | 关键词清单 + 简历 v2 |
| Day 5 | 用 Jobscan / Resume Worded 检查 ATS 关键词匹配(目标 ≥ 80%),补齐缺失关键词 | ATS 报告 + 简历 v2.1 |
| Day 6 | 建/补 GitHub 公开仓库 interview-prep 与 2 个项目仓库,写 README(标题 + 简介 + 技术栈 + 架构图 + 启动 + demo + 复盘) | 3 个 GitHub README + 第一个 commit |
| Day 7 | 步骤 A:跑通简历 v2.1 + 3 张 STAR 卡片 + ≥ 3 个 GitHub README;步骤 B:补齐 4 类边界(简历超 1 页 / GitHub 无 README / Result 无量化 / 关键词不匹配 JD) | 求职工具包 v0.1 + 4 类问题清单 |
Day 7 步骤 A 把简历 + 作品集资产跑通;步骤 B 每类问题先在文档里复现,再讲清补救路径。
5. 阶段通用验收
- 不看 STAR 卡 90 秒内讲完任意 1 个项目(S/T/A/R 各段齐全);
- 3 个强项目每条 Result 都有量化指标(数字 / 比例 / 速度 / 容量 / 成本);
- 简历 1 页(资深 1.5 页)+ Skills 段顺序与目标 JD 关键词顺序一致;
- ATS 检查 ≥ 80%(Jobscan / Resume Worded 报告截图存档);
- GitHub 至少 3 个有 README 的 repo(动机 + 技术栈 + 架构图 + 启动 + demo + 复盘 6 段齐全);
- 找 3 个朋友盲审简历,能在 60 秒内复述出你的 3 个亮点;
- 中英文简历各 1 份,动词一致(designed / led / built / shipped / optimized)。
6. 最终验收
- 完成 1 份打磨好的 1 页简历(中文 + 英文,PDF + Markdown 双版本),ATS 关键词匹配 ≥ 80%;
- 完成 3 张 STAR 项目卡片,每张含 4 段(S/T/A/R)+ 量化 Result + 60~90 秒可讲;
- 完成 ≥ 3 个有 README 的 GitHub 仓库(动机 / 技术栈 / 架构图 / 启动 / demo / 复盘 6 段齐全);
- 简历通过 3 个朋友盲审(60 秒讲完 + 能复述 3 个亮点);
- Skills 段顺序与目标 JD 关键词顺序一致(Jobscan ≥ 80% 命中);
- 简历 PDF 含字体嵌入(中文简历打开不乱码);
- 能在 6 秒内让资深面试官看出亮点(用 LaTeX moderncv 模板实测)。
7. 综合项目
首选:求职 portfolio 子模块(必做:1 页中文简历 + 1 页英文简历 + ≥ 3 个 GitHub 仓库 README + 3 张 STAR 卡片 + ATS 报告 + 朋友盲审记录)。
- 输入:现有项目经历 / 实习 / 开源 / 论文;
- 输出:必输出(1)简历中文 v3 + 英文 v3(PDF + Markdown 双版本);(2)3 张 STAR 卡片文本 + 录音;(3)≥ 3 个 GitHub 仓库 README;(4)ATS 关键词报告 ≥ 80%;(5)朋友盲审记录(≥ 3 人反馈);(6)简历迭代日志(v1 → v2 → v3 改动点);(7)Portfolio 站点(GitHub Pages / 个人博客,可选);(8)1 份 retrospective;
- 关键指标:ATS 关键词匹配 ≥ 80%、朋友盲审 ≥ 3 人通过、6 秒简历测 ≥ 3 亮点、STAR 每段量化 Result 全覆盖;
- 进阶可选:Portfolio 网站(GitHub Pages)+ Medium / 掘金技术博客(弱作品集载体)+ 公开演讲视频。
备选:dream company 投递包(针对 1 家目标公司:定制简历 v3 + ATS 报告 + GitHub 项目 demo 视频 + 求职信 Cover Letter + 1 份 company-specific STAR 库),适合”已锁定 dream company”的求职者。
任何综合项目都必须包含:
- 自我盘点与项目素材库(8~10 项目筛选记录);
- STAR 项目卡片(3 个强项目,含 S/T/A/R 与量化 Result);
- 简历骨架与打磨记录(v1 → v2 → v3 迭代日志);
- ATS 关键词提取与匹配(Jobscan 报告 ≥ 80%);
- GitHub 作品集(≥ 3 个 README 完整 repo,6 段齐全);
- 中英文简历一致性检查(动词 / 拼写 / 排版 3 项过);
- README(含求职 window、目标、产出、ATS 数据);
- retrospective.md(含教训、改进、下一轮)。
notes/ 与 README 存放规范
所有”STAR 卡片 / 简历版本 / ATS 报告 / GitHub README / 朋友反馈”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:
notes/star-cards.md:3 个项目的 S/T/A/R 文本(量化 Result 标记);notes/resume-versions.md:简历 v1 → v3 迭代日志(PDF + Markdown 双版本 + LaTeX 源码);notes/ats-report.md:Jobscan 报告截图 + 关键词命中率统计;notes/peer-review.md:≥ 3 个朋友盲审反馈(60 秒测试记录 + 亮点复述记录)。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 全部 | 经典书 | Gayle McDowell《The Google Resume》 | https://www.crackingthepminterview.com/ | 简历事实标准 |
| 全部 | 模板 | Tech Interview Handbook Resume | https://www.techinterviewhandbook.org/resume-gui | 程序员简历模板库 |
| 1 | 工具 | LaTeX moderncv(Overleaf) | https://www.techinterviewhandbook.org/ | LaTeX 简历模板 |
| 1 | 工具 | jsonresume | https://jsonresume.org/ | Markdown / JSON 简历 |
| 2 | ATS | Jobscan | https://www.jobscan.com/ | ATS 关键词匹配工具 |
| 2 | ATS | Resume Worded | https://resumeworded.com/ | ATS 评分 + 改进建议 |
| 4 | 评估 | Pramp Resume Review | https://www.pramp.com/ | 免费 mock 简历评估 |
| 4 | GitHub | GitHub Pages | https://pages.github.com/ | 个人作品集站点 |
| 5 | 跨行 | Cultivated Culture | https://cultivatedculture.com/ | 转行简历(选读) |
| 6 | 模板 | Canva 简历模板 | https://www.canva.com/resumes/templates/ | 视觉简历(设计师路径) |
默认使用顺序:先读《The Google Resume》第 5-7 章建立简历框架 → 列 8~10 项目素材库筛 3 个 → 写 STAR 卡片 + 简历 v1 → 用 Jobscan 提取关键词 → 用 moderncv / jsonresume 输出 PDF → 找 3 个朋友盲审 → 用 GitHub Pages 搭建 Portfolio → 写复盘到
notes/peer-review.md。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
简历是工程师的 6 秒电梯演讲。HR 平均 6 秒决定一份简历去留;ATS 系统先用关键词筛掉 70% 简历;GitHub 作品集是面试官评估动手能力的入口。Gayle McDowell 在《The Google Resume》中明确”简历不是简历,是营销文档”;今天每个 senior 工程师都把简历当 product 来迭代。
9.2 概念地图
flowchart LR
Projects[项目素材库 8-10] --> Star[STAR 卡片 3]
Star --> Resume[简历骨架]
Resume --> Keywords[关键词 ATS]
Keywords --> ATS[ATS 匹配 ≥ 80%]
Resume --> Polish[打磨 v3]
Portfolio[GitHub 作品集] --> Polish
Polish --> Apply[投递]
关系说明:项目素材是基础,STAR 是叙事单元,简历是产品包装,ATS 决定是否被看见,GitHub 决定能否进入面试。
9.3 基础知识讲解
9.3.1 简历经典
| 资料 | 影响 | 用法 |
|---|---|---|
| Gayle McDowell, The Google Resume | 简历事实标准 | 必读第 5-7 章 |
| Resume Worded | ATS 关键词工具 | 投简历前必跑 |
| Jobscan | ATS 匹配度 | 投简历前必跑 |
| Tech Interview Handbook Resume Guide | 程序员简历模板 | 模板库 |
| Pramp Resume Review | 免费 mock 简历评估 | 每周 1 次 |
| Cultivated Culture | 转行简历 | 转行者选读 |
9.3.2 STAR 项目叙事法
Situation(30 秒):背景、问题、规模
例:电商平台每秒 10k 订单,原系统用同步调用导致 P99 = 5s
Task(30 秒):你的角色、目标
例:作为 Tech Lead,重构订单服务,目标 P99 < 200ms
Action(2 分钟):你做了什么、技术选型、团队协作
例:引入 Kafka 异步化 + Outbox 模式 + 缓存预热
Result(30 秒):量化结果、业务影响
例:P99 从 5s 降到 180ms,订单处理容量 10x,节省 $200k/年服务器成本
9.3.3 简历 bullet 写法(“动词 + 对象 + 量化”)
差:负责订单服务开发
好:设计并实现订单异步化架构,将 P99 延迟从 5s 降至 180ms
差:参与数据库迁移
好:主导 1.2TB MySQL → TiDB 迁移,零停机,QPS 提升 3x
差:改进 CI/CD 流程
好:将 CI 流水线从 25 分钟降至 6 分钟,每天节省 100 次构建 × 19 分钟 = 31 工程师小时
差:管理 3 人团队
好:带领 3 人小组交付 A/B 实验平台,支持 50+ 实验并行,转化率 +12%
9.3.4 ATS 关键词提取流程
1. 收集 5~10 个目标 JD(每个目标公司 2~3 个)
2. 用工具统计高频词(python、kubernetes、aws、system design...)
3. 把关键词分为:技术栈 / 框架 / 概念 / 软技能
4. 在简历中合理嵌入:
- Skills 段直接列
- Experience 段嵌入动作中
- Projects 段强调相关性
5. 用 Jobscan 检查匹配度 ≥ 80%
9.4 经典问题与经典案例
| # | 问题 | 重要性 | 最简答案 |
|---|---|---|---|
| 1 | 简历该 1 页还是 2 页? | 决定阅读体验 | 应届严格 1 页;3-7 年 1 页;8+ 年可 1.5 页 |
| 2 | 没有量化指标怎么办? | 决定可信度 | 用比例 / 速度 / 容量 / 成本 / 用户数 |
| 3 | 跨行业求职怎么写? | 决定跨行通过率 | 用 transferrable skills + 重新包装 |
| 4 | 项目经历超过 5 个? | 决定密度 | 选 3 个强项目 + 1-2 个并列项 |
| 5 | GitHub 没有 star 的项目? | 决定作品集 | 写 README + demo + 文档;展示思路 |
| 6 | 应届没有工作经验? | 决定应届简历 | 课程项目 + 实习 + 开源 + 比赛 |
| 7 | 频繁跳槽简历怎么写? | 决定可信度 | 用主题聚合(项目 / 技术栈)而非时间线 |
| 8 | 简历要不要放照片? | 决定合规 | 美国不放;国内可放;欧洲看国家 |
| 9 | Skills 段顺序怎么排? | 决定 ATS | 与目标 JD 关键词顺序一致 |
| 10 | 简历要不要写”精通”? | 决定可信度 | 慎用”精通”;用”深入使用” |
| 11 | GitHub README 模板? | 决定作品集第一印象 | 动机 + 技术栈 + 架构图 + demo + 启动步骤 + 复盘 |
| 12 | 简历 PDF vs Word? | 决定格式 | 投 ATS 用 PDF;面试官看 Word 也行 |
| 13 | 英文简历怎么写动词? | 决定 native 感 | 用 STAR 动词表(designed / led / built / shipped / optimized) |
| 14 | 简历要不要写期望薪资? | 决定谈判空间 | 默认不写;HR 问到时再给范围 |
| 15 | 推荐信 / LinkedIn 推荐怎么要? | 决定背书 | 项目结束后 2 周内找 manager + mentor 求推荐 |
9.5 学习难点
- 概念难点:STAR 模板化过度导致故事像背稿;用具体细节(数字、人名、时间)保持真实感。
- 思维难点:自我感觉良好 vs 实际简历质量;用 3 个朋友 + Jobscan + mock 评估做客观检查。
- 工程难点:1 页 vs 2 页取舍;用优先级排序(最近 + 最强 + 最相关)+ 字号控制。
9.6 技术标准与接口
Entity
简历模板(Markdown / LaTeX / PDF)、Jobscan 报告、ATS 关键词清单、GitHub repo README、项目 STAR 卡片。
Scope
简历与作品集不替代面试表现,只解决”HR 是否给面试机会”与”面试官是否愿意深入”两个问题。
Structure
- 简历:Summary(3 行)+ Experience(4 段)+ Projects(2 段)+ Skills + Education;
- STAR 卡片:Situation / Task / Action / Result,每段 30 秒~2 分钟;
- GitHub README:标题 + 简介 + 技术栈 + 架构图 + 启动步骤 + 测试 + 复盘;
- ATS 关键词清单:技术栈 / 框架 / 概念 / 软技能四类。
Ecosystem
- 简历工具:LaTeX(moderncv)、Markdown(jsonresume)、Canva 模板、Overleaf;
- ATS 检查:Jobscan、Resume Worded、LinkedIn 评分;
- 简历评估:Pramp、Cultivated Culture、朋友 mock;
- GitHub:README、Actions(CI)、Pages(静态站点)、Releases。
Depth Tiers
- L0:知道简历存在;
- L1:能写 1 页简历;
- L2:能用 STAR 写项目;
- L3:能 ATS 匹配 ≥ 80% + GitHub 作品集完整;
- L4:能 mock 别人改简历。
本子主题要求:L3。
Source
- Gayle McDowell《The Google Resume》:简历事实标准;
- Tech Interview Handbook Resume:程序员简历模板;
- Jobscan:ATS 关键词匹配工具;
- Resume Worded:ATS 评分;
- 版本快照日期:2026-07-30。
9.7 关键代码
9.7.1 简历项目 STAR 数据结构
# 9.7.1 简历项目 STAR 数据结构 + 量化检查
from dataclasses import dataclass
@dataclass
class ProjectStar:
name: str
situation: str # 背景
task: str # 角色 + 目标
action: str # 做了什么
result: str # 量化结果
tech_stack: list[str]
def has_quantified_result(star: ProjectStar) -> bool:
"""检查 result 是否含量化指标"""
keywords = ["%", "x", "ms", "s", "$", "k", "M", "B",
"users", "QPS", "RPS", "GB", "TB"]
return any(k.lower() in star.result.lower() for k in keywords)
def star_one_liner(star: ProjectStar) -> str:
"""给面试官讲的 1 句话版本"""
return f"{star.name}: {star.action.split(',')[0]} → {star.result}"
if __name__ == "__main__":
p = ProjectStar(
name="订单服务异步化",
situation="电商每秒 10k 订单,原同步调用 P99=5s",
task="Tech Lead 重构订单,目标 P99 < 200ms",
action="引入 Kafka 异步化 + Outbox + 缓存预热",
result="P99 从 5s 降至 180ms,订单容量 10x,节省 $200k/年",
tech_stack=["kafka", "java", "redis", "mysql"],
)
print(has_quantified_result(p)) # True
print(star_one_liner(p))
9.7.2 GitHub README 模板(Mermaid 渲染)
%% 9.7.2 GitHub README 结构图
flowchart LR
Title[项目标题 + 简介 2 行] --> Stack[技术栈]
Stack --> Arch[架构图]
Arch --> QuickStart[快速启动]
QuickStart --> Test[测试]
Test --> Demo[Demo 截图 / 链接]
Demo --> Retro[复盘 / 后续]
9.7.3 ATS 关键词提取脚本
# 9.7.3 从 JD 提取高频关键词,与简历对比
import re
from collections import Counter
STOP_WORDS = {
"the", "a", "an", "and", "or", "with", "for", "to", "of",
"in", "on", "is", "are", "be", "as", "at", "by",
}
def tokenize(text: str) -> list[str]:
text = text.lower()
words = re.findall(r"[a-z][a-z0-9+#.-]{1,}", text)
return [w for w in words if w not in STOP_WORDS and len(w) > 1]
def top_keywords(jd_text: str, k: int = 20) -> list[tuple[str, int]]:
return Counter(tokenize(jd_text)).most_common(k)
def ats_match(jd_text: str, resume_text: str, k: int = 20) -> float:
"""返回 0~1 的关键词覆盖率"""
jd_kw = {w for w, _ in top_keywords(jd_text, k)}
resume_kw = set(tokenize(resume_text))
if not jd_kw:
return 0.0
return len(jd_kw & resume_kw) / len(jd_kw)
if __name__ == "__main__":
jd = "We are looking for a senior backend engineer with Python, AWS, Kubernetes, PostgreSQL, system design experience."
resume = "Senior engineer. Built distributed systems with Python on AWS. Used Kubernetes, PostgreSQL, Redis."
print(f"ATS match: {ats_match(jd, resume):.0%}")
10. 常见误区
- 简历用大词堆砌(“负责”、“参与”、“改进”),没有量化;
- Result 段写”系统更稳定”而不是”P99 降 80%”;
- 简历超过 1 页(资深也尽量 1.5 页内);
- Skills 段只写大类(“编程语言”),不写具体技术栈;
- ATS 关键词不匹配,被系统直接筛掉;
- GitHub 仓库没 README,面试官点开看不懂;
- GitHub 仓库没有 demo 截图或启动步骤;
- 项目经历写 10 个,每个 1 行(不如写 3 个,每个 4 行);
- 跨行业求职用同一份简历,不针对 JD 调整;
- 简历用花哨模板(图表 / 双栏),ATS 解析失败;
- 写”精通 X”,但面试被追问就崩;
- 推荐信 / LinkedIn 推荐空白;
- 简历 PDF 含中文但字体嵌入失败,对方打开乱码;
- 应届写”熟练使用 Office”,浪费版面;
- 把”目标岗位”写在简历顶部(应放 LinkedIn,不放简历);
- 简历不放 GitHub / 个人网站链接。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
本计划归属:项目与职业能力 主。
本主题贡献
- 职责:将经历压缩成可复述的 STAR 卡片;按 JD 调整 ATS 关键词;维护简历与 GitHub 作品集的版本管理。
- 交付物:3 张量化 STAR 卡片;按岗位定制的 ATS 关键词清单;简历版本日志与 GitHub 作品集仓库。
- 指标:ATS 关键词匹配 ≥80%;GitHub 作品集 ≥3 个完整 README;每张 STAR 卡 90 秒内讲完且 Result 有数字。