尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
手搓一个命令行技能追踪工具:用SQLite管理你的成长曲线
一提到“skills”这个词很多人第一反应是简历上那一排“精通XX”“熟悉XX”的标签。但我最近手搓的这个项目给的完全是另一个答案一个极简的个人技能追踪与成长管理工具用命令行就能维护自己的技能树记录每次刻意练习的时长、输出物和熟练度变化然后自动生成复盘报告。这篇文章就围绕这个项目的完整落地过程来写从需求拆解、数据模型设计到实际编码、踩坑修复再到最终沉淀出的个人使用工作流一次性讲清楚。如果你是那种喜欢用数据驱动自己成长的人或者正在学习某个新领域但总觉得“学了就忘、练了没数”又或者想在工作之外维护一套属于自己的能力账本那这篇文章里的思路和代码基本可以帮你省掉至少两个星期的试错时间。我自己从搭建到稳定使用花了三个版本迭代最后沉淀下来的方案足够简单也足够抗造。1. 项目缘起与整体设计思路1.1 为什么不做成笔记而是做成“记账工具”先说一个反直觉的观察我过去也用过各种笔记软件、打卡App来管理学习进度但几乎所有方案都有同一个致命问题——它们记录的是“内容”而不是“变化”。笔记擅长回答“我今天学了什么”但它回答不了“我此刻的熟练度到底是多少”“上次练Python爬虫已经是三周前该不该重新激活”。说白了笔记是一种记忆外设不是一个度量系统。而“skills”这个项目的核心主张是把技能学习当成一笔笔‘进度存款’来管理每次投入都要入账每次长时间不用就要计息——只不过这个‘利息’是遗忘曲线。所以项目定位从一开始就不是“另一个知识管理工具”而是“技能资产的个人资产负债表”。它解决的真实需求是让人清楚地知道自己在哪项技能上投入了多少、当前处于什么水位、哪些技能正在折旧归零。1.2 核心功能拆解与设计取舍这个项目最终收敛为四个核心命令添加技能add、注入练习记录log、查看当前状态tree/status、输出复盘报告review。我故意砍掉了日历视图、社交分享、成就系统这类锦上添花的东西理由是这些功能会诱导你把时间花在“装饰数据”而不是“积累数据”上。其中一个关键取舍是不做自动计时器。为什么因为真实场景里面技能练习往往发生在零散的时段里——通勤时听了一节音频课、午休时读了十几页书、晚上敲了一个小时代码。这些场景下让用户手动点“开始计时”再“结束计时”的负担太重最后大概率变成“忘了记录”。所以我采用“事后记录时长估算”模式你只需要在练完后花十秒钟填一个数字比如“今天练了40分钟爬虫产出是写了一个豆瓣Top250采集脚本”。数据不追求秒级精准但能持续不断本质上是在跟人性懒惰作对抗。1.3 技术选型为什么选了PythonSQLiteClick技术栈上我没有引入任何重型依赖。主体语言用Python 3.10命令行框架用Click数据存储用一个SQLite单文件数据库。这个组合的考量其实很朴素。第一单文件数据库。整个技能台账就是一个文件备份等于复制文件同步等于丢网盘迁移等于拷到新机器。对于个人工具来说这种“土办法”反而是最高级的可靠性。第二Click而非Argparse。Argparse写简单的单命令脚本够用但一旦涉及多级子命令、自动补全、交互式确认Click的文档和社区成熟度会帮你省下一堆“自己造轮子”的时间。第三用Python而不是Node或Go。纯属个人维护效率考虑——大部分会想复制这个项目的人Python环境基本是现成的拆开就能改。你要想换成Go也没问题核心架构是通用的下面我会把设计逻辑讲透语言只是外壳。2. 数据模型与核心细节解析2.1 技能分类与标签体系扁平比树形更抗用在设计数据库结构的时候我第一版做的是树形分类比如“编程 - 后端 - Python - 爬虫”五层嵌套看上去很丰满但实际用了两周就发现问题维护成本太高而且层级一旦超过三层人的归类决策就会犹豫——“爬虫算后端还是算数据工程”每归类一次都要做一次内心斗争大脑会罢工。后来我把分类结构砍成两层技能主题domain 自由标签tags。每个技能记录必须属于一个domain比如“编程后端”“语言学习”“写作”但同时可以打任意多个tags比如“效率工具”“面试必备”。扁平结构的好处是两个其一创建的摩擦成本低你不需要在“归属哪个父类”上纠结其二后期统计维度足够灵活想按domain看全景就按domain聚合想按tag看某个跨领域主题就按tag过滤。下面这张表是实际表结构的设计字段不算多但每一条都是经过反复实战迭代后才保留下来的字段类型说明skill_idTEXT技能唯一ID主键用kebab-case命名如“python-spider”nameTEXT技能显示名称domainTEXT所属主题域如“编程”levelINTEGER熟练度等级0-100整数total_hoursREAL累计投入小时数last_practicedDATE最近一次练习日期streak_daysINTEGER连续练习天数statusTEXTactive / fading / dormant 三态tagsTEXT逗号分隔的标签列表这里有三个字段我想特别说明一下设计意图。level不是拍脑袋填出来的数而是由“累计时长练习频次输出物数量”三个因子加权后取整得到。这样设计的好处是你无法靠“感觉今天状态不错”来虚报等级任何一次level的上涨都必须有对应的练习记录来支撑。status字段是整套系统的灵魂。active表示正在常练fading表示超过7天没练但还不至于忘记dormant表示超过21天没练已经进入“冷启动区”。每次录入练习记录时程序会自动把该技能的status刷新为active反之每次打开status视图时系统会按当前日期和last_practiced自动降级。这个机制让“哪些技能被冷落了”始终一目了然不至于到了复盘的时候才发现自己在某个技能上已经荒废了两个月。2.2 熟练度计算模型不追求科学精准只追求反馈及时关于熟练度怎么算我最早想的很复杂——想引入间隔重复算法的变体搞什么遗忘曲线拟合。但后来想了想项目初心是“低摩擦记录”不是“心理学实验”所以最终用的模型非常简单但短期内效果出奇地好。基础规则是这样每次练习记录提交后系统会计算一个增量公式为increment base_gain * (1 - level/120) output_bonus其中base_gain按练习时长分档少于15分钟不计时15-45分钟算2点45-90分钟算3点超过90分钟算5点但每天同一技能最多累计10点。output_bonus是产出物的奖励分每提交一个输出物比如一篇总结、一个Demo、一篇文章草稿额外加1点上限5点。为什么要除以120而不是除以100这是个很微妙的设计。如果除以100那么当level接近100时增量几乎为零用户会感到“练满了”从而失去动力。除以120可以让增量曲线在80分附近仍有可感知的涨幅同时又不会让满分过于廉价。说白了这是给“高阶玩家”留的心理空间。衰减规则则是如果某技能超过7天未练每天自动扣减0.5 level*0.002点封顶扣到该技能当前分数的60%为止。这样既模拟了遗忘又不会让你多年的积累一夜清零。2.3 与其他方案横向对比为什么不用现成App市面上其实有不少技能打卡类的App也有类似LeetCode刷题热力图、语言学习App里的连续打卡统计。但我要强调命令行工具和它们有一个本质区别数据完全的本地所有权和可编程性。App往往把数据存在别人服务器上导出格式稀奇古怪如果你想做“过去三个月里Python相关技能投入了多久”这种自定义分析你得祈祷开发团队给了这个维度。而“skills”项目的所有数据都躺在一个.db文件里你可以随时用SQL查询、用Python写脚本做任意维度的分析甚至一小时写个教程把数据渲染成网页。对于喜欢折腾的开发者来说这是App给不了的自由度。下表是我在立项时做的对比供你也做一次需求检查对比维度skills本工具通用打卡App笔记软件表格数据所有权全部本地服务商本地但无结构自定义统计任意SQL受限于功能需要手动维护输入摩擦可接受的10秒/次较低较高自动化程度中高状态自动降级低无长期演进可编程依赖厂商路线依赖模板3. 实操过程从零搭建到日常落地3.1 环境准备与依赖安装如果你想把代码跑起来环境准备大概五分钟就能完成。我假设你已经装好了Python 3.10以上版本并且有pip可用。实际执行时只需要安装一个第三方库pip install clickSQLite是Python内置的不需要额外安装。全部代码结构我做成了扁平化单模块个人工具这样最省心skills/ ├── skills.py # 主程序所有命令入口 ├── schema.sql # 初始化建表语句 └── skills.db # 运行后自动生成的数据文件首次运行前执行一次初始化就会建好数据表python skills.py init这个命令做的事情很简单用schema.sql里的CREATE TABLE语句创建出上一节说的那张技能表并建立一个独立的practice_log表用于存储每一次练习记录明细。注意我把练习明细单独建表而不是直接更新总表数值是因为后期做分析和报表时明细数据是不可或缺的。3.2 核心命令实现细节先看添加技能。这里的要点是ID采用kebab-case原因是实际输入时下划线需要按Shift键而横杠直接按就能敲出来摩擦更小。python skills.py add python-spider --name Python爬虫 --domain 编程 --tags 效率工具,数据采集命令内部的处理逻辑上值得关注的是它做了一个自动去重校验如果同名skill_id已存在会直接拒绝执行避免误操作把已有进度清零。接下来是核心的log命令也就是每次练习完后的“入账”操作python skills.py log python-spider --minutes 40 --note 完成豆瓣Top250采集解析JSON存储 --output 1执行时脚本会读取该技能当前level然后按前面说过的增量公式计算新的熟练度把total_hours加上对应小时数40分钟约等于0.67小时把streak_days逻辑变成如果昨天也练过则加1否则重置为1。这一连串操作都用SQLite的事务包裹确保任何一个环节失败都不会产生脏数据。tree命令用于查看当前全貌输出时按domain分组每行显示技能的当前level和状态图标化文本文字标识ACTIVE/FADING/DORMANT水平进度条用简单的等于号和减号拼接而成。一切以文本终端友好为主不为格式美化增加额外依赖。3.3 状态降级与报告生成让数据自动替你操心外界环境一变数据不说谎。状态自动降级的逻辑写在status命令和review命令里每次调用这两个命令时系统会先执行一次_check_rotation()函数把所有技能根据last_practiced和今天的日期重新计算新status。举个例子如果某项技能最后练习日期是今天那它肯定是active如果最后练习日期是10天前就降为fading超过21天就会变成dormant。但这个降级不是简单的if-else还耦合进了熟练度扣减逻辑每次检查时一次性把所有罚款算完并落库。这样设计的好处是老旧的进度不会在几个星期后才被发现而是每次打开终端就会被提醒。review命令则是生成一段markdown格式的复盘报告我专门给它写了按周和按月两种粒度。周报重点看“本周新增练习多少次、每个技能投入时长、连续天数变化”月报重点对比四个星期之间的趋势并筛选出从上个月以来掉分最多的技能按降序排列。输出可以直接重定向到文件再丢进个人Wiki或者博客草稿箱python skills.py review --period weekly --output report.md3.4 时间投入的经验参考用这个工具管理个人技能成长已经超过半年我手头产生了一套比较稳定的大致参考数据技能领域每周投入三个月后level参考后端开发5-7小时45-60英语听说3-4小时30-40写作输出2-3小时25-35数据分析4-6小时40-55数值因人而异关键不是绝对数字而是趋势线是否向上。用这套数据做复盘的时候我很清楚地看到哪几项投入一直上不去原因通常不是“没时间”而是“优先级不清”——这个工具至少把优先级问题变成了一堆白纸黑字的数字逼着你去面对它。4. 常见问题与排查技巧实录4.1 多设备同步时数据冲突怎么办因为SQLite是单文件如果通过网盘同步在多台电脑上同时写入可能会遇到文件冲突。我的解决办法很简单只在每天结束时同步一次平时不把数据库放在实时同步目录而是放本地的项目文件夹。同步前手动停掉另一台机器上的命令进程或者干脆只在主力机上更新数据。如果你确实需要多人协作或者双机同时高频写入可以考虑把数据库换成PostgreSQL但那就违背了“个人轻量工具”的初衷。对于99%的个人使用场景单文件反而是优势——你不需要部署任何服务端。4.2 熟练度数值虚高怎么校准有一次我发现某个技能的level已经到了82但实际让我现场手写一个小功能时却卡住了。这说明模型对短期刷时长产生了虚高奖励。我的解法是在review命令里增加一个“自评校准”模式每个月月底把所有active技能的当前自信程度1-5分录入一次然后用这个分数去约束下个月的level上限即下个月的level不得超过“上月置信分×25”。效果立竿见影——你没法再用零碎的打卡来制造虚假的成长感。4.3 冷技能被永久遗忘前如何抢救其实整个status机制都能看成一个“防遗忘预算系统”。但我额外给dormant技能加了一个“激活预案”当review发现某个技能进入dormant时会顺带打印一句提示比如“python-spider已沉睡了42天再练一次只需20分钟即可恢复active”。这个提醒会把“重新捡起来”的心理门槛拆到一个很小的动作亲测管用——我靠这个机制把一个差点彻底放下的乐器技能又拉了回来。4.4 一个隐蔽的坑记了时间但忘了记产出物使用初期我发现total_hours一直涨但level涨得却很少排查半天发现原因是output_bonus经常为零。原因是每次练习完我经常忘了输入--output 1或者说压根没产生实在的输出物。后来我改变了自己的实践习惯没产出物的练习不再记入时长强迫自己每次练习至少有一个可交付的小产物——哪怕只是20行总结、一个最小Demo、或者一份错题笔记。规则越硬水平曲线越健康。下面整理了一份快速排障速查表都是实测过的症状可能原因处理方式level长时间不动单次练习时长刚好卡在15分钟以下调整分档阈值或提高单次练习质量streak_days一直为1上次练习与昨天的间隔超过24小时复盘时确认是否真的连续练习报告里出现重复技能条目数据库中有历史遗留的重复id用SQL去重后merge两条记录数据文件在网盘同步后损坏并发写入导致数据库锁/崩溃备份文件后用sqlite3 .recover恢复review报告的日期区间不对终端时区未设置在环境变量中固定TZAsia/Shanghai5. 从命令行工具到个人管理方法论5.1 使用节奏高频记录低频复盘体验下来最舒适的使用节奏是每天都记录但不是实时记录。我习惯在每天晚上十分钟内把当天的三段练习轨迹统一录入。这个节奏的好处是白天的投入不会被“记录行为”打断晚上录入有仪式感它会像“给自己的账本结账”一样让人对自己一天做了什么有个交代。复盘则固定为每周日晚和每月一号。周六晚上的数据通常会比较难看但那个难看恰恰是有用的——它会在新一周开始前给你一次调整计划的依据。5.2 一些真实的使用实证两个月前我给一个技能打上了“面试必备”的tag每周固定投入三个小时配合每两周输出一篇技术笔记的规则现在这个技能已经从35分涨到61分而且在某次临时被要求内部讲课时我不需要额外准备就直接能讲出脉络。可以确定地说任何技能只要坚持“规律投入创造成品”这两个原则数据增长只是水到渠成的事情。还有一次我连续两周没有碰写作技能系统把它标成了fading第三周我打开review的时候看到一行警告“craft-writing正在降温预计两周后跌回dormant”这才重新把写作捡起来。那行警告文字救了我一整个月的写作手感。5.3 这个项目的后续扩展空间如果是你的话有几个扩展方向很做可以把review生成的markdown自动化推到个人博客或笔记仓库可以把所有练习明细用Pandas做长周期趋势分析画成周热度折线也可以在每次status降级时通过系统通知推送提醒目前是终端内打印没有走推送。不过个人的建议是先用最朴素的形态跑起来至少跑一个月感受到数据带来的反馈之后再决定要不要加功能。我自己在这个项目上最大的收益不是把Python写得更溜而是打通了“计划-练习-记录-复盘-修正”的完整闭环它现在已经替代了我之前百分之八十的手工表格和打卡类App。如果你也想为某个技能建立一条清晰的成长曲线照这个思路搭一个私有工具会是性价比很高的选择。
RELATED

相关推荐

C++归并排序入门:分治递归、复杂度推导与工程优化实践

C++归并排序入门:分治递归、复杂度推导与工程优化实践

归并排序是我一直推荐给C初学者作为分治思想入门课的第一个算法。它的结构足够规整、思路足够直观,不像快速排序那样在partition边界上一不小心就翻车,也不像堆排序那样需要先理解完全二叉树的堆化过程。更重要的是,归并排序几乎涵盖了递归算…

📅 2026/10/21 15:39:26
数据库设计核心原则与实战:从范式到分库分表

数据库设计核心原则与实战:从范式到分库分表

1. 数据库设计为什么值得认真对待 1.1 设计失误的代价有多大 很多人觉得数据库设计就是建几张表、定几个字段的事,等项目跑起来之后再优化也不迟。我见过太多这样想的人,最后都付出了实打实的代价。 一个很典型的案例是:某团队做了一个业务…

📅 2026/10/21 15:39:26
Vue+axios大文件上传进度条卡99%的完整解决方案

Vue+axios大文件上传进度条卡99%的完整解决方案

简介:本资源是一份面向前端开发者与Vue.js初学者的实用技术实践指南,聚焦解决大文件上传场景下的用户体验痛点——实时进度反馈。通过axios与Vue组合实现响应式进度条,涵盖单/多文件上传、FormData构造、onUploadProgress事件监听及进度百分比…

📅 2026/10/21 15:34:15
MORE NEWS

更多资讯

📰

1 个 AI 项目从 0 到 1:完整流程——好的开始,是成功的一半

1 个 AI 项目从 0 到 1:完整流程——好的开始,是成功的一半 这是《AI数字员工系统设计与企业自动化实战》日志连载第 29 篇 作者:老高FDE-AI实战前沿 深度聚焦:企业AI落地实战、AI-Workforce、AI数字员工实战、企业Agent组织设计、…

📰

深入理解Cargo与crates.io:从构建优化到发布实践

从 cargo new 跑通第一个 hello world,到能熟练地在项目里加依赖、跑测试,这中间其实隔着一道很有意思的分水岭。很多人对 Cargo 的印象停留在“包管理工具”这六个字上,知道 cargo build 、 cargo run 、 cargo add 这些高频命令&am…

📰

团队目标管理PPT:从OKR拆解到自动看板的落地闭环

简介:这份《团队目标管理.pptx》面向企业管理者、团队负责人及希望提升目标管理能力的职场人,围绕团队目标的作用、常见目标失效原因、目标制定方法与执行落地展开,帮助解决目标模糊、频繁变动、执行脱节等实际问题。资源包内含1个pptx文件&a…

📰

团队目标管理.pptx:从对齐到复盘的落地工具与避坑指南

简介:这份《团队目标管理.pptx》面向企业管理者、团队负责人及希望提升目标管理能力的职场人,围绕团队目标的作用、常见目标失效原因、目标制定方法与执行落地展开,帮助解决目标模糊、频繁变动、执行脱节等实际问题。资源包内含1个pptx文件&a…

📰

多旋翼无人机鲁棒姿态控制:从PID到H∞的实战指南

去年夏天,我把一套H∞姿态控制器搬上模拟项目X的试验台,看着屏幕上滚转角曲线终于不再乱甩的时候,第一反应不是兴奋,而是有点想骂自己——为了调好之前那套PID参数,我前前后后改了十几个版本,加陷波器、加前…

📰

USB供电充电电路设计:从原理到TP4056实战与避坑指南

简介:这是一份面向电子工程师、硬件设计初学者及便携设备开发者的USB供电充电电路技术资料,围绕USB总线取电为锂电池充电这一核心问题,梳理从原理到电路实现的完整思路。资源为单个PDF文档,压缩包约684KB,内容以电路图…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬