

# 如何把职位描述变成技能学习计划

用一小套完整职位描述找出反复出现的职责。再用一个项目证明这些职责。

这份计划给必须选择学什么的人使用。你会得到一张技能矩阵和一份排序后的学习计划。技能矩阵是一张表，列出技能、职责、类别和证明。

Actor 是托管的数据采集程序。Task 是已保存的输入预设。[LinkedIn Jobs Actor](https://apify.com/chronometrica/linkedin-jobs-scraper) 采集职位行。你阅读这些行并写出计划。Actor 不标注技能。它不衡量你的能力。它不写计划。

字段是一个有名称的输入，或一个有名称的输出。行是一条采集到的职位记录。2026年10月13日检查了构建版本 0.2.19。它接受 `searchTerm`、`location`、`maxItems`、`maxPagesPerSearch`、`postedWithin`、`saveOnlyUniqueItems` 和 `fetchJobDetails`。

公开的 [技能需求 Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/linkedin-skills-demand) 只是一个起始输入。它并不表示分析会替你完成。

一位[应届毕业生询问该学哪些技能](https://www.reddit.com/r/FresherTechJobsIndia/comments/1ncge8k/recent_data_science_graduate_seeking_advice/)。这个问题说明需要做出学习选择。它不能证明这份计划能带来面试。它也不衡量任何就业市场的规模。

## 1. 写明学习决定

在采集职位广告之前，先写下四个选择。一则职位广告就是一条招聘广告。

写出一个职位族。职位族是一种职位，例如数据分析师。写出一个级别。入门级是指该职位的第一份工作。写出一个市场。市场是你想工作的国家或城市。写下你阅读这些职位广告的日期。

这是针对该选择的学习计划。它不是全国技能短缺的证明。它也不是面试承诺。

不要把高级职位和第一份工作的分析师职位混在一起。如果两组都需要，就分开研究每一组。不要在一张表里混用两个市场。

本文后面的课程是原创虚构内容。它使用入门级数据分析师工作。它使用一个名为 Market One 的虚构市场。阅读日期是 2026年10月13日。同一个日历日期也是 Actor 的检查日期。日期相同并不表示这些职位已被采集。

## 2. 采集完整描述

在标注技能之前，先检查每一行。确认职位身份。确认全文存在。确认行数上限或一次失败的运行是否停止了采集。

行数上限是你要求采集的最大行数。失败的运行是未知的。不要把失败的运行当成零个职位。

只把已保存的 Task 输入当作起点：

```json
{"searchTerm": "data engineer\nsoftware engineer\nproduct manager", "startUrls": [], "saveOnlyUniqueItems": true}
```

2. 采集完整描述

该输入混有数据工程师、软件工程师和产品经理。把这个混合换成一个职位和一个市场。空的 `startUrls` 列表是已保存输入的一部分。本方法使用上面列出的七个字段。

做第一次小检查时，输入这些值：

| 字段 | 值 |
| --- | --- |
| searchTerm | data analyst |
| location | 你的一个市场 |
| postedWithin | any |
| maxItems | 3 |
| maxPagesPerSearch | 1 |
| saveOnlyUniqueItems | true |
| fetchJobDetails | true |

这次检查是一份文本样本。它不是每一个在招职位。它也不是对雇主的全面调查。

对你审查的每一行，保留这些输出字段：

| 字段 | 其中的内容 |
| --- | --- |
| jobId | 来源职位身份 |
| title | 职位名称 |
| companyName | 雇主名称 |
| locationRaw | 职位上的地点文本 |
| descriptionText | 职位描述 |
| descriptionStatus | 全文是否可用 |
| jobUrl | 指向来源职位的链接 |
| query | 该行的搜索词 |
| searchLocation | 你搜索的市场 |
| scrapedAt | 采集该行的时间 |

`descriptionStatus` 有两个有用的值。`full` 表示描述完整到可以标注。`missing` 表示全文不可用。如果状态是 missing，不要标注技能。把该行计为一项缺口。

只看职位名称可能漏掉职责。一段短摘录可能藏起一项必需职责。它也可能让一项优先技能看起来像必需技能。请阅读 `descriptionText`。

有些可选字段可以不存在。不存在和零不是一回事。如果 `companyName` 不存在，雇主就是未知。不要编造名称。如果 `jobUrl` 不存在，只有在 `jobId` 仍能识别该行时才保留该行。

用 `jobId` 去掉同一则职位广告的重复副本。保留一份。不要只因为一位雇主发布了两则，就删掉两则不同的职位广告。在每则广告上保留雇主。一位雇主有多则广告时，可能让一项技能看起来比实际更常见。

检查 `query` 和 `searchLocation`。如果它们与你的职位和市场不符，就把该行留在这一组之外。如果 `locationRaw` 写的是另一个市场，就排除该职位广告。不要把它混进 Market One，也不要混进你的真实市场。

对构建版本 0.2.19 的一次对照检查采集了三个来源职位 ID。它还采集了来源 URL、采集时间和完整的 `descriptionText`。该对照使用了不同的职位和不同的市场。它达到了三行上限。那三行并不是该市场的全部职位。这次对照说明可以采集全文。它不为数据分析师工作选择技能。它也不支持下面的虚构计数。

## 3. 为每项技能保存一行证据

一次阅读一份完整描述。对每项技能或职责，保存一行证据。

保存职位、雇主和来源原句。有真实 `jobUrl` 时，保存来源链接。保存一个简短技能名、一个要求类别、职责和一条备注。

要求类别是你读完句子后给出的标签。只使用四个标签。

- 必需表示文本说你必须具备该技能。
- 优先表示文本要求该技能，但没有说它是必需的。
- 背景表示文本提到一个工具，但不是用来考查你的。
- 不明确表示你无法从字句判断类别。

句子「We use Python」不够。不要仅凭这一句把 Python 标为必需。把它标为背景或不明确。

保留原话。在标注类别之前，不要把原话换成更顺的句子。

[原始词数统计](/zh-Hans/articles/%E8%81%8C%E4%BD%8D%E6%8F%8F%E8%BF%B0%E6%8A%80%E8%83%BD%E6%9C%AF%E8%AF%AD%E8%AE%A1%E6%95%B0/) 把每一次提及都当成同等重要。类别可以阻止这个错误。优先技能不是必需技能。一次背景提及不是你必须先学的技能。

## 4. 保持技能清单简短

为每项技能选一个简短技能名。把原话保留在该名称旁边。

SQL 是用来向表提问的语言。只有当文本指的是同一种语言时，才对 SQL 和 Structured Query Language 使用同一个技能名。

不要合并 Java 和 JavaScript。它们是不同的语言。不要把图表工作和一个产品名合并。不要把每一种云服务合并成一项技能。云服务是通过互联网使用的软件。不同的服务可以是不同的技能。

同义词是同一技能的不同用词。你手工决定同义词。如果两个标签冲突，就保留两条备注。不要声称自动技能工具做了这项工作。这个 Actor 不标注技能。

## 5. 分开统计职位广告和雇主

职位广告数是指有多少则不同的职位广告在该类别中写明该技能。雇主数是指有多少位不同的雇主写明该技能。同一雇主的三则广告是三次职位广告提及。它们仍然是一位雇主。

同时报告类别和两个计数。只用有全文的职位广告作为职位广告总数。不要把结果称为客户需求。不要称为全国比率。不要称为招聘增长。这种搜索不是全部职位的随机样本。

### 虚构样本

下面的表是原创虚构内容。它们用来教这些计数。它们不是 Actor 的输出。它们也不是那次三行对照。

虚构内容有六则你可以标注的职位广告。五位雇主发布了它们。雇主 A 发布了 J1 和 J2。雇主 B 发布了 J3。雇主 C 发布了 J4。雇主 D 发布了 J5。雇主 E 发布了 J6。标签 J1 到 J7 是课程名称。它们不是来源 ID。这份虚构内容没有来源 URL。在真实的表里，保存 `jobId` 和 `jobUrl`。

第七条采集到的行 J7 没有 `descriptionText`。它的虚构状态是 missing。它的技能未知。未知不是零。把 J7 排除在技能计数之外。写明这项缺口。七条采集行中有一条无法标注。技能的职位广告总数是六，不是七。

| 职位 | 雇主 | 全文 | SQL | 电子表格 | Python | 仪表板产品 |
| --- | --- | --- | --- | --- | --- | --- |
| J1 | A | 是 | 必需 | 必需 | 未写明 | 未写明 |
| J2 | A | 是 | 必需 | 未写明 | 优先 | 未写明 |
| J3 | B | 是 | 必需 | 必需 | 未写明 | 未写明 |
| J4 | C | 是 | 必需 | 未写明 | 优先 | 未写明 |
| J5 | D | 是 | 未写明 | 必需 | 未写明 | 未写明 |
| J6 | E | 是 | 未写明 | 未写明 | 优先 | 背景 |
| J7 | 未知 | 否 | 未知 | 未知 | 未知 | 未知 |

「未写明」表示这段虚构文本没有说。它不表示该技能不存在于雇主的真实工作中。

| 职位 | 雇主 | 虚构原句 | 技能名 | 类别 | 职责 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| J1 | A | 你必须使用 SQL 来筛选并连接销售表。 | SQL | 必需 | 筛选并连接表 | 「必须」表示必需。 |
| J1 | A | 你必须使用电子表格来绘制月度结果图表。 | 电子表格 | 必需 | 绘制月度结果图表 | 同一则职位广告中的第二项职责。 |
| J2 | A | SQL 是报告所必需的。 | SQL | 必需 | 编写报告查询 | 文本写明必需。 |
| J2 | A | 额外检查优先使用 Python。 | Python | 优先 | 额外检查 | 优先不是必需。 |
| J3 | B | 你必须使用 SQL 和电子表格来核对订单合计。 | SQL | 必需 | 核对合计 | 一个句子可以包含两项技能。 |
| J3 | B | 你必须使用 SQL 和电子表格来核对订单合计。 | 电子表格 | 必需 | 核对合计 | 不要丢掉第二项技能。 |
| J4 | C | SQL 是必需的。 | SQL | 必需 | 查询数据 | 必需可以单独成立。 |
| J4 | C | Python 是优先项，不是必需项。 | Python | 优先 | 没有必须项 | 文本拒绝必需这一标签。 |
| J5 | D | 你必须在电子表格中清理一张表并绘制图表。 | 电子表格 | 必需 | 清理并绘图 | 文本里没有 SQL。不要添加它。 |
| J6 | E | 优先使用 Python。 | Python | 优先 | 没有必须项 | 只有优先。 |
| J6 | E | 团队使用一种仪表板产品来制作内部图表。 | 仪表板产品 | 背景 | 不是对应聘者的考查 | 不要把它标为必需技能。 |
| J7 | 未知 | 没有描述文本。 | 无 | 未知 | 未知 | 缺口。不要填入零项技能。 |

| 技能 | 类别 | 职位广告 | 职位广告数（共 6） | 雇主 | 雇主数（共 5） |
| --- | --- | --- | --- | --- | --- |
| SQL | 必需 | J1, J2, J3, J4 | 4 | A, B, C | 3 |
| 电子表格 | 必需 | J1, J3, J5 | 3 | A, B, D | 3 |
| Python | 优先 | J2, J4, J6 | 3 | A, C, E | 3 |
| 仪表板产品 | 背景 | J6 | 1 | E | 1 |

必需 SQL 出现在六则中的四则。这些职位广告属于五位雇主中的三位：A、B 和 C。J1 和 J2 都来自雇主 A。第四则 SQL 职位广告增加的是一则广告。它不增加一位雇主。

必需的电子表格工作出现在六则中的三则。这些职位广告属于五位雇主中的三位：A、B 和 D。雇主 D 要求电子表格，并且没有提到 SQL。

优先 Python 出现在六则中的三则。这些职位广告属于五位雇主中的三位：A、C 和 E。在这张表里，Python 不是必需的。

仪表板产品只在 J6 中是背景。六则职位广告都没有把它标为必需。这个「没有」是这六段文本的标签计数。它不是一个国家的结果。J7 仍然未知，所以它不属于这个「没有」。

按关键词排序会把 SQL 放在第一，因为四大于三。然后电子表格会与 Python 并列。它还可能保留仪表板产品。这个排序是错误的学习顺序。

雇主数使 SQL、电子表格和 Python 持平，各有三位雇主。要求类别随后把 Python 排到两项必需技能之后。它也把仪表板产品移出学习清单。多出的那则 SQL 广告是雇主 A 的第二次。它不应让 SQL 单独排在电子表格工作之前。

不要把六分之四变成一个国家全部职位的比率。六分之四只描述这一套虚构内容。

## 6. 标出你已有的证明

简历上的技能名不是证明。证明是另一个人可以检查的已完成工作。一条查询可以是证明。一张清理后的表可以是证明。一张带有书面决定的图表可以是证明。

把每项反复出现的职责标为已有、部分或没有。已有表示已经检查过的证明存在。部分表示该职责有一部分已展示，有一部分缺失。没有表示没有展示证明。不要编造录用分数。不要预测面试。

在这份虚构内容里，学习者可以写一个基本的 SQL 筛选。筛选会保留一些行并去掉其他行。这项证明记为「已有」。学习者没有完成的连接。连接按一个共用键把两张表连起来。这项证明记为「没有」。学习者没有一份合计已核对的报告。核对是指输出合计与输入合计一致。这项证明记为「没有」。电子表格图表的证明也记为「没有」。Python 不是第一项缺口，因为它的类别是优先。

| 职责 | 为什么它在样本中 | 这份虚构中的证明 | 标记 |
| --- | --- | --- | --- |
| SQL 筛选 | 在 SQL 职位广告中为必需 | 可以写出基本筛选 | 已有 |
| SQL 连接 | J1 写了筛选和连接。雇主是 A。 | 没有完成的连接 | 没有 |
| 核对合计 | J3 要求这项职责。雇主是 B。 | 没有已核对的报告 | 没有 |
| 电子表格图表 | 图表职责出现在 J1 和 J5。雇主是 A 和 D。 | 没有完成的图表 | 没有 |
| Python | 只有优先 | 未被选为第一项缺口 | 以后 |
| 仪表板产品 | 只有背景 | 不是必需职责 | 排除 |

技能覆盖面不是具体职责覆盖面。SQL 技能覆盖 3 位雇主。电子表格技能覆盖 3 位雇主。连接职责出现在雇主 A 的 J1。核对职责出现在雇主 B 的 J3。图表职责出现在雇主 A 和 D 的 J1 和 J5。合在一起，这些明确的职责证据覆盖雇主 A、B 和 D。它不覆盖雇主 C。这些职责并不是每一项都覆盖 3 位雇主。

再练习筛选，只会重复已经存在的证明。缺失的必需证明是连接、已核对的合计和图表。第一个项目必须覆盖这些缺口。不要让 J2 单独把 Python 变成整个计划。

## 7. 选择一个项目

在这份虚构内容里，使用 SQL 连接、核对和电子表格图表。这一组是有意的组合。这三项职责适合同一份工作。三项都与必需文本相连。连接职责出现在雇主 A 的 J1。核对职责出现在雇主 B 的 J3。图表职责出现在雇主 A 和 D 的 J1 和 J5。合在一起，明确的职责证据覆盖雇主 A、B 和 D。它不覆盖雇主 C。SQL 技能覆盖 3 位雇主。电子表格技能覆盖 3 位雇主。技能覆盖面不是具体职责覆盖面。这些职责并不是每一项都覆盖 3 位雇主。

有用的项目能证明这项工作。一长串工具不会让它有用。写出你必须先练习的技能。先练习基本连接和电子表格求和。在你能解释 SQL 和电子表格结果之前，不要加入 Python。

验收检查是一项用来判定项目已完成的测试。下面的检查是计划。它们不是测得的学习者结果。本文没有运行查询。下面的合计是对这份测试小例的手工核对。

测试小例是用于该测试的一小套虚构行。保持输入行不变。

客户行：4 个客户 ID。

| customer_id | customer_name |
| --- | --- |
| C1 | 北店 |
| C2 | 东店 |
| C3 | 西店 |
| C4 | 南店 |

订单行：10 笔订单。

| order_id | customer_id | order_month | amount |
| --- | --- | --- | --- |
| O1 | C1 | 一月 | 10 |
| O2 | C1 | 一月 | 20 |
| O3 | C2 | 一月 | 15 |
| O4 | C2 | 二月 | 25 |
| O5 | C3 | 二月 | 30 |
| O6 | C3 | 二月 | 5 |
| O7 | C1 | 二月 | 40 |
| O8 | CX | 一月 | 12 |
| O9 | C2 | 一月 | 8 |
| O10 | CX | 二月 | 18 |

把这些读成两个不同的计数。客户表有 4 个 ID：C1、C2、C3 和 C4。订单使用 4 个不同的客户键：C1、C2、C3 和 CX。其中 3 个订单键是已知客户 ID。有 1 个订单键未匹配。未匹配的键是 CX。C4 没有订单。CX 和 C4 不是同一个事实。

凭直接查看，每个客户 ID 出现一次。预期的重复客户 ID 数是 0。每个订单 ID 也出现一次。这是对测试小例的手工阅读。它不是查询结果。

手工合计，如果每一笔订单都留在月度表中：

- 一月的金额是 10、20、15、12 和 8。它们的和是 65。
- 二月的金额是 25、30、5、40 和 18。它们的和是 118。
- 两个月的和是 65 和 118。它们的和是 183。
- 十笔订单金额的和也是 183。
- CX 的金额是 12 和 18。它们的和是 30。
- 已匹配金额是 183 减 30，即 153。

一张包含每一笔订单的正确月度表应显示 1月 65、2月 118，合计 183。图表应显示这两个月的金额。本文不包含一张完成的图表。你在电子表格中制作图表。

未匹配的订单是 O8 和 O10。两者都使用 CX。一次正确的未匹配键测试应指向这两行。

这份虚构内容的项目简报：

- 输入：上面的 10 行订单和 4 行客户。
- 输出：一张月度销售表、一张电子表格图表，以及两条书面发现。
- 方法：把订单连到客户，标出 CX，并按月对 amount 求和。
- 质量检查：手工把输入相加，并使 183 与月度表一致。
- 展示：查询文本、图表、未匹配的键，以及一条局限。

从测试小例应能得出两条发现。第一，CX 不在客户表中，它的金额是 30。第二，C4 没有订单。这些发现是预期说明。它们不是一次运行的结果。

月度表的计划查询文本。本文没有运行它。

```sql
SELECT o.order_month, SUM(o.amount) AS month_amount
FROM orders AS o
GROUP BY o.order_month
```

7. 选择一个项目

未匹配订单键的计划查询文本。本文没有运行它。

```sql
SELECT o.order_id, o.customer_id, o.amount
FROM orders AS o
LEFT JOIN customers AS c
  ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL
```

7. 选择一个项目

使用这些验收检查：

1. 原来的 10 行订单和 4 行客户保持不变。
2. 该工作报告 10 笔订单。
3. 该工作报告 4 个客户 ID。
4. 该工作报告订单上有 4 个不同的客户键。
5. 这 4 个键被写明为 3 个已知 ID 加上未匹配键 CX。
6. 备注解释 CX，并且不把它和 C4 混淆。
7. 手工检查显示订单金额合计为 183，月度表的合计也是 183。
8. 查询文本和图表都已展示。
9. 学习者解释一条局限。

一条清楚的局限就够了。例如，月度合计包含未匹配的 30，而已匹配合计是 153。另一条真实局限是，这个项目不能证明 Python。第三条是，六则虚构职位广告不是全国结果。这些局限中的任何一条都可以通过最后一项检查。

## 8. 排列计划

把工作分成四个部分。不要从优先技能开始。

第一部分是你先做的练习。在这个测试小例上练习一次连接。练习一次电子表格求和。

第二部分是组合项目。建立月度表。建立图表。写出两条发现。

第三部分是复查。另一位读者使用验收检查。读者不必信任一个分数。读者可以数出 10 笔订单，数出 4 个客户 ID，找到 CX，并把金额相加。

第四部分是说明。解释未匹配的键。解释一条局限。

这份虚构内容的排序很短。首先做连接、核对和图表。这些职责是必需的，而且证明缺失。这个项目是有意的组合。明确的职责证据覆盖雇主 A、B 和 D。它不覆盖雇主 C。这些职责并不是每一项都覆盖 3 位雇主。SQL 技能覆盖 3 位雇主。电子表格技能覆盖 3 位雇主。技能覆盖面不是具体职责覆盖面。接着，用这些检查复查该项目。只有在你能解释这项工作之后，再练习 Python。把仪表板产品留在技能计划之外。

你自己设定时间盒。时间盒是你选择花费的时间。它不是你将掌握该技能的承诺。在这份虚构计划里，练习用一次工作时段。项目用一次工作时段。复查和说明用一次工作时段。

如果你改变职位、级别或市场，就采集一份新样本。使用同样的规则。不要把这个虚构排序用于不同的职位。

## 下一步

在你自己的全文样本中，选择一项在不同雇主之间重复出现的必需职责。为一个能证明该职责的项目写一条验收检查，并写上第二个人可以检验的输入计数。用 [LinkedIn Jobs Actor](https://apify.com/chronometrica/linkedin-jobs-scraper) 采集职位文本。从已保存的 [技能需求 Task](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/linkedin-skills-demand) 开始。把三个混合职位换成一个职位和一个地点，并保持较小的行数上限。

## 来源和延伸阅读

- [LinkedIn Jobs Actor](https://apify.com/chronometrica/linkedin-jobs-scraper)
- [LinkedIn 职位描述技能需求数据集](https://apify.com/chronometrica/linkedin-jobs-scraper/examples/linkedin-skills-demand)
- [数据科学应届毕业生寻求建议](https://www.reddit.com/r/FresherTechJobsIndia/comments/1ncge8k/recent_data_science_graduate_seeking_advice/)