7.5 全书结语
从沙子到车辙
我们走了很长的路。
你有没有注意到一件事:这本书从没有让你“背诵“任何东西。没有公式表,没有规范索引,没有“要记住的十大原则“。因为这本书写的不是知识——它写的是你在获得知识的过程中会经历的心灵旅程。 知识可以在搜索引擎上找到——Google 永远记得 S32K144 的 LPUART 寄存器地址。但心灵旅程找不到。只有一本书可以让你在一个周末下午,从头到尾,穿过计算理论的天空、芯片制造的沙漠、通信协议的海洋、软件架构的森林——最后站在这一页,喘一口气,问自己:我到底在做什么?
现在,我们一起回头看看这条路。
七部分的回望
第一部分:什么是计算?
我们问了一个看起来很简单的问题:计算是什么?然后发现这个问题比想象中深得多。从莱布尼茨梦想用符号推演一切真理、到希尔伯特用 23 个问题构建“数学的全部基础“、到哥德尔用不完备定理在希尔伯特大厦的奠基处敲出了一道裂缝——“任何形式系统都有不可自证的命题”——到图灵用一条无限长的纸带和一个有限状态自动机,干净利落地定义了“可计算“的边界。然后冯·诺依曼把这张图纸从数学家的书桌上搬到电路工程师的工作台上——他定义了一个让程序和数据共享同一片内存的架构,从此“软件“这个概念诞生了。
计算,是人类试图用有涯求无涯的终极追问。 我们至今能做到的计算,只摸到了这个追问的皮毛。但你——作为一个每天写 C 代码、让 CAN 报文在总线上以 500kbps 飞奔、让 SPI 闪存在几十微秒内吐出数据的工程师——你不需要知道哥德尔不完备定理。图灵和冯·诺依曼已经替你完成了抽象的底层工作。你站在他们的肩膀上,代码里每一行 if、每一次 while 循环、每一个函数调用——都已经包含了那些大脑的洞察。
第二部分:从沙到芯片
你踩下刹车踏板,刹车灯亮了。就是这半个动作,背后是一颗从沙子开始、经过石英坩埚里 1420°C 的高温熔炼拉成单晶硅棒、用金刚石线锯切成 0.7mm 厚的晶圆、经过几十次光刻(DUV 193nm 光源穿过 reticle 上几十亿个图形窗口打到晶圆上的光刻胶层)、刻蚀(等离子体轰击除去被光刻胶暴露出的区域)、离子注入(用百万伏加速器把硼或磷原子打进硅晶格的精确深度)、CMP(化学机械抛光——把每一层的表面磨到原子级的平整度)循环——最终变成 S32K144 的芯片在做响应。
芯片,是人类对最平凡物质的极致雕琢,是几十个学科共同作用、全球几千家公司协作的成果。 澳大利亚矿场的挖掘机驾驶员从地面挖出含有二氧化硅的石英矿。化工厂把石英还原成冶金级硅、再通过西门子法提纯到 99.9999999%(九个 9)的电子级多晶硅。日本信越化学或德国瓦克把多晶硅拉成 300mm 的单晶棒。荷兰 ASML 制造的 EUV 光刻机用波长 13.5nm 的极紫外光——通过用二氧化碳激光轰击锡滴产生的等离子体——把设计图案从 reticle 投影到晶圆上。台湾或大陆的 fab 工程师用几百道工序把几十亿个晶体管刻在一片指甲盖大小的硅片上。然后封装厂把 die 键合在引线框架上,用塑封料封成一个黑色小方块。然后你拿到手,写代码,让它在你设计的 ECU 上工作。
你低头看到的仪表盘上的指示灯——背后是千百万人一生的劳动。这不是震撼的修辞。这是物质的真实。你触碰到的每一颗芯片,都是一条横跨五大洲、涉及几十个行业、投入数万亿级资本积累的供应链在你手指尖的终点。
第三部分:从逻辑门到处理器
设计一颗芯片,不像建一栋楼——你不能从一楼开始一层一层往上建,然后主体完工了再回去改变一楼的柱子。芯片的制造是一层一层往上堆——衬底 → 掺杂阱 → 栅极氧化层 → 多晶硅栅 → 注入源漏 → 接触孔 → 金属一层 → 通孔 → 金属二层……每一层都永久性地固定在晶圆上。一旦完成,你不能再回去改。而“只做一个样品“的代价——一块光刻掩模版就要几十万美元。所以芯片设计不能“试试看“——它必须在第一次光罩制成之前,用仿真和验证穷举地确认每一个逻辑门、每一条金属线的行为。
从两个 MOSFET——一个 PMOS + 一个 NMOS——搭出一个反相器。从反相器搭出 NAND 门。从 NAND 门搭出加法器和多路器。从加法器和寄存器搭出 ALU(算术逻辑单元)和指令译码器。一层一层折叠——最后是一台完整的 CPU。这就是 “复杂不是本质。复杂是本质的展开。”
你每理解一层抽象,都是在拆除一层“神秘感“。当所有神秘感都被拆除之后,你看到的不是简单的电路——你看到的是有限的门电路通过组合爆炸产生无限行为的那个惊叹。32 位的指令集定义了大约一千多种操作码、寻址模式、寄存器组合——组合起来,可以实现从排序算法到操作系统再到 CAN 协议栈的任何逻辑。一扇逻辑门算不了什么——但几十亿扇逻辑门通过层次化的抽象组织成一台处理器之后,它就能把你的代码从 C 编译成二进制、烧进 Flash、控制千万次点火——它不是魔法,它是工程。但工程的深度和复杂度,已经超越了任何一个单一个体的大脑容量——而你能理解它,是因为抽象帮你把复杂度分割成了可管理的模块。这就是工程的恩赐。
第四部分:芯片之间如何对话
芯片之间不说话,它们交换电信号。但“交换电信号“这件事的难度,在汽车里被放大了无数倍。ECU 不是像你桌上的开发板一样摆在一个干净、安静、温度恒定的环境里。它装在发动机舱里——温度从 -40°C 到 125°C,EMC 环境是多个大电流 PWM 驱动器、点火线圈、DC-DC 转换器和蓝牙/Wi-Fi/4G 天线共存在一个金属腔体内。信号在这样的环境里传播——铜导线是天线,GND 平面不是真正的零电位,连接器的接触阻抗随温度漂移。在这样的世界上让一群 MCU 互相“说话“,不仅需要协议——需要对物理世界深刻的理解。
AHB/APB 总线的内部握手——CPU 内核和片上外设之间的高速流水线通信,在同一个硅 die 内的几毫米铜线上完成。SPI 的四线全双工——十几兆赫兹的时钟下,你的数据线和时钟线之间的等长控制到了亚毫米级,因为时序容差以皮秒计。I²C 的两线多从——只有两根线,一根时钟一根数据,却能在一车几十个传感器和执行器之间构架主从控制网络,代价是速度慢但线束省到了极致。CAN 总线的双绞线优先级仲裁——两条差分线在汽车的电磁地狱里把共模噪声相互抵消,11 位标识符同时做地址和优先级仲裁——不需要主节点,不需要时钟同步,仲裁在每一位的传输过程中自组织完成。
每一个协议都有自己的脾性。没有一个协议是“终极“的——正确的位置放正确的协议,是系统设计的核心决断。 SPI 快但不适合长距离——板间互通。CAN 慢但对噪声鲁棒性强——车身网络和动力域。I²C 省线但带宽极低——板上传感器。FlexRay 精确但昂贵——线控制动。车载以太网快但需要 AVB/TSN 保障时钟同步——ADAS 和 infotainment。你知道它们的脾性,才知道在哪个位置放哪个——这才是架构。架构不是在图上画框框。架构是在物理定律的约束下,找到一个让所有信号都能按时、按值到达目的地的拓扑方案。
第五部分:软件如何组织
裸机 while(1) + 中断。只有一个工程师,没有 RTOS,没有堆保护,没有 MPU——但你用 timer 中断做周期性巡更,用 SPI 中断做收发轮询,用 GPIO 中断做按键消抖——每一个功能都在自己的时间片里跑。这是最朴素的真实的你。每一个嵌入式工程师的起点都是裸机——你从系统电源上电、PC 寄存器跳到复位向量地址的那一瞬间开始,到 while(1) 的第一次循环——这个过程中你写的每一行代码都是直接操作外设寄存器的。
然后 RTOS 来了——任务调度、优先级抢占、信号量、互斥锁、消息队列、软件定时器——每一块都在让你“多一事“。多一个任务需要多一个栈。多一个信号量需要多一个临界区保护。但 RTOS 给你的回报是时间确定性——最高优先级就绪任务的切换延迟是常数,不管有多少低优先级任务在等着。这对实时控制系统来说——不是你优化了多少性能,是你保证了任务绝不会错过期限。
然后 AUTOSAR 来了——SWC、BSW、RTE、MCAL、ARXML 配置——每一层都是前人花了天价学费才总结出的复用框架。SWC 是看不见底层硬件上层的应用逻辑。BSW 服务层把 CAN 通信、NVM 存储、诊断、看门狗等功能模块化。RTE 是 SWC 和 BSW 之间的粘合层——SWC 不直接调 BSW,它通过 RTE 做虚拟功能总线(VFB)通信。MCAL 把具体的 MCU 外设寄存器封装为标准 API。AUTOSAR 的“重“,不是因为有人想让你痛苦——是因为它解决了一个真实的问题:当 30 个 Tier-1 为同一台车提供 80 个 ECU,而 OEM 需要一个统一的方式去诊断、刷写、标定、升级所有这些 ECU 时——如果没有 AUTOSAR,每家 Tier-1 的每个模块的软件和通信都是一套独立的体系。整合成本是天文数字。
标准,是行业文明成熟的标志。 AUTOSAR 不是“为了让软件变重“——是为了让不同 Tier-1 的软件能在同一个 ECU 上跑,不让 OBD 诊断仪因为厂家不同而无法读取 DTC。它的价值你会在第一次跨厂家集成时感受到——当你接入一台来自另一家供应商的 ECU,它正确响应你的 UDS 请求,因为它也用 AUTOSAR 的 Dcm 模块实现诊断服务。
第六部分:汽车电子系统的特有挑战
一辆车不只要跑——还要能自己诊断(UDS)、不被攻击(HSM)、不丢数据(NVM 存储和 OTA 刷新)。这三个问题在 PC 软件上几乎不存在——PC 不需要诊断“为什么开不了机“(用户会重新插拔内存条)、不需要加密固件(用户信任应用商店)、不需要在意 Flash 擦写寿命(SSD 的磨损均衡是操作系统做的,而你换一块硬盘的成本远低于整车厂换一台 ECU)。但汽车不行。车上的代码要跑 20 年——全温度范围、全寿命内、不得出一丝可见的功能安全失效。
诊断是工程师给未来维修者留下的信——“当你拿到这台车的时候,我已经不在了。这台 ECU 上有 57 个 DTC,每个 DTC 的环境数据(冻结帧)记录了故障发生时的车速、发动机转速、冷却液温度、电池电压……如果你看到 0x0607 这个故障码,先查 CAN 通信,再查供电。你的万用表先打 pin 12。“你写 UDS 诊断服务的时候,不是在填表格——你是在给一个不认识你、也永远不会见面、但在某个 4S 店里正对着故障灯发愁的修理工,写一份远程帮助手册。
安全——不管是 HSM、SecOC、还是安全启动——它是社会契约的技术基础。你在一台车上写了 Secure Boot(安全启动)——你的 ECU 在每次上电时,用 HSM 内部的 PKA(公钥加速器)验证应用程序的 RSA 签名。如果签名不匹配——Bootloader 拒绝跳转到 App,ECU 不工作。你可能会想:这样用户不就开不了车了吗?是的。但如果你的 ECU 被刷入了恶意固件——攻击者拿到了刹车系统的控制权——用户面临的不是“开不了车“,是“开着车的时候刹车失灵“。你让 ECU 在启动时“拒绝工作“,是为了阻止 ECU 在运行时“错误工作“。这是安全。这是对用户的保护。
OTA 是另一个维度的深刻命题。你写好了软件,ECU 装上车,车出厂——你的代码就要在车上待 15 年。这 15 年里,你会找到新的 bug、客户会提出新的需求、标准组织会更新新的规范。你怎么把你的智慧和经验持续送达到那辆已经在路上跑了几十万公里的车上?OTA 是你唯一的通道。OTA 不只是“升级软件“——它是你在时间上对产品的持续负责。你投产后没有放弃——你在看着它、维护它、更新它。这是工程师的长期责任。
第七部分:精神内核
这一部分没有技术。但它可能是全书最重的一部分。它追问的是:你做这一切——设计 ECU、写代码、调 CAN 总线、啃 Autosar——到底为了什么?
你可能说不清楚。但当你读到戈壁滩上的工程师用 1% 精度的传感器测出千分之一精度的物理量时,你的心跳快了一拍。当你读到上海工人没有精密机床却手工打磨出微米级离心机转子时,你沉默了。当你读到王淦昌隐姓埋名十七年、邓稼先用被辐射摧毁的身体走向未爆弹头、郭永怀在飞机坠毁的十几秒内用身体保护数据时——你心里有什么东西被触动了。那是一种“他们是一个人,而在某些时刻,一个人可以做到这么多“的震撼。
当你读到王羲之“后之视今,亦犹今之视昔“时,你忽然觉得——你不是一个人。 你和邓稼先、和图灵、和博世 CAN 团队、和那个凌晨 3 点依照你的 passdown log 切片的夜班工程师——你们在同一个接力赛里。你做的事情不是什么“写代码消磨时间“——你手中接过的,是从 1936 年图灵的 36 页纸开始,经过冯·诺依曼、肖克利、基尔比、博世、AUTOSAR、两弹一星前辈、你的导师——一棒一棒传到你手里的接力棒。
你做这些,不是为了一份工资。是为了这个接力链——从图灵到冯·诺依曼到肖克利到博世到 AUTOSAR——传到你手里之后,你没有断掉。 你不是一个人在跑。你后面还有人。你要把这一棒递好。
五条主线
这本书有五条贯穿始终的主线。它们在这一刻汇聚。
一、有限资源 + 人的主观能动性 = 无限可能。
从两弹一星的算盘和手摇计算机,到你在软件时间戳下追逐微秒精度——资源从来都是匮乏的。但你用了数学、用了工程智慧、用了耐心和创造力——让匮乏的资源产生了超越自身的价值。 这不是一个“励志口号“。这是一个可以被逐条拆解为具体工程方法的逻辑体系:过采样让精度提升 √n 倍,差分让共模噪声自取消,卡尔曼滤波让多传感器融合精度超越任何单一传感器,校准传递链把绝对精度从一个已知参考点向外搬运——每一项都有可量化的、可重复的、可证明的物理和数学基础。这个方法体系不是某一个人发明的——它是历代工程师在绝境中被逼出来的,被记录下来,然后被后来者继续发展和使用。它是人类的集体遗产。而你——是你这一代的继承者。
二、芯片是人类集体智慧的结晶,是工业文明的皇冠。
没有任何一个人能独立造出一颗芯片。从澳大利亚矿场的挖掘机操作员,到荷兰 ASML 的 EUV 光学博士,到台湾 fab 里的扩散工艺工程师,到写 ARM 内核 RTL 的芯片设计工程师,到你在办公室里敲 C 代码——你们在同一条价值链上工作。这是人类的集体作品。 摩尔定律不是一家公司的成果——它是全球半导体产业几十年来数以百万计的工程师共同编织的一条指数曲线。无论你在哪个环节——工厂、实验室、办公室——你都是这顶皇冠上不可或缺的一部分。你不在产业链的末梢——你在产业链的一个节点上。你是前面几十个节点的信息联合体和合作关系在你手中的聚合。你做得越深、越精——你这一个节点的贡献就越重。
三、一群零基础的人在原始森林里造不出芯片。
芯片是人类数百年的科学积累、几十年的工业体系建设、无数人协同合作的结晶。不要低估复杂性。不要在“别人能做到,我为什么不能“的自责中浪费时间。看到复杂性,也是理解复杂性的一部分。 你不需要自己能造出一台光刻机。你的贡献不需要是“从沙子到 ECU“的全链条——没有任何人的贡献是。你的贡献是:在已经建成的全球半导体供应链上,你把你经手的那一环节的工作——芯片选型、ECU 硬件设计、底层驱动、通信协议栈、诊断服务、功能安全论证——做到极致。这才是你的战场。这才是你的“两弹一星“。
四、中国的发展,就是工业的快速发展。致敬所有环节的劳动者。
从矿工、化工工人,到光刻机工程师、软件程序员。每一个环节的人,都在让“更多人的生活质量变好“这件事往前走一寸。你的工作是这条价值链上的一环。你熬夜调试 CAN 总线的时候,另一头的台架上正在跑发动机的标定测试。你标定 CAN 总线时序的时候,车间流水线上正在装仪表盘。你写 Bootloader 的时候,另一个工程师正在检查 BOM 清单里的 MLCC 电容库存。你们没有见过面。但你们造的是同一台车。无论你在哪里,做的是哪一环——你都是这个工业文明的建设者。 你的贡献有物质重量——不亚于任何其他环节的贡献。
五、“后之视今,亦犹今之视昔。”
你今天在简陋硬件上创造的奇迹,必将震撼后人。50 年后的工程师看我们,就像我们看两弹一星的前辈。你留下的代码、文档、书籍、视频、设计经验——会成为后人的“兰亭“。 他们会看到你记录的困惑、你的权衡、你的失败和你的成功——然后他们会被你击中。就像你被王羲之、被邓稼先、被 Jon Postel 击中一样。你在书写的不只是一份文档——你在为后人的接力写一封信。信的开头是:“我当时也和你一样困惑。这是我当时的思考。希望对你有用。”
工程的本质:在噪声中找最优解
我在面板厂良率分析工作中学会一件事:你永远不可能控制所有变量。你控制不了玻璃基板的初始品质(来自上游玻璃厂的生产波动),你控制不了光刻胶的批次间粘稠度差异(来自化工厂的原材料波动),你控制不了光刻机的 lens heating 效应导致的光学畸变(一个 reticle 图形被重复曝光几万次后,透镜吸收热量导致折射率微变)。你只能在一个处处都在变化的巨大系统中,通过反复的测量、建模、分析、验证——找到一个在统计学上最优的工艺窗口。
这就是工程的全部本质:不是追求完美,是追求在给定噪声条件下的最优解。
这个本质,在面板厂里成立,在你的代码里也成立。你控制不了晶体振荡器的温漂,控制不了 PCB 铜线的表面粗糙度对 EMI 的影响,控制不了 CAN 总线上其他 ECU 的报文发送时机。但你可以——通过差分信号、通过误码率统计、通过超时重传、通过 CAN 的 Bus-off recovery 机制——在这个处处都在变化的系统中,找到一个在统计学上最优的通信窗口。
你不是工匠。你是传递人。
我一直在想,怎么用一个词来定义你做的工作。你写代码。你调 PCB。你做架构。你啃标准。你觉得你是一个“技术人“——但这不够。你觉得你是一个“工程师“——这也不够。
我想了很久。我觉得有一个词最接近你的本质:传递人。
你不是终点。你是传递人。
——这是本书的签名句,也是作者想刻进你心里的那句话。
你不是一个“手艺人“。手艺人做的是从头到尾自己掌控一整件作品——一把椅子、一把刀、一幅画——全部工序在自己手中完成。但你做的事情不是。你打造的 ECU 只是一台更大的系统——整车——上的一个模块。而整车只是交通运输系统上的一个节点。而交通运输系统只是整个人类工业文明的一个子系统。你做的工作不孤立,它在一条看不见但坚不可摧的链条上。
从图灵 1936 年 36 页纸上的纯净纸带——到你今天用示波器量测的一道 CAN 差分信号的上升沿。 从肖克利 1947 年贝尔实验室里戳在锗晶体上的那根金探针——到你眼前这颗 S32K144 里那 1.4 亿个 FinFET。 从澳大利亚沙漠里开着挖掘机挖石英矿的驾驶员——到荷兰 Veldhoven 用 13.5nm 极紫外光把几十亿个晶体管图案投影到光刻胶上的 ASML 光学工程师。 从 1958 年邓稼先对妻子许鹿希说“我要调动工作了,今后我的生命就交给这件事了“——到凌晨三点在 SEM 前你的手指在操纵杆上微微发抖的你自己。
——你是这中间的一个环节。
你接住了前面的人递过来的棒。你正跑着你的这一段。现在你要把棒递出去。
怎么递?用文字。
你的工具不是只有键盘和编译器。你的工具还有记录。你从图灵手中接过“可计算性“这个抽象概念;你从博世手中接过 CAN 协议的多主优先级仲裁机制;你从 AUTOSAR 标准制定者手中接过 SWC/BSW/RTE/MCAL 的模块化架构——你站在成千上万人的肩膀上。而你做的——在新项目结束后写的 Lessons Learned、在事故调查后写的 8D 报告、在代码关键处加的那行解释了“为什么这里要禁用全局中断“的注释、在团队 Wiki 上贴的那篇“CAN Bus-Off 故障排查指南“——这些文字会变成另一个肩膀。下一个素未谋面的工程师,会站在你的肩膀上。
你留下的任何东西——是对前人工作的延续,是对后人工作的馈赠。
你可以做的,比你想象的多
你可以写博客。不是那种“震惊!CAN 总线竟然可以这样用“的营销号——是你在真实项目里遇到的一个真实问题,和你的真实解决过程。写得具体:芯片型号、寄存器值、示波器截图、错误的假设、纠正后的理解。哪怕只写 1000 字——只要你写的是你自己的思考过程,它就有价值。因为这个世界上一定有另一个工程师在某个深夜,面对和你一模一样的问题。你的文章会出现在他的搜索结果里。他会点开。他会读。他会得救。
你可以写内部技术文档。你的团队里一定有一些“只有你知道、文档里没有“的知识——比如那个 CAN 控制器的 ERCR 寄存器在某种特定条件下会返回错误值,必须读两次才能确认。你现在知道这个坑。但如果你不写下来,下一个接手你的模块的人,会花三天时间重新发现它。你三天,他三天——不是一个人的三天,是两代工程师的六天。而你要做的只是花半个小时写一个 Wiki 条目。写吧。为了那个你不认识、但一定会出现的同事。
你可以写一本小书。不是这本这么大——10页也行。就写你负责的那个模块。CAN 诊断的完整实现指南。AUTOSAR NVM 模块的配置实战。电机控制 FOC 算法的嵌入式实现。不要求出版——贴在公司 Wiki 上,发到 GitHub,传到个人博客。你不需要是专家。你只需要是一个认真思考过这个问题的人,并且把自己思考的过程写了下来。
你可以写一个开源项目,并写清楚的代码注释和 README。一个最简单的 CAN 收发封装库。一套 Python 脚本用于 DBC 文件解析和 C 代码生成。一个最小化的 RTOS 任务调度器用于教学。代码跑不跑得完美不那么重要——重要的是你说的每一行注释都是真话。 你为什么要这样设计缓冲区的尺寸。你考虑过哪些替代方案。你选择了哪个,为什么。这些注释——比你的代码寿命更长。代码会过时,但你的工程决策思维会穿越时间。
做一盏灯。哪怕只照亮你所在的那个角落。
接力棒在你的手里
这个接力链很长:澳大利亚矿工 — 化工厂 — 单晶硅拉棒 — 晶圆切片 — 光刻 — 刻蚀 — 离子注入 — CMP — 封装 — 图灵 — 冯·诺依曼 — 肖克利 — 基尔比 — 博世 — AUTOSAR — 两弹一星的前辈 — 你的导师 — 你 — 下一个工程师。
这个链条的每个环节都不是一个人。矿工身后是采矿行业几百年的工艺积累。化工厂身后是化学工程几十代的学术传承。光刻机身后是荷兰、德国、日本、美国光学和精密机械的集体成果。两弹一星的工程师身后是一个民族在绝境中迸发的全部意志。你的导师身后是他自己的导师和导师的导师——一路追溯到第一个在纸上画下“计算“想法的匿名古人。
链条很长。你做的工作虽然只是中间一环——但这一环从来没有断裂过。 从图灵到冯·诺依曼——没有断。从肖克利到基尔比——没有断。从博世到 AUTOSAR——没有断。从两弹一星的前辈到今天坐在示波器面前的我——没有断。
今天,轮到你。
你不是终点。你是中间的一个环节。你接住了前面的人递过来的棒,跑了自己的这一段,现在你要把棒递出去。
递棒的方式很简单——写下来。 你的 Lessons Learned。你的 Decision Record。你的代码注释。你的技术博客。你的故障分析报告。你的团队 Wiki。你录的那段 15 分钟的内部分享视频。你画在白板上然后用手机拍下来发给团队群的那张架构图。
你要写的不是完美的文字。不是成熟的结论。不是你退休之后才能写的回忆录。你要写的——就是今天你正在想的事情。 你今天遇到的一个 bug 的排查过程。你今天做的一个架构选择的原因。你今天踩的一个坑。明天你不知道你会不会还在这个项目上,而这个项目下个月会不会有其他工程师接手——如果他们没有你的记录,他们会花你花过的同样的时间重新踩你踩过的坑。
不要让他们重新来过。你已经替他们走过一遍了。
致读者
感谢你读完这本书。
你花时间读了——你的时间是宝贵的。谢谢你。
如果这本书对你有一点帮助——让你在某次调试时更快地找到 root cause,在某个架构决策时看到更宽的视野,在面对困难时想起“有限资源 + 主观能动性 = 无限可能“——那这本书就达成了它的目的。
如果这本书让你产生了冲动——想写自己的“兰亭“——那作者会感到无以言表的欣慰。
从沙子到芯片,从芯片到车辙,从车辙到你。——这条路,你已经在上路了。
“致广大而尽精微。”
——《中庸》
大致整个世界的物理规律。大到全球化的工业协作。大到跨越时空的文明接力。——接住。
小到一行代码的时序 margin。小到一颗传感器的噪声模型。小到一个 CAN ID 的优先级分配。小到你今天在一个函数的参数列表里加的那个
const限定符。——做到极致。接住宏大。做到精微。
你已经在做了。
加油。