尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用Git仓库搭建个人技能管理系统:从YAML数据到自动化评估

用Git仓库搭建个人技能管理系统:从YAML数据到自动化评估 很多接触过“个人知识管理”的人最后都会遇到同一个瓶颈知识存了一堆笔记越积越厚但“我会什么”“我掌握到什么程度”这件事反而变得越来越模糊。早期的我也一样。技术书读了不少项目做过几轮可真到写简历、做复盘、定学习计划时却说不清楚自己的技能栈到底长什么样。后来我围绕“skills”这个词搭了一套完全属于自己的技能管理仓库问题才算真正解决。本文分享的就是这套方案的完整设计与落地过程包含数据结构、量化标准、自动化实现和我在反复迭代中踩过的一些坑适合所有想把自己或团队的能力资产搞清楚的人参考。1. 项目整体设计与思路拆解1.1 “skills”到底在解决什么问题很多人的第一反应是技能这种东西心里大概有数不就行了现实恰恰相反。“大概有数”是最不靠谱的状态。我见过太多人在面试时被问到“你熟悉多线程吗”回答“还行”然后深问几句就露馅。这并非能力不行而是对自己的技能边界缺少实时的、结构化的认知。“skills”这个项目的本质是把不可见的、模糊的能力认知转化成可见的、可量化的、可追溯的结构化数据。它不只是列一个技能清单而是建立一套完整的技能管理体系包含三个层面技能档案层记录“会什么”用结构化的方式存储技能项每项涵盖领域、工具、熟练度、最近使用时间、项目佐证等信息。动态评估层回答“熟练到什么程度”结合自评打分、项目复盘、使用频率给每项技能动态调整置信度避免一年前的技能印象一路不改地躺在履历里。自动化展示层解决“怎么用起来”通过脚本把技能数据渲染成可视化图谱、简历附件、季度复盘简报让数据真正产生价值。我倾向于把“skills”理解成一套“个人能力操作系统”它输出的不只是列表而是对自身能力结构的实时快照。项目适合三类人正在求职、需要精准呈现技能栈的开发者带团队、需要盘点成员能力结构和补位方向的技术管理者以及长期做技术沉淀、希望持续跟踪自己成长曲线的独立开发者。1.2 为什么选择“仓库 结构化文件”这套方案最初我考虑过直接用现成的技能矩阵工具也试过在Notion里建表格但最终都放弃了。Notion的问题在于数据被锁定在平台里查询、备份、二次加工都不方便在线工具又大多强调团队协同单人场景用起来反而重。最后确定的方案是一个Git仓库 Markdown/YAML文件 轻量脚本。选择这个组合理由很明确数据完全自主可控不依赖任何平台换电脑、换工具都不影响数据完整性。Git天然带版本管理技能变化的历史一目了然哪段时间学了什么、哪项技能最近被激活都有迹可循。结构化文件便于程序处理可以用Python、Node.js等任意语言做二次开发渲染成网页、PDF、简历模板都行。配合GitHub Actions或者本地定时任务几乎零成本实现自动化。这个方案的哲学是“一切皆为文件”。技能数据就是一堆可读、可改、可版本化的文本文件所有上层应用都从这堆文件里派生。你不需要维护复杂的数据库也不依赖特定的软件要的只是一个朴素但明确的数据协议和一点执行纪律。2. 核心细节解析与实操要点2.1 技能分类体系的选择设计技能仓库的第一步是定义分类体系。没有分类技能就是一堆随意堆叠的标签分类过细维护成本会迅速压垮更新动力。我见过的合理做法是“三层分类 自由标签”的混合结构。第一层按领域分比如后端、前端、运维、数据、软技能第二层按子域分比如后端下面拆分Web框架、数据库、消息队列、API设计第三层是具体技能项比如“Spring Boot”“PostgreSQL”“Kafka”。每一层控制在5到8个以内是相对健康的宽度超出就要考虑拆分。另外务必保留自由标签。分类是树状结构有天然的局限性一个技能可能同时属于多个分类比如“Docker”既算运维也算开发工具。标签的作用是把这类横切属性补上。我自己的做法是每个技能项至少要带两个标签一个表示所属业务场景一个表示底层能力维度这样后续做交叉分析时不会漏项。2.2 技能文件的YAML结构设计每个技能对应一个独立文件文件头用YAML Front Matter存储元数据正文部分写详细描述与使用心得。YAML Front Matter是Jekyll、Hexo这类静态站点工具的标准写法熟悉博客的朋友不会陌生它的好处是元数据和正文分离、解析简单、人工可读性高。我的每个技能文件长这样--- name: Spring Boot category: backend subcategory: web-framework tags: [java, microservice, rest-api] level: 4 confidence: 82 last_used: 2024-11-08 projects: [order-center, payment-gateway] learning_note: 对自动配置原理掌握尚浅需要深入阅读源码 ---这里每个字段都有明确的作用name和category/subcategory决定技能归属层次tags解决多维度归类问题level是熟练度评级取值1到5对应从“了解”到“精通”confidence是置信度表示“我有多大把握认为这个评级是准确的”取值范围0到100这个字段很有用防止自评失真last_used记录最后一次实际使用时间用来识别技能有没有“长草”projects作为项目佐证分号分隔的项目名可以在后续渲染时链接到项目档案learning_note是给自己的备注记录能力短板避免盲目自信。用文件方式存储还有一个隐性好处Git的提交历史天然记录了每次修改。比如我某天把某个技能的level从3改到4提交信息里能看到具体原因这比Excel表格里一个数值变化要可靠得多。2.3 熟练度与置信度的量化标准level这个字段如果没有明确定义每个人打分都会漂移。我给自己定了一套严格的评分锚点实践证明清晰的标准能让自评稳定很多等级定义典型表现1了解知道概念读过文档没有完整实现过2入门能基于模板和教程完成基础功能遇到非典型问题容易卡住3熟练独立负责过完整模块能解决常见问题但底层原理掌握不全4精通深入理解原理能针对场景做方案选型和性能优化能带新人5专家能设计通用方案输出可复用的框架或工具能影响团队技术方向confidence字段的加入是我迭代过程中的一个亮点。早期方案只有level结果出了个尴尬情况某项技能明明三个月没碰了翻到旧文件看到自己写过level 4下意识就觉得自己还很行。加了confidence之后每次更新会强制问自己一句“这个等级我现在还配得上吗”。如果长期不用、项目没有新进展confidence就会自动下调倒逼我重新审视学习计划。3. 实操过程与核心环节实现3.1 仓库初始化与目录规划整个项目从初始化一个空仓库开始mkdir skills cd skills git init git branch -M main目录结构是经过几次重构后定下来的整体分四个区skills/ ├── data/ │ ├── framework-backend/ │ ├── framework-frontend/ │ ├── language/ │ ├── ops/ │ └── soft-skills/ ├── scripts/ │ ├── generate_overview.py │ ├── generate_graph.py │ ├── check_freshness.py │ └── stats.py ├── templates/ │ ├── skill_template.md │ └── monthly_review_template.md ├── output/ │ ├── overview.md │ └── skills-graph.html └── README.mddata目录按分类再细分每个技能一项存成独立的Markdown文件文件名用英文短横线连接。scripts目录放所有自动化脚本。templates放新建技能时的模板。output是渲染产物不手动编辑。我把所有生成的文件都加进了.gitignore只保留基础数据和脚本。原因很简单产物类文件可以随时重新生成没必要占据仓库体积也不会在review时产生大量噪音。3.2 新建技能项的标准化流程技能文件靠手动从头写很容易漏字段。我的做法是做一个模板文件把YAML字段说明和正文框架都放进去--- name: category: subcategory: tags: [] level: 1 confidence: 0 last_used: YYYY-MM-DD projects: [] learning_note: --- ## 技能描述 ## 使用场景 ## 掌握程度说明 ## 最近实践记录 ## 下一步学习重点新建技能时复制模板填完字段后放到对应分类目录下即可。这套流程看起来单调但标准化的价值在于当所有技能文件都长一个样时脚本解析就非常容易批量更新也不会漏项。3.3 脚本化生成技能总览数据是基础但一堆YAML文件并不能直接阅读。我用Python写了一个generate_overview.py扫描data目录下所有技能文件解析YAML按分类分组渲染成总览Markdown。核心逻辑比较简单关键在于对排序和分组的处理#!/usr/bin/env python3 import yaml import os import re from datetime import datetime SKILL_DIR ../data OUTPUT_FILE ../output/overview.md def parse_skill_file(filepath): with open(filepath, r, encodingutf-8) as f: content f.read() match re.search(r^---\s*\n(.*?)\n---, content, re.DOTALL) if not match: return None meta yaml.safe_load(match.group(1)) meta[_filepath] filepath return meta def load_all_skills(): skills [] for root, dirs, files in os.walk(SKILL_DIR): for file in files: if file.endswith(.md): skill parse_skill_file(os.path.join(root, file)) if skill: skills.append(skill) return skills def group_by_category(skills): groups {} for skill in skills: cat skill.get(category, 未分类) groups.setdefault(cat, []).append(skill) return groups def render_table(skills): lines [| 技能 | 等级 | 置信度 | 最近使用 | 项目佐证 |, |------|------|--------|----------|----------|] skills_sorted sorted(skills, keylambda x: (x.get(level, 0), x.get(confidence, 0)), reverseTrue) for skill in skills_sorted: name skill.get(name, 未知) level skill.get(level, 0) confidence skill.get(confidence, 0) last_used skill.get(last_used, 未知) projects , .join(skill.get(projects, [])) or - lines.append(f| {name} | {level} | {confidence}% | {last_used} | {projects} |) return \n.join(lines) def main(): skills load_all_skills() groups group_by_category(skills) output [# 技能总览, , f 最近更新{datetime.today().strftime(%Y-%m-%d)}, ] for category in [backend, frontend, language, ops, soft-skills, 未分类]: if category not in groups: continue output.append(f## {category}) output.append() output.append(f技能数量{len(groups[category])}) output.append() output.append(render_table(groups[category])) output.append() with open(OUTPUT_FILE, w, encodingutf-8) as f: f.write(\n.join(output)) print(f已生成 {OUTPUT_FILE}共 {len(skills)} 项技能) if __name__ __main__: main()这个脚本生成的总览是我日常看最多的文件。一眼扫过去哪些技能最近没动、哪些置信度在下降都很清楚。脚本还有个参数可以指定技能名称用来查看单个技能的完整档案非常实用。3.4 用GitHub Actions做自动化巡检手动跑脚本这种事坚持不了几天。我配置了GitHub Actions每次push后自动更新总览并定时巡检“技能保鲜度”。这个保鲜度检查大概是整个项目里最具实用价值的模块了。工作流定义如下name: skill-check on: push: branches: [ main ] schedule: - cron: 0 0 1 * * # 每月1号自动执行 jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-pythonv5 with: python-version: 3.12 - run: | cd scripts pip install pyyaml python generate_overview.py python check_freshness.py - uses: stefanzweifel/git-auto-commit-actionv5 with: commit_message: chore: auto update skills overviewcheck_freshness.py做的事情很直接from datetime import datetime from pathlib import Path def check(): today datetime.today().date() report [] for p in Path(../data).rglob(*.md): if template in p.name: continue meta parse_skill_file(p) last datetime.strptime(meta[last_used], %Y-%m-%d).date() months (today.year - last.year) * 12 today.month - last.month if months 6: suggestion 建议复核等级大概率需要降级 elif months 3: suggestion 建议安排复习或小项目激活 else: continue report.append({ name: meta[name], months: months, suggestion: suggestion }) return report超过6个月没用的技能脚本会提示降级超过3个月的会提示安排激活。这个机制极其有效它时刻提醒着我技能不用就会退化技能清单不是功劳簿而是动态的“能力温度计”。3.5 数据可视化与日常应用文本总览虽然清晰但缺少图表那种直观的冲击力。我用generate_graph.py把技能数据渲染成了一份HTML页面基于ECharts实现了雷达图和散点图。雷达图看能力结构的均衡性散点图以“使用频率”和“熟练度”为坐标轴能一眼看出哪些技能是“高频高能”哪些是“吃老本”。可视化不是花架子它有两个实际用途一是做季度复盘时图表比文字更有利于发现能力结构里的盲区二是在写简历、准备晋升材料时直接从output目录导出图表比自己临时画准确得多。4. 常见问题与排查技巧实录4.1 如何防止技能仓库沦为“打卡墙”技能仓库维护最大的敌人不是技术难题而是动力消退。头两个星期兴致勃勃第三个星期开始忘一个月后整个仓库就躺平了。我踩过这个坑后来靠三条机制才稳下来降低写入成本所有新增技能都从模板复制不需要想格式字段能简则简能少填就少填。绑定仪式感动作我固定在两个时间点更新技能库——项目复盘后、或者每月最后一天当作一种月度仪式而不是临时想起才做。保留更新痕迹每次提交信息写清楚原因比如“提升Kafka到L4完成3个月生产环境维护”。这个历史回顾起来很有成就感也是维持更新动力的重要因素。4.2 自评失真怎么办自评体系的通病是容易两极分化要么高估自己要么过度谦虚。confidence字段只能部分缓解这个问题更有效的办法是引入“外部锚点”。我在学习备注里强制加了一个字段最近一次被同行认可或质疑的案例。这个案例既可以是代码评审里的争执也可以是技术分享后别人给的正反馈。这些客观事件是校准自我认知最有效的外部信号。另外一个技巧是用项目替代技能做评估。我在项目档案里记录每个项目用到了哪些技能项目结束复盘时回写技能文件。项目结果比主观感受可靠得多用项目事实校准技能等级比空对空打分靠谱得多。4.3 个人数据量小值不值得自动化有人质疑说总共不到一百个技能文件手动维护不就行了何必写脚本。我的回答是自动化的价值不在于节省那几秒钟而在于创造你手动不会去做的动作。比如“超过三个月没用就提示激活”这种事手动维护的人根本不会想起来做。自动化提高的不是效率而是决策质量。4.4 技能数据如何对外展示GitHub仓库本身就可以直接作为技能展示页配合pages服务可以渲染成在线页面。我还在脚本里增加了一个导出JSON的选项这样一次性调整格式后技能数据可以自由导入任何自定义简历系统、内部人才盘点工具甚至做成实时更新的个人官网数据源。JSON格式兼容性好几乎不需要再做二次处理。5. 扩展方向与进阶思考基础版本跑通之后还可以往几个方向扩展价值会进一步提升。我目前已经在做的有两个方向也在计划里排了第三个一个是“技能依赖网络”。有些技能之间存在强关联比如Spring Boot依赖扎实的Java基础Kafka要求理解分布式一致性。我计划给数据文件加上dependencies字段构建技能依赖图谱。这样在做学习决策时就能清楚看到“要补Kafka得先补什么”而不是漫无目的地东一榔头西一棒子。另一个是“目标驱动型学习计划”。每季度我会在项目里新建一个goals目标文件列出本季度的成长目标比如“将Docker提升到L4”“建立前端SSR能力”。脚本会把目标与当前技能数据做差异分析自动生成学习路径建议让每个目标都有明确的操作入口。第三个方向是团队版也就是把单人的数据协议扩展到多人。每个成员维护自己的技能文件技术管理者通过脚本汇总成团队能力地图。这样在项目排期、人员招聘和培养计划制定上都有数据支撑而不是凭印象做判断。我在实际维护这套“skills”仓库的过程中最大的感受是能力管理这件事难点从来不在方法而在持续。方法可以学脚本可以抄但真正让这套体系生效的是每一次项目复盘后老老实实打开文件更新那几个字段的耐心。只要数据是活的它回馈给你的价值就是持续的一旦数据长草再花哨的脚本也只是一堆空转的代码。从今天起建一个data目录写下你当前最核心的三项技能这个动作本身就是整个体系开始运转的起点。
返回列表