zoukankan      html  css  js  c++  java
  • 关于嵌入式的技术竞争力

    相信很多刚入行1-2年,甚至5年10年的嵌入式工程师都会有这些疑惑。我做的事情好像没有多少技术含量,我做的事情好像没有多少创新,做嵌入式的技术竞争力到底在哪?嵌入式到底是做驱动好还是做应用好?

    很多人说,嵌入式要学习很多很多的技能才能找到工作,既要懂硬件,还要懂编程,精通C/C++,懂操作系统Linux内核,懂通信(4G 5G),懂自动控制,懂数字信号处理,懂网络协议栈,懂FPGA,懂电磁兼容,懂Android,是这样吗?(这肯定是有人在吹牛装逼)。火哥今天和大家聊聊这个话题。

    一、嵌入式的技术竞争力必须因地制宜,根据你所在的具体环境具体分析,case by case, 没有万能药方

    说到做嵌入式的技术竞争力,其实是和每个嵌入式工程师所身处的环境有关。所谓的环境包括:你的学历,你的家庭因素(是否已婚,家里老人妻儿是否需要时间精力照顾),你所在的城市以及该城市的嵌入式相关产业结构,你目前从事的行业和业务,你现在的工作年限和当前已经有的基础技能与业务技能积累深度,你所认识的或互相信任的同行业的人脉等等。

    火哥所拥有的技术竞争力,放在你所处的环境往往不一定有竞争力,这就好比你在一个二三线城市,整个城市没有一家做AI深度学习相关的公司,火哥如果给你分享嵌入式+AI深度学习的技能,在你的环境里就毫无参考意义,如果你只是公司的一个小兵,工作权限只能修改一个模块,火哥给你分享的复杂业务场景下大规模软件架构技术也意义不大。

    很多时候个人是难以改变现有环境的,要么重新选择环境,要么适应环境,再参考别人分享的经验,根据自己当前的环境状况,做出对自己最有利的选择。

    另外还有一个老生常谈的撕逼问题,嵌入式到底是做驱动好还是做应用好,其实也是要根据所在城市和公司的组织架构情况而定的,没有绝对优劣。

    火哥第一家公司是属于传统行业大厂的嵌入式Linux产品开发(火哥在应用部门),内核驱动和应用软件部门是严格划分的,驱动部门大部分都是5年经验以上核心老员工(相对薪资也高一些),一般不直接校招,应用部门工作3-5年经验的也可以转到驱动部门,没有绝对限制和门槛。

    应用软件部门员工相对年轻,经验浅,应用软件部门没有权限提交驱动代码的修改,只能定位到驱动问题,让驱动部门的工程师修改。当时这家公司很多核心的业务逻辑和通信协议的代码在驱动层,公司设计的这套组织架构也是为了保证核心部门员工的稳定性,并不是说做应用就没有技术含量,就很难再转驱动了。

    火哥第二家公司是新兴行业小厂AI相关嵌入式Linux产品开发,嵌入式开发就一个部门8个人(小厂人少,分工就不细),7个人做应用层开发(火哥还是做应用),1个人做底层驱动。但是底层驱动的人,只是负责新的硬件和驱动功能集成到系统里面,做应用开发的同事,如果遇到底层的驱动的bug,也要自己有能力解决,底层驱动的同事并不会帮你处理旧的模块的bug。

    火哥第三家公司是新兴行业大厂的Android系统平台开发(火哥终于有做底层驱动的机会了)。公司组织架构上根本就不是按驱动开发部门和应用开发部门这样划分的,而是按模块划分部门,比如摄像头组,存储组,视频编解码组,音频编解码组,蓝牙、wifi组,功耗电源组,bsp组等等。

    每个组,只要你负责的模块有问题,不管是在内核驱动层还是在应用层,都属于你要处理的。比如摄像头组,你要有独立解决摄像头驱动和应用软件的能力,而不是说我只做摄像头驱动,应用不管。

    另外火哥还了解到,在二三线城市甚至深圳这种一线城市,一些小厂(尤其是做单片机mcu项目的小厂,可能就二三十人甚至更少),由于人手不够,或者硬件部门,软件部门暂时没有招到合适的人,所以有些嵌入式软件工程师不得不暂时甚至长期兼顾PCB硬件原理图设计的工作。

    当然火哥认为软硬设计都做的工作实在是不合理,分散精力容易出很多问题,但是不得不承认这种分工的工作在嵌入式(尤其是单片机mcu开发)工程师中是客观存在的,老板安排的硬件相关工作也不得不去承担。

    虽说每个人具体的技术竞争力问题要根据实际情况,case by case分析,但是火哥还是希望通过本文,抛砖引玉,给出一些case,来引导小伙伴们进行深度思考。

    二、能保证饭碗的基础技术竞争力

    一般嵌入式工程师都是指在嵌入式平台做软件开发的工程师,没有专门的嵌入式硬件工程师说法(硬件工程师自有专门的硬件工程师,这里以软件为主)。虽然没有万能的技术竞争力,找工作也不是什么都要懂(公司招人的基本要求是能够马上干活帮老板解决问题,而不是啥都懂吹技术牛逼)。

    但是嵌入式还是有些通用的技术技能需要掌握才能成为一个合格的嵌入式工程师,随时保证有一个嵌入式的饭碗,能在一线城市找到月薪10K以上的工作(二三线城市根据实际情况递减),火哥还是建议你要掌握以下几点通用嵌入式基础技术。

    1. 编程能力

    编程能力不用多解释,嵌入式开发主要还是软件编程嘛,C语言尽量精益求精,各种指针、结构体,联合体的高级用法滚瓜烂熟不需要问人(可以上豆瓣搜3-5本高分的C语言编程书籍细看),C语言编程能力就是嵌入式开发的命根子。

    另外,数据结构对于现代的大规模嵌入式软件开发(不管是单片机mcu还是Linux)也是必学科目,我知道很多电子通信,自动化专业出身的嵌入式工程师没有学过数据结构的课程,所以在这里啰嗦一下,去学吧,不然很难看懂别人写的复杂的程序结构(尽管学了也不保证看得懂)。

    另外,基本的计算机算法(堆和栈搜索,链表反转,哈希表,二叉树,红黑树,深度优先广度优先,时间复杂度……),有时间尽量学一学,补齐短板,虽然并不是说工作中要自己从头实现或者工作中绝对能用到(知道你们大部分人都是写业务逻辑代码),但是很多公司笔试面试要考,不学可能过不了面试,学了可以开拓思路。

    C++语言应该也是要懂的,但是C++范式太多,学习时间会比较长,而且每过几年还会更新,可以先工作,然后工作有时间慢慢学。不要求精通C++(根本就不可能精通所有C++特性和范式),但是至少能够看得懂基本的语法代码,能改动别人的C++程序,能调用别人实现好的class实现你的功能。

    另外最好懂一门脚本语言,比如Python, Python在做测试用例代码和自动化工具的时候还是用得挺多的,也不难学,比C/C++简单(我觉得可以先学Python,再学C++,这样C++反而不会那么难)。

    2. 操作系统与计算机体系结构知识(包括一些编译,链接的知识)

    嵌入式程序员和非嵌入式程序员(纯APP或者web开发)最大的能力差别就在解决操作系统底层,计算机体系结构相关问题的能力。操作系统知识对于做Linux/Android 或者 RTOS开发的嵌入式程序员,不用我啰嗦,学吧,最好还要能看看Linux内核源代码,理解其中的各种子系统的设计机制和设备模型。

    对于单片机MCU裸机开发的程序员,虽然可能暂时用不上,但建议你们有时间还是应该学一下,这样对以后换环境跳槽选择的路子会更宽(相比于完全不懂操作系统的老单片机工程师有优势),而且Linux FreeRTOS等操作系统内核都是开源的,里面有丰富的代码可能可以给你单片机编程提供参考(抄),扩展思路。

    计算机体系结构的知识,可以说是做嵌入式程序员(不管是做Linux、Android、RTOS还是单片机MCU裸机)的内功心法。一个CPU是按照什么样的流程执行程序,cache是什么有什么用,TLB是啥,MMU有什么用,中断流程是怎么执行,中断服务函数和一般函数有啥不同,一个程序运行的地址空间和各种段是怎么样的分布,系统是怎么启动最后运行你的应用程序,系统是怎么管理内存,防止碎片化,动态库静态库原理上有啥区别,你所使用的编译器工具链,硬浮点软浮点的基本原理和使用条件。

    (不懂的可以从《深入理解计算机系统》这本书入手)。这一系列体系结构有关的知识,火哥认为,不管是做操作系统还是做裸机嵌入式,都必须掌握,才能在面试中,得到面试官对你技术底子的认可(很多候选人,可能公司相关业务知识不熟,但是技术底子不错,面试官也会考虑给机会)。

    3. 硬件的基本知识

    关于嵌入式要学多少硬件的问题,众说纷纭,有些文章渲染地神乎其神,软硬通吃。但是火哥在嵌入式软件工程师的面试中,其实被问的真正的硬件问题(CPU中断这些体系结构知识不算真正硬件知识,体系结构知识是嵌入式必备的)并不多(50次面试就2-3次问过硬件),而且火哥是自动化专业出身,读书的时候模电,数电都有认真学,课程设计都有认真做,读书的时候也有过电力电子的项目经历,因而面试的硬件问题对火哥来说基本不是问题。

    火哥的观点就是,对于电子通信、自动化专业出身的嵌入式工程师,以前学校读书学的模电,数电课本知识基本能够满足平时嵌入式软件开发中,看懂原理图,看示波器,和硬件工程师合作沟通,定位软硬件问题的需求,并不需要再加强多少硬件知识,也不需要真正去设计电路图,PCB,EMC电磁兼容之类的东西,当然懂一些更好,但是也对找工作加不了太多分。

    但是如果是计算机类专业出身,对硬件完全没有概念也不行,还是需要花1-2个月时间,看看模电、数电的课本,学习示波器的使用,3个月足以学习基本的概念知识,示波器的使用也就像使用一个办公软件一样,不需要多精通,会用就行,没有网上吹的那么神(动不动示波器分析射频电路,fft频谱特性,动态响应特性)。

    当然如果是在做单片机MCU开发的小公司,由于公司缺乏人手,需要兼顾硬件开发的话,那只好硬着头皮上了,但是这样花费的时间精力可能比较多,对你跳槽正规大厂的嵌入式也没有多少好处。

    4. 计算机网络知识

    计算机网络,TCP/IP,套接字编程,如果是电子通信专业出身的,学吧!现代嵌入式设备连接网络的功能越来越多,越来越常见,不一定要把TCP/IP协议啃得很深(Linux内核有现成的开源实现代码,不需要你从0开始做),但是基本的概念和网络应用编程还是要懂,才能增加你的就业机会。

    5. 各种寄存器,软硬件调试方法和经验

    调试配置寄存器,软硬件联调就是传统嵌入式代代相传的手艺活了。这也很能体现大部分人所谓的实际项目中解决问题的能力(定位问题到寄存器配置上,解决问题真有成就感哈!),这项能力还是要靠实际的项目来锻炼,也就是嵌入式中所谓的吃经验的东西。

    但火哥认为,现代嵌入式开发不要太迷信这种调试寄存器带来的成就感,还是应该把大部分精力放在计算机软件、操作系统,体系结构等基础知识的学习上。调试寄存器的能力就像NBA比赛的灌篮技能一样,很有成就感,带来全场欢呼,但是毕竟不是常规得分手段,也不是常规技能(大部分得分还是要靠战术配合,投篮,上篮,三分远射),嵌入式开发大部分精力还是要放在编程,实现业务逻辑上。

    三、升职加薪的业务技术竞争力

    要想在公司升值加薪,除了基础技术竞争力之外(这项只能帮你好跳槽,找工作,不保证升职加薪),还需要和公司业务相关的技术竞争力(这项竞争力只在同行业跳槽有效,不保证跨行业跳槽)。

    所谓业务技术竞争力,就是在特定行业和公司才有价值的技术竞争力,是无法轻易从书本获取的技术。尽管火哥承认Linux内核,操作系统原理,计算机基础算法,计算机体系结构这些知识有一定难度,不是那么容易学的,但是毕竟一个没有工作经验的学生都能从书本这种最廉价的途径获取,所以无法构成业务竞争力的壁垒,业务技术竞争力也是学生和有工作经验的工程师最主要的差距。

    一般来说,业务技术需要入行之后,在工作中学习,而且不同行业不同公司能学习到的业务技术是不一样的。比如说,通信行业的公司,4G LTE协议,标准相关的技术就是业务技术竞争力;网络产品行业的公司,那些网卡路由标准协议相关的技术就是业务竞争力;机顶盒产品的公司,音视频流媒体编解码播放的相关技术标准就是业务竞争力;网络摄像头产品的公司,摄像头数据采集与网络通信协议相关的技术和标准就是业务竞争力……

    一般进入某个行业某个公司之后,只有多学习积累公司业务相关的知识,才能自己独立完成业务相关的项目,然后指导新人、同事,带领团队做业务相关的更大的项目,进而在公司掌握更大的业务话语权,和高管讨论公司业务规划,乃至战略规划。

    一般站在公司高管的角度,思考的问题都是业务发展方向和战略上的问题,一个工程师Linux内核底层驱动理论和技术能力再好,如果不是在Red Hat SUSE 或者华为的Linux内核部门这种把内核开发作为业务方向的公司和部门,那么你牛逼的底层技术能力,也只是一项基础技术,平时工作解决的再复杂再难的底层内核问题,写的再风骚的代码,在高管眼里都只是解决一个普通问题,实现一个普通功能而已。

    这些都是为公司的业务服务的铺路石而已,而高管就像在路上开车,眼里只有终点,尽管铺路石的好坏可能导致路上的颠簸,但是只要顺利到达终点铺路石看起来并没有那么重要。

    可以说,在公司,你所掌握的和公司战略方向相关的业务技能,就像一个放大器,把你实际的技术能力和价值放大多倍,进而带来更高的收益。但这也带来了一些问题,如果公司近年的业绩不够好,你牛逼的业务能力可能不会给你带来等价的回报,那就得考虑你在公司业务方向上花费的时间和精力到底值不值。

    火哥第一家公司就有不少业务专家,但是公司业绩一年不如一年,导致业务专家也和普通小兵一样拿死工资,没有得到相应的年终奖,最后,火哥跳槽出来的时候,差不多算跨行跳槽,相关的业务知识也在面试中没有太大的帮助。

    同时,火哥也在和很多面试官聊天中,发现很多业务牛人,出来面试,虽然业务技术牛逼,但是基础技术花费的精力不够,所以没有得到面试官的认可。当然,在同行跳槽的情况下,业务技术能力的加分还是很大的,比如手机行业,高通跳槽去OPPO、小米的对口部门,待遇上的提升就很多,但是这种真正业务对口的跳槽机会,火哥认为占少数,所以在业务技术竞争力上,行业的选择一定要有眼光,高薪跳槽机会多的行业,业务技术才是有竞争力的技术(尽管可能不是最难的技术)。

    四、无法轻易获取的门槛技术竞争力

    所谓无法轻易获取的门槛技术竞争力其实也是业务竞争力的一种,只是相对于常规的业务竞争力来说具有更高的获取门槛。上一节所说的业务竞争力是指一般的业务竞争力,可以在公司内部,通过参与公司实际项目,业务知识培训或者老员工指导,口口相传中获取。

    而这种门槛技术,在公司中一般也是保密的,非偶然机遇,无法获取,靠自己找资料自学琢磨基本行不通。嵌入式开发相关领域无法轻易获取的门槛技术竞争力一般有这些(如果火哥说的有遗漏,可以后台私信补充):

    • 4G/5G 通信基带算法与核心业务逻辑
    • WiFi、蓝牙驱动加载的固件或IP中核心的算法与业务逻辑
    • Camera驱动加载的固件或IP中,MIPI-CSI高速数据采集接口相关的核心业务逻辑,ISP(数字图像处理)相关的核心算法与业务逻辑
    • GPU驱动加载的固件或IP,以及OpenGL、CUDA、OpenCL等API标准的库实现中核心的算法与业务逻辑
    • 音视频编解码Codec驱动加载的固件或IP,以及OpenMax等API标准的库实现中的核心算法与业务逻辑
    • 高清LCD/OLED屏幕,或者HDMI屏幕驱动加载的固件或IP中核心的业务逻辑和实现
    • 嵌入式设备电源低功耗相关技术
    • 嵌入式设备信息安全与密码保护相关技术

    这些门槛业务技能,除非你有偶然的机会,去了某个IC原厂专门的部门,否则基本不可能接触到这种高门槛的业务技能。如果你在OEM产商从事相关的岗位驱动(比如在小米做手机的camera或者WIFI开发),你也只能从高通或MTK拿到二进制的固件,几乎不可能看到核心业务逻辑的源代码。

    这些模块虽然Linux内核驱动部分可能为了遵守GPL协议开源,但是一般这种开源的驱动都是hardware enable的驱动,也就是说驱动里面只有使能或者停止设备的基本功能,核心业务逻辑相关的代码都抽出来做在固件(可以是内核加载的固件,也可以是应用层的闭源库)。

    有机会接触这类高门槛核心业务岗位,也算一种幸运,如果能跳槽到对口的公司,可能拿到非常高的待遇(当然也可能跳槽要签竞业协议,每月从老东家拿钱)。

    这种岗位的员工,在就业市场上是非常难招的,公司也会出于防止核心门槛业务技术机密泄露的目的,花大价钱留住这些核心员工,也不会培养太多懂得这些核心门槛业务技术的员工。

    有机会从事相关门槛业务技术的开发,如果跳槽到对口的赚钱的公司,就有突破年薪50W甚至100W的机会,也算是一种幸运吧。这种嵌入式领域的门槛业务技术本身的难度相对于Linux内核,Android系统框架等复杂系统而言,也不是绝对的难(毕竟大规模应用的技术,本身不可能比理论性的东西难,智商良好的大学生应该都能学会),但是轻易无法获取,会有一种神秘感。

    五、跳槽涨薪的新兴技术竞争力

    目前嵌入式相关的行业和领域,出现了很多不同于传统嵌入式领域的产品与解决方案,比如嵌入式+物联网+云端,嵌入式+大数据,嵌入式+人工智能,嵌入式+无人驾驶……

    关于这些新兴技术,也有一些争议,有些老的工程师对这些东西表示不屑,认为也不是很有技术难度和深度,就是调用一下别人做的云端或者AI的API,有很多泡沫,无法落地等等……他们觉得做嵌入式还是不能浮躁,应该踏踏实实去钻研Linux内核,网络协议栈等非常深非常难的已有技术。

    但是,火哥对年轻的嵌入式工程师往新兴技术领域发展,持支持的态度,我也相信我们公司总监说的“right time to do right things”。而且从大的趋势上看,NVIDIA公司推出的Jetson平台,AI边缘计算解决方案以及Xavier平台无人驾驶解决方案;Intel公司收购以色列无人驾驶芯片公司MobilEye;ARM公司在CPU里面做的神经网络并行矢量计算加速库,最近也大规模招聘物联网与云端项目相关的工程师;华为的海思麒麟970芯片集成AI加速单元NPU;瑞星微RK3399Pro也有NPU支持各种AI应用的部署……

    行业领军公司的布局,种种迹象表明,AI、物联网、云端+嵌入式解决方案的新兴技术,已经是大势所趋,并不像某些有经验的老工程师所说的都是泡沫,无法落地。

    所以,火哥还是建议刚入行做嵌入式的年轻人,尽量地往嵌入式+人工智能+物联网+云端的应用解决方案领域靠拢,要敢于尝试新生事物。新兴技术能够落地应用,就证明这里面并不是特别难学,也不是一定要钻研内核驱动,积累很深的东西才能学新兴技术。

    而且不难学的技术,不代表没有技术含量,技术上的东西,很多时间是在信息不对称的情况下,打一个时间差,抢到一个合适的岗位,虽然以那些老工程师的智商,应该也能学会这些新兴技术,但是他们不一定有这个时间和精力(时间成本可能是最大的成本),换行成本也比较高,所以这块更适合年轻人争取时间差,在懂得这项技术的人还不多的时候,赶快抢到一个好的位置,能够有业务上的话语权。

    从另一方面说,由于之前2节所描述的嵌入式领域业务技术上的竞争力,在传统领域,由于已经发展了一段时间,有很多行业大佬已经掌握这些传统业务的技术话语权,而且部分业务还有很大的获得门槛,必须要努力+机遇才有机会进入对应岗位做下去,靠自学很难积累。

    一旦一个领域,在你前面积攒了8年,10年甚至15年以上经验的大佬太多,并且制定了太多的行业标准和专利,你就只能被别人的业务标准和专利牵着鼻子走,很难做到很高的位置。

    这就像很多工程师说,在单片机上实现蓝牙,WIFI,TCP/IP协议栈也是很难很有挑战的,然而,做技术的目的是为了什么,花这么多精力重新实现复杂的协议栈,只是为了炫耀技术牛逼吗?在这些成熟技术的领域,已经有很多前人铺好路,有很多现成的模块和开源代码,也有很多的别人制定的认证标准和专利(所谓认证标准就是在某些市场,某些产品哪怕实现了所有功能,但是如果功能不符合一些公司制定的标准,那就拿不到认证,产品不允许在这个市场出售。

    比如音频相关的产品如何没有通过杜比认证,在很多市场就不被接受,你不得不花时间学习很多别人制定的标准,而有制定标准话语权的大佬,可以随心所欲修改标准)。所以年轻人靠新兴的技术,在嵌入式+人工智能,嵌入式+物联网+云端等领域,通过同起点,同样的学习时间,可能可以做到弯道超车,3年之内,在收入上超过那些工作8年,10年的大佬。

    当然,火哥所说的这些新兴技术领域和行业,也要根据你自身的情况因地制宜,制定学习的计划。

    首先,不是所有城市都有这些新兴技术领域的相关企业,如果你想入行新领域,可能就得做出跳槽去北上深等一线城市的决策,如果已经在二三线城市安家,要照顾家人,可能就得做一些取舍,不得不放弃这些发展计划,继续在旧的领域深耕。

    其次,第二节所说的基础技术竞争力应该放在首位。在夯实基础(不一定要达到精通,但是还是要扎实)的情况下,保证能得到面试官的对你技术底子的认可,能找到合适的工作的前提下,跳过二、三节所说的传统业务技术的学习,直接进入新兴技术领域,弯道超车。

    最后,要保持一双火眼金睛,要能够识别出你所做的新兴业务到底是真新兴,还是传统业务包了一层皮。比如有些童鞋在所谓做嵌入式+物联网业务的公司,实际上每天的工作就是用stm32单片机和NB-IOT模块,每天做一些调用单片机UART,I2C接口和NB-IOT模组通信的重复性工作,这就不算是真正的新兴业务,也不具备真正的新兴技术竞争力。

    真正的嵌入式+物联网领域的技术竞争力应该熟悉整套IOT终端到云端的解决方案架构,熟悉如何搭建部署这套系统,熟悉IOT设备与终端和云端的通信协议的核心业务逻辑。同理,在嵌入式+AI相关的公司,虽然嵌入式工程师不一定要懂得自己实现AI核心算法,但是核心技术竞争力也不是指调用别人的人脸识别闭源库函数,做简单人脸识别应用。

    火哥认为嵌入式+AI相关领域的核心业务竞争力,也是在熟悉整套边缘端到云的AI计算系统架构和解决方案,懂得一些AI算法的基本原理(不一定要自己独立能实现),各种神经网络的优劣,能对嵌入式平台的AI软件做系统级别的计算性能的加速优化,部署落地,解决客户实际应用场景中的问题,提供反馈给做AI算法的工程师,帮助他们修正训练出来的模型。

    最后也灌一句鸡汤,Right time to do right things。

    ---END---

    转载自火哥公众号 嵌入式老鸟的职场之道

    关注公众号百问科技(ID:baiwenkeji)第一时间阅读嵌入式干货。
    技术交流加个人威信13266630429,验证:博客园

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/weidongshan/p/10876668.html
Copyright © 2011-2022 走看看