知识卡片
设备无关性与物理地址无关性:两个历史案例印证策略细节脱钩的真实收益
内容
[[保持可选项策略与细节脱钩让实现决策尽可能推迟]]不是纸上谈兵,作者亲历的两段历史印证了它的真实价值。20世纪60年代早期,程序直接绑定具体I/O设备是行业惯例——要打印就写死操作打印机的机器指令,要读卡就写死读卡器交互代码;后来出现磁带这种更安全、更快、更易备份的存储介质,所有直接操作读卡器/打卡器的软件却因此不得不被大改。60年代末,操作系统把I/O设备抽象成处理记录的标准函数,程序转而调用这些抽象服务,同一段程序不经修改就能读写卡片也能读写磁带——开闭原则(虽然那时还没这个名字)由此诞生。作者本人在一家群发广告信件打印公司亲身受益于此:程序原本用IBM 360的单行打印机(每月租金数万美元)逐字打印客户姓名地址,因为程序调用的是操作系统提供的抽象I/O接口,只需让操作系统把输出目标从打印机切换成磁带(10分钟写满一卷,相当于打印机好几卷的量),磁带取下后装到五台离线打印机上7×24小时并行打印,整套程序不用做任何改动,每周产能从数千封暴涨到几十万封。70年代早期作者又参与过一套卡车工会账务系统,最初把柱面、磁头、扇区这些磁盘物理结构硬编码进代码里(甚至连索引和双向链表都直接存物理地址),升级新硬盘时不仅要写专门程序迁移数据、还要满系统翻找所有硬编码的地方逐一修改;后来一位资深同事建议改用相对地址——把磁盘当成一串连续整数编号的线性扇区队列,用一个专门的转换程序在运行时把相对地址映射成物理的柱面/磁头/扇区号,高层业务逻辑从此与具体磁盘物理结构脱钩,选择哪种磁盘的决策也就能从应用程序里彻底剥离出来。两个故事共同示范的原则是:优秀架构师会把高层策略与底层实现细节仔细隔离开,让策略部分完全不依赖细节,并让与实现细节相关的决策尽可能推迟。
参考来源
- 位置:《架构整洁之道》第15章《什么是软件架构》"设备无关性""垃圾邮件""物理地址寻址""本章小结"(源文件:_epub-src/text/part0014_split_000.html)
- 结论依据:原文详述60年代I/O设备从直接绑定到操作系统抽象接口的演进(含OCP的雏形)、作者本人在垃圾邮件打印业务中受益于设备无关性实现产能暴涨的真实经历,以及卡车工会账务系统从硬编码磁盘物理地址迁移到相对地址寻址的案例,直接支撑本卡片结论。
- 原始内容:到了20世纪60年代末期,我们已经吸取了这个教训,并为此提出了设备无关性这个概念……开闭原则(OCP)此时就诞生了……我们修改了系统的高层策略,使其与磁盘的物理结构脱钩……优秀的架构师会小心地将软件的高层策略与其底层实现隔离开。