☰
用纯文本搭建个人技能管理系统:从技能树到证据链
2026/10/11 19:48:36 网站建设 项目流程

这两年我最大的一个体会是:很多人不是没有技能,而是根本没搞清楚自己“会什么”。年初写简历的时候对着空白文档发呆,年中复盘的时候只能凭印象说“大概学了点东西”,年底总结的时候又不得不翻遍聊天记录找自己到底做过什么。所以我干脆做了一个叫skills的个人技能管理项目,用纯文本的方式把“我会什么”这件事系统化地管起来。这套方案不依赖任何在线平台,不需要付费软件,只要一个文本编辑器、一个命令行终端,就能建起自己的技能库。适合所有想认真梳理自己能力的人——不管是程序员、设计师、产品经理,还是任何一个想给自己做能力盘点的人。

这套东西做出来之后,我自己的简历质量提升非常明显,更重要的是,我真正能说清楚自己在一项技能上处于什么阶段、有哪些证据支撑、下一步该往哪走。下面我就把整个设计思路、数据结构、实操流程和踩过的坑一次性说清楚。

1. 为什么把“技能”当作一个项目来管理

1.1 技能的真相:不是“会”,而是“可证明”

先说一个很残酷的现实:面试官、合作方、甚至你自己,对一个技能的判断从来不是靠感觉,而是靠证据。你说自己“熟悉 Linux”,但如果让你说出最近一次用 Linux 解决具体问题的场景,你说不出来,那这个“熟悉”就是空的。我自己就吃过这个亏——曾经在一份简历里写了“熟练掌握 Shell 脚本”,结果面试官让我现场写一个批量重命名脚本,我愣是卡了十分钟才拼出来。从那以后我就明白了一个道理:技能不是形容词,是可复现的证据链。

所以这个项目的核心出发点就是:每个技能条目都必须绑定可回溯的证据。这种证据可以是代码仓库、项目文档、实验记录、作品链接,甚至是一篇自己写的笔记。没有证据支撑的技能,在系统里根本就不该存在。这个原则听起来简单,但执行起来非常考验人,因为它逼着你诚实地面对自己到底做过什么。

1.2 从无序清单到结构化技能树

我最早尝试过用备忘录列技能清单,结果发现一个问题:列表只能记录“有什么”,但无法回答“现在学到哪了”“接下来学什么”“哪些技能之间有关联”。比如你写了一个“Python”,那 Django 算不算单独一项?“数据可视化”跟 Python 是并列关系还是包含关系?这种问题在平面列表里根本说不清。

于是我把技能组织成了树状结构。根节点是大的能力域(比如“后端开发”“数据分析”“沟通协作”),子节点是具体技能(比如“Python”“SQL”“演讲表达”)。每个技能节点只归属于一个父节点,但允许跨域打标签。这样既保持了结构的清晰,又能通过标签找回技能之间的隐性关联。树的层级不需要太深,两到三层就够了,再深就会陷入无休止的分类游戏,反而失去管理意义。

1.3 技术选型:为什么用纯文本 + 命令行

在这个项目里我刻意没有选择现成的技能管理软件,而是回到了最原始的组合:Markdown 文件存内容、YAML 头部存元数据、Git 管版本、少量 Python 脚本做查询和统计。这样选有三个原因。

第一是长期可维护性。纯文本文件再过十年也不会打不开,但任何在线服务都可能关闭,任何商业软件都可能停止维护。第二是灵活度。我可以在文件里写任何想写的字段,加任何想加的证据链接,不需要等产品经理给我加功能。第三是命令行的自动化潜力。一旦数据是结构化的纯文本,我就能写脚本做统计、生成雷达图、甚至自动导出一份简历。这种掌控感,是图形界面软件给不了的。

2. 核心数据结构与字段设计

2.1 技能条目的五要素

我设计的最小技能单元是一个 Markdown 文件,文件名就是技能名,文件内容分两部分:YAML 头存放结构化元数据,正文存放自由描述和证据链接。每个技能文件必须包含五个字段:名称、父级分类、等级、证据列表、下一步行动。

名称和父级分类不用多说。等级用来标定当前水平,必须配合明确的等级标准。证据列表是这个技能的“锚”,每一个证据都是一条可点击的链接或文件路径。下一步行动是当前最需要做的一件事,保证这个技能一直处于“有方向”的状态。这五个字段缺一不可,尤其是“下一步行动”,没有它的技能条目就是一块躺在仓库里的化石。

2.2 等级标准怎么定:从 L0 到 L4

等级标准是这个系统里最容易糊弄过去的部分,但恰恰是最重要的。我用的是五位等级制:

  • L0:完全没接触,属于雷达图上不该出现的状态
  • L1:了解概念,看过教程或文档,但没独立做过完整的事情
  • L2:能在指导下完成常规任务,出错时能根据提示修正
  • L3:能独立完成中等复杂度任务,并能解释关键决策的原因
  • L4:能带别人做,能沉淀方法论,能处理非标准问题

判断标准的关键是看行为而不是感觉。比如“了解某概念”和“做出来过”是两个完全不同的级别。我见过很多人把“看过几篇教程”当成“会了”,放在这个体系里,那顶多算 L1,离 L3 还差着几个实战项目。定级的时候我还会强制自己写一句“为什么是这个等级”,这句话通常就暴露了自己水平到底如何。

2.3 标签体系与技能分组

树状结构解决了“从属关系”,标签解决“横向关联”。我给每个技能文件打上若干标签,比如#编程语言、#前端、#正在学、#高频使用。标签不需要设计得太细,太细会导致打标签本身变成负担。我只保留了四类标签:领域标签(属于哪个技术领域)、状态标签(稳定、学习中、搁置)、使用频率标签(每日、每周、偶尔)、证据类型标签(有实战、有笔记、有作品)。

分组和标签配合使用,就能回答很多有意思的问题:“我有哪些正在学的技能?”“我最近用得最多的前端技能是什么?”“哪些技能有实战证据但还没有被写进简历?”这些查询靠简单的脚本就能完成,但如果没有数据支撑,这些问题就只能凭感觉猜。

2.4 一张技能卡片的完整示例

下面是我某个技能条目的真实结构(做了脱敏简化),可以直接当作模板用:

--- name: Python 数据处理 category: 数据分析 level: L3 level_reason: 独立完成过三个完整的数据清洗与分析项目,能熟练处理缺失值、异常值,并能向同事解释每一步处理逻辑 tags: [编程语言, 数据分析, 高频使用, 有实战] evidence: - 项目:某销售数据清洗脚本 - 项目:某用户行为分析 Notebook - 文章:一篇关于 pandas 性能优化的笔记 next_action: 学习 dask 处理更大规模数据,目标是完成一个超过 20G 数据集的实战任务 ---

正文部分我通常会写一段简短的“经验要点”,记录这个技能里最容易踩坑的点和自己总结的套路。比如在 pandas 那个文件里,我会写“read_csv 时永远先看 dtypes,能省下一半内存”。这些经验碎片乍看没什么,攒多了就是一笔巨大的财富。每个文件三五十行就够,不需要长篇大论,重点是记录核心认知。

3. 实操流程:半小时搭起你的技能库

3.1 目录规划与初始化

现在我们从头搭建。先规划目录结构。我的做法是这样:

skills/ ├── meta/ │ └── categories.yaml ├── data/ │ ├── backend/ │ │ ├── python.md │ │ └── sql.md │ ├── frontend/ │ │ └── react.md │ └── soft/ │ └── communication.md ├── scripts/ │ ├── stats.py │ └── export_resume.py └── README.md

data下面按一级分类建子目录,每个技能对应一个 Markdown 文件。meta/categories.yaml用来维护分类结构,脚本读取这个文件就能自动生成技能树。初始化这个动作本质上是“想清楚自己要什么”,所以不用急着建很多文件,先把分类定好,再逐个添加技能,比起一上来贪多要靠谱得多。

3.2 编写第一个技能文件

拿一个最简单的例子:假设你想加入“Python”这个技能。先别急着打开编辑器写内容,先用五分钟想清楚两个问题:这个技能的证据是什么?当前的等级是什么?

第一次写的时候一定会发现,很多技能其实是证据不足的。这时候我建议按“最诚实”的方式处理:没有证据就只写到 L1,不给自己找补。我当时就是这么干的,把自己所有技能都写完之后,发现能上 L3 的技能只有个位数,这逼着我承认了一个事实——大部分时间我都在“低水平勤奋”,学得多,但真正实践得少。这个打击很重要,因为它是整个系统生效的起点。

文件写好之后,立刻用 git 初始化仓库并做第一次提交,这不仅是备份,也是给自己一个“从今天开始系统性管理技能”的心理锚点。

3.3 用 skills 命令完成状态流转

纯手工维护文件其实也能跑,但加了脚本之后体验完全不同。我给skills写了两组核心命令:add和review。add负责创建一个新的技能文件,交互式地询问分类、等级、标签和证据链接;review负责定期巡检,它会列出所有技能文件的状态,标出哪些技能超过 60 天没有更新、哪些技能缺少“下一步行动”、哪些技能的等级描述超过 6 个月没有变化。

命令大概是这样的:

python scripts/skills.py add --category backend --name python python scripts/skills.py review --stale-days 60

review是最有用的命令,因为它把“定期复盘”这个抽象的要求变成了一个具体的输出。每次看到“python 已 47 天未更新”,我就会意识到,这个技能可能已经生疏了,该安排一次实践了。这种有节奏的提醒,比手机里任何任务管理 App 都管用。

3.4 每周复盘:把“正在学”变成“已经用”

我每周日晚上花十五分钟做一次技能复盘,流程固定:先跑review看有哪些技能状态异常,然后浏览本周所有的工作产出,看看有没有新的证据可以挂到已有技能条目上,最后更新每个条目的等级和“下一步行动”。

关键习惯是:做过的每一件有产出的事情,都要在 24 小时内落到技能库。比如我今天写了一个多进程爬虫脚本,那这个事实就必须立刻更新到 Python 技能的 evidence 列表里。不要等月底、等年底,因为到那时候细节早忘了。这个习惯才是技能库能持续积累的核心燃料。

4. 进阶:让技能库真正“活”起来

4.1 证据链管理:把项目、作品、产出挂到技能上

基础版本只能告诉你“我有什么技能”,但真正有价值的是“我的技能强在哪里”。这就要靠证据链管理。我的做法是:每个技能文件里的 evidence 字段都指向具体的、外部可访问的产物。代码技能指向代码仓库地址,写作技能指向已发布的文章链接,演讲技能指向演讲稿或现场视频。没有外部产物的技能,我会在本地放一个成果文件的路径作为临时替代。

证据链的意义在于,它把“我掌握了 X”变成“X 的几个实际应用案例”,前者是一种主张、后者是一种事实。面试的时候我能直接打开仓库给对方看代码而不是嘴上说“我写过”,这种冲击力比任何证书都有说服力。我甚至把一份技能库导出的 Markdown 文档当作简历附件发出去过,反馈相当好,因为对方一眼就看到我做的事都有据可查。

4.2 技能雷达图与差距分析

当数据积累到二三十条之后,就可以用脚本生成可视化了。我用一个简单的 Python 脚本读取所有技能文件的 level 字段,按一级分类聚合,再用 matplotlib 画一张雷达图。这个图对我的用处有两个:一是宏观能力分布一目了然,二是能看到相邻技能之间的水平差。

比如我曾经的雷达图显示“数据分析” 的 Python 相关技能到了 L3,但“数据库”里的 SQL 还停留在 L2,那这就是一个明显的短板。我不需要成为一个全能选手,但我需要知道自己计划组合使用的技能之间是否出现“跛脚”状态。脚本实现不复杂,逻辑无非是把 YAML 数据读进来、按 category 分组求平均分,然后画图罢了。

4.3 和求职、晋升材料打通

技能库积累半年以上,最惊喜的收获是写简历变成了一件“抄作业”的事。我的export_resume.py会扫描所有技能文件中 level 为 L3 及以上的条目,自动生成一个按分类排列的技能清单,并把 evidence 里的项目名称一并列出来。我只需要稍作润色,就能作为简历的技能板块初稿。

这里有个技巧值得说:简历里的项目描述,直接去技能库里找对应的 evidence 展开,因为那都是你真实做过的事。以前写简历总觉得没东西写,那是因为大脑在回忆,现在从库里翻就行。晋升答辩也是同理,评委问“你在某方面有什么积累”,我直接打开技能库,把我这几年在这个技能上的证据链路展示出来,这种结构化的表达远比临场组织语言有说服力。

4.4 团队协作:多人共享技能矩阵

这个系统虽然是给人用的,但后来我发现它也很适合小团队。团队里可以建一个共享的技能仓库,每个人都用自己的分支维护技能文件,GitLab 或 GitHub 上跑一个简单的脚本,定时合并所有人的数据并生成团队技能矩阵。

这个矩阵的威力在于:排活的时候能直接看到谁适合什么任务;做复盘的时候能看出团队在哪些技能上靠一两个人撑着,存在单点风险。不需要复杂的管理系统,一个共享仓库加一个脚本就完成了一个初级的“技能管理平台”。当然团队成员会不会认真维护是另一回事,但从数据结构的支撑度来说,这套方案已经够用了。

5. 常见问题与避坑技巧

5.1 最容易踩的坑:把“了解”当成“熟练”

我见过太多人在技能库里给自己打分虚高,最常见的表现是:读过几篇技术文章,就把某技能标到 L2 甚至 L3。我的应对方法是定了个硬规矩——没有对应的证据就不允许评 L2 以上。每提升一个等级,至少要有一条新增的、独立的证据。这条规矩执行起来有点痛苦,尤其是我曾经想把自己某技能从 L2 改到 L3,但翻遍仓库都找不到第 4 条证据的时候,只能老老实实把等级改回去。也正因为这样,这个系统的数据才真正可信。

5.2 技能太多怎么办:二八法则与优先级

另一个麻烦是技能条目会越来越多,几十个文件铺开根本看不过来。我的建议是:分类保持在 4 到 6 个,总技能数量控制在 20 到 30 条之间。如果一个分类下面的技能超过 10 条,就说明分类太粗或者技能划分太细,需要合并。

还要给自己定一个“重点技能”标签,用#focused标出当前阶段最重要的三项技能。复盘和精力分配都围绕这三项展开,其他技能只要能维持在现有等级不退化就行。记住:技能库的目标不是记录越多越好,而是帮你判断“现阶段该在哪发力”。什么都想学,往往什么都学不深。

5.3 工具链故障与数据备份

既然用了命令行工具,就难免遇到环境问题。Python 脚本报缺依赖、Git 冲突、YAML 解析错误,这些我都遇到过。我的应对方案也很原始:定期把整个目录打包备份到本地另一块硬盘,同时推送远程仓库做异地备份。文件内容本身是纯文本,所以任何环境问题都不会损害数据本身。

有个小细节值得提醒:YAML 里面如果证据链接里含有特殊符号(比如中文括号或空格),一定要用引号包起来,否则脚本解析时可能报错。我自己踩过这个坑,某次把一个带中文冒号的链接直接写进了 YAML,结果整段数据解析失败,排查了很久才发现是标点符号的问题。

5.4 另一个实用技巧:季度技能审计

最后分享一个独家的技巧:每个季度做一次“技能审计”,也就是把技能库整体过一遍,做三件事——删除半年没有更新且不打算继续发展的技能条目;合并过于相似的技能;重新调整个别技能的分类归属。这个动作的本质是给技能库“剪枝”,防止它在收集癖的驱动下变成一座无人打扫的档案库。

每个季度我还会问自己一个问题:如果今天失业,凭现在的技能库,最快能靠哪三项技能找到新机会?这个问题听起来很功利,但它很好地检验了自己的市场价值。技能库不只是一个自我欣赏的后花园,它应该是一个能随时用来应对现实的工具箱。

做这套skills系统,前前后后花了我一个周末加几个晚上的时间,但收益远超我的预期。我最大的感触是:真正有用的不是工具本身,而是它逼着我去正视“证据”和“等级”这两个让人不舒服但极其关键的问题。如果你也经常感到自己学了很多却说不清会什么,不妨用这套纯文本方案试着搭一个自己的技能库,然后用一个月时间持续更新,再回看当初那张技能清单,你一定会看到一个不一样的自己。

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

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

立即咨询