Files
vibe-coding-cn/docs/philosophy
2026-05-10 08:06:38 +08:00
..

哲学方法论

字多不看

  • 本目录回答“为什么这样判断、如何减少幻觉、如何让复杂问题可描述、可推理、可验证”。
  • 先用“思维模型”选择认知工具。
  • 再用“组合描述模型”把对象、状态、序列、过程和关系说清楚。
  • 需要理解代码、结构和复杂度时读“编程之道”。
  • 需要软件工程底层判断时读“软件工程的朴素真理”。
  • 需要提效方法时读“方法论工具箱”。

快速导航

  1. 思维模型 - 第一性原理、奥卡姆剃刀、多阶思维、状态空间等认知工具。
  2. 组合描述模型 - 对象、状态、快照、序列、过程、变换、同一/差异与关系。
  3. 编程之道 - 编程哲学、结构、状态、复杂度与工程判断。
  4. 软件工程的朴素真理 - 代码、复杂度、需求、维护、质量、架构和团队的工程常识。
  5. 方法论工具箱 - 现象学还原、正反合、可证伪主义、形式化方法等提效工具。
完整细粒度目录(点击展开/收起)

细粒度目录

使用方式

正文


1. 思维模型 - 第一性原理、奥卡姆剃刀、多阶思维、状态空间等认知工具。(点击展开/收起)

1. 思维模型

第一性原理、奥卡姆剃刀、多阶思维、状态空间等认知工具。

这里用于沉淀可复用的思维模型。先不固定结构,后续按实际内容自然生长。

使用原则

  • 一个模型先说清它解决什么问题。
  • 能配例子就配例子,避免只留下抽象口号。
  • 先记录,再整理;先保留上下文,再提炼结构。
  • 同一个模型可以多次迭代,不追求一次写成最终版。

模型记录区

第一性原理

把问题拆到不能再依赖既有说法、行业惯例和二手结论的基础事实,再从基础事实重新推导方案。

适合:

  • 需求被经验做法绑架时。
  • 方案复杂但没人能解释为什么必须这样时。
  • 要判断一个“默认方案”是否真的成立时。

使用方式:

  1. 写出当前结论。
  2. 逐条追问:这个结论依赖哪些前提?
  3. 区分事实、假设、偏好、惯例。
  4. 保留不可再拆的事实约束。
  5. 从事实约束重新推导最小可行路径。

在 Vibe Coding 中,它常用于防止 AI 沿着常见套路生成过度复杂方案。

奥卡姆剃刀

在能解释同一现象、满足同一验收标准的多个方案中,优先选择假设更少、结构更短、依赖更少、状态更少的方案。

它不是“越简单越好”,而是:

在不牺牲关键约束的前提下,少引入不必要实体。

适合:

  • AI 生成了大量抽象层、框架和配置。
  • 一个功能有多种实现路径。
  • 需要判断是否真的要引入新依赖或新模块。

使用方式:

  1. 列出所有必须满足的约束。
  2. 对比方案的依赖数量、状态数量、分支数量、概念数量。
  3. 删除无法直接服务验收标准的结构。
  4. 保留可测试、可解释、可替换的最小方案。

网络效应

一个系统、工具、标准或平台的价值,会随着使用者、连接节点、互操作对象和生态资产的增加而上升。

适合:

  • 选择技术栈、平台、协议、社区或开源生态。
  • 判断一个标准是否值得跟随。
  • 评估文档、模板、Skill、质量门禁和工程闭环是否应该统一入口。

使用方式:

  1. 识别网络里的节点:用户、工具、插件、文档、数据、案例、贡献者。
  2. 判断新增节点是否会提高其他节点的价值。
  3. 判断迁移成本、锁定风险和替代路径。
  4. 优先选择能扩大生态连接、降低协作成本的方案。

在知识库中,网络效应意味着:同一套术语、路径、模板和入口越统一,越容易被人和 AI 重复引用。

思想实验

在现实执行之前,先构造一个简化但关键约束完整的假想场景,用来检验概念、规则、边界和后果。

适合:

  • 方案还没写代码,但要判断是否会崩。
  • 现实试错成本高。
  • 需要测试一个原则在极端情况下是否仍成立。

使用方式:

  1. 设定一个最小场景。
  2. 保留关键约束,删除无关细节。
  3. 推演正常路径、边界路径、极端路径。
  4. 看结论是否自洽,是否出现反例。

示例问题:

  • 如果用户完全零基础,这份教程还能不能走通?
  • 如果 AI 输出错了,门禁能不能挡住?
  • 如果某个外部仓库不可用,系统是否还能替换?

逆向思维

从失败、反例、风险和终局倒推当前行动,先问“怎样一定会失败”,再反推避免失败的约束。

适合:

  • 做质量门禁。
  • 做架构风险分析。
  • 判断一个计划是否只是看起来完整。

使用方式:

  1. 写出最坏结果。
  2. 列出导致最坏结果的路径。
  3. 找出其中可被提前检测或阻断的环节。
  4. 把阻断点转成测试、CI、脚本、schema、清单或人工复核。

在 AI 协作中,逆向思维尤其重要:不要只问“AI 怎么完成任务”,还要问“AI 会怎样糊弄、幻觉、漏测、误删、过度实现”。

多阶思维

多阶思维继承二阶思维,但不止停在“行动之后会发生什么”,而是继续追踪后续反应、反馈、反身性和系统性连锁。

二阶思维关注:

我的行动会带来什么后果?

多阶思维继续追问:

后果会改变参与者行为吗? 行为改变后会反过来改变系统吗? 系统改变后,原来的策略还成立吗?

适合:

  • 平台规则、社区治理、开源协作、SEO/GEO、激励机制。
  • 任何会让参与者根据结果调整行为的系统。

使用方式:

  1. 一阶:行动本身会产生什么直接结果。
  2. 二阶:直接结果会触发什么间接后果。
  3. 三阶:参与者看到后果后会如何改变行为。
  4. 反身性:行为改变会如何反过来改变系统条件。
  5. 收敛:原策略是否需要调整、加门禁或保留回滚路径。

在 GEO 中,多阶思维意味着:不是只写关键词,而是让内容被 AI 引用后继续强化项目定位、用户行为和外部分发路径。

组合描述模型

完整文档:组合描述模型

组合描述模型是一套理解世界、描述变化、整理知识的基础认知语法。它把复杂对象放进一条动态认知链:

对象 -> 状态 -> 快照 -> 序列 -> 过程 -> 变换 -> 同一/差异 -> 关系

它解决的问题是:如何在变化中持续追踪一个对象,描述它在不同条件下的状态,记录它的快照和序列,解释它如何通过变换形成过程,并判断它为什么仍然算“同一个”、哪里已经变得“不同”、又处在什么关系网络里。

一句话理解:

对象让世界可被指认,状态让世界可被描述,快照和序列让世界可被记录,过程和变换让世界可被解释,同一、差异和关系让世界可被理解。

核心含义:

  • 对象:被识别和追踪的单位。
  • 状态:对象在某一条件下的存在方式。
  • 快照:对某个状态的静态记录。
  • 序列:多个快照按时间、逻辑或规则排列。
  • 过程:序列背后的动态展开。
  • 变换:状态变化的规则、操作或机制。
  • 同一:变化中仍能被认作同一个对象的依据。
  • 差异:变化、比较和意义生成的基础。
  • 关系:对象和过程在系统中的连接方式。

使用方式:

  1. 先问对象是什么,边界在哪里。
  2. 再描述当前状态,而不是只贴标签。
  3. 收集多个快照,避免只凭单点判断。
  4. 把快照排成序列,识别变化路径。
  5. 从序列中推断过程。
  6. 找到推动过程的变换机制。
  7. 判断哪些属性保持同一,哪些差异真正重要。
  8. 最后放回关系网络中理解。

在软件工程里,它可以用于分析系统演化、版本变化、Bug 复现、用户行为路径和知识库重组。

状态空间思维模型

状态空间思维模型把“状态、变化、序列、决策树、多元宇宙”整合在一起,用来分析一个系统从当前状态可能走向哪些未来状态。

它关注的不是单一路径,而是:

当前在哪个状态? 可以采取哪些动作? 每个动作会把系统推向哪些状态? 哪些路径可逆,哪些路径不可逆? 哪些未来状态更稳定、更可验证、更可回滚?

核心元素:

  • 当前状态:系统此刻的配置、资源、约束和风险。
  • 动作集合:现在可以执行的操作。
  • 状态转移:动作如何改变状态。
  • 决策树:不同动作展开出的路径分支。
  • 多元宇宙:所有可能路径形成的未来状态集合。
  • 序列:实际被选择并发生的一条路径。
  • 收敛条件:哪些状态算成功、失败或需要回滚。

使用方式:

  1. 描述当前状态,不急着下结论。
  2. 列出可行动作,而不是只看默认动作。
  3. 为每个动作写出可能的后续状态。
  4. 标记不可逆动作、高风险动作和可回滚动作。
  5. 选择能保留最多未来选择权、同时最接近目标的路径。
  6. 用检查点、测试、提交、备份和 CI 把路径变得可回退。

在工程实践中,状态空间思维能防止“一步走死”:重要操作前先建立检查点,优先走可验证、可回滚、可分阶段收敛的路径。

2. 组合描述模型 - 对象、状态、快照、序列、过程、变换、同一/差异与关系。(点击展开/收起)

2. 组合描述模型

对象、状态、快照、序列、过程、变换、同一/差异与关系。

组合描述模型,可以看成一套理解世界如何“既保持又变化”的基础框架:对象是我们能够指认和追踪的相对稳定单位,状态是对象在某一时刻或条件下的存在方式,快照是对状态的静态截取,多个快照按时间或规则排列就形成序列,而序列作为动态整体展开出来就是过程;过程之所以能从一个状态走向另一个状态,是因为背后有某种变换机制。可是一旦讨论变化,就必然遇到两个问题:它为什么仍然算“同一个”,又为什么已经变得“不同”。因此,同一用来保证追踪和识别的连续性,差异用来揭示变化、比较和意义的生成,而关系则把对象、状态、过程和差异放进更大的结构网络中,使它们真正获得意义。换句话说,这组概念不是零散术语,而是一种从静态存在走向动态生成、从孤立对象走向关系结构的认知语法:对象让世界可被指认,状态让世界可被描述,快照和序列让世界可被记录,过程和变换让世界可被解释,同一、差异和关系则让世界可被理解。

UserInput(组合描述模型) -> 对象 -> 状态 -> 快照 -> 序列 -> 过程 -> 变换机制 -> 同一判定 -> 差异判定 -> 关系网络 -> 动态本体论框架

这几个概念,几乎就是我们理解世界、描述变化、整理知识的一套较小框架。

它们不只出现在哲学里,数学、物理学、计算机科学、系统科学、语言学、认知科学里,也都离不开它们。

单看每个词,都很常见。但把它们放在一起,问题就会更深一层:

我们到底怎么在变化里把握事物,又怎么在差异里建立统一?

这其实是很多学科都在面对的问题。

一个对象,从来不是孤零零存在的。它总在某种状态里。状态可以被截成快照,快照可以排成序列,序列展开以后,就是过程。过程又依赖某种变换规则。

而在变换里,我们一方面要说明,为什么它还是“同一个”;另一方面也要说明,它为什么已经“不同了”。最后,这一切都只能放进关系网络里,才真正说得通。

所以,这组概念不是一张并列摆开的术语表。它更像一套用来描述世界、系统和认知的动态本体论框架。

一、对象

对象,就是我们拿来指认、区分和讨论的单位。

它可以很具体,比如一棵树、一台机器、一个人。也可以很抽象,比如一种制度、一个算法、一个命题、一个国家。

对象的关键,不在于它是不是“独立存在”,而在于,它能不能被识别成一个相对稳定的单位。

也就是说,对象总和边界、识别、持续性有关。没有边界,对象就立不起来。没有持续性,对象就会散成一团难以组织的事件流。

不同学科里,对象的意思也不一样:

  • 在哲学里,它常常对应实体、存在者,或者现象对象。
  • 在数学里,它可以是集合、群、空间、范畴里的元素。
  • 在计算机科学里,它可以是数据结构、类实例、进程、节点。
  • 在系统科学里,它更常被理解成系统单元,或者系统里的子系统。

所以,对象不只是“一个东西”。它是一个被组织起来、能被识别、还能被持续追踪的存在单位。

二、状态

状态,是对象在某个时刻、某种条件下的规定性。

对象不会永远静止不变。它会表现出不同的属性、位置、能量、角色,或者内部配置。

状态,就是这些规定性的总和。也可以说,状态就是对象“此时此地怎么存在”的方式。

比如:

  • 一杯水可以是液态、固态、气态。
  • 一台机器可以在运行、停机、故障这些状态里切换。
  • 一个人可以清醒、疲惫、专注、焦虑。
  • 一个社会系统,也可能是稳定、危机、转型。

状态这个概念,让对象从“只是存在”,变成“可以被描述的存在”。

没有状态,对象只是一个空名字。有了状态,对象才真正变成能分析、能比较、能记录的单位。

三、快照

快照,就是对状态做一次静态截取。

它强调的是“截面”,不是“流动”;强调的是“这一刻就是这样”,不是“它怎么变成这样”。

快照的意义,在于先把连续变化暂时冻住。这样我们才能观察、记录、比较、建模。

比如:

  • 照片是视觉快照。
  • 数据库备份是系统快照。
  • 某个时间点的人口统计,是社会快照。
  • 实验里某一刻的测量数据,也是快照。

但快照不等于对象本身。它只是对象在某个时间点上,一个可以被记录下来的切面。

所以,快照天然带着选择性。它记录什么,不记录什么;它保留哪些属性,忽略哪些背景。

也就是说,快照既是认识工具,也是一种简化。

四、序列

序列,是多个快照按照时间、逻辑,或者生成规则排出来的结果。

当我们不再只问“这一刻是什么”,而开始关心“前后发生了什么”,快照就进入了序列。

序列可以是:

  • 时间序列,比如一天里的温度变化。
  • 行为序列,比如用户在软件里的点击路径。
  • 叙事序列,比如故事里的事件链。
  • 运算序列,比如算法执行的步骤。
  • 生长序列,比如一个生物体发育的阶段。

序列让分散的快照之间,开始建立可追踪的连续性。

它是我们从静态描述,走向动态理解的第一步。

五、过程

过程,可以看成序列的动态整体。

如果说序列强调的是排列,那过程强调的就是展开。如果说序列更像“把结果一个个列出来”,那过程更像“变化正在持续发生”。

过程不只是很多状态排在一起。更重要的是,这些状态之间有生成关系,有演化方向,也有内在联系。

比如:

  • 种子发芽是过程。
  • 儿童成长是过程。
  • 化学反应、经济周期、项目推进、语言习得,也都是过程。

过程最核心的地方在于,它有持续性,有方向性,有内在机制,还会产生新的状态和新的结构。

所以,比起“对象”,过程往往更能抓住现实世界的生命力。

很多现代思想都倾向于认为,世界最根本的,不是静态实体,而是过程、事件和生成。

六、变换

变换,是从一个状态到另一个状态的规则、操作,或者机制。

它回答的问题是:

为什么会变?又是怎么变过去的?

变换可以是:

  • 物理变换,比如受力运动、相变、能量交换。
  • 数学变换,比如映射、函数、群作用、坐标变换。
  • 计算变换,比如状态转移、程序执行、数据更新。
  • 认知变换,比如分类、联想、重构。
  • 社会变换,比如制度改革、角色转换、结构迁移。

变换让过程变得可以解释。

没有变换,过程只是现象。有了变换,我们才有机会建立机制模型,理解为什么会从 A 走到 B。

七、同一

同一,指的是在变化里,某个东西依然被认作“它自己”。

这是这组概念里最偏哲学的问题之一。

一个人和十年前相比,身体细胞不同了,心理结构不同了,社会身份也可能不同了。但我们还是会说,这是同一个人。

一艘船的木板全换了,它还是不是原来那艘船?

一个软件升级了很多次,它还是不是同一个系统?

同一问题会把一个张力直接摆出来:

变化一直在发生,但识别不能因此彻底崩掉。

所以,同一不是绝对不变。它更像是一种可持续的认定原则。

这个原则,可能来自物质连续性,也可能来自结构连续性、功能连续性、因果连续性,还可能来自记忆和叙事的连续性,或者规则上的身份保持。

所以,同一性通常不是说“本质一点都没变”,而是说:

在某种意义上,它仍然算同一个。

八、差异

差异,就是对象之间、状态之间、快照之间,或者过程阶段之间的不相同。

没有差异,识别就无从发生。因为识别本身,就是把这个和那个区分开。

差异可以是静态的,比如两个对象不一样。也可以是动态的,比如同一个对象,前后两个状态不一样。还可以是两个序列的差异,过程不同阶段的差异,或者同一个结构在不同语境里的差异。

差异不是对同一的简单否定。恰恰相反,同一和差异是互相规定的。

没有某种持续性,你都没法说“它变了”。没有变化,你也没法说“它还是同一个”。

需要注意的是:

差异不是附属的边角料。它本身就是意义生成的基础。

一个符号之所以有意义,因为它和别的符号不同。一个身份之所以成立,也因为它在关系网络里和别的身份区分开来。

九、关系

关系,是对象和对象、状态和状态、过程和过程之间的连接方式。

关系可以是空间关系,也可以是时间关系、因果关系、逻辑关系、功能关系、社会关系、语义关系。

关系的重要性在于,对象很多时候不是先孤立存在,然后才去彼此连接。恰恰相反,很多对象就是在关系里才被定义出来的。

比如:

  • 父亲这个对象,离不开亲属关系。
  • 节点离不开网络关系。
  • 商品离不开交换关系。
  • 词语离不开句法和语义关系。

所以,关系视角意味着一种转变:

从“以实体为中心”,转到“以结构为中心”。

在这种视角里,理解一个东西,不只是问“它是什么”,还要问:

  • 它和什么相连?
  • 它在什么网络里起作用?
  • 它又是由哪些差异和对应构成的?

十、概念之间的结构关系

这几个概念之间,其实不是松散堆在一起的。

它们可以连成一条线:

对象,到状态,到快照,到序列,到过程,再到变换。

同时,这条线一直被另外三组更深层的概念支撑着:

  • 同一,保证我们追踪的,还是“同一个对象”或者“同一个过程”。
  • 差异,保证变化、比较和生成,能够被识别出来。
  • 关系,保证这些单位不是孤立的,而是在结构里获得意义。

换句话说:

  • 对象是被识别出来的单位。
  • 状态是对象当下的规定。
  • 快照是状态的记录形式。
  • 序列是快照的排列方式。
  • 过程是序列的动态统合。
  • 变换是过程展开的机制。
  • 同一让追踪成为可能。
  • 差异让比较成为可能。
  • 关系让理解成为可能。

整个框架,可以被看成一条从静态存在走向动态生成的认知路径。

十一、不同学科中的展开

放到不同学科里看,这套框架都会展开出自己的版本。

1. 哲学

哲学是最早系统讨论这些概念的地方。

古希腊哲学里,巴门尼德强调存在和同一,赫拉克利特强调流变和过程。这几乎已经把后面关于“同一和变化”的基本矛盾摆出来了。

亚里士多德又用实体和属性、潜能和现实,去解释对象、状态和变化。

到了近代哲学,问题进一步变成:

对象是独立于认识而存在,还是在经验中被构成出来的?

现代哲学里,现象学、结构主义、过程哲学、后结构主义,又分别从意识、结构、生成、差异这些角度,重新组织这组概念。

所以在哲学里,核心问题通常会集中在这些地方:

  • 什么才算对象?
  • 变化里的同一怎么成立?
  • 差异到底是附属的,还是根本的?
  • 关系是外在连接,还是构成性的?
  • 世界最基础的东西,到底是实体还是过程?

可以说,这组概念在哲学里,本来就是本体论和认识论的一条核心轴线。

2. 数学

数学给这组概念,提供了最精确的形式表达。

集合论把对象处理成元素和集合。函数和映射用来描述变换。序列、递推、极限,处理的是有序展开。

拓扑学研究的是变形里哪些东西保持不变。某种意义上,这也是在回应“同一”的问题。

抽象代数研究的是,对象在运算下怎样保持结构。

范畴论更进一步,把对象和态射放进同一体系里,让关系和变换的位置,比对象本身还更基础。

数学特别重要的一点在于,它不只是讨论这些概念。它还能给出严格条件,告诉我们:

  • 什么时候两个对象算等价。
  • 什么时候一个变换算保持结构。
  • 什么时候一个过程可逆。
  • 什么时候不可逆。

3. 物理学

物理学里,这组概念几乎可以直接一一对应:

  • 对象,可以是粒子、场、系统。
  • 状态,可以是位置、速度、能量、自旋、宏观参数。
  • 快照,就是某个时刻的观测值。
  • 序列,就是测量记录和轨迹数据。
  • 过程,是运动、演化、衰变、相变。
  • 变换,是动力学方程、对称变换、守恒律。
  • 同一,是同一个系统在时间里的延续。
  • 差异,是不同状态、不同相、不同测量结果之间的区别。
  • 关系,是相互作用、耦合和时空关系。

物理学特别强调一点:

对象不能脱离状态空间和演化规律来理解。

一个系统到底是什么,很多时候就取决于,它可能处在哪些状态里,以及这些状态会怎样随时间变化。

所以,物理学很典型地代表了一种“状态—演化”的世界观。

4. 计算机科学

计算机科学里,这组概念是非常能落地、非常有操作性的。

在程序设计和系统建模中:

  • 对象可以是数据实体、模块、进程、节点。
  • 状态可以是内存值、配置、上下文。
  • 快照可以是系统镜像、数据库备份、版本存档。
  • 序列可以是日志、执行轨迹、输入流。
  • 过程可以是程序运行、工作流、协议执行。
  • 变换可以是算法、状态转移函数、数据处理规则。
  • 同一可以表现成对象 ID、引用、版本继承。
  • 差异可以表现成补丁、变更记录、版本比较。
  • 关系则表现成依赖、调用、连接、图结构。

尤其是在状态机、数据库、分布式系统、版本控制、人工智能这些领域里,这组概念几乎就是基础语言。

计算机科学的重要贡献,就在于它把这些概念变成了能设计、能验证、能执行的系统结构。

5. 系统科学

系统科学里,对象通常被理解成系统或者子系统。关系被理解成结构。状态变化被理解成动态演化。

所以,这套概念在系统科学里有很强的整体性。

系统科学关心的,从来不是一个孤零零的对象。它更关心:

  • 对象怎么组成系统。
  • 系统怎么维持状态。
  • 系统怎么在扰动里发生变换。
  • 系统怎么在时间里保持同一。
  • 系统又怎么通过反馈,产生差异化的演化。

在控制论、复杂系统理论、生态系统研究、组织理论里,这样的框架都很常见。

它的优势在于,能同时处理稳定和变化,局部和整体,结构和生成。

6. 语言学和认知科学

语言学和认知科学里,这组概念也很关键。

语言学里,意义常常就是靠差异和关系形成的。认知科学里,人脑理解世界,也离不开对象化、分类、跟踪和关系建模。

人在感知一个连续世界的时候,并不是直接面对一团“纯粹流动”。我们会主动把它切开,分出对象,识别它的状态,形成快照式记忆,把经验串成序列,再去推断它背后的过程,并建立相应的变换模型。

比如我们会判断:

这是同一个人在走路。

也会注意到:

他的表情变了。

也会把几个动作连成一个完整事件。

所以,这组概念不只是描述外部世界的工具。它们本身,也是认知活动组织经验的方式。

十二、理论上的核心问题

接下来,有几个理论上的核心问题。

1. 实体优先,还是过程优先

就是说,世界是不是先由对象构成,然后对象再去变化;还是说,世界本来就是过程流动,对象只是过程里相对稳定的结点。

前一种思路,更偏实体论。后一种思路,更偏过程论。

实体论强调同一和稳定。过程论强调生成和变动。

现实里,两边往往都不能少。没有相对稳定的对象,认知没法展开。没有过程和变换,对象又会僵成空洞标签。

2. 同一怎么在变化里成立

这个问题从古典讨论到现代,一直没有真正结束。

判断同一,可以看物质连续性,也可以看结构、功能、因果链、记忆、命名规则这些标准。

不同学科、不同语境,会选不同的标准。

所以,同一通常不是一个唯一答案。它更像一套随着情境变化而变化的判准体系。

3. 差异到底是派生的,还是基础的

传统思想往往把同一放在基础位置,把差异看成偏离。

现代思想则更常认为,差异才更根本。因为没有差异,就没有识别,没有意义,也没有生成。

这样一来,差异就不再只是分类剩下来的残余。它会变成知识生产本身的根部。

4. 关系会不会比对象更基础

在网络科学、结构主义、范畴论、系统论里,关系往往不是次生的。

一个对象具有什么性质,很多时候由它在关系网络里的位置决定。

这会让我们对世界的理解,从“对象的集合”,慢慢转成“关系的结构”。

十三、五层统一模型

如果把这九个概念再压缩一下,可以得到一个统一模型。

第一层:存在层

这里包括对象和状态。

它回答的是:

  • 有什么?
  • 以及它此刻怎么存在?

第二层:表征层

这里包括快照和序列。

它回答的是:

  • 怎么记录?
  • 又怎么把记录组织起来?

第三层:生成层

这里包括过程和变换。

它回答的是:

  • 怎么变化?
  • 变化的机制又是什么?

第四层:判定层

这里包括同一和差异。

它回答的是:

  • 什么保持不变?
  • 什么发生了改变?

第五层:结构层

这里就是关系。

它回答的是:

  • 这一切怎么被连接成系统?

这个模型的价值就在于,它能跨学科反复使用。

不管你研究的是哲学问题,还是物理系统、程序运行、社会变迁、叙事结构,都可以用这五层框架来组织分析。

十四、作为一种分析方法

所以,这组概念不只是理论术语。它也可以变成一种方法。

面对任何复杂对象,都可以按这样的步骤去分析:

  1. 先确定对象到底是什么。
  2. 再描述它现在有哪些状态。
  3. 然后收集几个快照。
  4. 把快照排成序列。
  5. 从序列里识别出过程。
  6. 再进一步找出推动变化的变换机制。
  7. 同时判断,哪些属性支撑了同一。
  8. 哪些属性构成了差异。
  9. 最后,把它放回更大的关系网络里理解。

这其实是一种很普遍的分析法。

它能用在科学研究里,也能用在系统设计、历史叙述、产品分析、组织诊断,甚至自我反思里。

十五、结语

最后,对象、状态、快照、序列、过程、变换、同一、差异、关系,并不是一堆零散的术语。

它们是一组基础概念,能把静态和动态连起来,也能把实体和结构、稳定和生成连起来。

它们一起在回答一个很根本的问题:

我们怎么描述一个世界?

这个世界里有东西,这些东西会变化。这些变化可以被记录,可以被比较,可以被解释。而且最终,还能在关系中形成整体意义。

如果说:

  • 对象让世界可以被指认。
  • 状态让世界可以被描写。
  • 快照和序列让世界可以被记录。
  • 过程和变换让世界可以被解释。

那么,同一、差异、关系,就是让世界真正可以被理解的条件。

从这个意义上说,这组概念,几乎就是一切系统性思考的基础语法。

3. 编程之道 - 编程哲学、结构、状态、复杂度与工程判断。(点击展开/收起)

3. 编程之道

编程哲学、结构、状态、复杂度与工程判断。

绝利一源,用师十倍。三返昼夜,用师万倍。

一份关于编程本质、抽象、原则、哲学的高度浓缩稿 它不是教程,而是“道”:思想的结构


1. 程序本体论:程序是什么

  • 程序 = 数据 + 函数
  • 数据是事实;函数是意图
  • 输入 → 处理 → 输出
  • 状态决定世界形态,变换刻画过程
  • 程序是对现实的描述,也是改变现实的工具

一句话:程序是结构化的思想


2. 三大核心:数据 · 函数 · 抽象

数据

  • 数据是“存在”
  • 数据结构即思想结构
  • 若数据清晰,程序自然

函数

  • 函数是“变化”
  • 过程即因果
  • 逻辑应是转换,而非操作

抽象

  • 抽象是去杂存真
  • 抽象不是简化,而是提炼本质
  • 隐藏不必要的,暴露必要的

3. 范式演化:从做事到目的

面向过程

  • 世界由“步骤”构成
  • 过程驱动
  • 控制流为王

面向对象

  • 世界由“事物”构成
  • 状态 + 行为
  • 封装复杂性

面向目的

  • 世界由“意图”构成
  • 讲需求,不讲步骤
  • 从命令式 → 声明式 → 意图式

4. 设计原则:保持秩序的规则

高内聚

  • 相关的靠近
  • 不相关的隔离
  • 单一职责是内聚的核心

低耦合

  • 模块如行星:可预测,却不束缚
  • 依赖越少,生命越长
  • 不耦合,才自由

5. 系统观:把程序当成系统看

状态

  • 所有错误的根源,不当的状态
  • 状态越少,程序越稳
  • 显化状态、限制状态、自动管理状态

转换

  • 程序不是操作,而是连续的变化
  • 一切系统都可视为: output = transform(input)

可组合性

  • 小单元 → 可组合
  • 可组合 → 可重用
  • 可重用 → 可演化

6. 思维方式:程序员的心智

声明式 vs 命令式

  • 命令式:告诉系统怎么做
  • 声明式:告诉系统要什么
  • 高层代码应声明式
  • 底层代码可命令式

规约先于实现

  • 行为先于结构
  • 结构先于代码
  • 程序是规约的影子

7. 稳定性与演进:让程序能活得更久

稳定接口,不稳定实现

  • API 是契约
  • 实现是细节
  • 不破坏契约,就是负责

复杂度守恒

  • 复杂度不会消失,只会转移
  • 要么你扛,要么用户扛
  • 好设计让复杂度收敛到内部

8. 复杂系统定律:如何驾驭复杂性

局部简单,整体复杂

  • 每个模块都应简单
  • 复杂性来自组合,而非模块

隐藏的依赖最危险

  • 显式 > 隐式
  • 透明 > 优雅
  • 隐式依赖是腐败的起点

9. 可推理性

  • 可预测性比性能更重要
  • 程序应能被人脑推理
  • 变量少、分支浅、状态明、逻辑平
  • 可推理性 = 可维护性

10. 时间视角

  • 程序不是空间结构,而是时间上的结构
  • 每段逻辑都是随时间展开的事件
  • 设计要回答三个问题:
    1. 状态由谁持有?
    2. 状态何时变化?
    3. 谁触发变化?

11. 接口哲学

API 是语言

  • 语言塑造思想
  • 好的接口让人不会误用
  • 完美接口让人无法误用

向后兼容是责任

  • 破坏接口 = 破坏信任

12. 错误与不变式

错误是常态

  • 默认是错误
  • 正确需要证明

不变式保持世界稳定

  • 不变式是程序的物理法则
  • 明确约束 = 创造秩序

13. 可演化性

  • 软件不是雕像,而是生态
  • 好设计不是最优,而是可变
  • 最好的代码,是未来的你能理解的代码

14. 工具与效率

工具放大习惯

  • 好习惯被放大成效率
  • 坏习惯被放大成灾难

用工具,而不是被工具用

  • 明白“为什么”比明白“怎么做”重要

15. 心智模式

  • 模型决定理解
  • 理解决定代码
  • 正确的模型比正确的代码更重要

典型模型:

  • 程序 = 数据流
  • UI = 状态机
  • 后端 = 事件驱动系统
  • 业务逻辑 = 不变式系统

16. 最小惊讶原则

  • 好代码应像常识一样运作
  • 不惊讶,就是最好的用户体验
  • 可预测性 = 信任

17. 高频抽象:更高阶的编程哲学

程序即知识

  • 代码是知识的精确表达
  • 编程是把模糊知识形式化

程序即模拟

  • 一切软件都是现实的模拟
  • 模拟越接近本质,系统越简单

程序即语言

  • 编程本质是语言设计
  • 所有编程都是 DSL 设计

程序即约束

  • 约束塑造结构
  • 约束比自由更重要

程序即决策

  • 每一行代码都是决策
  • 延迟决策 = 保留灵活性

18. 语录

  • 数据是事实,函数是意图
  • 程序即因果
  • 抽象是压缩世界
  • 状态越少,世界越清晰
  • 接口是契约,实现是细节
  • 组合胜于扩展
  • 程序是时间上的结构
  • 不变式让逻辑稳定
  • 可推理性优于性能
  • 约束产生秩序
  • 代码是知识的形状
  • 稳定接口,流动实现
  • 不惊讶,是最高的设计
  • 简单是最终的复杂

结束语

编程之道不是教你怎么写代码,而是教你如何理解世界 代码是思想的形状 程序是理解世界的另一种语言

愿你在复杂世界中保持清晰,在代码中看到本质

4. 软件工程的朴素真理 - 代码、复杂度、需求、维护、质量、架构和团队的工程常识。(点击展开/收起)

4. 软件工程的朴素真理

软件工程不是把代码写出来,而是在变化中持续交付可靠价值。

软件工程的核心,不是写代码,而是管理复杂性。

代码只是结果。真正困难的是:需求会变化,人会误解,系统会膨胀,历史包袱会累积,边界会模糊,成本会被低估。

软件工程不是把复杂问题变成复杂代码,而是尽量把复杂问题变成可理解、可维护、可演进的系统。

一、关于代码

1. 代码是写给人读的,顺便让机器执行

机器不在乎变量名叫 a1 还是 user_discount_rate,但人会在未来反复阅读、修改、排查这段代码。

代码首先是一种沟通媒介,其次才是机器指令。

可读性比聪明感重要。没人会长期欣赏只有你自己能看懂的代码。

2. 清晰比聪明重要

聪明的代码可能让人佩服一分钟,清晰的代码能让团队少痛苦几年。

调试通常比写代码更难。如果代码本身已经写得过于“聪明”,未来排查问题的人会付出更高代价。

3. 命名是编程中最难的事之一

一个好名字抵得上一段注释,一个坏名字会制造无数误解。

命名困难,往往说明概念还没有想清楚。

4. 最好的代码,是不存在的代码

能不写的代码,永远是最好的代码。

代码越多,维护成本越高,出错面越大。删除代码常常才是真正的进步。

少即是多,不是偷懒,而是克制。

5. 重复代码不一定坏,错误抽象更坏

抽象是有代价的。

好的抽象减少复杂性,坏的抽象制造复杂性。没有被真实使用验证过的抽象,往往只是提前制造复杂度。

过早抽象,很多时候比适度重复更糟。

二、关于复杂度

6. 软件工程的核心是管理复杂性

软件开发本质上,是把业务世界里的混乱逻辑,转化为可运行、可理解、可维护的数字逻辑。

业务本身有多复杂,系统最终就会有多复杂。

工程能力不是消灭所有复杂度,而是让复杂度有边界、有位置、有解释。

7. 复杂度不会消失,只会转移、隐藏或命名

你可以通过架构、抽象、封装、平台化来移动复杂度,但很难真正消灭复杂度。

如果一个系统看起来简单得不可思议,复杂度很可能被推给了用户、运维、调用方,或者藏在某个尚未暴露的角落里。

8. 简单不是简陋,而是克制

简单不是少写几行代码,而是少让人记住东西。

好的设计不是堆更多功能,而是减少不必要的概念、状态、分支和例外。

真正的简单,是让正确的事情容易发生,让错误的事情难以发生。

三、关于需求

9. 需求永远不会完整

用户往往知道自己不满意什么,却未必能准确描述自己真正需要什么。

很多失败项目,不是因为程序员不会写代码,而是因为一开始就没有搞清楚要解决什么问题。

10. 需求不清,技术越强,偏得越快

需求不清时,技术能力越强,越可能把错误的方向实现得又快又复杂。

最贵的 bug,通常不是写错了代码,而是理解错了问题。

11. 变化是常态

软件不是在稳定世界里运行的静态产物。

市场会变,用户会变,组织会变,依赖会变,监管会变,基础设施也会变。

所以软件设计不能只追求“第一次做对”,还要考虑未来如何修改、扩展、替换和回滚。

四、关于维护

12. 上线不是结束,而是开始

软件不是一次性交付物,而是一项长期债务。

上线只是软件开始接受现实检验的第一天。维护、扩展、排障、迁移、兼容,才是成本的大头。

13. 不动的代码也会腐烂

即使一行代码都不改,系统也可能逐渐失效。

依赖会过时,环境会升级,接口会废弃,业务规则会变化,安全风险会积累。

不维护的系统,迟早会出问题。

14. 技术债不是罪,假装没有技术债才是罪

为了赶进度牺牲质量,有时是现实选择。

但技术债必须被看见、被记录、被评估。债可以借,但要知道借了多少,利息是什么,什么时候还。

“以后再重构”通常意味着“以后也不会重构”。

五、关于质量

15. 测试不是为了证明代码正确

测试不能证明系统没有 bug,但能阻止很多旧 bug 复活。

它最大的价值,是让修改不那么可怕。

没有测试的系统,越成功越难改;越难改,越容易变成负担。

16. 性能问题要靠测量,不要靠感觉

过早优化是万恶之源。

先让它跑起来,再让它正确,最后才是让它快。

大多数性能问题不是靠猜出来的,而是靠监控、profiling、压测和真实数据定位出来的。

17. 安全不是一个功能,而是一种默认假设

系统最脆弱的地方,通常不在算法,而在边界。

输入、权限、网络、并发、时间、状态、依赖、异常路径,才是事故高发区。

安全的基本假设应该是:任何输入都可能有问题,任何边界都可能被突破。

18. 稳定不是没有故障,而是故障可控

稳定系统靠的不是永远不出问题,而是出问题时能够被发现、被定位、被隔离、被恢复。

日志、监控、告警、追踪、降级、限流、回滚,都是系统稳定性的一部分。

日志不是给程序看的,是给凌晨三点处理事故的人看的。

六、关于架构与权衡

19. 没有银弹

没有任何语言、框架、架构、平台或工具能解决所有问题。

换语言不一定能解决性能问题,引入新框架不一定能解决组织问题,使用 AI 写代码也不等于解决了需求定义和工程责任。

技术只是手段,不是答案本身。

20. 软件工程本质上是权衡

软件世界里很少有绝对最优,更多是当前条件下的相对合适。

速度、质量、成本、灵活性、稳定性、安全性、复杂度,往往互相牵制。

架构设计不是寻找完美方案,而是在多个不完美选项中,选择团队当前最能承担的代价。

七、关于团队

21. 软件工程是团队运动

再厉害的独行侠,也比不上一个沟通顺畅的团队。

代码是媒介,协作才是核心。

团队里的隐性知识越多,系统风险越大。没有被写下来、讲清楚、传递出去的知识,都会在未来变成成本。

22. 系统的形状,往往反映组织的形状

沟通混乱的团队,很难产出边界清晰的软件。

职责不清、目标不一、协作低效,最终都会反映到系统里,变成混乱的模块、模糊的接口和难以维护的依赖关系。

23. 文档不是装饰品

文档不是为了证明你写过什么,而是为了让别人少猜。

尤其是记录“为什么这么做”的文档,通常比解释“代码做了什么”更有价值。

代码能说明系统当前怎么运行,但文档能解释当时为什么做出这个选择。

八、最终总结

软件工程的朴素真理是:

技术只是手段,解决问题才是目的。

优秀的工程师,不是写出多复杂的代码,而是能用尽可能简单、清晰、可靠的方式解决复杂问题。

每一行代码,都是未来要承担的责任。

每一个抽象,都是未来要维护的承诺。

每一个系统,都会在变化中接受检验。

所以,软件工程的本质不是“把代码写出来”,而是:

在变化中持续交付可靠价值。

5. 方法论工具箱 - 现象学还原、正反合、可证伪主义、形式化方法等提效工具。(点击展开/收起)

5. 方法论工具箱

现象学还原、正反合、可证伪主义、形式化方法等提效工具。

目标:把"vibe(探索)"系统化为"可验证、可迭代、可收敛"的工程产出。 每个方法给出:用途 / 落地动作 / Python工具 / 可复制提示词。

目录定位

philosophy/ 存放哲学方法论、思维模型、编程哲学和底层认知模型。它回答的不是“下一步命令是什么”,而是“为什么这样判断、如何减少幻觉、如何让复杂问题可描述、可推理、可验证”。

适合:

  • 需要提升问题抽象、系统理解和长期工程判断的人。
  • 需要为 AI Agent 提供更稳定认知框架的任务。
  • 已经掌握入门流程,希望把经验沉淀成可迁移方法的人。

怎么选

目标 先读
想快速获得可复用认知工具 思维模型
想描述复杂系统的对象、状态和变化 组合描述模型
想理解代码、结构、状态和复杂度 编程之道
想理解真实工程里的需求、维护、质量、权衡和协作 软件工程的朴素真理
想把探索过程变成可验证工程流程 本文件的方法论工具箱

相关文档

  • 思维模型 - 第一性原理、奥卡姆剃刀、网络效应、多阶思维、状态空间等可复用认知工具。
  • 编程之道 - 用更抽象的方式理解代码、结构、状态、复杂度与工程判断。
  • 软件工程的朴素真理 - 用底层常识理解代码、复杂度、需求、维护、质量、架构与团队。
  • 组合描述模型 - 对象、状态、快照、序列、过程、变换、同一/差异与关系。

目录


总体作业流

建议默认流程:

  1. 现象卡片(现象/意图/情境/边界)→ 清零脑补
  2. 规格化(类型+schema+错误语义+不变式)→ 可机器检查
  3. 检查器(单测+性质测试+lint+类型检查+关键断言)→ 可证伪
  4. 最小实现main path)→ 快速跑通
  5. 反例驱动Hypothesis/边界/差分/基准)→ 找到失败模式
  6. 收敛重构(删复杂度、固化概念、稳定接口、补文档)→ 可维护

推荐底座(Python

ruff + black + pyright(或 mypy) + pytest + hypothesis + pydantic(msgspec可替代)

方法论

1. 现象学还原(悬置假设)

用途:需求含糊、模型脑补、Bug难复现时,先把"解释/偏好"清零,回到可观察事实与可复现结构。

落地动作

  • 先写四件套:现象(实际) / 意图(期望) / 情境(环境约束) / 边界(明确不做)
  • 输出最小可复现体 MRE:最小输入 + 最小脚本 + 复现步骤 + 预期vs实际
  • 把抽象词降维:快/稳/好用 → 指标&验收用例

Python工具pytestMRE脚本)、日志、最小数据样例

提示词

先做现象学还原:不要推测原因。输出:现象/意图/情境/边界/未确定项/MRE;然后再给最小修复与测试。

2. 正反合(三段迭代)

用途:把一次性"写到完美"替换为可控三轮:快速可用 → 反例打脸 → 收敛为工程版本。

落地动作

  • :只做 main path,让它跑通
  • :列失败模式(边界/空值/并发/权限/超时/性能),用测试与基准逼出反例
  • :重构接口/收敛依赖/补文档与回归,形成下一轮稳定起点

Python工具pytest + hypothesis + ruff/black + profiling/benchmark

提示词

按正反合输出:1)最小可运行实现 2)反例与失败模式+测试 3)综合后的重构方案与最终代码。

3. 可证伪主义(波普尔)

用途:把"看起来对"变成"暂时无法证伪";显著降低隐藏 bug。

落地动作

  • 每个关键断言都要配一个能让它失败的测试(边界/随机/反例)
  • 优先性质测试而非只写示例测试

Python工具hypothesis(性质/模糊)、pytest

提示词

为该实现列出 5 个可证伪点,并为每个点写一个最小测试(优先 Hypothesis 性质测试)。

4. 形式化方法(轻量形式化)

用途:减少非法状态、约束模型输出、让行为可检查可累积。

落地动作

  • 先规格:类型 + schema + 不变式 + 错误集合(异常或 error object)+ 复杂度约束(可选)
  • 再检查器:类型检查 + 运行时校验 + 断言/契约 + 性质测试
  • 最后实现:逐条映射规格(谁保证哪条约束)

Python工具

  • typingLiteral/NewType/Protocol/TypedDict/Annotated
  • pyright/mypy
  • pydantic/msgspec(输入输出校验)
  • assert / icontract / deal
  • pytest + hypothesis

提示词

先输出形式化规格(类型/schema/不变式/错误语义),再给至少 3 条 Hypothesis 性质测试,最后写实现并逐条说明满足关系。

5. 奥卡姆剃刀(最小复杂度)

用途:避免模型引入不必要框架/抽象;提升可维护性与迭代速度。

落地动作

  • 要求两套方案:常规版 vs 简化版;以测试为准删复杂度
  • 优先标准库、减少依赖、减少可变状态、减少层级

Python工具ruff(复杂度/风格)、依赖审计(requirements最小化)

提示词

在满足全部测试与验收的前提下,把实现复杂度删掉 30%:减少依赖、状态和抽象层,并解释删减理由。

6. 实用主义(以指标为准)

用途:避免"优化方向漂移";每轮明确一个可量化目标。

落地动作

  • 先定义成功指标(P95延迟/错误率/成本/内存/可维护性)
  • 每轮只优化一个指标;其余保持不退化(用基准/回归锁住)

Python工具pytest-benchmark 或简单计时;日志与指标;回归测试

提示词

把需求转成指标与验收阈值,并给出测量方法;本轮只优化 X 指标,保证其它指标不退化。

7. 系统论/整体论(边界与反馈回路)

用途:复杂系统容易在耦合点失控;缩短反馈回路提效最大。

落地动作

  • 先画数据流/依赖边界:I/O 放边缘,核心逻辑保持纯函数
  • 优先解耦高耦合点;把慢依赖换成桩/模拟以加速测试

Python工具:依赖注入(轻量)、pytest fixtures、纯函数设计

提示词

画出数据流与依赖边界,指出最高耦合点与最短反馈回路改造方案;给出可测试的纯函数核心与 I/O 适配层。

扩展阅读


8. 诠释学(语境澄清)

用途:需求文本有歧义,模型与人对同一词理解不同。

落地动作

  • 先复述需求 + 歧义清单 + 默认选择(必须显式)
  • 默认选择写入 docstring/README/类型定义

Python工具docstring、类型与 schema 固化默认

提示词

先复述需求并列出所有歧义点;对每个歧义给默认策略与理由;确认后再写实现与测试。

9. "钢人化"原则(最强版本理解)

用途:减少无效争论/误解;让重构建议更贴近原意图。

落地动作

  • 先把现有方案表达成最强版本(目标、约束、权衡)
  • 再提出改进(保留其优势,指出代价)

Python工具:PR描述结构化(优点/风险/替代方案)

提示词

先钢人化现有实现:列出它的最佳解释与优点;再给改进方案并明确代价与风险。

10. 决策论/机会成本(可逆优先)

用途:避免过早做不可逆技术决策(换框架/改数据模型)。

落地动作

  • 标注决策:可逆 vs 不可逆;优先做可逆高价值项
  • 先写接口+测试桩+适配层,延后绑定外部系统

Python工具:抽象边界、adapter、in-memory 实现

提示词

把方案拆成可逆/不可逆决策;先给可逆路径的 MVP,实现通过测试;不可逆部分只给接口与占位实现。

11. 反事实推理(Counterfactuals

用途:系统性覆盖异常路径,降低线上事故。

落地动作

  • 问"如果 X 不成立会怎样":超时、乱序、重复、空值、弱网、权限缺失、时钟漂移
  • 把反事实转成测试矩阵与降级策略

Python工具pytest 参数化、hypothesis 生成器、超时与重试控制

提示词

列出 15 个反事实场景并按风险排序;为 Top5 写测试与降级/错误语义。

12. 溯因推理(Abduction,最佳解释)

用途:debug/性能退化时,比穷举更快定位"最可能原因"。

落地动作

  • 列候选原因 → 为每个原因写最便宜的区分性实验(日志点/开关/最小基准)
  • 用证据淘汰而不是凭感觉改代码

Python工具:结构化日志、trace、最小 benchmark、feature flag

提示词

给出候选原因列表,并为每个原因提供一个最低成本、最高区分度的验证实验与预期观察。

13. 贝叶斯式信念更新(与溯因配合)

用途:在不确定下理性分配排查时间。

落地动作

  • 给假设先验(高/中/低)→ 实验后更新后验排序
  • 只对后验最高的 1-2 个假设投入修改成本

Python工具:同 12;加一张"假设-证据"表

提示词

按先验排序原因;给最信息增益实验;根据可能结果更新排序并给下一步。

14. 反思平衡(Reflective equilibrium

用途:当用例、原则、约束冲突时收敛规范(尤其 API 语义、错误处理、兼容性)。

落地动作

  • 三层对齐:具体用例 ↔ 一般原则 ↔ 系统约束
  • 用测试固化:回归用例(具体判断)+ 性质测试(原则)

Python工具pytest + hypothesis;规范文档(错误模型/幂等语义)

提示词

列出用例/原则/约束三集,指出冲突点;给两轮调整方案,每轮说明要改哪些用例、原则或实现以达成一致。

15. 概念分析 / 概念工程

用途:防止术语漂移导致返工;把领域概念固化进代码。

落地动作

  • 概念表:术语/定义/边界/不变量/转换关系
  • 概念工程:用 Enum/Literal/NewType/dataclass(frozen) 与 schema 固化边界;禁止混用

Python工具EnumLiteralNewTypepydantic 校验

提示词

先产出概念表;再映射成 Python 类型与 schema;给 5 个应被拒绝的反例输入,并写对应测试。

16. 方法论怀疑(笛卡尔式)

用途:把不可靠前提当事实是 vibe coding 常见事故源。

落地动作

  • 对关键前提标注:是否可验证
  • 不可验证 → 必须加运行时校验/超时/重试/降级;并写会失败的测试

Python工具assert/校验器、超时、重试、容错分支测试

提示词

列出该方案依赖的所有前提,并标注可验证性;对不可验证前提添加防线(校验/超时/降级)与对应测试。

17. 视角三角测量(Triangulation

用途:减少单一证据的误判;提升结论可靠性。

落地动作

  • 同一结论至少两种证据:单测/性质测试 + 日志/指标;或差分测试 + fuzz

Python工具pytest/hypothesis + metrics/logging;差分对照

提示词

对关键行为给出至少两种独立验证方式,并说明各自盲区与如何互补。

18. 机制解释(Mechanistic explanation

用途:把"能跑"变成"可解释可维护";降低未来修改风险。

落地动作

  • 要求输出数据流:输入 → 中间状态 → 输出
  • 对中间状态写不变式/断言;把解释与代码结构对齐

Python工具assert、类型收窄、分层函数、docstring

提示词

给出机制解释:数据在系统中如何流动;列出每个中间状态的不变式,并在代码中用断言或类型保证。

19. 错误认识论(Error epistemology

用途:系统化"我们会如何错",比事后补洞更省。

落地动作

  • 先做失败模式清单(空值/乱序/重复/并发/权限/超时/编码/浮点等)
  • 每类至少一个测试;明确错误语义(raise / error object / log+metric

Python工具pytest 参数化 + hypothesis;统一 error 模型

提示词

生成失败模式清单并按风险排序;为 Top N 写测试;统一错误模型并给出示例响应/异常层级。

20. 实验哲学(x-phi

用途:交互与默认策略别靠直觉,用数据决定。

落地动作

  • 把争议点改成可测实验(A/B 默认值、错误文案、重试策略)
  • 指标:误用率、重试率、成功率、工单率、完成时间

Python工具:埋点/日志、简单 A/B 分组、配置开关

提示词

把该设计争议转成实验:分组、指标、样本、持续时间、判定阈值;给出埋点字段与分析方法。

21. 计算哲学(Computational philosophy

用途:复杂状态与规则用"可运行模型/仿真/搜索"代替纯讨论。

落地动作

  • reference 实现(慢但清晰)作为 oracle
  • optimized 实现(快/工程化)用差分测试锁死行为
  • 用仿真/生成器自动探索边界

Python工具hypothesis、差分测试、状态机测试(Hypothesis stateful

提示词

先写 reference(清晰)+ optimized(高效);写差分测试与状态机/性质测试自动找反例并修复。

22. 自然化认识论(Naturalized epistemology

用途:承认人类/模型都有系统性偏误,用流程与工具把偏误外包给检查器。

落地动作

  • 默认自动化:lint+format+类型检查+测试
  • 高风险路径:必须性质测试/模糊测试/运行时校验
  • 结论至少双证据(测试+指标)

Python工具ruff/black/pyright/pytest/hypothesis/pydantic

提示词

列出该任务最常见的误判点,并为每个误判点给一个自动化防线(检查器/测试/断言/埋点)。

23. 贝叶斯认识论(Bayesian epistemology

用途:在多个方案/原因间理性分配注意力与试错预算。

落地动作

  • 先验 → 实验 → 后验 → 下一步;把排查变成序列决策问题

Python工具:同 12/13;记录表

提示词

用贝叶斯式流程组织排查:先验排序、信息增益最高的实验、更新后的行动计划。

附录

通用"性质测试"提示(可复用)

性质 说明
非负性/有界性 结果不越界
幂等性 f(f(x)) == f(x)
单调性 输入增大输出不违反预期
守恒性 长度/集合元素/总和按规则变化
互逆性 decode(encode(x)) == x(或近似)
稳定性 排序/去重等操作满足稳定条件
交换/结合 满足代数性质的操作应通过

建议的项目框架(最小)

src/           # 纯逻辑与 I/O 分离
tests/         # 示例+性质+差分
pyproject.toml # ruff/pytest/pyright
README.md      # 概念表/错误语义/验收指标

使用指南

场景 推荐方法组合
需求不清 1(现象学)+ 8(诠释学)+ 15(概念工程)
质量不稳 3(可证伪)+ 4(形式化)+ 19(错误认识论)
排错提效 12(溯因)+ 13/23(贝叶斯更新)+ 17(三角测量)
复杂系统 7(系统论)+ 21(计算哲学)+ 14(反思平衡)
交互默认争议 20(x-phi)+ 6(实用主义指标)

现象学还原用于 Vibe Coding

核心目的:把“我以为需求是这样”从对话里剥离出去,只留下可观察、可复现、可检验的事实与体验结构,让模型在更少臆测的前提下产出可用代码。

工程语境下的三个动作:

  • 悬置:暂时不采纳任何原因解释、业务推断或最佳实践偏好,只记录发生了什么、期望是什么、约束是什么。
  • 还原:把问题还原到“给定输入 -> 经过过程 -> 得到输出”的最小结构,先不谈架构、模式、技术栈优雅与否。
  • 意向性:明确这个功能是为谁、在什么情境下、要达成什么体验;不要停在“做个登录”,要落到“用户在弱网下也能在 2 秒内完成登录并得到明确反馈”。

适用场景:

  • 需求描述充满抽象词:快、稳定、像某某一样、智能、顺滑。
  • 模型开始自带设定:自己补产品逻辑、乱选框架、擅自加复杂度。
  • Bug 复现困难:偶发、环境相关、输入边界不清。

操作流程:

  1. 先清空解释,只保留现象:现象、意图、情境、边界。
  2. 产出最小可复现体:最小输入、最小代码片段、明确复现步骤、预期 vs 实际。
  3. 把抽象词降维成可测指标:快 -> P95 延迟,稳定 -> 错误率,好用 -> 交互反馈与可恢复性。

可复制提示词:

请先做“现象学还原”:不要推测原因、不要引入额外功能。
只根据我给的信息,输出:
1) 现象(可观察事实)
2) 意图(我想要的可观察结果)
3) 情境(环境/约束)
4) 未确定项(必须问清或需要我补的最小信息)
5) 最小可复现步骤(MRE)
然后再给出最小修复方案与对应测试。

口诀:先悬置解释,再固定现象;先写验收标准,再让模型写实现。

辩证法用于 Vibe Coding:正反合

把辩证法的“正反合”用于 Vibe Coding,就是把每次写代码都当成一轮可控的三段论。

正:当前状态,先跑通

  • 让模型按直觉快速给出最顺的实现。
  • 目标只有一个:尽快跑通主路径。

反:审计与调优,再打脸

  • 立刻站在挑刺者视角反驳它。
  • 列出失败模式、边界条件、性能与安全隐患。
  • 用测试、类型、lint、基准把反驳落地。

合:根据审核修正,再收敛

  • 把速度与约束合起来。
  • 重构接口、收敛依赖、补齐测试与文档。
  • 形成下一轮更稳定的起点。

实践口诀:先顺写 -> 再打脸 -> 再收敛。

一句话:Vibe 负责生成可能性,正反合负责把可能性变成工程确定性。

控制论与科学方法论

控制论视角下,工程实践不是一次性生成,而是通过信息、反馈和约束持续收缩可能性空间。

核心要点:

  1. 控制的逻辑起点是被控对象存在多种可能状态;控制的本质是通过选择手段,让可能性空间朝目标状态收缩。
  2. 改造世界的实践,本质是在多维可能性空间中选择物质、条件和时机,最终把低概率组合实现为确定结果。
  3. 控制能力可以理解为控制前后可能性空间大小之比;任何工具或方法都有能力上限。
  4. 负反馈通过比较现状与目标的差距并采取行动缩小差距,把有限的单次控制能力累积放大。
  5. 正反馈会自我增强,使状态持续偏离初始平衡点,可能导致增长、演化、崩溃或恶性循环。
  6. 信息是对系统不确定性的减少;控制要实现,必须先获得足够信息。
  7. 控制与信息是一体两面:信息改变认知状态,控制改变现实状态。
  8. 组织是一种结构状态,组织化程度越高,结构中包含的信息量越高。
  9. 复杂系统的因果关系常常是概率因果、反馈环和因果网络,而不是单一线性链条。
  10. 有效分析必须建立“相对孤立系统”,把无限问题切成有限问题。
  11. 拥有内部反馈回路的系统会趋向稳态结构,用动态平衡抵御外部随机干扰。
  12. 系统演化通常是旧稳态被破坏,经过不稳定过渡,落入新稳态。
  13. 自组织系统会在没有外部指令时,由内部相互作用从无序涌现出宏观有序。
  14. 质变可以是渐变,也可以是飞跃;关键不在变化速度,而在中间状态是否稳定。
  15. 黑箱认识依赖输入控制与输出观察,理论就是对黑箱内部结构的模型。
  16. 认识过程是“实践 -> 理论 -> 实践”的负反馈循环,用模型预测与现实输出的差异修正模型。
  17. 认识反馈能否收敛,取决于理论是否可证伪、反馈速度是否足够快、反馈幅度是否不过度、实践结果是否能可靠判别理论真伪。
  18. 科学规律的本质是变量之间的约束关系;掌握规律,就是把不可控随机变量转成可预测、可控制的确定结果。

用于 AI 编程时,这套方法可以压缩成一句话:

先把目标写成可检验状态,再用测试、日志、反馈、约束和迭代,把模型输出从可能性空间中逐步收缩到可验收结果。