其他
在替换、否定或重启旧方案前…
当你质疑“为什么用 X”、打算放弃某方案,或评估可能只是复兴的“新”想法时,先追踪其历史谱系,以理解原因、避免重复失败并重新发现被弃方案。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在替换、否定或重启旧方案前,用知识谱系追通用
解决思路
- 核心原则:在评判当前方案或提出“新”方案前,先追踪其知识谱系。
- 在以下行动前追踪谱系:提议替换现有方案(先理解它为何存在);否定“旧”模式(它们可能因错误原因被弃);实施“新”想法(它们可能是值得重新考虑的复兴);宣称某物为“最佳实践”(先理解其演化)。
- 出现以下红旗时触发谱系追踪:“这看起来过度复杂”(以前更简单吗?为何变复杂?);“为什么不直接……”(大概率有人试过,发生了什么?);“这是现代方式”(旧方式教会了什么?);“我们应该切换到 X”(当初为什么离开 X?)。
- Technique 1 决策考古:查找当前方案何时、为何被选择。
- 检查决策记录,常见位置:`docs/decisions/`、`docs/adr/`、`.decisions/`、architecture decision records。
- 搜索对话,使用 skills/collaboration/remembering-conversations。
- 进行 Git 考古:运行 `git log --all --full-history -- path/to/file`。
- 询问编写该方案的人(如果可用)。
- 按模板记录谱系:## Lineage: [Current Approach];**When adopted:** [Date/commit];**Why adopted:** [Original problem it solved];**What it replaced:** [Previous approach];**Why replaced:** [What was wrong with old approach];**Context that drove change:** [External factors, new requirements]。
- Technique 2 失败尝试分析:当有人说“我们试过 X,但没用”时,不要假设 X 本质上有缺陷。
- 追踪失败尝试:当时的上下文是什么?(哪些约束现在已不适用)
- 追踪失败尝试:具体是什么失败了?(整个方案还是某一方面?)
- 追踪失败尝试:当时为什么失败?(技术限制、团队约束、时间压力)
- 追踪失败尝试:上下文是否已改变?(新工具、不同需求、更多经验)
- 按模板记录失败尝试:## Failed Attempt: [Approach];**When attempted:** [Timeframe];**Why attempted:** [Original motivation];**What failed:** [Specific failure mode];**Why it failed:** [Root cause, not symptoms];**Context at time:** [Constraints that existed then];**Context now:** [What's different today];**Worth reconsidering?:** [Yes/No + reasoning]。
- Technique 3 复兴检测:评估“新”方案时,搜索历史先例(是否曾以不同名称尝试过?)。
- 识别真正新的部分,相对于只是重新包装的部分。
- 理解它为何消亡(如果它是一个复兴)。
- 检查复活条件是否存在(上下文是否已足够改变?)。
- 留意常见复兴模式:Microservices ← Service-Oriented Architecture ← Distributed Objects;GraphQL ← SOAP ← RPC;Serverless ← CGI scripts ← Cloud functions;NoSQL ← Flat files ← Document stores。
- 询问:“我们从上一代形态中学到了什么?”
- Technique 4 范式转变映射:当发生重大架构变化时,映射该转变。
- 按模板映射范式转变:## Paradigm Shift: From [Old] to [New];**Pre-shift thinking:** [How we thought about problem];**Catalyst:** [What triggered the shift];**Post-shift thinking:** [How we think now];**What was gained:** [New capabilities];**What was lost:** [Old capabilities sacrificed];**Lessons preserved:** [What we kept from old paradigm];**Lessons forgotten:** [What we might need to relearn]。
- 搜索谱系的位置:决策记录,常见位置:`docs/decisions/`、`docs/adr/`、`.adr/`,或搜索 "ADR"、"decision record"。
- 搜索对话历史,使用 skills/collaboration/remembering-conversations 搜索。
- 搜索 Git 历史:`git log --grep="keyword"`、`git blame`。
- 搜索 issue/PR 讨论(GitHub/GitLab issue history)。
- 搜索文档演化:`git log -- docs/`。
- 利用团队知识:问“以前有人试过这个吗?”
- 使用搜索模式:`git log --all --grep="introduce.*caching"` 查找方案引入时间。
- 使用搜索模式:`git log --diff-filter=D --summary | grep pattern` 查找某文件被什么替代。
- 使用搜索模式:`git log --all --grep="remove.*websocket"` 查找被放弃方案的讨论。
- 发现以下红旗说明你正在忽略历史:“我们直接重写这个”(而未理解它为何复杂);“旧方式显然错了”(而未理解上下文);“现在没人用 X 了”(而未查它为何消亡);因“旧”而否定方案(年龄 ≠ 质量);因“新”而采用方案(新 ≠ 质量)。这些全部意味着:先停下,追踪谱系。
- 当提议变更时,文档中包含谱系:## Proposal: Switch from [Old] to [New];### Current Approach Lineage;- **Adopted:** [When/why];- **Replaced:** [What it replaced];- **Worked because:** [Its strengths];- **Struggling because:** [Current problems];### Previous Attempts at [New];- **Attempted:** [When, if ever];- **Failed because:** [Why it didn't work then];- **Context change:** [What's different now];### Decision;[Proceed/Defer/Abandon] because [reasoning with historical context]。
- 良好谱系追踪示例:以前用 XML,后来 JSON;XML 因冗长损害开发者体验而消亡,但 XML namespaces 解决了真实问题;如果 JSON 遇到 namespace conflicts,应研究 XML 如何解决,而不是重新发明。
- 坏谱系忽略示例:说“REST 老了,用 GraphQL”时,忽略:REST 为何胜过 SOAP?它擅长解决什么问题?这些问题是否已消失?
- 带上下文的复兴示例:2010 年尝试客户端路由,因浏览器支持差而放弃;现在支持普遍且工具有所改善,值得结合教训重新考虑。
- 记住并应用:当前方案存在都有原因(追踪这些原因);过去的失败现在可能可行(上下文会变);“新”方案可能是复兴(检查先例);演化本身有教益(研究转变);忽视历史会重蹈覆辙。
适用边界 · 注意事项
- 上下文已根本变化时,可不被历史束缚:过去不存在的技术现已可用、强制决策的约束不再适用、团队能力已不同。
- 已有明确的关键教训时,可不被历史束缚:行业理解已演进、过去尝试已教会我们应避免什么、更好的模式已出现并被验证。
- 原始推理有缺陷时,可不被历史束缚:基于后来被证明错误的假设、不理解原理的 cargo-culting、由时尚而非需求驱动;但仍要记录覆盖原因。