【实战复盘】知识管理系统越做越重?从 1200 个文件砍到 870 的过程与判断框架

0 阅读6分钟

标签:知识管理 | 系统重构 | 阅读约 8 分钟 | 分类:工程实践

在这里插入图片描述

一、痛点共鸣

你有没有过这样的经历:当初为了解决"知识散落各处"的问题,搭建了一套知识管理系统。目录越分越细,模板越写越多,自动化脚本也不断叠加。一年后突然发现——光维护这套系统本身就需要专门花时间,而它产生的价值却在持续递减。

更可怕的是,你已经很难判断:哪些部分是真正在产生价值的,哪些只是"因为一开始建了所以一直在维护"的历史包袱。

这篇文章还原一次从 1200 个文件砍到 870 个的过程——不只是"删了什么",更重要的是"怎么判断该删什么"。

在这里插入图片描述

二、核心概念

知识管理系统(Knowledge Management System) 在工程团队中通常承担三层职责:规则层(团队怎么做事的约定)、模式层(可复用的代码片段和设计决策)、知识层(历史决策记录、调研文档、会议纪要)。

问题往往出在第三层:知识层的文件数量是指数级增长的,但它们的复用率是指数级下降的。一个一年前的架构决策文档,今天还有人在看吗?

在这里插入图片描述

三、方案对比与决策

面对一个臃肿的知识管理系统,通常有三种策略:

策略做法优点风险
渐进式裁剪逐个目录评估,一个一个删安全,每一步可验证周期长,容易半途而废
全量归档整个知识层打包移到 archive/干净利落断链多,修复成本高
按价值分层保留规则+模式,删除纯知识/执行/演进记录保留核心价值需要清晰的价值判断标准

最终选择了按价值分层策略。核心判断依据只有一个问题:

"一个新加入团队的成员,会因为找不到这个文件而犯错吗?"

如果答案是"不会",那这个文件就不属于核心层。

具体决策:

  • 保留:工程规则(团队怎么协作、代码怎么写)和模式(可复用的设计决策和技能)
  • 删除:纯知识记录(历史调研)、执行记录(任务状态追踪)、演进文档(版本规划记录)、分析报告
  • 删除:根目录下的独立技能目录(技能应归属于具体项目,不应集中管理)

最终删除了 6 个目录共 313 个文件,系统从约 1200 个文件精简到约 870 个。

在这里插入图片描述

四、关键实现

执行分四个阶段,每个阶段提交一次,确保每一步都可独立回滚。

阶段一:物理删除

git rm -r knowledge/ execution/ evolution/ analysis/ docs/ skills/
# 265 个 tracked 文件 + 48 个 untracked 文件 = 共 313 个

这一步最需要勇气——一旦 git rm,就只能往前走了。但好处是一次性干净利落,不会陷入"再想想这个要不要删"的内耗。

阶段二:修复引用

删除文件后,所有指向这些目录的链接都会失效。需要系统性地修复:

# MOC.md 改动示例
- ## 知识库 → 查看最近的调研文档
- ## 演进记录 → 查看版本迭代规划
+ (整段删除,不再提供不可达的导航入口)

同时修复了 38 个 Claude Code 技能符号链接——原来指向已删除的目录,需要重新指向 patterns/ 下的项目子目录。

阶段三:更新规范文档

系统的 SCHEMA 定义、lint 脚本、使用指南都需要同步更新。这一步的关键是不留"幽灵引用"——文档里提到的路径要确保真实存在:

# lint.py 改动:删除对已废弃目录的检查
- sessions_check = check_frontmatter_field('sessions', ...)
# 简化 wikilink 验证:只检查实际存在的 patterns/ 和 rules/  
- valid_prefixes = ['knowledge/', 'execution/', 'patterns/', ...]
+ valid_prefixes = ['patterns/', 'rules/']

阶段四:验证

最终 lint 检查:从 775 个问题降到 433 个,其中 0 个是本次引入的新问题。剩余的 433 个属于历史遗留的 frontmatter 格式和 wikilink 引用问题。

五、踩坑与避雷

坑 1:符号链接断裂连锁反应

现象:删除了根级 skills/ 目录后,Claude Code 中 24 个技能全部失效。

原因:AI 编程工具的技能配置目录下有 32 个符号链接指向已删除的目录。链接本身分散在各处,不在一处,很容易被遗漏。

解决:用 find 技能目录/ -type l ! -exec test -e {} \; -print 找出所有断裂链接,逐个重建指向 patterns/项目名/skills/

教训:删除目录前,先用 grep -r "旧路径" 扫描全项目(包括外部依赖的配置目录),避免遗留断裂引用。

坑 2:wikilink 交叉引用修复不彻底

现象:删除了 knowledge/ 后,patterns 子目录下的 5 个项目的 .mirror-core.yaml 配置文件中仍引用了已删除的 knowledge_dir 字段。

原因:配置文件分散在各项目子目录,不在根目录搜索范围。

解决:用 grep -r "knowledge_dir" patterns/ 批量定位,逐个 patch。

教训:删除操作的影响范围通常比你预想的广。用全局搜索代替"我觉得应该只有这里引用了"的猜测。

在这里插入图片描述

坑 3:lint 规则与实际结构脱节

现象:lint 脚本中硬编码了 7 个目录前缀用于验证 wikilink,删除 5 个目录后,lint 仍然检查这些前缀,导致大量假阳性报错。

解决:同步简化 lint 规则,只保留实际存在的路径前缀。

教训:自动化检查脚本必须和目录结构保持同步。建议在 lint 脚本中动态读取实际目录结构,而非硬编码。

在这里插入图片描述

六、价值提炼

这次重构沉淀出三个可复用的判断框架:

  1. "新人会犯错吗"测试:判断一个文件是否该保留的最简单标准——如果删除它,新加入的团队成员会因此犯错误吗?不会就可以删。

  2. 四阶段安全删除法:物理删除 → 修复引用 → 更新规范 → 验证。每阶段一个 commit,保证可独立回滚。不要试图在一个 commit 里完成所有事。

  3. 单向依赖原则:技能应该归属于具体项目(项目/skills/),通过符号链接被外部工具引用,而不是反过来由中心仓库管理所有技能。消除双向依赖是精简的前提。

指标重构前重构后变化
文件总数~1200~870-27%
一级目录数105-50%
lint 问题775433-44%
断裂符号链接240全部修复

七、延伸与行动号召

这次分享的是"做减法"的方法论。下一次会聊聊精简后的系统如何支持多项目的全栈任务拆解——从 5 个需求到 10 个子任务,再到 30+ 个 AI 代理自动提交的全过程。

如果这篇文章让你想起自己项目中那个"该删但一直没删"的目录,不妨今天就动手。记住那个问题:"新人会因为它不存在而犯错吗?"

有帮助的话欢迎点赞收藏,下一篇见 👋