知识卡片

固件的重新定义:由依赖关系与变更难度界定,而非存储位置

普通读书笔记卡

内容

主流对固件的定义大多围绕存储位置——”存储在ROM/EPROM/闪存里的代码”,但作者认为这个定义是错的,或至少已经过时。Doug Schmidt提出的关键洞察是:软件本身不会随时间磨损,但硬件及固件会随时间过时,进而要求软件跟着改动——沿着这个思路可以推出更准确的定义:固件不是由它存放在哪里定义的,而是由代码的依赖关系、以及这些依赖随硬件演进而产生的变更难度定义的;进一步说,”虽然软件质量本身不会随时间损耗,但未妥善管理的硬件依赖和固件依赖却是软件的头号杀手”——本可以长期使用的嵌入式软件,常常因为内部隐含的硬件依赖关系而无法继续使用。这个定义的边界比直觉宽得多:任何在代码中嵌入SQL、或引入对某个平台依赖的代码,即便写的人不是嵌入式工程师,实质上也是在写”固件代码”(比如没有把业务逻辑和Android API分离的Android工程师)。作者亲历的通信系统案例印证了这一点:一套90年代末从TDM迁移到VOIP的系统,系统工程师被问及某种情况下电话该如何处理时,答案总是”从当前产品代码里查”——业务逻辑和具体通信技术代码交错纠缠到无法区分,整个产品实质上已经变成了一坨固件;同样,命令消息处理器/分发器代码如果和操作UART硬件的代码混在同一个文件里、充斥硬件实现细节,这段本可以长期复用的处理器代码也就沦为了固件。核心建议很直白:程序员该少写点固件、多写点软件,让代码活得更久。

参考来源

- 位置:《架构整洁之道》第29章《整洁的嵌入式架构》引言(源文件:_epub-src/text/part0014_split_014.html) - 结论依据:原文引用Doug Schmidt关于软件不磨损但硬件固件会过时的观点,重新定义固件为"由依赖关系及随硬件演进的变更难度界定"而非存储位置,并用TDM转VOIP通信系统、UART消息处理器两个真实案例说明业务逻辑与硬件代码纠缠会让整段代码沦为固件,直接支撑本卡片结论。 - 原始内容:虽然软件质量本身并不会随时间推移而损耗,但是未妥善管理的硬件依赖和固件依赖却是软件的头号杀手……固件并不一定是指存储在ROM中的代码……而是由其代码的依赖关系,及其随着硬件的演进在变更难度上的变化来定义的。