1. 那个通宵调死机的人为什么总在晋升名单之外嵌入式圈子里有个很普遍的现象项目出问题的时候第一个被叫到现场的是你最后一个离开实验室的也是你。示波器、逻辑分析仪、JTAG调试器摆满一桌STM32的HardFault异常寄存器被你翻来覆去地看Linux侧的dmesg日志刷了一屏又一屏凌晨三点你还在比对内核oops的调用栈。问题最终解决了产线恢复了项目按时交付了。然后季度绩效出来涨薪名单上没有你职级评审结果出来晋升的是那个平时看起来没你忙、但总在会议上发言的人。这件事让很多嵌入式工程师感到委屈甚至开始怀疑是不是技术好没用。我经历过这个阶段也见过身边不少同行卡在这个阶段好几年。后来我慢慢想明白了一件事问题不在于你的技术不值钱而在于你的技术价值没有被看见。工程价值和工程价值的可见度是两件完全不同的事。前者是你实际解决的问题有多难后者是决策链条上的人能不能感知到这件事有多难、有多重要。这篇文章想聊的就是这个可见度问题。它不是教你拍马屁也不是让你放弃技术去搞关系而是从嵌入式工程师的实际工作场景出发拆解为什么通宵查死机这件事在组织里不值钱以及怎么在不降低技术深度的前提下让你的工程价值被正确评估。适合所有在嵌入式一线干活、技术不差但总觉得回报不对等的朋友。2. 通宵查死机这件事在组织眼里到底长什么样2.1 你看到的是技术难度别人看到的是又出问题了先换位思考一下。你是一个项目经理或者是一个部门主管你早上到公司听说昨晚又有人通宵了。你的第一反应是什么大概率不是这位工程师真厉害而是这个项目怎么又出问题了。这不是主管冷血而是信息不对称导致的必然结果。你脑子里装的是HardFault的BFAR寄存器指向了一个非法地址结合反汇编定位到是DMA传输完成中断里访问了已经被释放的缓冲区这是一个典型的内存生命周期管理问题修复方案是调整缓冲区的释放时机并加一道引用计数保护。这个信息量非常大技术含量也很高。但传到主管那里经过层层转述变成了昨晚系统死机了XX查了一晚上修好了。你看技术难度在传递过程中被完全蒸发了只剩下出问题和修好了两个事实。而出问题是减分项修好了是应该的。这就是通宵查死机在组织里的真实处境你解决了一个高难度问题但组织接收到的是一个负面事件被平息了。2.2 救火型工作的价值衰减曲线更麻烦的是救火这件事的价值是有衰减曲线的。第一次你通宵解决一个死机问题大家会觉得你很关键。第二次、第三次就变成了反正有你在出问题你能搞定。到了第五次这件事就彻底变成了你的本职工作不再产生额外的价值感知。我见过一个很典型的例子。某团队里有一位工程师专门负责一个复杂系统的稳定性几乎每个月都要处理一两次偶发性死机。他每次都能定位到根因修复也很彻底。但两年下来他的绩效一直是符合预期没有一次超出预期。原因很简单在主管的认知模型里系统稳定是这个工程师的职责稳定是常态不稳定才是异常。他做得越好异常越少反而越没有存在感。这就是救火型工作的陷阱你的产出是没有发生坏事而没有发生坏事是无法被感知的。相比之下那个做了一个新功能上线的同事产出是发生了一件好事这是可以被看见、被展示、被写进汇报里的。2.3 死机排查的技术深度为什么在评审会上讲不出来还有一个很现实的问题死机排查的技术深度在晋升评审会上极难表达。假设你面对的是一个技术评审委员会你要用五分钟说明你过去半年的工作价值。如果你说我解决了三个偶发性死机问题评委的反应大概率是这是本职工作。但如果你说我主导设计了一套内存安全框架从架构层面消除了这类死机问题评委的反应就完全不同了。问题在于很多嵌入式工程师在做死机排查的时候确实就是就事论事地修bug修完就完了没有把这个问题抽象成一个系统性的改进。你做了十次高难度的根因定位但每一次都是独立的、一次性的、不可复用的。在组织看来这就是十次救火而不是一项能力建设。3. 工程价值的可见度到底由什么决定3.1 价值可见度的三个维度难度、影响面、可复用性我后来总结了一下一件事在组织里的价值可见度大致由三个维度决定。维度含义通宵查死机的典型表现难度解决这个问题需要多深的技术功底很高但外人感知不到影响面这个问题影响多少业务、多少客户通常很大但被修好了掩盖可复用性这个解决方案能否沉淀为通用能力往往很低修完就完了通宵查死机这件事难度维度是满分影响面维度其实也不低系统死机影响的是整条业务线但可复用性维度往往接近零。而组织评估价值的时候恰恰最看重可复用性因为可复用意味着一次投入长期收益这是管理者最容易理解和量化的东西。3.2 为什么修好了反而让你的价值归零这里有一个反直觉的结论你把问题修得越干净你的价值越容易被归零。因为问题的痕迹被你彻底抹掉了。系统恢复稳定日志被清理临时补丁被正式版本覆盖一切回到正轨。后来的人看到的只是一个稳定运行的系统没有人知道这里曾经有一个多么凶险的bug也没有人知道你是怎么定位到它的。我见过一些聪明的工程师他们会在修复问题之后做一件事写一份根因分析报告并且在报告里明确标注这个问题的潜在影响范围。比如该问题如果未修复在特定负载下会导致系统在运行72小时后必现死机影响所有使用该模块的设备。这句话一写出来问题的严重性就被量化了你的贡献也就被看见了。3.3 技术深度和表达深度之间的鸿沟还有一个很关键的点技术深度和表达深度是两回事。你能看懂ARM Cortex-M的异常压栈格式能从栈帧里还原出出错时的寄存器状态这是技术深度。但你能不能用一个不懂嵌入式的人也能听懂的方式说明这个问题的严重性和你的解决思路这是表达深度。很多嵌入式工程师在这件事上是吃亏的。我们习惯了和寄存器、和时序图、和内核源码打交道不太擅长把这些东西翻译成业务语言。但组织的决策者往往是不懂技术的。你不需要把技术讲浅但你需要把技术翻译成他们能理解的风险和收益。4. 从救火队员到价值可见的四个转变4.1 把一次性修复变成可复用的防护机制第一个转变也是最实在的一个不要满足于修好当前这个bug要想想能不能从机制上防止这类问题再次发生。举个例子。你定位到一个死机是因为某个中断里访问了已释放的内存。修好它之后你可以做这几件事在内存分配和释放的接口上加一层引用计数或者生命周期检查在Debug版本里一旦检测到非法访问就主动触发断言把偶发的、难以复现的问题变成必现的、容易定位的问题。写一个静态检查脚本扫描代码里所有在中断上下文中可能访问动态内存的地方纳入CI流程。把这个案例整理成团队内部的技术分享让其他人也知道这类问题的排查思路。这三件事做完你的产出就从修了一个bug变成了建立了一套防护机制。前者是一次性的后者是可复用的。在晋升评审的时候后者是可以写进PPT的前者只能口头提一句。4.2 让问题的严重性在修复之前就被量化第二个转变不要等到问题修好了才让别人知道要在问题还在排查的时候就同步信息。具体怎么做我自己的习惯是在接手一个死机问题之后先花半小时做一个初步评估然后发一封简短的邮件或者消息给相关的人内容包括问题的现象和初步定位不用太详细说清楚影响什么功能就行当前评估的严重程度比如该问题会导致设备在运行一段时间后无响应需要重启影响现场所有在线设备预计的排查方向和所需时间如果需要其他资源配合也在这里提出来这封邮件的作用不是邀功而是让决策者在你还在干活的时候就知道这件事有多难、有多重要。等到你修好了他们已经有心理预期了你的贡献也就顺理成章地被记住了。注意同步信息要把握频率和粒度不要每半小时发一封。一般在一个关键节点比如初步定位、找到根因、修复验证各同步一次就够了。太频繁会让人觉得你在刷存在感反而适得其反。4.3 用业务语言翻译技术贡献第三个转变学会用业务语言描述你的技术工作。这不是让你放弃技术细节而是准备两个版本的说法。技术版本给同行听业务版本给主管和评委听。比如同样是解决一个DMA和中断的竞态问题技术版本DMA传输完成中断和缓冲区释放之间存在竞态条件导致中断服务程序访问了已释放的内存触发HardFault。通过在释放路径上加引用计数并在中断入口做有效性检查解决。业务版本这个问题会导致设备在高负载场景下随机死机现场无法自行恢复必须返厂或者远程重启。我定位到了根因并做了修复同时加了一道防护机制确保这类问题以后不会再出现。修复后经过72小时压力测试零复现。你看业务版本没有丢掉任何关键信息但它把技术问题翻译成了业务风险和风险消除。决策者听到的是这个人帮我避免了一个可能造成现场批量故障的隐患而不是这个人改了几行代码。4.4 在团队里建立问题排查的知识资产第四个转变把你排查问题的经验沉淀下来变成团队的知识资产。这件事的价值经常被低估。很多资深工程师觉得我自己会就行了教别人太费时间。但实际上当你把排查经验整理成文档、工具或者流程的时候你的价值就从一个人能解决问题变成了让一群人能解决问题。后者在组织里的价值是前者的数倍因为它可复用、可扩展、不依赖于你个人。具体可以做的事包括整理一份常见死机问题的排查手册包括典型现象、可能原因、排查步骤、常用工具和命令。把常用的调试脚本、分析工具封装好让其他人也能用。定期做技术分享讲最近遇到的典型案例和排查思路。这些事情做下来你在团队里的定位就慢慢从那个能修死机的人变成了那个建立了死机排查体系的人。前者是一个岗位后者是一个能力标签而能力标签才是晋升时真正被评估的东西。5. 那些看起来不忙的人到底做对了什么5.1 他们花时间在被看见的事情上我观察过身边晋升比较快的嵌入式工程师发现他们有一个共同点他们不是不忙而是把一部分时间花在了被看见的事情上。什么叫被看见的事情比如主动在项目例会上汇报技术方案和进展而不是等着别人来问。把技术难点整理成文档或者分享让更多人知道这件事的复杂度。在跨部门协作的时候主动承担技术接口人的角色让其他部门的人也知道你在做什么。在季度总结的时候用数据和业务影响来说明自己的贡献而不是只列做了什么。这些事情看起来是软技能但它们的本质是降低别人理解你价值的成本。你技术再强如果别人不知道你强在哪你的价值就无法被正确评估。5.2 他们把救火变成了防火另一个共同点是他们不会让自己长期陷在救火状态里。救火这件事偶尔做是英雄长期做是苦力。聪明的工程师会在救火之后花时间分析为什么会有这么多火然后从流程、架构、工具层面去减少火灾的发生。比如如果发现死机问题频繁出现在某个模块他们会推动这个模块的重构或者增加自动化测试。如果发现排查效率低他们会去搭建更好的调试环境或者日志系统。这些工作的产出是火灾变少了虽然不如救了一场大火那么戏剧化但在组织看来这是更高级的价值创造。5.3 他们懂得在关键节点留痕还有一个很实用的技巧在关键节点留痕。什么叫留痕就是让你的工作过程有记录、可追溯。比如重要的技术决策用邮件或者文档记录下来说明背景、方案对比和选择理由。排查问题的过程保留关键的分析步骤和结论不要修完就删。和别人的技术讨论重要的结论同步到相关的群或者文档里。留痕的目的不是为了邀功而是为了在需要证明自己贡献的时候有据可查。很多工程师在晋升评审的时候吃亏就是因为过去半年的工作说不清楚明明做了很多事但拿不出具体的证据。6. 一个真实的排查案例从通宵到被看见6.1 问题现象和初步排查说一个我亲身经历的例子细节做了模糊处理。某段时间一个基于STM32和Linux双系统的设备在客户现场偶发性死机平均两三天出现一次重启后恢复正常但过几天又会出现。现场无法复现日志也看不出明显异常。我接手之后先做了一件事把问题的严重性量化。我统计了一下这个设备在现场有几百台如果每台两三天死机一次意味着每天有上百次的服务中断。这个数字一出来项目组立刻重视起来了。然后我开始排查。第一步是确认死机发生在哪一侧STM32还是Linux。通过在现场设备上加了一个简单的看门狗日志发现是STM32侧先失去响应然后Linux侧因为等不到STM32的回复而超时。问题定位到了STM32侧。6.2 定位根因的关键思路STM32侧的死机最常见的原因就那么几类HardFault、看门狗复位、电源问题、时钟问题。我先排除了电源和时钟然后重点看HardFault。但问题是现场设备没有连接调试器HardFault发生时的现场信息拿不到。我做了两件事第一修改启动代码在HardFault处理函数里把关键寄存器CFSR、HFSR、BFAR、MMFAR和栈帧信息保存到一块不受复位影响的RAM区域下次启动的时候读取并上报。这样即使现场没有调试器也能拿到死机现场。第二在关键的中断和任务切换点加轻量级的执行痕迹记录用一个环形缓冲区保存最近的操作序列死机后可以还原出问题发生前的执行路径。这两件事做完等了大概一周终于抓到了一个现场死机的案例。分析保存下来的寄存器信息发现CFSR的IMPRECISERR位被置位说明是一个不精确的总线错误。结合执行痕迹定位到问题发生在一个SPI传输完成中断里中断服务程序访问了一个已经被释放的DMA缓冲区。6.3 修复方案和防护机制根因清楚了修复本身并不复杂调整DMA缓冲区的生命周期管理确保在传输完成中断处理完毕之前缓冲区不会被释放。同时加了一道引用计数保护防止类似的生命周期问题再次发生。但我没有止步于此。我做了三件额外的事把这次排查用到的现场信息保存机制整理成了一个通用的调试组件其他项目也可以直接用。写了一份详细的分析报告包括问题现象、排查过程、根因分析、修复方案和防护措施发给了项目组和相关主管。在团队内部做了一次技术分享讲这类偶发性死机的排查思路和工具。这三件事做完之后效果很明显。主管在季度总结的时候专门提到了这个问题的解决并且把建立了现场死机信息保存机制作为了一个亮点。后来晋升评审的时候这个案例也成了我技术贡献的重要证据。6.4 这件事之后我学到的这个案例让我最深的体会是同样一件事做的方式不同价值感知完全不同。如果我只是修好了那个bug那么这件事在组织里的记录就是解决了一个现场死机问题平平无奇。但我把排查过程工具化、把分析过程文档化、把经验分享化之后这件事就变成了建立了一套偶发性死机的排查和防护体系价值立刻上了一个台阶。技术工作本身没有变变的是它的可见度和可复用性。7. 嵌入式工程师的价值表达有哪些坑要避开7.1 不要走向另一个极端过度包装说了这么多要让价值被看见但有一个坑必须提醒不要走向过度包装的极端。我见过一些工程师学了点表达技巧之后开始把很小的事情说得很大。比如改了一个配置参数说成优化了系统性能修了一个拼写错误说成提升了代码质量。这种过度包装短期可能有效但长期一定会被识破而且会严重损害你的技术信誉。正确的做法是实事求是地描述技术工作但要把它的业务影响和可复用性说清楚。你不需要夸大难度只需要把难度翻译成别人能理解的语言。7.2 不要只做可见的事忘了技术深度另一个坑是为了追求可见度只做那些容易展示的工作忽略了技术深度的积累。嵌入式这个领域技术深度是根基。你可以会表达、会汇报、会做PPT但如果你的技术不过硬遇到真正难的问题搞不定那一切都是空中楼阁。可见度是放大器技术深度是信号本身。没有信号放大器放大的是噪声。所以正确的策略是技术深度和可见度两手抓。用技术深度解决真正难的问题用可见度让这些问题的价值被正确评估。7.3 不要和团队文化硬碰硬还有一个很现实的点不同的团队有不同的文化。有些团队看重技术深度有些团队看重业务结果有些团队看重协作和影响力。你的价值表达方式需要和团队文化相匹配。如果你在一个技术导向的团队那就多在做技术分享、写技术文档、解决技术难题上下功夫。如果你在一个业务导向的团队那就多关注你的技术工作对业务指标的影响。不要用一套固定的方式去应对所有环境要看环境需要什么。8. 把工程价值翻译出来的几个实用模板8.1 问题排查类工作的价值描述模板对于死机排查、性能优化、稳定性提升这类工作可以用这个模板来描述价值问题现象[描述现象尽量量化影响范围] 潜在风险[如果问题不解决会导致什么业务后果] 排查难度[为什么这个问题难定位比如偶发性、现场无法复现、涉及多系统交互等] 解决方案[做了什么修复以及做了什么防护机制] 验证结果[修复后经过什么测试效果如何] 可复用产出[沉淀了什么工具、文档或者流程]这个模板的好处是它把技术工作的完整价值链都覆盖了从问题到风险到方案到验证到沉淀每一环都能体现你的贡献。8.2 技术改进类工作的价值描述模板对于架构优化、工具开发、流程改进这类工作可以用这个模板改进背景[原来存在什么问题比如效率低、容易出错、维护成本高] 改进方案[做了什么改进技术方案是什么] 量化收益[改进后效率提升了多少错误率降低了多少节省了多少时间] 长期价值[这个改进对团队的长期影响是什么]量化收益这一环特别重要。嵌入式工程师往往不习惯量化但排查时间从平均8小时降低到2小时这种数字比任何形容词都有说服力。8.3 技术分享和知识沉淀的价值描述模板对于技术分享、文档编写、新人培养这类工作可以用这个模板沉淀内容[整理了什么文档、工具或者课程] 覆盖范围[多少人受益在多少个项目中应用] 实际效果[有没有具体的案例证明这些沉淀产生了价值]这类工作的价值往往被低估因为它不直接产生业务结果。但如果你能证明因为这份排查手册团队的平均故障处理时间缩短了一半那它的价值就非常清晰了。9. 我个人在嵌入式职场里踩过的几个坑9.1 以为技术好就够了我刚工作那几年有一个很天真的想法只要我技术够强能解决别人解决不了的问题就一定会被认可。后来发现完全不是这么回事。技术好是必要条件但不是充分条件。组织评估一个人的价值看的是这个人对组织目标的贡献而不是这个人的技术排名。你技术再强如果贡献没有被感知在评估体系里就是零。这个认知转变花了我挺长时间。接受这件事之后我开始有意识地在技术工作之外花一点时间做价值翻译的工作。效果是显而易见的。9.2 把救火当成了核心能力第二个坑是我曾经把能救火当成了自己的核心竞争力甚至有点享受那种关键时刻只有我能搞定的感觉。但后来发现这种定位是有天花板的。救火队员在组织里的角色是保障而不是驱动。保障型角色的价值是有上限的因为它的产出是没有出事而没有出事很难被量化成业绩。真正能突破天花板的是那些能防火的人也就是能从机制上减少问题发生的人。从救火到防火是从保障型角色到驱动型角色的转变也是从值钱到被看见值钱的转变。9.3 忽略了向上沟通的重要性第三个坑是我曾经觉得向上沟通是拍马屁不屑于做。后来我意识到向上沟通不是拍马屁而是确保你的工作方向和组织的目标对齐并且让决策者知道你在做什么。如果你不沟通主管只能通过间接信息来判断你的价值而间接信息往往是失真的。有效的向上沟通不是天天汇报而是在关键节点同步关键信息。比如项目启动的时候对齐目标遇到困难的时候及时求助取得进展的时候同步结果。这些沟通不需要花很多时间但能极大地提升你的价值可见度。10. 从今天开始你可以做的几件小事如果你读到这里觉得有道理但不知道从哪里开始我建议从下面这几件小事做起。第一下次修完一个bug之后多花半小时写一份简短的根因分析。不用很长把问题现象、根因、修复方案、影响范围写清楚就行。发给相关的人并且存档。第二下次遇到一个难搞的问题在排查过程中同步一次信息。让相关的人知道你在处理什么、难度在哪、预计什么时候有结果。第三把你最近解决的一个典型问题整理成一份可以分享的文档或者一次分享。不用很正式团队内部讲讲就行。第四在下次季度总结或者晋升评审之前用第8节的模板把你的工作梳理一遍。看看哪些工作的价值没有被充分表达下次注意。这几件事都不难但坚持做下来你的价值可见度会有明显的提升。技术深度是你的底气价值可见度是你的杠杆。两者结合你才能在嵌入式这条路上走得更远、更稳。我在实际工作中最大的体会是不要等着别人来发现你的价值要学会主动把价值翻译出来、展示出来。这不是功利而是对自己劳动成果的尊重。你通宵查死机的那份辛苦值得被看见。
阅读完成 · 觉得有帮助?