目录
编辑自:
工作了好久,终于有时间写这篇文章了。写这篇文章的原因是经常有人问我关于转行嵌入式的问题。一开始我很乐意回答这些问题,但是这些问题的答案都差不多,工作太忙也没法回复大多数人的私信,所以打算总结一下自己从电气转行到嵌入式的过程,包括个人对在这个行业发展的一些规划和建议。作为一个刚入行的新人,本文仅代表个人观点,欢迎各位同仁多多批评指正。
你为什么想改变职业?
长期关注我的朋友应该知道,我之前的工作是电气工程师,主要从事 PLC、HMI 编程。从 2017 年毕业以来一直从事这个行业,在转行前几乎已经触及行业薪资的天花板。但考虑到以下几个方面,我还是打算为自己另谋出路。
1. 工作环境问题
那么PLC编程的工作环境是什么样的呢?一般都是在郊区的各个工厂里。相信大家脑子里都有一幅画面,当时我们在那种脏乱差的环境中,拿着电脑对着一堆铁疙瘩编程,有时候现场连个坐着的地方都没有。我就不多说了,就看我当时的朋友圈吧(其实很多工厂不允许拍照,所以给不了大家更真实的画面,可能超出你的想象)。
2. 无休止的出差、加班和混乱的作息时间
做过这个行业的人都知道,出差是不可避免的,基本上项目在哪里,家就在哪里,我曾经连续出差了六个城市,几乎三个月没有休息过。而且电气工程师的出差跟其他行业不一样,前面说了工厂一般在郊区,其他行业出差都是住酒店(比如我哥是审计师,出差总是住高档酒店),我们出差很难找到酒店,大多数时间都住在厂里的员工宿舍,生活条件可想而知。还有上班时间,没有项目的时候就是正常的朝九晚六+两天休息,每天在办公室吹空调、做文件,很舒服。但是一旦出差去做项目,基本就是807模式。 早上七八点左右你就会在流水线旁边守着,晚上至少九点以后才能离开,甚至通宵达旦。说实话,我还没经历过几次正常的通勤,就被分配了各种项目。长期出差的另一个坏处是,你会与社会有些脱节。我可以说,在我工作的这几年里,我几乎没有朋友,也没有什么娱乐活动,我甚至一年能打不到三次我最喜欢的篮球。我还患上了不少疾病(长期饮食和作息不规律导致了肥胖和轻度脂肪肝)。
3.工作压力大
PLC编程一般都是乙方公司来做的,无非就是两类:非标设备公司和方案公司。这两类公司我都工作过。做非标设备的公司还好一些,至少机械工程师都是自己家人,可以面对面沟通解决问题。但如果是方案公司,就相当于某个项目的电气外包。面对一些其他公司设计的设备的编程,一旦运行出现问题,甲方不会管是结构问题还是加工精度问题,会把责任推到电气工程师身上,让电气去解决。很多时候是机械精度加工不到位,也可能是设计不周到,但硬件是非标设备,一旦做出来就不可能再修改,所以甲方会让电气工程师改程序,尽量通过软件来弥补硬件的不足。说实话,电气工程师能解决的问题,一般自己都能解决。 如果解决不了的问题只能从机械层面去解决,但最后都是你的错,甲方还是会怪罪我们技术水平差。
4. 薪资上限低,行业前景不佳
从事工控的都是制造业,相信大家都知道制造业的现状,无论是薪资还是职业前景,都不如其他行业。虽然这个行业确实是年纪越大越吃香,但是30岁以后,谁受得了这种四处奔波、熬夜的生活,谁不想结婚生子,过上安稳的生活呢。问题是这个行业根本不会让你轻松,公司也不会给你提供退休福利。
考虑到以上原因,以及我自己的其他因素,我开始在其他行业寻找出路。
为什么选择嵌入式
有了转行的想法之后,我开始收集自己感兴趣的行业的相关信息,比如前端、后端、嵌入式、APP开发等计算机相关的行业,甚至平面设计、金融、自媒体、电商、销售等与技术岗位不相关的行业,我一一了解了一下。
那么为什么会选择嵌入式呢?其实我也纠结过,前后端、APP开发等技术岗位都行,但觉得自己年纪比较大了(当时我已经27岁了),担心毕业找工作的时候竞争不过同年的应届毕业生。我也考虑过平面设计或者视频剪辑。大学的时候为了接这样的兼职,我还学过PS、PR、AE等软件,所以当时确实留有这个想法。至于金融行业,人们看重相关专业的学历,所以我就过了;电商行业起薪不高,需要长时间积累,所以我直接过了;自媒体行业耗费的精力和成本很大,也不一定是一分耕耘一分收获,可以尝试做份副业;销售行业,除了顶级的销售,至少80%的人拿的都是底薪。 毕竟,80/20 规则在任何地方都适用,所以我通过了。
所以我最终选择了嵌入式
首先我个人很喜欢将软件和硬件结合起来实现某些功能所带来的成就感,哪怕是一个在专家看来微不足道的小玩意,我还是会很享受,因为是自己做的。B站UP主智惠君也对我影响很大(毕竟他是真正的天才,很羡慕他的能力)。
其次跟我大学学的专业(电气工程及其自动化)有一点联系,学过C语言编程、微机原理、单片机,从岗位的专业相关性上来说,还是有一定联系的。
第三,我曾经在一家小家电公司实习过两个月,所以算是有一些单片机相关的工作经验。其实这里面还有一个小插曲,早在我毕业的时候,我这个应届毕业生就可以进入嵌入式行业了,当时已经收到多个单片机、Linux应用开发的offer了。然而就在我准备开工前一周,却被一个比我大几岁的学长截胡了,他是一家非标设备公司的工程部经理,也算是小有成就了。他想让我和室友去他那里干,先在基层当一段时间技术员,再调到工程部当助理工程师(后来我学长没画饼,我们都被调到了工程部)。当时我就在想,与其进入一个不太熟悉的行业,还不如去一个跟专业比较相关的行业,还有人带,这样岂不是水土不服?于是我就顺利入坑了。 事实证明,那时的我还是太年轻。
最后当然就是薪资问题了。之前也说了,转行前我已经触及到行业的天花板,一年下来,月薪大概20K左右。转行后也考虑过收入降低的可能,但考虑到后续的职业规划和发展,初期的降薪还是可以接受的。嵌入式技术的起薪可能没有Java等技术高,但在很多行业也是很不错的水平了。
总结来说,我觉得选择行业最重要的是自己的兴趣,兴趣是我们选择职业规划最基本的标尺,选择自己感兴趣的职业,才能充分发挥个人实力,才能乐在其中,至少我就是这样的人。
转行前先学习
确定转行方向后,我就开始着手准备。对于自己不熟悉的技术行业,我以当时入行的电子工程师为参考,在入行前做好规划。第一件事是了解嵌入式系统的岗位细分,要了解嵌入式系统具体有哪些岗位,每个细分岗位具体做什么工作等。这不仅对选择研究方向有帮助,对未来的职业规划也很有帮助。第二件事是针对不同岗位,对需要学习的内容进行分类。确定大方向后,制定最短的学习路径。
经过一段时间的资料收集,我大致把嵌入式分为四个方向:单片机开发,Linux应用程序开发,Linux驱动开发,Android系统开发。
至于职场中的职位或者不同公司中的不同头衔,我也总结了一个表格,对应四个方向不同的职业定位。
这里我就简单说一下四个方向的就业要求,学习内容,以及我自己的学习路径和方法。
1. MCU开发
这类职位的要求比较统一,就是熟悉C语言,熟悉单片机原理,熟悉C51、ARM等8位、32位单片机开发等。至于会用PCB画图软件、能独立设计单片机外围电路等要求,个人认为这些太偏向硬件了,不应该放在软件开发选项里,或者说这些是简历和面试的加分项。一般要求多、要求复杂的公司基本都是小公司,软件硬件一两个人搞定,建议想转行的就不要去了。
好了,知道了基本要求之后,就可以开始规划学习路线了。最基础的就是C语言了,我看过很多人的C语言课,推荐浙江大学翁凯老师的《C语言程序设计》,可以在MOOC或者Bilibili上免费学习。也有人推荐郝斌老师的C语言,也很不错。我大学的时候看过郝斌老师的C语言课,但是最大的缺点就是现有的视频质量和上课用的软件,实在是让人望而却步。大家可以选择自己喜欢的来学。
掌握了C语言之后,就要开始学习单片机了。这里需要分为有没有电路基础,如果是没有电路基础的新手玩家,可以买开发板来学;如果有一定的数字电路基础,可以考虑最小系统板+面包板+外围电路的组合。不过转行时机紧迫,考虑到时间成本,也可以直接用开发板来学。这里不得不提两款经典的单片机——C51和STM32。针对这两款单片机,有人建议不要学C51,直接学STM32,我不同意,我建议先从8位的C51单片机入手,因为C51单片机简单易学,功能齐全,网上也有很多开源资料可以参考,可以在短时间内学会,并获得成就感。 其实在转行的过程中,更重要的是稳定自己的心态,获得成就感,因为这会让后面的学习更有动力。
学完C51之后,我开始学习STM32,当然从学习时间上来说,STM32比C51难学很多。但也不代表要全部掌握才能找工作。我的理解是,当你学的差不多了,可以做一些小项目,比如温湿度监控系统,循迹避障小车等,虽然不怎么样,但内容够多,也体现出开发能力至少不错,那么找一份单片机开发的工作也是没问题的。就算工作中不用C51也不用STM32也不影响,因为开发逻辑都是一样的,毕竟可以举一反三。当然,最好能学会在STM32上运行RTOS,做一些任务。虽然市面上的单片机大多都是裸机开发,但懂得使用RTOS也是一个加分项,甚至是一些岗位的必备条件。
至于看谁的视频,C51可以考虑郭天祥的《十天学会51单片机》,如果觉得画质不好或者视频太长,也可以选择看江科大科协的《C51单片机入门教程》。STM32我只建议找这两家公司的课程和板子:正点Atom和野火,选一个就可以了,买板子也有课程,如果觉得太贵,也可以看铁头羊自己搭建。以上视频在Bilibili上都有完整版。
至于数字电子学、模拟电子学、电路板绘制方面的知识和技能,我觉得可以等进入行业之后再深入学习。
2.Linux应用程序开发
这个方向的工作最多,包括音视频、智能家居、网络安全等等。但是基本的要求比较统一,要求懂Linux系统环境软件开发,熟练掌握C语言,熟悉Linux操作系统,了解ARM芯片上的交叉编译,熟练掌握Linux下的多线程、多进程、内存共享、网络通信、信号处理、IO操作等编程技能。以上是不同Linux应用开发的共同要求,因此学习的方向也随之揭晓。值得注意的是,在对Linux应用开发的要求中几乎没有提到硬件(即使有也是非常少见的),所以在学习的过程中,我们甚至可以不需要硬件知识就可以学习,这也是我特别推荐的一个转行方向,因为据我所知,很多Linux软件工程师并不懂单片机,有些工程师大学时是学软件工程专业的,基本没有接触过硬件。
这部分我是买课程自学的,但是对于时间紧,经济条件好的朋友,我还是建议去线下机构培训,因为这个方向的学习路线太复杂了,一旦没有规划好学习地图,很容易走弯路。第一是C语言部分,这个是必备技能,不做过多讲解。第二是Linux系统下编程,这部分的学习量很大,大致是文件操作,进程,线程,内存共享,信号,网络等。最后学一块ARM结构的嵌入式开发板,结合之前学过的知识做一些DIY的小项目。这是我自学的学习路线,根据几家培训机构的培训目录总结出来的,仅供大家参考。
现在有了学习路线,那怎么学呢?很简单,看视频。对于初学者来说,看视频是最快的学习方式。一个视频可以反复观看,可以暂停,可以加速。我的学习方式是先简单看一看,记下几个重点信息(我习惯用草稿纸),然后回头再看有代码的部分,把代码复制过来,看能不能实现跟视频一样的功能。然后不看视频,不复制代码,重新敲一遍,实现功能。如果代码能实现相应的功能,说明这个知识点掌握了,就到了最后一步:输出总结。大家可以看我之前的文章,都是我在学习过程中的笔记。这些笔记在后面会起到很重要的作用,特别是后面的面试阶段(后面我会在其他文章里详细讲解)。那么学习嵌入式系统需要看书吗?答案是需要的,但是不应该在初学阶段,目前很多嵌入式系统的经典书籍并不适合初学者。 毕竟书的内容会比较严谨,不会像那些面向初学者的视频那样容易理解。比如业界宝藏书《Unix环境高级编程》就涵盖了Linux应用开发的所有内容,需要你边看书边敲代码,慢慢在Linux上实验、调试,看完整本书之后,大部分Linux应用工程师都会比这本书厉害。这本书也讲解了大部分Java程序员和C++程序员之间的差距。但是这本书内容太多,需要花很多时间去消化,无法帮助大多数人快速入门,只适合初学者做进阶学习,所以不建议初学者看书。
既然不建议看书,那看谁的视频呢?这里推荐几个。如果想快速入门,快速掌握嵌入式技能,可以去抖音找上官可编程,购买课程之后还会送配套的硬件,虽然内容比较简单,但是学完找工作还是没问题的。如果时间充裕的话,推荐魏东山老师的课程,Linux的内容讲的很透彻,魏东山老师的课从不废话,满满都是干货,但是学习者要有一定的基础。当然这些都是建立在自学的前提下,如果自学能力差,自律性不够的话,我觉得还是去培训机构吧,但是比较贵(大概两三万,学习半年,还不包括食宿)。华清远见是一个选择,但是华清远见是所有机构中最贵的。 如果没有经济能力就不要考虑了。
3.Linux驱动开发、Android开发
我把这两个放在一起说主要是因为个人觉得这两个岗位不太适合新手或者非专业人士。
先说Linux驱动开发。内核驱动用于Linux底层的开发,是嵌入式工作中比较难的一个部分。一般公司招聘驱动开发岗位时,都要求工程师有3~5年的应用开发经验,需要非常熟悉Linux内核机制、驱动程序、用户应用程序接口,掌握系统在设备上的并发操作。其实内核和驱动是两个岗位,内核至少需要熟悉两个以上的内核子系统,难度很大。目前的Linux内核有1.3万个.c文件,1300万行代码,能看懂其中一部分的都是大佬。主要是系统移植、内核优化、提高子系统级性能。驱动也需要熟悉内核,深入了解驱动架构、文件系统、进程管理和内存管理,熟悉字符驱动设计和分层分离思想。主要是新产品平台开发和底层驱动设计维护。 所以不建议新手或者转行的人选择这个方向。这里的新手包括刚毕业的学生,作为刚毕业的学生,你没有相关的工作经验,每天面对一堆内核源码和芯片手册(纯英文),面临的压力很大。当然大厂是个例外,一般大厂工资比较高,有导师指导,所以刚毕业的学生可以尝试一下。
说起Android开发,可能有人会误解就是开发Android应用。其实不然,Android应用并不是用C语言开发的,一般都是用Java之类的语言。这里的Android开发指的是Android手机应用操作系统、游戏、以及Android平台各项功能的开发。Android工程师指的是从事Android手机应用操作系统、游戏、以及Android平台各项功能的应用、开发、测试的技术人员。主要针对的是手机开发,包括但不限于手机操作系统、手机游戏、以及其他手机功能的开发与优化。由于我对这个职位不是很了解,这里就不教大家怎么做了。
至于驱动开发课程,全网唯一推荐的就是魏东山老师的,因为工作需要,购买了魏东山老师的驱动课程,目前还在学习中,感觉课程非常好,以后会继续分享学习心得。
我的学习过程
在综合考虑了自己的时间和条件后,我的第一选择是Linux应用开发,第二选择是单片机开发。确定了方向,我就开始制定学习路线。整个自学过程大概需要5个月左右。其实前两份工作我都没有辞职,经常要忙于公司项目,所以学习是断断续续的。后来想想,不辞职的话,只要有项目做,就没法学习,学习进度只会被耽误,耽误转行的时间。于是就辞去了工作,在出租屋里隐居学习。我的学习过程大致可以分为三个阶段。
第一阶段:学习C语言。因为大学时教单片机的时候学过C语言,所以对我来说不算难,大概一个月就学完了。其实本来可以更快的,但是那时候我还没辞职,每天下班回家大概十点多,所以没有太多的时间去学习。我觉得这个阶段学会增删查改链表就够了。我最开始学习的软件是用Dev C++,后来为了适应Linux的VIM,在Windows系统下使用了Notepad++和MinGW的组合。那么怎么测试自己的学习成果呢?当然是做一些DIY的小项目了。学完链表之后,我做了一个学生信息管理系统,还有贪吃蛇的小游戏,这两个以后我会单独写一篇博文。所以到这里,我的第一阶段的学习就结束了。
第二阶段:学习Linux。这个阶段我用了两个多月的时间。学习方法和过程上面已经说了,这里就不再赘述了。学完之后,我基于树莓派实现了一个简单的FTP云盘和一个智能家居。其实学完这个,我基本上就可以出去找工作了,但是当时还是没自信,所以就有了第三阶段。
第三阶段:单片机。这个阶段我只用了一个月的时间,学习了C51和STM32的基本函数,使用了Arduino。基本上就是用这三个单片机完成了点灯,驱动LCD1602,输出PWM控制舵机,模拟IIC波形和SPI波形点亮OLED屏,实现基于uart的MODBUS协议等,在STM32上移植了FreeRTOS。做了超声波传感器垃圾桶,温湿度检测仪,智能遥控小车等。
完成我的“三步曲”后,我用了两周的时间简单学习了数据结构和算法,同时准备了简历和面试,转行前的自学就此结束。
关于采访
4月中旬到五一假期前这段时间,是我投简历面试的时间,投了20多家公司,收到了19家公司的面试邀请,最后当场拒绝了4家,因为工作地点太偏僻或者工资太低(通勤时间超过1小时,工资在12K以下的直接被拒),但还是拿到了8个offer(出乎意料)。
我身边有些朋友跟我年龄差不多,大概 27、28 岁,他们担心这个年龄转行会不会被接受。其实我也考虑过这个问题,当时的想法是先进入这个行业,进入行业之后再考虑细分方向。对于年龄较大的转行者来说,跟应届毕业生相比,其实没有太大区别,都是零工作经验,唯一比应届毕业生有的优势就是有工作经验,这个在任何行业都是通用的。
面试前一定要做好充分的准备,毕竟不经常跳槽,所以面试机会没有那么多,可以把前几次面试当成一次尝试,习惯面试的感觉。面试时多注意面试官问的问题,特别是一些你没有回答好的问题。回家后做个总结,方便下次面试。面试还有一点很重要,就是要诚实,如果你面对的面试官是行业资深人士,他一眼就能看穿你包装的东西(我曾经就是面试官)。如果你运气不好,遇到素质差的面试官,那这次面试基本就被他控制了,你就会不断被刁难。当然,如果我是公司有这样的人,我是不会去的。所以我自己面试的时候,会主动解释我之前的职业,为什么转行,为什么选择嵌入式等。简历上的项目不要包装,要主动解释是非商业项目,是自己DIY的。 这样做的目的是因为我看到别人做到了,自己也想做到。如果你这样解释,只要面试官是个正常人,他就会觉得你很真诚,为了转行也付出了很多努力,学习能力也不差。只要第一印象好,即使后面面试不顺利,面试官也会觉得情有可原,毕竟他会明白你需要在短时间内转行。
关于面试的一些详细问题我会另外写,这里就简单说一下。
后续发展计划
在进入嵌入式行业之前就知道这是一个一生都无法填满的巨大坑,所以安排好后续的职业规划很重要。
我目前从事的是Android系统驱动开发,业务内容是电机驱动、OTG、USB和PMIC。说实话,跟我入行前的规划有些不一样。我原本想找一份Linux应用开发的职位,等三到五年的学习和积累经验后,会考虑要不要转行做Linux驱动开发,毕竟驱动开发难度还是比较大的。不过,这一轮面试下来,我最终还是阴差阳错地做了驱动开发,一方面是薪资的吸引力,另一方面是想尽快入行。
关于接下来的三年的研究计划,这与我以前的想法并没有大不相同。 AOHUA的“ Linux设备开发详细说明”,并同时学习,我将根据我的需求学习面向对象的编程语言。 UIT,模拟电路等。
在这里,我在采访时借用了Zhihui的话:如果您想进行嵌入式开发,您不仅要专注于您面前的小技术,否则很难获得良好的成绩。