一.行业
找工作时,并不光光是找职位,更重要的是找行业。不同行业中同样的职位需要掌握的知识技能是不一样的,比如同样是嵌入式驱动开发工程师,消费
电子可能主要是做BOOT,
通信设备就更看重协议和接口的实现。这样过个三五年转行的成本就很高了,因为你在这样行业中大量用到的知识另外一个行业可能基本用不到。
因此,在嵌入式的大家庭中选择一个好的行业尤为重要,就应用领域来说主要有消费电子、通信设备、安检安防、医疗电子、工业控制、汽车电子。总的来说,这几个行业都处于上升期,行业产值快速攀升,除非下一次技术革命到来,否则嵌入式还将继续长大。但如果一个个分开来,区别还是有的。
消费电子伴随着中产阶级的扩大和消费理念的强化在近几年成为成长最快的领域,从硬件到软件,从
手机到平板,再到各种智能电视,嵌入式得到迅速普及,大有把你所能碰到的东西都变成电脑的架势,据统计,消费电子五年的复合增长率高达73%,在经济低迷的2012年,国内的消费电子依然有高速的增长。但消费电子升级快、压力大,分子风光,下面分母死伤无数,极高速的增长会不会带来泡沫还需要谨慎观察。
通信设备领域主要是电信基础设施、骨干网设施等组成,其增长的原动力还是网络更好更快更广和国家相关的电信基建计划,3G、4G,LTD都是烧钱的游戏。虽然你从2011下半年开始,华为中兴两个领头羊都出现了利润大幅下滑的现象,这主要是受全球经济不景气的影响,各国纷纷缩减了投资,但在未来2-3年内,收到新一代IPV6网络和3G普及的刺激,通信设备将迎来艳阳天。
工业控制是个很稳重的领域,不像消费电子这么浮躁,也赶不上通信设备升级的速度,工业控制讲究的是实用和稳定,比方说当今大部分工业控制方法都是古老的PID,工控机还装着古老的WIN2000。工控嵌入式的增长完全和工业增长指数联系在一起,越是技术密集型的工业就越需要嵌入式软件来帮助管理,所以最近经济不景气和虚拟经济的畸形发展已经压迫到了实体工业的发展,工控的增长会是一个慢而平稳的长期过程。
安检安防也是一个近几年快速爆发的领域,源动力来源于安全和维稳。一方面是单位需要,比如小区,饭店,学校,银行,另一方面就是城市安全需要,比如交管,街道。前几年在大城市掀起的摄像头风如今广大县城也正在上演,2011是安防行业值得庆贺的一年,这一年,安防从模拟到数字、从单机到网络、从普清到高清,再加之结合“安全城市”、“智慧城市”、“物联网”等概念,虽然现在行业整体产值并不高,但未来10-20年都将是安防设备大普及年。
医疗电子的增长已进入平稳期,盖因大小医院早已完成了设备更新改造,在未来的20年内他们将很少会采购新的设备,最近五年复合增长率为15%,不过医疗电子的增长希望已经转向了便携式医疗设备,就是我们常看到的电子血压计、红外体温计,便携式血糖仪之类的设备,复合增长率为24%,产值达到近40亿美元。但说实话根据生活经验,这些便携设备家里都不怎么用,更多的还是传统设备。当然了,中国有13亿人,随着老龄化加剧和国人健康意识提高,便携式医疗电子会有一个慢慢起飞的过程。
汽车电子适合汽车紧密相连的产业,下面的导航设备,车载娱乐设备,车辆控制系统都是准标配设备,可以说是一荣俱荣,一损俱损。汽车的增长率今年是14-15%,相信汽车电子也会保持一个类似的速度增长。
应该说,每个主要领域都是有不俗的表现的,相比其他落日产业,这几个领域都有个人发挥的足够空间。
二.核心竞争力之行业经验
什么东西是不能简单复制的,只要不是书本的就是不能简单复制的。
什么是行业经验呢?我是这样认为的:每个行业都有一条长长的产业链,比如手机,从芯片销售集团或者说解决方案提供商(ARM/INTEL等+
ti/高通/MTK等+代理商)到手机设计集团(软件方面:苹果/安卓/WP等,硬件方面:苹果/三星/微软/诺基亚等)再到手机生产集团(很多就不举例了)最后到消费者,这是一条主链条。
你所在的公司一般位于中间某一级别上,这样就出现了你的上游和你的下游,行业经验就是你在你的上游,同级,下游中的形象,更简单地说,你的上游愿意与你长期有诚意的合作,你的同级钦佩你的能力和人品,你的下游认为与你合作有利有信,总之在全行业树立起你的可靠形象是最关键的行业经验,其次就是技巧性的行业经验,比如说合作流程这些可以马上学到的东西。前者将是你的行业名片,后者将为你锦上添花。
但是行业经验并不容易积累,原因在于研发人员一般是铁屁股,没有机会走出去接触行业内部,上游有采购经理,下游有销售经理,你又有项目经理管,你只是执行项目经理和架构师的指令罢了。但如果不深入了解行业,你始终只是IT民工,没有发展的机会。
我觉得,当你投身研发工作3年后,你下面应该有3名小兵,对他们来将,你就是他们的架构师,你要充分把握这一机会减少技术时间,加强学习管理。对下,你需要为你的组员合理分配工作,管理他们的情绪,激发他们的工作热情,完成既定工作。对上,你要为你们组争取利益,并能在所有组面前清楚地表达你的意见和建议,目的只有一个:露脸,使上司认为你是一个综合性的人才。
在往上走,你成为高级技术人员后,你会有很多机会和同行打交道了,比如各种学习会、交流会、展览会,和他们建立融洽的关系很重要。也多和市场销售人员打交道,他们是你在这一时期唯一能获得上下游信息的人。
再往上走,就基本定型了。你可以考虑急流勇退自己创业、也可以走行业内技术专家、也可以走技术与管理结合的路线。总之,拥有哪方面的核心竞争力,你就适合往哪个方向走。
最后我想说一句:别把自己当做机器使,让自己沉浸在技术的世界里,一天到晚干着体力劳动,合理分配技术与社交的时间非常重要,不然最后你很有可能被钉死在一个中层岗位上,更重要的是你可能孑然一身,真爱无觅,孤伴终老。
三.核心竞争力之技术经验
一个研发人员得以安身立命的根本就是技术经验。不过可惜的是,技术是很容易复制的。我曾经很自得于自己做过51/430的实际项目,但是说实话,这都不是什么核心竞争力,因为我做的项目也大量参考了网上前辈的代码,有的甚至是直接拿过来用的,我做的工作有大部分是代码的剪裁而已。而这个,我相信一个之前没有经验的电类本科生,一个月的时间也能学会。也就是说,我和他相比,只是多了一个月的优势罢了。这种容易学习,容易复制的经验,不能算是核心竞争力。你在网上找到的一切代码都只能算学习资料。
技术人员除了复制粘贴外,更应该掌握核心的原理性技术。什么是核心技术呢?就是本来没有只能由你创造或只能由你更低成本创造的技术,比如我的公司是一家从事多媒体处理的公司,我们要开发一个自动识别瞳孔的设备,核心就是瞳孔识别算法。这个算法可以从网上拿,从国外买,或者自己研发,网上的算法也许你看得懂,但如果不会优化,只会裁剪那还是白搭的,这就是原理性技术和技巧性技术的区别。从国外买成本高而且得不到源码,这样自主研发就是唯一一条路了,如果整个公司只有你有这样的能力根据客户需求从原理出发设计源码核心,那么恭喜你,你可以理所当让的拿着高薪了。
技巧性技术更多是指一种经验,一种积累。比如我积累了两年的
单片机函数库、我在调试放大器时遇到书本中没说的问题等,这些都不是在书上就能学到的内容,而拥有这些经验会让你开发的速度变快。但技巧性技术绝对不是核心竞争力,因为它可以在短期内掌握。但有人会问“IT/电子行业中有些老人随便一句指点就足够让新人琢磨个半年,这种现象是客观存在的,这个不是核心竞争力吗?”,要注意的是,老人和新人是没有竞争关系的,因为他们本来就没在一个等级上,所以这种倚老卖老的行为构不成核心竞争力,核心竞争力只能在同级之间比较。
技巧性技术可以转化为核心技术,比方说我调试放大器时遇到一个诡异的问题,我用结果反推原因,再用理论验证,再而用理论上的调整规避问题,从现象升华到本质,从知道升华到掌握,就是这么一个转化的过程。但是不是所有的技巧性技术都能成功转化,技巧性技术本质上讲就是帮助开发的经验罢了,扎实的掌握原理并能举一反三才是核心技术的源泉。
说了这么多,总结一下。核心竞争力大致分成两个方面:深入的行业经验和扎实的原理技术。前者通过时间慢慢的积累,后者可以通过密集的学习掌握,但两者也都需要长期的实践巩固加强。
四.嵌入式核心竞争力六大特点
1、嵌入式系统为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
2、嵌入式系统的硬件和软件都必须地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。
3、嵌入式系统是将先进的计算机技术、
半导体技术和电子技术与各个行业的具体应用相结合后的产物。这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
4、嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。
5、嵌入式系统通常是面向特定应用的嵌入式CPU,与通用型的不同就是嵌入式CPU大多工作在为特定用户群设计的系统中,它通常都具有低功耗、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,跟网络的耦合也越来越紧密。
6、嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。
五.职位分析
嵌入式开发涵盖硬件软件,开发链条很长,要根据自己的实际情况选择适应的职位。
嵌入式的职位大概有:
1、硬件工程师:
负责底层的硬件设计,主要要用到:
1.处理器:ARM9,DSP;Niosoll;
FPGA(用于高速特殊场合)
2.
PCB:EMC设计与
仿真;
3.通讯:IIC,IIS,SPI,UART,CAN总线;RS232、PSTN Modem、网络、GPRS通信;
2、驱动开发工程师:
负责底层和上层的通讯,主要要用:
1.系统:Linux非实时系统/VXworks实时系统+架构/文件系统;
2.内核与BOOT:内核裁剪与移植、boot loader和驱动编写,驱动程序开发
3.上层接口:USB,网口,
4.底层接口:SPI、UART、IIC、I2S,CAN、IDE
3、软件工程师:
负责上层应用软件,主要要用:
1.CPU:51/MSP430/
STM32/ARM7/ARM9;
2.外设:AD/DA、UART、USB、LCD;
3.总线和通讯接口:I2C,SPI,RS232,RS484,CAN,USB,以太网||||||BACnet、 MODBUS(或有实时性要求)
4.环境:Linux/QNX+ARM汇编;
5.GUI:VC++/VC#/
labview;
4、系统开发工程师:
负责系统架构设计
5、DSP软件工程师:
负责数字信号处理部分,主要要用:
1.CPU:固定为一个小系列(如TI DM642/648/6467、TI C6000、TMS320C5000、Freescale StarCore);
2.算法:熟悉图像、音频、视频相关处理算法很重要,要会修改和优化;
3.接口与驱动:网络协议(MAC、IP、UDP、TCP)等;
4.操作系统:架构设计和操作系统配置;
6、FPGA设计工程师:
负责高速信号处理和部分数字信号处理,主要要用:
1.语言:VHDL/Verilog ;
2.环境:modlesim、Synplify、Quartus、ISE、ispleverEDA;
3.调试:设计、仿真、调试能力;
4.算法:数字信号处理、滤波设计等算法;
5.接口:E1 Framer/Deframer、HDLC控制器、以太网MAC控制器、SDH Framer/Deframer、SDH Mapper/Demapper、SPI4.2、HiGig、DDR、PCI、PCI-E、DDR-II、HD-SDI
在一个完整的项目中,每个工程师分工合作,完成架构师分配的模块。每个职位深入研究下去的水都很深,一旦决定很难再顺利转行了,所以毕业选择职位时一定要慎重。总的来说软件方面的需求在国内更大,当然竞争也更加激烈。硬件很多是直接买国外解决方案的,所以硬件职位需求较少,但高级人才非常吃香。
另外某嵌入式er对于核心竞争力这样看:
在天龙八部中有这样的一个情节,萧远山和慕容博在少林寺强练武术套路而未潜心修习内功心法,最终导致练武不成反伤及自身的情况发生。而少林扫地僧则达到了可以摘花伤人的地步。这就可以看出,同是练武之人,抓住核心竞争力很重要。而在这里,内功就是核心竞争力。萧远山和慕容博恰恰是因为没有抓住核心竞争力,而只抓住了练武的套路,最终不仅练武不成,还导致自身出现内伤。所以,无论对于一个人还是一个企业,一定要认清到底什么才是自己的核心竞争力!而在对核心竞争力的认识上,鄙人也犯下了萧远山和慕容博两位前辈都犯了的错误。
今日在此述说一下自己的想法,但因个人阅历有限,说辞之中片面之处在所难免,望各位看官保持纪律,不要随便扔鞋和臭袜子,鄙人先行谢过啦!
嵌入式系统核心竞争力:
1、裁剪性——嵌入式系统支持可伸缩性和开放性的体系结构。
2、接口——可为设备提供 统一的驱动接口。
3、实时性——EOS实时性一般较强,可用于各种设备控制中。
4、操作性——操作简单方便,视图易学易用。提供强大的网络功能,支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。
5、稳定性——唯一指令让用户不需过多介入操作,通过系统的调用命令向用户程序提供服务。
6、移植性——更好的硬件适应性,也就是良好的移植性。
等等,以上举出嵌入式系统比较常见的自身核心竞争力。如此可以看出,2016年嵌入式开发前景一片利好。未来随着物联网科技发展,嵌入式系统将会面临着巨大的机遇和挑战,嵌入式开发工程师也将成为企业核心竞争力的重要指标之一。
下面切入正题。
先直截了当的说一个基本论点:对于嵌入式行业的研发人员和企业来说,各种性能强劲的芯片和各种各样花样百出的软件,都不是嵌入式行业的核心竞争力。好芯片和好软件,只是“工欲善其事,必先利其器”中的器,而要“善”的事,才是一个研发人员和一个企业的核心竞争力。
下面来举例说明一下。鄙人从事的是工控领域的嵌入式开发,比较典型的一个应用技术是根据一个设备运行时产生的振动的情况来分析这个设备的运行状况。这里涉及到两个部分的技术,一个是设备的振动的信号的采集,另外一个是振动信号的分析。先从一个企业来说吧,一个企业想做出这样的产品,然后在这个行业立足,那么使用什么芯片和什么传感器进行信号的采集,这绝对不是核心竞争力了。如果企业里有个会使用COTEX-M3单片机的人才,那么可以使用COTEX-M3单片机进行信号的采集,如果有个会使用ARM9的人才,那么可以使用ARM9进行信号的采集,这是可以改变的。
由此看来,振动信号的分析才是核心竞争力。但是如果仅仅做到把振动的信号使用傅里叶变换分析出几个具体的信号波形,也不能构成核心竞争力,因为傅里叶变换技术是随便一本振动信号分析的书里都有的东西,拿来就用,这也只是一个工具。而且,做这种信号的变换的软件也有很多,可以用
matlab,可以用组态软件,也可以用LABVIEW,企业想做不同的界面,只要招聘不同的人才便可,这构不成核心竞争力。而倘若能够通过采集到的振动信号分析出这台设备的每一个重要的零部件的具体数据信息,然后判断出这台设备中各个零部件分别工作的状态如何,这才能构成核心竞争力。当然,这是书上没有的东西,是需要企业自己进行研发的技术,这也是其他企业无法抄袭的东西。
从以上对企业的分析中可以看出,对于一个嵌入式研发人员来说,核心竞争力不是你会使用什么高级的芯片,或者你会使用什么先进的程序设计语言或者软件。从以上的分析可以看出,对于一个研发人员来说,核心竞争力也是信号的分析技术。至于原因,不再赘述。
另外再举一个例子。
现在炒的比较火的一个无线应用是“物联网”,在这个物联网中,其核心的东西是无线技术,而适合于“物联网”的无线技术首推ZIGBEE无线网络。对于ZIGBEE技术来说,其核心竞争力是什么呢?由上面的分析可以轻易得出结论,ZIGBEE网络构成的算法就是其核心竞争力。因为ZIGBEE的协议是公布出来的,大家都看得懂;而各种无线通信的芯片和
电路也都是琳琅满目,可以尽情选择;而怎样通过这些无线芯片实现ZIGBEE网络,才是其核心。拥有ZIGBEE网络协议算法技术的企业,已经在无线领域迈出一大步,比如目前在国内做的比较火的DIGI公司推出的XBEE无线模块。对于个人来讲,道理是一样的。你会用无线芯片,别人也会用,这都是可以通过书学会的东西。但是,如果你自己研发出来了ZIGBEE网络的协议堆栈,那么这个就是别人无法从书上去学的东西了,这就构成了个人的核心竞争力。
当然,这里并不是说工具不重要。对于个人来讲,会使用一款芯片或一款软件,乃是安身立命的基础,也是实现核心竞争力的基础。而对于企业来说,道理是一样的。所以在嵌入式行业,必须做到内外兼修,方能成大业。
最后
无论对于企业还是个人,做到在外修武术套路,方能安身立命;做到在内修内功心法,方能称霸一方。所以一定要兼修内功心法和武术套路,如此方能称霸于武林,有资本参与华山论剑!
另外,著名嵌入式工程师火哥对于嵌入式行业核心竞争力的看法:
相信很多刚入行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算法的工程师,帮助他们修正训练出来的模型。
天龙八部想必各位一定不会陌生,或许你看完了仅仅过了眼瘾,不过这位同学在看电视的同时结合自己的行业悟到了一些嵌入式er核心竞争力的问题。一起来看看。
另外,著名嵌入式工程师老石也对FPGA工程师的核心竞争力进行了讲解:
老石认为,这个问题其实可以引申为以下两点:
1、什么是只有FPGA工程师能做的
2、作为FPGA工程师,我们应该如何培养这些能力
接下来就是老石的解答。
什么是只有FPGA工程师能做到的
对于上面提到的一些回答,的确是FPGA工程师不可或缺的能力,但老石总觉得没有说清楚这个问题的本质。
首先给出老石的回答:FPGA工程师最核心的就是全栈能力。
这里的全栈,指的是系统级的软硬件全栈能力。它既包括了在系统层面的架构设计、芯片开发的前后端流程,也包括了软件设计的全栈流程,甚至还有后期的项目维护、技术支持、与客户的沟通等等软技能。它可以看成是综合多种技能的技能树。
老石随手写了一下FPGA工程师的全栈技能树,见下图,尽管很不完整,但仍可供大家参考。之前很多人提到的,诸如调试与分析的能力,其实是这个全栈技能树里的一片树叶,或一个分支。
只有FPGA工程师能做到一人成团,在短时间内将想法落实到高质量的软硬件系统实现。这是其他系统架构师、ASIC工程师、单片机工程师、软件工程师等等都无法单独完成的。与这些工程师相比,FPGA工程师有着很强的单兵作战能力。当然,技能树过于庞大也是为什么很多人认为FPGA难学的本质原因。
有人会问,为什么其他类型的工程师没有这种全栈能力,或者换句话说,为什么只有FPGA工程师才能做到全栈?这和FPGA本身的特点有关。
在下图中,老石对比了FPGA与ASIC、CPU(或单片机)的特点与主要开发方式和风格。
对于传统的IC工程师而言,他们的具体职责可以大致分成前端和后端两部分。前端主要负责逻辑实现,后端负责芯片物理实现。两路人马通常有各自的技能树,需要互相配合才能完成产品级的芯片,这个过程往往很久,而且伴随着巨大的前期投入和风险。
对于单片机或CPU工程师而言,更多的是基于给定的单片机架构和API,使用诸如C或C++的高层语言编写应用程序。如果要写出高质量的应用,固然需要了解目标芯片的硬件结构,但并不需要对硬件的逻辑实现有过多了解。虽然基于CPU或MCU可以灵活实现各种应用,但由于架构限制,在很多诸如人工智能的应用领域里并不能达到很好的性能。
FPGA很大程度上结合了两者的优点。在硬件方面,FPGA底层架构固定,因此不需要做太多芯片后端的工作,但仍需要FPGA工程师掌握时序优化、面积优化、功耗优化等后端技能。因此一个优秀的FPGA工程师凭借自身的前后端与软硬件技能,就可以完成一个完整的而且质量比较高的FPGA项目。
软件方面,FPGA可以灵活定义API与软件架构,并可以通过内置的处理器内核完成软硬件协同开发,这样也能兼顾应用的灵活性。因此,一个优秀的FPGA工程师通常也具有优秀的软件编程能力。
在系统层面,FPGA工程师可以自定义软硬件整体架构,不会像CPU或单片机一样存在明显的架构瓶颈,也不会像ASIC一样需要考虑过多底层电路单元以及工艺的具体实现。
综上,只有FPGA工程师能拥有软硬件系统的全栈能力,这也是FPGA工程师的核心竞争力。并且,这种能力可以在工程实践中不断自我丰富和提升。这使得优秀的FPGA工程师不需要太过依赖其他人,能够自己或少量人很快完成完整的系统级方案。
现在很多AI初创公司选择使用FPGA作为硬件平台的主要原因之一,就是看中FPGA工程师的全栈能力,使得公司能在较少投入的情况下,取得性能、灵活性、可扩展性等多个方面的良好平衡。
全栈能力是FPGA工程师需要的完整技能树。至于很多答友提到的调试和debug能力,更多的是在回答这个技能树的技能点分配问题。这就是老石要讲的第二个方面:
作为FPGA工程师,我们应该如何培养这些能力
相信很多人会问,老石你说的这种全栈能力,究竟是不是在画大饼吹牛逼?在实际生活中,到底是不是真的有人能全部精通技能树中的所有分支?老石的答案是,虽然很少,但确实有这样的大牛,而且老石有幸和他在一个团队里工作。
一般来说,如果一个FPGA工程师能在这个FPGA技能栈里精通某一项,就可以成为这个领域的大牛和权威。比如,像很多人提到的,如果你特别会调板子,硬件调试能力很强,那你就可以很好的负责项目中的硬件测试环节。再比如,你RTL写的很好,或者验证很强,或者对系统架构有很深的理解,你都能在项目里成为不可或缺的人。
但是,在老石所在团队里就有一位带头大哥,可以从系统架构、模块设计、验证、系统整合、FPGA后端优化、硬件测试、软件开发和调试等等全部环节一个人搞定,可以说是点满了技能树上所有的技能点。
这样的人就像阿里的多隆,一个人可以顶一支团队,公司缺他不可。因此如果一个FPGA工程师能够获取软硬件的全栈能力,将是团队乃至全公司的最主要竞争能力。
作为一个新人,应该如何培养自己的FPGA全栈能力呢?其实,带头大哥的技术功底也并非通过一天练成的,最重要的是时间的积累,不断的钻研以及真正的兴趣。这些道理在任何行业都是一样的。一开始可以先重点突破技能树的某个分支,但最终的目标还是要让整个技能树枝繁叶茂。
此外,工程师需要的软技能也是不可或缺的,例如独立思考的能力、沟通、写作以及良好的英语等等。