ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用Git仓库与Markdown搭建个人技能库:从零到高效复用

用Git仓库与Markdown搭建个人技能库:从零到高效复用 “skills”这个标题乍一看很泛但在技术社区和开发者圈子里它往往指的不是虚无缥缈的“能力”而是一个实打实的项目把一个人反复用到的脚本、配置、命令行片段、技术决策记录整理成一个叫“skills”的仓库。这个仓库可以是公开的也可以是私有的核心价值只有一个——别让同样的事情做第二遍。我最初把“skills”当成一个普通笔记目录来维护结果半年后回过头看它已经变成了一个包含几十个Markdown文件、十几个脚本、三套配置模板的个人技能资产库。这篇文章把我从零搭建、迭代、踩坑的全过程整理出来重点讲清楚这类项目到底该怎么设计、怎么落地、怎么避免变成“收藏夹吃灰”的结局。适合正在整理个人技术沉淀、想搭建自己的技能库/工具箱/运维手册的开发者参考。1. 项目整体设计与思路拆解1.1 “skills”到底是什么为什么值得做成项目很多人听到“技能库”第一反应是“不就是笔记吗”但笔记和技能库有本质区别。笔记的定位是记录信息它的核心动作是“写下”技能库的定位是复现能力它的核心动作是“调取”。同样是记录一条Nginx反向代理配置笔记里可能就是一行链接技能库里则应该是“可以直接复制改参数就能用”的完整配置块加说明。之所以叫“skills”而不是“notes”或“docs”是因为这个项目的筛选标准完全不同能进这个仓库的必须是经过验证、有明确产出、值得反复调用的东西。一条调试了一下午才解决的报错值得入库一篇看过觉得“挺有道理”的文章不值得入库。这个筛选标准决定了仓库的密度和价值。从工程角度来看把技能沉淀做成项目还有几个实际好处。首先是版本管理技能不是一成不变的昨天的最优解可能今天就被更好的方案替代用Git管理就能看到每次变更的原因和演进轨迹。其次是可检索性散落在脑海和笔记里的经验是没法检索的而一个结构化的仓库可以通过文件名、标签、全文搜索快速定位。最后是可迁移性换电脑、换团队、换公司这个仓库可以整体带走个人的核心生产力不会因为环境变化而清零。1.2 方案选型为什么用Git仓库加Markdown而不是其他工具这个项目可以用各种工具实现Notion、语雀、Confluence、私有Wiki……每种我都试过最终选定“Git仓库 Markdown文件”这套组合原因有三个。第一零依赖。Markdown是纯文本任何设备上打开都能读不需要特定软件、不需要联网、不需要账号权限。Git是开发者最熟悉的工具不需要额外学习成本。整个项目不依赖任何第三方平台平台挂了仓库还在。第二天然支持代码。技能库里很大一部分内容是代码片段、命令行、配置文件Markdown的代码块语法能把这些内容格式化呈现配合语法高亮阅读体验远超普通文档系统。相比之下很多在线文档工具对代码块的支持都差一口气——缩进会被吃掉空格会被替换脚本复制下来根本跑不了。第三便于自动化。纯文本文件可以被脚本处理可以做全文检索、做标签统计、做内容校验甚至可以把某个技能文件直接include到实际的项目配置里。这是Web版文档工具很难做到的它们的数据都在别人的数据库里你只能通过API去捞。当然这个方案也有代价没有内置的编辑界面、没有协同评论、移动端阅读体验一般。但对于个人技能沉淀这个场景利远大于弊。1.3 目录结构怎么设计才合理仓库建起来的第一步就是定目录结构。我见过很多技能库项目死在这一步——要么目录分得太细建完十几个文件夹发现根本不知道该往哪儿放要么完全不分目录几百个文件堆在一起检索基本靠翻。我最终采用的结构是按“领域”一级分类按“类型”二级组织大致长这样skills/ ├── README.md # 入口文件索引全部技能 ├── scripts/ # 可执行的独立脚本集合 ├── templates/ # 各类配置模板如nginx、docker-compose、gitignore ├── snippets/ # 代码片段按语言细分 │ ├── shell/ │ ├── python/ │ ├── javascript/ │ └── sql/ ├── troubleshooting/ # 问题排查记录按场景命名 ├── workflows/ # 多步骤操作流程 └── knowledge/ # 经过验证的技术决策与原理笔记这个结构的关键在于分类没有超过两层。领域目录下一层就到底因为技能检索的核心路径是“我知道我要找的东西属于哪类”如果层级太深这个“知道”就变成了负担。文件名承担了剩下的索引作用比如nginx-reverse-proxy-ssl.md、fix-docker-container-exit-code-137.md一眼就能看出内容是什么。2. 核心细节解析与实操要点2.1 Markdown技能文件的标准模板文件结构是整个技能库的灵魂。我迭代过很多版本最终固定下来一套模板每个技能文件都按这个骨架来写# 技能名称 ## 适用场景 什么情况下你会需要这个技能解决什么问题。 ## 前置条件 - 依赖的工具或环境 - 需要提前安装的依赖 ## 操作步骤 1. 步骤一说明与操作 2. 步骤二说明与操作 ## 验证方法 怎么确认这个操作真的成功了。 ## 常见错误 - 错误现象 - 原因分析 - 解决办法 ## 参考资料 原始来源链接或者灵感出处。这套模板的出发点很简单每一个技能都应该能“照做”。“适用场景”管判断让别人包括三个月后的自己快速确认该不该看这篇“前置条件”管准备避免看了半天发现自己环境缺东西“操作步骤”管执行一步一步做就行“验证方法”管预期——很多人踩坑是因为做完之后根本不知道什么叫“成功”导致明明操作对了还在反复折腾常见错误管兜底把已知的坑提前标出来。2.2 可执行脚本的规范不能有“一次性”代码技能库里一定会沉淀很多脚本比如日志清理、环境检查、批量改名、定时备份。脚本的规范比Markdown文件更重要因为脚本是要直接运行的运行出错不只是“读起来不顺”的问题。我给自己的脚本定了几条硬规矩每个脚本必须有set -euo pipefailBash脚本任何一行出错立即终止绝不带病执行必须有入参校验参数不对就打印用法并退出必须输出清晰的日志信息让人知道当前在做什么、做完的结果是什么同一个功能只保留一份脚本需要参数变化通过命令行参数解决而不是复制出十几个微调版本举个例子一个清理旧日志的脚本最初我写的是下面这样的find /var/log -name *.log -mtime 30 -delete这个脚本如果误执行了会把所有30天前的日志全部删除没有任何确认没有输出——不满足“可复用”的标准。后来我重构为带参数校验和确认机制的版本#!/usr/bin/env bash set -euo pipefail # 用法: ./clean_old_logs.sh 日志目录 保留天数 if [ $# -ne 2 ]; then echo 用法: $0 日志目录 保留天数 exit 1 fi LOG_DIR$1 DAYS$2 echo [INFO] 开始清理 $LOG_DIR 中 $DAYS 天前的日志文件... find $LOG_DIR -type f \( -name *.log -o -name *.gz \) -mtime $DAYS -print -delete | while read -r f; do echo [INFO] 已删除: $f done echo [INFO] 清理完成。脚本可用的判断标准只有一条一个完全不知道来龙去脉的人看脚本的日志输出和用法提示能不能安全地执行它。如果做不到这个脚本就不算成熟不该进入skills仓库。2.3 README索引文件怎么写一个没有索引的技能库等于没有入口。README文件在仓库中的作用不是展示项目介绍而是承担最短路径检索——读者进来之后不看目录树、不用猜文件名直接通过README找到目标。我的README用三层结构组织。第一层是“快速导航”按使用频率列出最常用的10个技能一两秒就能定位。第二层是“分类清单”把每个子目录下的技能文件逐个列出每条一行附一句话说明。第三层是“标签索引”用标签把跨领域的技能串起来比如“docker”标签下可以同时出现在troubleshooting和templates里的相关技能。这里有个实操技巧README不用手工维护写一个小脚本扫描目录结构自动生成。我每月跑一次这个脚本保证索引和实际文件一致不然一定会出现“文件加了但README没更新”的窘境。3. 实操过程与核心环境搭建3.1 从零初始化一个skills仓库我以全新的空仓库为例走一遍从初始化到内容入库的完整过程。环境是Linux系统配备Git和VS Code你可以在macOS或Windows WSL里照样操作。第一步创建仓库结构mkdir -p skills/{scripts,templates,snippets/{shell,python,javascript,sql},troubleshooting,workflows,knowledge} cd skills git init git branch -m main第二步创建README骨架文件内容先简单写清楚这个仓库是干什么的、目录结构是什么后续再逐步丰富# Skills 个人技能资产库。沉淀经过验证的脚本、配置、排查过程和操作流程目标是不重复解决同一个问题。 ## 目录说明 - scripts: 可直接执行的脚本 - templates: 配置模板 - snippets: 代码片段 - troubleshooting: 问题排查记录 - workflows: 多步骤流程 - knowledge: 技术决策与原理笔记第三步写第一条技能记录。我建议第一个入库的技能选自己最近刚解决过的一个问题因为刚解决完印象最深、细节最完整这时候记录效率最高。比如刚处理完一个Docker容器启动失败的问题就在troubleshooting目录下创建docker-container-crash-loop-backoff.md按标准模板填写。第四步提交初始版本git add . git commit -m 初始化技能库结构入库第一条Docker排查记录到这里仓库就已经可用了。别等着把所有想整理的内容都准备好再开工先建骨架、先进第一条内容后面逐步迭代这是这个项目能跑起来的核心心法。3.2 技能入库的四步流程往skills仓库里添加内容我总结了一个固定流程触发 → 验证 → 沉淀 → 索引。触发什么情况下你会产生入库意愿我的经验是三个信号——同一个问题第二次被问到无论是别人问你还是你自己翻记录、同一个操作第三次手工执行、某个排查过程超过半小时才搞定。任何一个信号出现就该入库。验证入库前必须把技能完整跑通一遍。写入操作步骤后照着步骤从零执行一次确认每一步的描述和实际操作没有偏差。这一步很关键因为很多时候我们写出来的步骤是“我以为的步骤”而不是“实际执行的步骤”差异往往就在一字之间。沉淀按照标准模板撰写内容。这里有一个细节——不要在解决问题当天写等半天到一天再写这时候当时的“直觉性操作”会被过滤掉留下来的内容是真正的关键步骤。当天记录容易把一些无关的试错过程也写进去读者包括未来的自己会被误导。索引更新README里对应目录的清单如果需要就补充标签。这个动作不能省略否则技能会“沉底”——文件在仓库里但在需要的时候你根本想不起来它的存在。3.3 检索效率的提升方案技能库积累到50个以上文件后靠人工翻目录已经不现实了必须建立检索机制。我的做法分两层第一层是文件和标题命名规范。文件名一律使用“领域-动作-对象”的格式比如docker-container-logs-cleanup.md、python-venv-setup.md、nginx-ssl-config.md。这个命名格式保证了只要记得“我在处理什么对象、做什么操作”就能在目录列表里用肉眼快速找到目标。第二层是用ripgrep做全文搜索命令很简单rg -i 关键词 skills/比如我想找所有和“数据库备份”相关的内容一条命令就能把所有文件里包含“备份”“backup”“dump”的段落扫出来。这比任何在线文档系统的搜索都快因为纯文本的扫描延迟是毫秒级的。如果技能库规模继续变大还可以给每个Markdown文件加YAML front matter标签写一个脚本用标签生成站内索引页但就个人使用而言命名规范加全文搜索已经覆盖了绝大多数场景。3.4 版本管理与变更记录技能库的Git提交信息要遵循“变更类型 主题”的格式比如feat: 新增Nginx反向代理配置模板 fix: 修正Docker容器退出码137的排查步骤 update: 更新Python虚拟环境脚本支持Python 3.12 remove: 删除过时的SVN操作流程这样做的价值在于每次提交历史都是一份技能演进日志半年后回头看能清晰看到每个技能是什么时候沉淀的、为什么修改、被什么方案替代。这在技术决策复盘时是宝贵的信息源。随着时间推移老旧的技能记录需要标记“已过时”而非删除——直接在文件名后加.deprecated.md后缀或者把文件移到archive/目录保留原始内容但不再进入索引。因为过时技能中可能还藏着某个仍然有效的思路直接删掉会丢失潜在的参考价值。4. 常见问题与排查技巧实录4.1 技能库维护的现实困境技能库项目的核心问题不是“怎么开始”而是“怎么持续”持续维护过程中最常见的坑主要有这么几个。分类焦虑。新笔记不知道该放哪个目录纠结半天最后扔进了根目录。这个问题的解法是放宽标准只有能明确归属的技能才放进具体目录界限模糊的内容统一丢进knowledge或misc定期比如一季度一次统一整理归档。分类的目的是让技能被找到不是让分类变得完美。追求大而全。有一种倾向是什么都想往里塞看到任何一篇好文章就想着“存进skills里”结果仓库迅速膨胀真正的常用技能被淹没在大量一次性阅读笔记中。应对方法是给入库设立门槛只有自己实际用过、验证过、还会再用的才允许入库。依赖工具胜过内容。花大量时间配置自动化脚本、折腾标签系统、搞CI/CD流程结果核心内容没沉淀几个。技能库的价值在于技能本身工具只是辅助先写内容等上百条了再考虑自动化。没有建立回顾机制。技能库里沉淀出来的内容必须周期性地回顾和更新。我的习惯是双周回顾“最近用过哪些技能、哪些技能没用到、哪些技能用起来不顺手需要改进”每月更新一次技能库剔除过时的、修正错误、补充新技能每季度做一次完整整理调整分类和索引。这个节奏可以根据使用频率调整但核心是得有一个固定的时间点去回到这个仓库里否则仓库就会被遗忘。4.2 结构化失败的典型表现与修正方法技能库最容易出现的一种情况是刚开始热情满满几周后就停更了。根据我自己的经验和观察停更的原因往往不是“懒”而是结构设计出了问题——每次要往里面加内容都觉得“别扭”说不清哪里不对但就是不想打开这个仓库。典型的结构问题有几个。一个是“空转分类”目录建了一大堆但每个目录下只有一两个文件新内容不知道该进哪个目录旧内容找的时候又想不起来在哪个目录。另一个是“模板过重”技能模板要求填写适用场景、前置条件、操作步骤、验证方法每加一条内容都要填一整套表操作成本太高自然不想往里写。还有一个是“没有正确索引”文件都堆在目录里但README索引没有同步维护找东西只能靠翻文件名。这些问题的根本原因都是同一个设计的复杂度超过了实际使用的需要。技能库是私人工具不是团队协作平台它的设计应该以“我能用起来”为唯一标准而不是以“看起来专业”为标准。修正的方法也很直接把空目录删掉把模板简化成几行把索引同步纳入每次入库的强制流程。以我自己为例模板从五段式简化成灵活的两段式“怎么做”和“注意事项”只有那些真正值得写更细的技能才扩展成完整模板。简化之后仓库重新变得好用起来了每次技能沉淀的操作成本降到了两分钟以内持续维护才真正成为可能。4.3 内容重复与旧技能失效的处理技能库使用时间长了不可避免地会出现内容重复。最常见的是同一个问题在troubleshooting里有一条记录在knowledge里有一段笔记两者内容高度相似。我处理这类重复的原则是保留可执行、比保留介绍性内容优先。如果两个文件都包含“如何配置”的内容把配置步骤完整的那条留下来原则性说明合并进其中然后删掉另一条在删除提交信息里写清楚保留位置方便以后追溯。旧技能失效是另一个无法避免的问题。软件版本升级、环境变化、工具替换都会让原本正确的内容变成坑。处理方案是“留痕不保留仅供参考价值”在旧文件开头加一段明确标记 该技能已过时。原因Docker Compose V2已内置该功能不再需要手动安装。 替代方案见 [docker-compose-v2-usage](templates/docker-compose-v2-usage.md)这比直接删文件好因为半年后可能有人就是你自己会看到旧链接或者旧命令顺着标记找到替代方案避免走弯路。4.4 跨设备使用的同步方案取舍我经常在台式机、笔记本和服务器之间切换使用技能库同步问题绕不开。方案主要有三种私有Git远程仓库、同步网盘如坚果云、OneDrive、Dropbox、本地离线LiveSync。我的选择是核心仓库用私有Git远程仓库因为这是唯一能保证跨设备一致性、有完整版本历史的方案。网盘同步最大的风险是并发冲突在两台设备上同时修改同一个文件会产生冲突副本处理起来非常麻烦Git不会产生这种问题提交前先更新拉取即可。为此需要配置SSH密钥登录从~/.ssh/config中为远程仓库设置访问配置设置本地提交前自动拉取。有一个小坑值得注意如果在非主力设备上改了一处内容忘记提交会导致后来其他设备拉取时提示冲突解决办法就是不定期在所有设备上执行一次git status检查确认没有未提交的变更。也可以启用“技能库进入某种笔记软件”的联动方式比如把skills目录放到本地笔记软件能读取的位置做成软链接或作为笔记软件的本地目录这样既能享受笔记软件的全文检索界面又能保留纯文本的同步优势。不过这个方案我试过几次都觉得太重了最终还是回归命令行加编辑器的方式。5. 扩展思路从个人库到团队资产技能库做顺手之后很多人会想着把它分享给团队、部门乃至开源社区。这个扩展方向我个人觉得很有价值就是需要注意“个人可用”和“团队可用”之间的差异。个人库的上下文在你脑子里你不需要解释为什么需要这个技能、适用于什么项目拿着用就行。团队共享后读者不再了解你的思维语境必须补偿上下文缺失比如把“适用场景”“适用限制”写在正文开头把“与其他模块的关系”补充清楚。我见过很多“共享出来的个人文档最终没人看”的案例大多不是因为内容不好而是因为可读性和上下文信息不足。如果要对外分享还需要提前做一次敏感信息清理。检查脚本里有没有硬编码的路径、服务器地址、账号信息检查配置模板里有没有团队内部的服务名、内网IP补充通用的许可证声明。这些工作在个人库阶段完全可以不care一旦对外发布就变成必须项。如果只想分享某一个具体的技能而不是整个仓库可以把那个文件单独导出转化成一篇自包含的文章补充足够的背景信息后发到社区博客。这样既能帮助别人又不牺牲个人仓库的灵活性和隐私性。写在最后的经验我做这个skills项目到现在最大的体会是“个人技能沉淀”这件事的收益有极强的滞后性——第一个月你只会看到一堆Markdown和脚本半年后你会发现自己通过这个仓库解决了很多“差点就想不起来怎么做”的问题一年后这个习惯已经内化成一套工作方法了。如果你现在还不确定从哪里开始我的建议很简单回想一下最近一个花了超过半小时才解决的问题把它按“用了什么方法、踩了什么坑、最后是怎么解决的”的框架写成一个Markdown文件放进一个名为skills的目录里然后照着这篇文章的目录结构把它组织起来。这一步落地以后后续的维护、扩展、优化自然就有了抓手。不用等“都准备好了再开始”从来都不会有那个完美的时刻。
返回列表