Skip to content

模式时间线

这些模式横跨 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 年发表),形式化了自愿让出
1959Trie 前缀树Rene de la Briandais 描述了 trie;Fredkin 于 1960 年命名(取自 retrieval)
~1960环形缓冲区用于电信和实时 I/O 系统;无单一发明者
~1960Arena 分配器编译器中的区域分配;Knuth 在 TAOCP(1968)中讨论了池分配
1960引用计数George Collins 描述了用于自动存储回收的引用计数
~1960驻留LISP 从最早期实现就驻留符号;该技术早于其名称
1962依赖图Kahn 在 CACM 发表"大型网络的拓扑排序"
1964最小堆Williams 为堆排序发明二叉堆;Floyd 同年改进
1965信号量Dijkstra 为 THE 操作系统发明了 P() 和 V()
~1965脏标记虚拟内存系统使用"脏位"跟踪已修改的页面;该模式后来泛化为任何延迟重算场景
1966LRU 缓存Belady 的"虚拟存储计算机替换算法研究"(IBM 系统期刊)
~1966标签联合体Algol 68 形式化了判别联合体;更早的汇编程序员非正式地使用类型标签
1967虚函数表Simula 67 通过方法表引入虚方法分派;C++ 后来使其流行,并使用"vtable"这一名称
~1967事件循环早期交互系统使用事件驱动分派;由 Smalltalk(1980)和 X Window 系统(1984)推广
1970布隆过滤器Burton Bloom 发表"带允许误差的哈希编码中的空间/时间权衡"(CACM)
~1970B+ 树Bayer & McCreight 发明 B 树(1970);叶节点链接的 B+ 变体于 1972 年左右出现,用于数据库索引
~1971写时复制IBM VM/370 虚拟内存;后被 BSD Unix 的 fork() 采用
1973Actor 模型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 中形式化
1978MVCCDavid 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《设计模式》形式化了访问者模式,用于对象结构上的双重分派
1996LSM 树O'Neil 等人:"日志结构合并树"——在内存中缓冲写入,刷入有序文件
1997一致性哈希Karger 等人:"一致性哈希和随机树"(STOC)
~2003合并迭代器通过最小堆实现 K 路有序流合并;在 LevelDB/BigTable 时代系统中形式化
2007熔断器Nygard 在《Release It!》中描述——借鉴自电气工程

注: 标有 ~ 的年份是近似值——这些概念从工程实践中自然涌现,而非源于单篇发表。

这告诉我们什么

  1. 基础模式非常古老。 信号量(1965)、堆(1964)、状态机(1943)已经被实战验证了 60-80 年。使用它们时,你站在数十年经过验证的工程之上。

  2. 大多数"新"模式是组合。 React 的协调器(2017)组合了位掩码 + 最小堆 + 协作调度 + 差异/补丁 + 双缓冲——全部发明于 1943 到 1974 年之间。

  3. 从发明到广泛采用的间隔在缩短。 布隆过滤器从论文(1970)到数据库广泛使用(2000s)花了 30 年。熔断器从书籍(2007)到 Netflix Hystrix(2012)只花了 5 年。

  4. 模式比使其流行的技术更长寿。 写时复制于 1971 年为 IBM 大型机发明——现在它在 Git、Rust 和每个现代操作系统内核中使用。

基于 MIT 许可证发布。