别让 AI 替你编简历:用 DDD 把求职材料建模

Posted on 日 28 6月 2026 in AI

Abstract 别让 AI 替你编简历:用 DDD 把求职材料建模
Authors Walter Fan
Category AI
Status v0.1
Updated 2026-06-29
License CC-BY-NC-ND 4.0

别让 AI 替你编简历:用 DDD 把求职材料建模

简短大纲

  • 不要直接对 AI 说“帮我写简历”,那样得到的通常是漂亮废话。
  • 按 DDD 思想先建立领域模型:求职者、目标职位、证据、匹配关系、投递材料。
  • 用结构化数据喂给 AI,再让它做解析、匹配、改写和生成。
  • 简历和求职信不是“生成一次”,而是针对每个职位做一次投影。
  • 文末给可直接复制的 YAML 模板、匹配矩阵和 Prompt 清单。

1. 先问一个扎心的问题

很多人第一次用 AI 写简历,提示词都很朴素:

帮我写一份后端工程师简历,再写一封求职信。

AI 很快就会给你一份看起来还不错的东西:措辞完整,排版整齐,动词很有劲,什么“主导”“优化”“赋能”“显著提升”一应俱全。

问题是,读着读着,你会有一点心虚:这份简历像一个很努力的候选人,但不太像你。更麻烦的是,它可能把你做过的事写虚,把你没做过的事写实,把你真实的亮点写成招聘网站上随处可见的套话。

我最近看年轻人用 AI 准备求职材料,最大的感受就是:AI 太会写漂亮话了。漂亮到什么程度呢?它能把一个普通项目写得像改变行业格局,把一次日常优化写得像拯救公司于水火。听起来很燃,面试时却很危险。因为面试官只要多问两句,漂亮话就会像没有单元测试的代码,一跑就露馅。

所以我认为,用 AI 生成求职信和简历,第一步不是写 Prompt,而是建模。

一句话:求职不是写作文,是做匹配。简历和求职信只是匹配结果的两种输出格式。

这件事如果用软件工程的话说,很像 DDD:先理解领域,再建对象模型,最后才是生成视图。别需求还没澄清,就让 AI 往主干分支提交代码。年纪大了,见不得这种刺激。


2. DDD 视角:求职这个领域里到底有哪些对象

先把“帮我写简历”拆开。这里至少有五类对象。

对象 说明 典型字段
求职者 Candidate 你是谁,你有什么经历和能力 基本信息、教育经历、工作经历、项目经历、技能、特长、特点
目标职位 TargetJob 你要申请什么岗位 公司、岗位、岗位职责、任职要求、加分项、业务关键词
证据 Evidence 能证明你能力的事实 项目、动作、结果、数据、奖项、代码/文档/作品链接
匹配关系 Match 岗位要求和个人证据之间的映射 requirement、evidence、strength、gap、risk
投递材料 ApplicationPackage 对外输出 简历、求职信、面试故事卡、投递备注

如果再讲得“领域味”一点:

  • Candidate 是一个聚合根,下面有 EducationWorkExperienceProjectSkillTrait
  • TargetJob 也是一个聚合根,下面有 ResponsibilityRequirementPreferredQualification
  • Evidence 是最关键的领域对象,因为简历上的每一句话,最好都能追溯到一个真实证据。
  • Match 是领域服务的输出:它不属于候选人,也不属于职位,而是两者之间的分析结果。
  • ResumeCoverLetter 不是源数据,它们是投影,是视图,是为了某次投递生成的快照。

这层关系想清楚后,AI 的位置也清楚了:AI 不是来替你编经历的,它是来做四件事的:

  1. 把混乱经历整理成结构化对象;
  2. 把职位描述拆成可匹配的要求;
  3. 找出“要求”和“证据”的对应关系;
  4. 把匹配结果改写成简历和求职信。

如果没有前三步,第四步生成得越快,风险越大。就像没有单元测试的重构,越顺手越可怕。


3. 先把自己建成一个 Candidate 模型

不要急着写简历。先把自己当成一个领域对象录入系统。

这一步看起来有点笨,甚至不像“高科技”。可是简历这件事,笨办法反而可靠。先把事实摆出来,再谈包装;先把证据编号,再谈表达。下面这个 YAML 可以直接复制。里面不要填“看起来厉害”的话,只填真实信息。没数据就写“暂无”,不要让 AI 帮你补。

candidate:
  basic_info:
    name: "你的姓名"
    target_city: "目标城市或远程"
    target_roles:
      - "后端工程师"
      - "平台工程师"
    contact:
      email: "your_email@example.com"
      phone: "可选"

  education:
    - school: "学校名称"
      degree: "本科/硕士/博士"
      major: "专业"
      period: "YYYY-YYYY"
      highlights:
        - "课程/奖项/论文/社团,只写真实内容"

  work_experience:
    - company: "公司名称"
      title: "职位名称"
      period: "YYYY-MM  YYYY-MM"
      responsibilities:
        - "你长期负责什么"
      achievements:
        - id: "A1"
          summary: "一个可证明的成果"
          context: "当时背景"
          action: "你具体做了什么"
          result: "结果,最好有数据,没有就写可观察结果"
          evidence: "链接/文档/上线记录/负责人,可选"

  projects:
    - name: "项目名称"
      role: "你的角色"
      tech_stack:
        - "Java"
        - "Go"
        - "Kubernetes"
      problem: "解决了什么问题"
      action: "你做了什么"
      result: "带来什么结果"
      keywords:
        - "性能优化"
        - "高可用"
        - "成本优化"

  skills:
    programming:
      - "Java"
      - "Python"
      - "Go"
    backend:
      - "微服务"
      - "数据库"
      - "缓存"
    collaboration:
      - "需求澄清"
      - "跨团队沟通"
      - "技术方案评审"

  traits:
    - name: "特点"
      evidence_id: "A1"
      note: "这个特点由哪段经历证明"

这里有个小原则:凡是不能追溯到证据的形容词,都先降级处理。

比如“学习能力强”这句话,简历上人人都会写。它没错,但太软。更好的写法是:

在两周内补齐 Go 服务开发和部署链路,独立交付某某模块,并沉淀部署文档供团队复用。

这就从“自我评价”变成了“证据”。

写到这里,你大概已经发现了:这个 YAML 不是为了炫技,也不是为了把求职搞成软件工程考试。它只是逼着我们诚实一点:我到底做过什么,能证明什么,哪些地方只是自我感觉良好。


4. 再把职位建成 TargetJob 模型

招聘 JD 经常写得像许愿池。既要精通这个,又要熟悉那个,还要沟通好、抗压强、能带项目、最好会十八般兵器。

AI 的第二个任务,是帮你把 JD 拆开,而不是被 JD 吓住。

target_job:
  company: "公司名称"
  role: "岗位名称"
  source: "JD 链接或来源"
  business_context: "这个团队/产品大概做什么,不确定就写未知"

  responsibilities:
    - id: "R1"
      text: "负责核心服务设计、开发和稳定性建设"
      keywords: ["后端", "稳定性", "服务设计"]
      importance: "high"

  requirements:
    - id: "Q1"
      text: "熟悉 Java/Go 至少一种后端语言"
      type: "technical"
      importance: "must"
    - id: "Q2"
      text: "有高并发系统或微服务经验"
      type: "experience"
      importance: "must"
    - id: "Q3"
      text: "具备良好的沟通协作能力"
      type: "soft_skill"
      importance: "should"

  preferred:
    - id: "P1"
      text: "有云原生、Kubernetes 或平台工程经验优先"

拆完之后,你会发现 JD 不是一堵墙,而是一组可匹配的接口。每个 Requirement 都在问:

你有没有对应证据?证据强不强?有没有缺口?缺口能不能解释?

这就进入下一步。


5. 核心不是生成,是 Match:把要求和证据对上

我建议让 AI 先产出一张匹配矩阵,而不是直接写简历。

职位要求 匹配证据 匹配强度 简历表达建议 风险
Q1:熟悉 Java/Go 项目 P1:用 Go 开发某服务 放在技能和项目第一屏
Q2:微服务/高并发 成果 A2:压测和性能优化 需要补充具体指标 数据不完整
Q3:沟通协作 成果 A3:跨团队推进上线 适合放求职信 注意别写成空话
P1:Kubernetes 项目 P4:部署和排障经验 可放加分项,不要夸大 深度不足

这张表比一份漂亮简历更重要。因为它告诉你:

  • 哪些能力是主线,应该放在简历前半部分;
  • 哪些能力只是加分项,轻描淡写即可;
  • 哪些缺口不能装懂,需要在求职信里诚实处理;
  • 哪些经历其实和岗位无关,应该删掉。

简历不是自传。它是一次查询优化。目标职位就是 query,候选人经历就是数据表,匹配矩阵就是执行计划。你不能把全库都扫一遍塞给面试官,那叫性能事故。


6. 一套可复制的 Prompt 工作流

下面这套提示词,不追求花哨,追求可控。

6.1 把原始经历整理成 Candidate

你是一个严谨的职业材料整理助手。

任务:请把我提供的个人经历整理成 Candidate YAML。

规则:
1. 只能使用我提供的信息,不得编造学校、公司、项目、数据、奖项。
2. 不确定的信息标记为 "unknown" 或 "需要人工补充"。
3. 每条 achievement 尽量拆成 context/action/result/evidence。
4. 对没有证据支撑的形容词,放入 "claims_need_evidence"。

输入如下:
[粘贴你的原始经历、旧简历、项目笔记]

6.2 把 JD 整理成 TargetJob

你是一个招聘 JD 分析助手。

任务:请把下面的岗位描述拆成 TargetJob YAML。

规则:
1. 区分 responsibilities、requirements、preferred。
2. 为每条要求标记 type:technical / experience / soft_skill / domain / management。
3. 标记 importance:must / should / nice_to_have。
4. 提取关键词,但不要过度解释公司意图。

岗位描述如下:
[粘贴 JD]

6.3 生成匹配矩阵

你是一个求职匹配分析助手。

输入:Candidate YAML 和 TargetJob YAML。

任务:生成 Match Matrix。

输出字段:
- requirement_id
- requirement_text
- matched_evidence_id
- matched_evidence_summary
- strength: strong / medium / weak / none
- resume_strategy: 放在摘要 / 放在项目 / 放在技能 / 不建议写
- cover_letter_strategy: 是否适合展开说明
- gap_or_risk

规则:
1. 没有证据就写 none,不要编。
2. strength 为 weak 的,不要写成“精通”。
3. 优先选择和岗位最相关的证据,而不是最炫的证据。

6.4 生成定制简历

你是一个简历编辑助手。

输入:Candidate YAML、TargetJob YAML、Match Matrix。

任务:生成一份针对该岗位的中文简历草稿。

要求:
1. 简历控制在 1-2 页结构内,优先展示强匹配证据。
2. 每条项目经历使用“动作 + 方法 + 结果”的句式。
3. 不得新增 Candidate 中不存在的信息。
4. 对数据缺失处,用 [需要补充数据] 标记,不要猜。
5. 输出后附一段“人工检查清单”。

6.5 生成求职信

你是一个求职信编辑助手。

输入:Candidate YAML、TargetJob YAML、Match Matrix。

任务:写一封 500-800 字中文求职信。

风格:真诚、具体、不过度吹嘘,不要像模板。

结构:
1. 开头:说明申请岗位和最相关的 1 个匹配点。
2. 正文:用 2-3 个证据说明为什么匹配。
3. 缺口:如有弱匹配,诚实说明学习计划或迁移能力。
4. 结尾:表达希望进一步交流。

规则:
1. 不写“贵公司平台广阔、发展前景良好”这类空话。
2. 不夸大经历,不虚构数字。
3. 每个核心观点都要能追溯到 Evidence。

7. 一个小例子:从一句空话到一条证据链

假设你原来在简历里写:

熟悉微服务架构,具备良好的问题分析和性能优化能力。

这句话没有错,但像白开水。我们把它放进领域模型里看。

对应的 Evidence 可以是这样:

注意,下面方括号里的内容是占位符,不是让 AI 猜数字。没有监控数据、压测报告或上线记录,就宁可先空着。

achievement:
  id: "A7"
  summary: "优化订单查询接口性能"
  context: "某核心接口在高峰期响应变慢,影响运营查询效率"
  action: "通过慢 SQL 分析、索引调整和缓存策略优化,将热点查询从同步聚合改为预计算"
  result: "P95 响应时间从 [原始数据] 降到 [优化后数据],高峰期超时告警减少"
  evidence: "压测报告/监控截图/上线记录"

然后 AI 可以把它改写成简历子弹点:

针对订单查询接口高峰期响应慢的问题,完成慢 SQL 分析、索引优化和缓存策略调整,将热点查询从同步聚合改为预计算,P95 响应时间由 [原始数据] 降至 [优化后数据],高峰期超时告警明显减少。

注意两个细节:

  • 方括号里的数据必须你自己补,AI 不准猜;
  • 如果没有数据,就写可观察结果,比如“减少运营手工等待时间”“降低超时告警频率”,但不要硬编百分比。

这就是从“形容自己”变成“证明自己”。

很多简历的问题,不是候选人没做事,而是把做过的事写成了形容词。形容词一多,人就虚;证据链一出来,人就稳。


8. 简历和求职信怎么分工

简历和求职信不是重复关系,而是两种不同视图。

材料 主要作用 适合放什么 不适合放什么
简历 快速证明匹配度 技能、经历、项目、成果、关键词 大段动机、自我感动
求职信 解释为什么适合这个岗位 选择这个岗位的原因、最关键证据、迁移能力 简历复读、空泛表忠心
面试故事卡 为后续面试做准备 STAR 案例、追问准备、反思 过度包装

我的建议是:先生成简历,再生成求职信,最后生成面试故事卡。

因为简历是事实骨架,求职信是动机和解释,面试故事卡是运行时日志。骨架不稳,后面两个都会飘。


9. 质量闸门:投出去之前至少过五关

AI 生成的求职材料,不能生成即发送。至少过这五关。

9.1 真实性检查

逐条问:

  • 这句话是否来自真实经历?
  • 数字有没有来源?
  • “主导”“负责”“参与”有没有区分清楚?
  • 技能熟练度有没有写过头?

“参与过”和“主导过”差一个词,面试里差一口锅。别给未来的自己挖坑。

9.2 匹配度检查

把简历前 30 秒当作首页加载时间。

面试官扫一眼,能不能看到这个岗位最关心的三件事?如果不能,要重排顺序。

9.3 可追问检查

简历里的每个项目,都准备回答三类问题:

  • 你具体做了什么?
  • 为什么这么做?有没有别的方案?
  • 结果怎么衡量?如果再做一次会怎么改?

回答不上来,就别写太满。

9.4 隐私检查

不要把公司内部项目代号、客户名称、未公开数据、源码链接、内部架构图直接贴给外部 AI 工具。能脱敏就脱敏,不能脱敏就只写抽象描述。

求职很重要,但别为了找下一份工作,先给上一家公司制造安全事故。这个账不划算。

9.5 人味检查

最后大声读一遍求职信。如果你自己读着都觉得像模板,那招聘方也会这么觉得。

好的求职信不需要煽情,但要具体。它应该像一个认真准备过的人在说话,而不是一台礼貌机器在自动回复。


10. 常见坑

坑 1:把 AI 当代笔,而不是编辑

AI 可以帮你写得顺,但不能替你想清楚“我凭什么匹配”。这个问题必须你自己回答。

坑 2:一份简历投所有岗位

这就像一个 API 返回所有字段,调用方自己筛。看上去省事,实际没人愿意替你解析。

每个目标职位至少要调整三处:摘要、项目顺序、关键词。

坑 3:关键词堆砌

适当对齐 JD 关键词是必要的,但不要把简历写成搜索引擎优化垃圾页。关键词必须落到经历上。

坑 4:把缺口藏起来

弱匹配不是不能投。关键是诚实处理:说明相关迁移经验、学习计划和补齐路径。藏起来,面试时也会被问出来。

坑 5:过度精修,失去本人声音

简历可以干净利落,求职信不要像公文。尤其是开头和结尾,最好保留一点你自己的表达习惯。


11. 明天就能用的最小流程

不用搭系统,不用写代码。先跑通这个最小闭环:

  1. 找一份你真实想投的 JD。
  2. 把自己的旧简历和项目笔记整理成 Candidate YAML
  3. 让 AI 把 JD 拆成 TargetJob YAML
  4. 让 AI 生成 Match Matrix,先看匹配,不要急着生成简历。
  5. 根据 Match Matrix 手工确认:哪些证据可用,哪些数据要补,哪些不能写。
  6. 再让 AI 生成定制简历和求职信。
  7. 用五道质量闸门检查后再投递。

这个流程跑一次会慢一点,跑三次之后就快了。因为你的 Candidate 模型会越来越完整,后面每个职位只是换一个 TargetJob,再生成一次新的投影。

这才是 AI 的价值:不是替你编一个更像样的人,而是把真实的你,更准确地投影到目标岗位上。

说到底,求职材料不是变脸术。它不是把一个人包装成另一个人,而是把真实的人讲清楚。尤其是刚工作不久的年轻人,不必把自己写成“全栈架构师兼业务增长专家”。你只要把做过的事、学到的东西、能承担的责任讲清楚,就已经胜过一大堆模板话了。


总结

用 AI 写求职信和简历,最危险的不是 AI 写得不好,而是它写得太像真的。

我的建议很简单:

  • 先建领域模型,再生成文档;
  • 先匹配证据,再润色表达;
  • 先保证真实,再追求漂亮;
  • 简历负责证明,求职信负责解释;
  • AI 负责整理和改写,人负责事实和判断。

最后送一句老程序员式的提醒:简历是接口,不是数据库。暴露最该暴露的字段,隐藏不该暴露的实现细节,最重要的是别返回假数据。

行动清单

  • [ ] 建一个自己的 Candidate YAML,至少整理 5 条可证明成果。
  • [ ] 找一个目标 JD,拆成 TargetJob YAML
  • [ ] 生成一张 Match Matrix,标出 strong / medium / weak / none。
  • [ ] 只用 strong 和 medium 证据生成简历主线。
  • [ ] 投递前逐条检查真实性、匹配度、可追问性、隐私和人味。

思维导图

@startmindmap
<style>
mindmapDiagram {
  node {
    BackgroundColor #F8F9FA
    RoundCorner 10
    Padding 10
    FontSize 13
  }
  :depth(0) {
    BackgroundColor #1E3A5F
    FontColor white
    FontSize 18
    FontStyle bold
  }
  :depth(1) {
    BackgroundColor #E3F2FD
    FontSize 15
    FontStyle bold
  }
}
</style>

* AI 生成求职信与简历
** DDD 建模
*** Candidate
*** TargetJob
*** Evidence
*** Match
*** ApplicationPackage
** 工作流
*** 整理 Candidate YAML
*** 解析 TargetJob YAML
*** 生成 Match Matrix
*** 生成简历
*** 生成求职信
** 质量闸门
*** 真实性
*** 匹配度
*** 可追问
*** 隐私
*** 人味
** 常见坑
*** AI 代笔
*** 一稿多投
*** 关键词堆砌
*** 隐藏缺口
*** 过度精修
@endmindmap

AI 生成求职信与简历思维导图


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。