模式时间线
这些模式横跨 80 多年的计算历史——从最早的存储程序计算机到现代分布式系统。
交互式探索 — 按分类筛选,点击卡片跳转到对应模式:
完整表格
| 年份 | 模式 | 起源 |
|---|---|---|
| ~1943 | 状态机 | McCulloch & Pitts 将神经元建模为有限自动机;Mealy(1955)和 Moore(1956)形式化了两种经典类型 |
| ~1945 | 位掩码 | 存储程序计算机固有特性;von Neumann 的 EDVAC 报告描述了位级操作 |
| ~1953 | 双缓冲 | IBM 701/709 I/O 子系统中用于计算与数据传输重叠 |
| ~1956 | 批处理 | GM-NAA I/O 监控器(IBM 704)——首个有文档记录的批处理系统 |
| 1958 | 空闲链表 | McCarthy 的 LISP 使用空闲链表管理 cons cell 分配 |
| 1958 | 协作调度 | Melvin Conway 描述了协程(1963 年发表),形式化了自愿让出 |
| 1959 | Trie 前缀树 | Rene de la Briandais 描述了 trie;Fredkin 于 1960 年命名(取自 retrieval) |
| ~1960 | 环形缓冲区 | 用于电信和实时 I/O 系统;无单一发明者 |
| ~1960 | Arena 分配器 | 编译器中的区域分配;Knuth 在 TAOCP(1968)中讨论了池分配 |
| 1960 | 引用计数 | George Collins 描述了用于自动存储回收的引用计数 |
| ~1960 | 驻留 | LISP 从最早期实现就驻留符号;该技术早于其名称 |
| 1962 | 依赖图 | Kahn 在 CACM 发表"大型网络的拓扑排序" |
| 1964 | 最小堆 | Williams 为堆排序发明二叉堆;Floyd 同年改进 |
| 1965 | 信号量 | Dijkstra 为 THE 操作系统发明了 P() 和 V() |
| ~1965 | 脏标记 | 虚拟内存系统使用"脏位"跟踪已修改的页面;该模式后来泛化为任何延迟重算场景 |
| 1966 | LRU 缓存 | Belady 的"虚拟存储计算机替换算法研究"(IBM 系统期刊) |
| ~1966 | 标签联合体 | Algol 68 形式化了判别联合体;更早的汇编程序员非正式地使用类型标签 |
| 1967 | 虚函数表 | Simula 67 通过方法表引入虚方法分派;C++ 后来使其流行,并使用"vtable"这一名称 |
| ~1967 | 事件循环 | 早期交互系统使用事件驱动分派;由 Smalltalk(1980)和 X Window 系统(1984)推广 |
| 1970 | 布隆过滤器 | Burton Bloom 发表"带允许误差的哈希编码中的空间/时间权衡"(CACM) |
| ~1970 | B+ 树 | Bayer & McCreight 发明 B 树(1970);叶节点链接的 B+ 变体于 1972 年左右出现,用于数据库索引 |
| ~1971 | 写时复制 | IBM VM/370 虚拟内存;后被 BSD Unix 的 fork() 采用 |
| 1973 | Actor 模型 | Hewitt, Bishop, Steiger:"人工智能的通用模块化 Actor 形式主义" |
| 1973 | 指数退避重试 | Metcalfe 的以太网为 CSMA/CD 引入截断二进制指数退避 |
| 1974 | 差异/补丁 | McIlroy 在贝尔实验室为 Unix V5 创建了 diff |
| ~1974 | 背压 | TCP 流控(Cerf & Kahn)——计算中最早的背压生产实例 |
| 1975 | 迭代器 | Liskov 的 CLU 语言将迭代器引入为一等抽象 |
| ~1975 | 墓碑 | 数据库系统中用于删除标记;对 B 树删除和后来的 LSM 树至关重要 |
| ~1976 | 预写日志 | IBM System R,第一个 SQL 关系数据库;在 ARIES(1992)中形式化 |
| ~1976 | 检查点 | 与 System R 中的 WAL 一起用于崩溃恢复;在 ARIES 中形式化 |
| 1978 | MVCC | David Reed 的 MIT 博士论文,多版本并发控制 |
| 1978 | 逻辑时钟 | Lamport 的"分布式系统中的时间、时钟和事件排序"—— Lamport 时间戳 |
| 1979 | 观察者 | Reenskaug 在 Xerox PARC 为 Smalltalk 设计的 MVC 模式 |
| 1979 | 默克尔树 | Ralph Merkle 为大型数据结构的高效安全验证申请了哈希树专利 |
| 1981 | 工作窃取 | Burton & Sleep 描述了并行图归约的任务窃取 |
| ~1986 | 限流器 | Turner 描述了网络流量整形的漏桶算法 |
| 1989 | 跳表 | Pugh:"跳表:平衡树的概率替代方案"(CACM) |
| 1990 | 享元 | Calder & Linton:"字形:用户界面的享元对象"(USENIX) |
| ~1993 | 中间件链 | 责任链(GoF 1994)泛化为 Web 框架的中间件管道;CORBA 中间件更早出现 |
| ~1993 | 注册表 | COM(1993)和 CORBA 使用注册表进行组件发现;GoF 的抽象工厂与之相关 |
| ~1994 | 对象池 | Bonwick 的 Solaris slab 分配器;数据库连接池使其普及 |
| 1994 | 访问者 | GoF《设计模式》形式化了访问者模式,用于对象结构上的双重分派 |
| 1996 | LSM 树 | O'Neil 等人:"日志结构合并树"——在内存中缓冲写入,刷入有序文件 |
| 1997 | 一致性哈希 | Karger 等人:"一致性哈希和随机树"(STOC) |
| ~2003 | 合并迭代器 | 通过最小堆实现 K 路有序流合并;在 LevelDB/BigTable 时代系统中形式化 |
| 2007 | 熔断器 | Nygard 在《Release It!》中描述——借鉴自电气工程 |
注: 标有 ~ 的年份是近似值——这些概念从工程实践中自然涌现,而非源于单篇发表。
这告诉我们什么
基础模式非常古老。 信号量(1965)、堆(1964)、状态机(1943)已经被实战验证了 60-80 年。使用它们时,你站在数十年经过验证的工程之上。
大多数"新"模式是组合。 React 的协调器(2017)组合了位掩码 + 最小堆 + 协作调度 + 差异/补丁 + 双缓冲——全部发明于 1943 到 1974 年之间。
从发明到广泛采用的间隔在缩短。 布隆过滤器从论文(1970)到数据库广泛使用(2000s)花了 30 年。熔断器从书籍(2007)到 Netflix Hystrix(2012)只花了 5 年。
模式比使其流行的技术更长寿。 写时复制于 1971 年为 IBM 大型机发明——现在它在 Git、Rust 和每个现代操作系统内核中使用。