268 lines
5.3 KiB
Markdown
268 lines
5.3 KiB
Markdown
# 🧭 编程之道
|
|
|
|
一份关于编程本质、抽象、原则、哲学的高度浓缩稿
|
|
它不是教程,而是“道”:思想的结构
|
|
|
|
---
|
|
|
|
# 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. 语录
|
|
|
|
- 数据是事实,函数是意图
|
|
- 程序即因果
|
|
- 抽象是压缩世界
|
|
- 状态越少,世界越清晰
|
|
- 接口是契约,实现是细节
|
|
- 组合胜于扩展
|
|
- 程序是时间上的结构
|
|
- 不变式让逻辑稳定
|
|
- 可推理性优于性能
|
|
- 约束产生秩序
|
|
- 代码是知识的形状
|
|
- 稳定接口,流动实现
|
|
- 不惊讶,是最高的设计
|
|
- 简单是最终的复杂
|
|
|
|
---
|
|
|
|
# 结束语
|
|
|
|
**编程之道不是教你怎么写代码,而是教你如何理解世界**
|
|
代码是思想的形状
|
|
程序是理解世界的另一种语言
|
|
|
|
愿你在复杂世界中保持清晰,在代码中看到本质
|