☰
用证据链管理个人技能:从YAML到五级模型的技能档案实战
2026/10/20 4:05:26 网站建设 项目流程

可能很多人第一次看到“skills”这个项目名,都会觉得含义太宽泛,但对我来说,它恰好代表了我这几年在做的一件很朴素的事:把“我会什么”“我多会”“我凭什么说我会”这三件事,用一套系统管理起来。

这个项目最初只是一个命令行小工具,用来记录我的技术技能清单,后来慢慢长成了一个带等级、带证据、带时间戳、能生成个人技能画像的轻量系统。它解决的核心问题很简单:面试、写简历、年中述职的时候,我常常说不清楚自己到底在哪个水平线上,全靠记忆和感觉,结果就是自我评价忽高忽低,和别人的认知对不上。这篇文章我把它作为一次完整的实操复盘写出来,适合想建立个人技能档案、带小团队做能力盘点、或者打算做技能管理工具的人参考。

1. 项目背景:为什么我会做一个叫 skills 的项目

1.1 最开始的痛点

我属于平时喜欢往开阔地带走的人,今天学一点 Python,明天碰一下容器化,后天又看两眼前端框架。学习本身是快乐的,但副作用也很明显:知识面看着很广,每一条都浅尝辄止。直到有一次准备季度述职,领导让我把“核心能力”列一列,我打开旧的简历文档,发现上面写的还是三年前的描述,实际掌握的内容早就变了,但又说不出自己究竟进展了多少。

那一周我做了一个很蠢的尝试:把电脑里所有项目目录过了一遍,试图从工程实践中反推技能水平。结果更糟糕,项目目录多到几十个,有的一次性的脚本,有的是给别人搭的临时工具,有的只开了个头。靠翻文件的方式评估自己,等于用记忆去还原一张本来就没存的图,完全做不到。

也是那段时间,我帮团队整理培训需求,发现大家对自己能力的描述五花八门:有的人把“用过”说成“熟练”,有的人明明掌握了工具链,却说自己只会皮毛。这种主观性不只是沟通问题,它会直接影响任务分派和成长规划。我当时就在想,如果有一份结构化的、带证据链的技能清单,这些问题是不是能直接解决一半。

1.2 这个项目到底解决什么问题

skills 要解决的,不是“给技能打分”这么简单。它要解决的是一连串问题:

  • 怎么用同一套标准描述不同领域的能力,而不是这个工具一个标准、那个框架另一个标准?
  • 怎么让自我评价不再凭感觉,而是有据可查、经得起别人问?
  • 怎么让技能清单不是一潭死水,而是能持续更新、能回溯历史?
  • 怎么让技能盘点不仅服务于个人,还能用于团队任务指派、培训规划?

因此我做了三个核心设计决策。第一,数据全部落成本地文件,用版本管理工具维护,每次改动都有记录。第二,每一项技能必须绑定至少一条“证据”,证据是客观存在的工程产物、事件或反馈。第三,等级描述采用业界成熟的五级模型,并且为每个等级写清楚行为特征,不搞抽象数字。

这三个决策贯穿了后续所有代码和数据结构。你可以把 skills 理解成一个“能力界的账本”,每次新增一条技能,都像记一笔账,必须有凭证、有时间、有来源。

1.3 适合谁用

从我实际体验来看,有三类人最值得在这个思路上下功夫:

  • 技术从业者:每年做个人复盘、换工作写简历、和 leader 对齐成长预期。
  • 团队负责人:想了解组内成员的真实能力分布,辅助分派任务、制定培训方向。
  • 自由职业者:需要不断向客户解释“我能做什么、我哪方面最强”,证据化技能清单要比口头说服更有力。

如果你只是想找一个现成的指标系统打分,这个项目可能不太合适;如果你想建立一套属于自己的、能持续运转的能力记录方式,这篇文章的代码和思路你基本可以照着搬。

2. 整体设计与核心取舍

2.1 数据模型:技能、等级、证据、时间戳

最开始我画了一张简单的 ER 图,后来发现需要管理的实体并不复杂,核心就是四个字段组合在一起。

一个技能记录长这样:

- name: Python category: 编程语言 level: competent evidence: - 2024-11 为某数据清洗工具新增并发处理模块,线上稳定运行两个月 - 2025-01 独立完成某内部脚本框架的重构,测试覆盖率达到 85% updated: 2025-01-08

字段拆解一下:

  • name:技能名称,尽量用公认的叫法,比如 Python、SQL、项目管理,不要自创“高效沟通与协调”这种模糊词。
  • category:所属分类,我用“编程语言”“前端技术”“数据技术”“开发工具”“软技能”“领域知识”六类,后续可以自己改。
  • level:五级等级中的一个,具体标准见 2.3。
  • evidence:证据列表,这是整个模型的灵魂。每条证据应该包含大致的发生时间、项目/场景、具体做了什么、可观察的结果。没有证据的技能会让人缺乏信任感。
  • updated:最近一次更新的日期,用于判断这条技能是不是已经“过期”,也方便生成周报、月报的变化统计。

这套模型是可以直接迁移到关系型数据库的,但第一阶段用本地文件就足够了。本质上,任何能支持“列表+键值对”的数据格式都可以,我只是选了 YAML。

2.2 为什么用 YAML 而不是数据库

很多人一听到“做系统”,第一反应就是上数据库。我在这个项目里反其道而行,刻意选了 YAML 文本文件。理由很简单:

  • 个人系统数据量极小,几千条技能撑死了也到不了数据库的规模。
  • 文本文件可以直接放进版本管理工具,技能的每一次变更历史都可以被追踪,这是上难度很高才能实现的效果。
  • 可以在命令行里直接用文本编辑器改,不需要写任何管理后台。
  • 对新手友好,打开文件就能看懂结构,不会把问题复杂化。

当然 YAML 也有缺点,比如缩进错了就解析失败、转义字符处理麻烦。所以我在代码里加入了“读取前校验”和“错误提示定位”,并在 CLI 命令里尽量用结构化的增删改,绕开手改文件的麻烦。

如果你一定要用数据库,我觉得也可以,SQLite 是比 MySQL 更好的选择,因为零部署、单文件、可移动。但对我来说,YAML 这套方案已经够用了,能持续维护才是最重要的。

2.3 等级体系:借了成熟模型的五级框架

我在 1.2 提到的五级模型,就是工程领域常说的技能发展模型。等级名称和典型特征我给它们做成了下表:

等级我的判断依据
新手(novice)需要步骤指引,无法独立完成;遇到问题容易卡住
高级新手(advanced)能完成常见任务,但遇到边界情况依赖搜索或求助,解决方案缺乏全局性
胜任(competent)能独立完成任务,能处理教科书之外的场景,会考虑多个方案并权衡
精通(proficient)能整体把控一个领域,能总结出方法论,能指导他人,并能预防潜在问题
专家(expert)能创造新方法、新思路,是团队或社区公认的“破局者”,对非常规问题有直觉级判断

需要强调的是,我用的不是简单的“熟悉/掌握/精通”,因为那个口径每个人理解都不一样。等级判断的唯一推荐方式是结合证据。比如你自己觉得“Python 是精通”,但没有产出过有影响力的项目,也没解决过疑难问题,那大概率是胜任而不是精通。

2.4 目录结构与命令设计

实际项目目录长这样:

skills/ ├── cli.py ├── core.py ├── models.py ├── config.py ├── templates/ │ ├── profile.md │ └── weekly.md └── data/ └── skills.yaml

关于命令,我做的是尽量小、尽量分而治之的 CLI:

skills init skills add "编程语言/Python" --level competent --evidence "2025-01 独立完成某数据采集工具" skills update "编程语言/Python" --level proficient skills rm "编程语言/废弃技能" skills ls --category 编程语言 skills snapshot skills report --format markdown skills suggest

一条命令对应一个动作,没有任何隐式状态。如果你也打算照着写,建议保持这个原则:宁可命令多一点,也不要搞出一个“魔法命令”让你看不懂自己在干什么。

3. 核心实现:让 skills 工具真正跑起来

3.1 命令行入口与数据读写流程

我用的是 Python 标准库 argparse,没有引全功能框架,这样部署成本最低。整个程序的读写流程可以理解为三步:

  1. 读取 YAML 文件,转换成 Python 字典。
  2. 执行增删改查操作,更新字典。
  3. 重新序列化,写回原文件。

这个流程简单有效,但有一个细节必须处理:写回文件的时候不能破坏原有的注释和格式。YAML 库在 dump 的时候默认会丢弃注释,我用的是自定义的“节点级”操作方法,尽量避免整文件重写。如果你也想做类似工具,我的建议是尽早确定好“最小改动”策略,否则每执行一次命令,文件就乱一次,最后你都懒得开了。

核心代码的骨架大概长这样:

def load_data(path): with open(path, encoding="utf-8") as f: return yaml.safe_load(f) def save_data(path, data): with open(path, "w", encoding="utf-8") as f: yaml.safe_dump(data, f, allow_unicode=True, sort_keys=False)

注意sort_keys=False这个参数,默认情况下 yaml 会把字典按字母排,那样会把你的分类顺序打乱,体验很糟糕。

3.2 让“证据”成为强制字段

这是整个系统里最“反人性”但最有效的一步。在 add 命令里,我把--evidence设为必填参数,如果你不填,命令直接拒绝执行。

$ skills add "编程语言/Go" --level competent 错误:至少需要一条证据,evidence 不能为空。

一开始我也觉得强制证据太麻烦,但用了一段时间后,我发现它倒逼我在“记一次技能”的时候同步想起“我到底在什么场景用过”。如果没有这条证据,以后回看清单,我根本分辨不出来这是个踩过水的小坑,还是真的学会了。

证据本身最好遵循“时间 + 场景 + 结果”的格式。比如“2024-12 在订单服务重构中,负责缓存层改造,接口响应时间降低 40%。”这种描述既具体又便于别人核实。尽量避免写“熟悉 Python”,那不是证据,是立场。

3.3 报告生成:技能矩阵与个人画像

数据是有了,但人看起来还是不够直观。我加了一个 report 命令,目前能生成两类东西:一类是按分类聚合的技能矩阵,一类是个人画像 Markdown。

技能矩阵用表格展示:

| 分类 | 技能 | 等级 | 最近更新 | 证据数 | | --- | --- | --- | --- | --- | | 编程语言 | Python | 胜任 | 2025-01-08 | 2 | | 编程语言 | JavaScript | 高级新手 | 2024-11-20 | 1 |

个人画像则是把所有“精通/专家”级别的技能汇总成一段总结性文字,同时会附带更新时间,避免画像过期。这两个功能放在一起,基本上可以替代我原来手写“个人亮点”的过程。

我实现上用了模板引擎,模板放在 templates 目录下,改样式和生成格式都方便。如果你想输出 HTML 甚至 PDF,思路也是完全一样的,就是把模板换掉。

3.4 快照与历史回溯:自我复盘的精神基础

技能系统最怕“只增不改”或者“只改不留”,那样到了年底你根本看不出自己这一年的变化。我给 skills 加了一个 snapshot 命令,它做的唯一一件事,是把当前 YAML 复制一份到snapshots/2025-01-12.yml这样的路径下。

这条命令本身没什么技术含量,但它带来的行为改变非常大:每周五下班前我会主动执行一次skills snapshot,月末再跑一次 diff 看一下这个月在哪些技能上投入了时间、哪些技能已经被标记成过期。配合版本管理工具的 diff 功能,我可以精确看到自己技能树的全貌演化过程,这让我在季度总结的时候写出来的东西跟以前完全不是一个颗粒度。

4. 实操记录:从零上手的一个完整示例

4.1 初始化与第一份清单

我第一次跑这套流程大约花了 40 分钟。先执行skills init生成默认配置和空数据文件,然后开始录入。这里我有一个很实用的建议:不要一上来就追求大而全,先只录入“最近 3 个月你实际用过”的技能,其他的一律不写。这样做有两个好处:一是数据质量高,二是以后更新起来不会有心理负担。

我当时录入的第一批技能是:Python、Bash、SQL、Docker、Markdown 写作、需求梳理。我把每一项都按照“五级模型 + 证据”格式填好,最后生成的清单让我第一次对自己的能力底盘有了比较清晰的认识。

4.2 日常维护节奏

日常维护我把它变成了一种轻量习惯:

  • 每周五:新增技能或更新证据,跑一次 snapshot。
  • 每月底:跑一次 report,看一下当月技能变化 diff。
  • 每季度:针对“精通及以上”的技能做一次复核,确认证据是否还立得住。

这里的关键是“小步快跑”,不要想着一个月只做一次大更新,那样很容易因为积压太多而彻底放弃。技能归档还有一个诀窍:凡是超过一年没更新、也没证据投入的技能,我会把它移入“休眠清单”,而不是直接删除,避免误删和将来重新想起时有记录可查。

4.3 一次完整的季度复盘流程

假设现在是 4 月份,我要做 Q1 复盘。我的操作路径是这样的:

# 先看当前清单 skills ls --all # 对比快照 diff snapshots/2025-03-31.yml data/skills.yaml # 生成季度技能画像 skills report --format markdown --out Q1-profile.md

然后我会打开 Q1-profile.md,对照 Q1 的目标清单逐一核验。这个过程看起来只是生成了一份文件,但实际上,它逼着我把抽象的“成长”变成了可量化的清单变化。第一季度我在实践中做了一次 DBA 相关工作,于是把 SQL 从“高级新手”更新成了“胜任”,并补了一条小项目证据,这种感觉比自己在心里默默以为自己进步了要踏实得多。

5. 踩坑实录与问题排查

5.1 分类体系漂移:旧数据该怎么迁移

我用了大概三个月后就遇到一个问题:最初把分类设得太粗,只有“技术”和“非技术”两类,结果“技术”分类里混进来沟通、项目管理、Python,乱七八糟。后来我决定把分类细拆成六类,于是所有历史数据都需要迁移。

我踩的坑是:直接在 YAML 里手动批量替换,结果因为缩进问题导致整个文件解析失败。这个教训告诉我,迁移一定要写脚本,不能用人工。用 Python 把旧数据读进来,然后根据关键词映射表移动分类,最后再写回去,十分钟搞定。

这类问题以后也还会出现,我建议你在项目里预留好“数据迁移脚本”目录,每次分类规则变更,都留一个版本化的迁移脚本,而不是就地改数据。

5.2 自评分数失真:怎么面对“高估”和“低估”

我在内部试用的时候,让团队成员也按这套体系给自己打分。结果非常有意思:有的人明明只写了几个脚本,却给自己标了“精通”;有的人做过很复杂的系统改造,却只敢标“高级新手”。这说明自评这件事,天生就受性格和参照系影响。

后面我采用了一个温和的校正机制:自评只作为起点,一个月或一个季度后,和实际协作的同伴做一次对照复盘。如果证据里找不到能支撑当前等级的内容,我会暂时把等级降一级。这个方法不能做到完全客观,但起码能压制住“自我感觉良好”的系统偏差。

5.3 常见问题速查表

问题原因解决办法
YAML 解析报错手改文件导致缩进或转义错误用 CLI 命令变更数据,不要直接用编辑器改
技能分类混乱分类粒度太大或太小提前定义好 6 类左右的一级分类,尽量别超过两级
等级普遍偏高缺少证据约束强制证据字段,定期做同伴交叉评价
维护频率下降,数据过期没有养成更新习惯固定每周快照,用好 reminder 或日历提醒
报告输出和预期不符模板没更新模板单独版本化,修改后立刻跑一次渲染确认

这五类问题几乎是我所有使用者的共性踩坑点,提前知道它们,能让你的使用过程顺畅非常多。

6. 向团队场景和 AI 辅助扩展

6.1 从个人工具到团队技能地图

后来我把这个工具的思路带进了团队,做了一次轻量化改造:每位成员维护一份自己的 YAML 文件,定期提交,再由一个汇总脚本生成团队技能地图。汇总结果不用于绩效,只用于任务分派和培训规划。

这个扩展比我预想的顺利,原因是有三大好处:第一,负责人能一眼看出某个技术点谁最资深;第二,新人可以看团队地图里有哪些“高等级”的人去请教;第三,培训需求不用再靠猜测,地图上“高级新手”扎堆的技能就是重点方向。

当然我也要提醒一句:团队版推广时一定要强调“这是成长工具,不是绩效考核”。只要一牵扯考核,大家就会开始美化自己的清单,最后数据全废。

6.2 接入 AI 辅助的初步尝试

在最近几个月,我开始把 skills 和语言模型能力结合做自动化。具体做了两件事:

  • 技能盘点草稿:输入一段“最近做了啥”的自然语言记录,AI 帮忙抽取技能名称、等级和证据片段,然后我再人工确认。
  • 成长建议:根据当前技能分布和最近快照差异,生成下一阶段的学习方向和推荐项目,减少我从零做规划的成本。

这块落地起来不复杂,核心还是把数据喂给合适的模型,再对输出做结构化校验,确保生成结果能直接 merge 进原有 YAML。这个方向我没做得很重,但它让我意识到,技能管理未来应该是“人负责判断,工具负责记录,AI 负责提炼”。

6.3 我个人坚持下来的体会

最后说一点我的真实感受。很多人觉得记录技能很麻烦,坚持不下来,我也曾经断更过。但后来我降低了对自己的要求:不追求每天记,只追求每周留下一个快照;不追求每条技能都有完美证据,只要求以后能讲清楚“我为什么会这么评价自己”。

这套系统没有给我带来直接的工资涨幅,也没有让我的简历一键金光闪闪。但它让我的能力不再是一团模糊的感觉,而是我能随时打开、随时查阅、随时向别人展示的真实资产。如果你也在为“我说不清自己会什么”而烦恼,我建议你从今天起,放下打分评测的心思,认真记录三件事:你做过什么、拿到过什么结果、你在这件事里的位置是什么。这三件事记录得多了,你的能力画像自然就清晰了。

skills 这个项目到现在仍然在迭代,但它核心的价值不是代码本身,而是让我养成了用证据说话的工作习惯。希望这篇复盘能给你的技能管理、团队盘点或者工具设计带来一些启发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询