关于我转行嵌入式的那些事
文章目录
- **为什么想转行了?**
- **一、工作环境问题**
- **二、无休止的出差加班和混乱的作息时间**
- **三、工作压力大**
- **四、薪资上限低,行业前景差**
- **为什么选择嵌入式**
- **转行前的学习**
- **一、单片机开发**
- **二、Linux应用开发**
- **三、Linux驱动开发和Android开发**
- **我的学习过程**
- **关于面试的那些事**
- **后续的发展规划**
已剪辑自: https://zhuanlan.zhihu.com/p/585528663
忙活了很长一段时间,终于有空来写这篇文章了。写这篇文章的原因是,在后台经常会有人问我关于转行嵌入式的问题,起初我都很乐意回答这些问题,但是这些问题的答案都差不多,而且工作实在太忙,不能回复大部分人的私信,所以打算总结一下我从电气转行嵌入式的过程,包括我个人在这个行业发展的一些规划和建议。作为刚刚入行的小白选手,本文仅代表我个人愚见,欢迎同行的大佬可以多提意见和建议。
为什么想转行了?
关注我比较久的小伙伴应该知道我是之前的工作是电气工程师,主要以PLC和HMI编程为主。从2017年毕业后,就一直做这个行业,转行前也差不多摸到了行业薪资的天花板。但是考量了以下几方面,我还是打算给自己另外找一条出路。
一、工作环境问题
那么做PLC编程的工作环境在哪呢?一般都是在郊区的各种工厂,那么工作环境如何,相信大家脑海都有画面了。我们就是在那种脏乱差的环境中,带着电脑面对着一堆铁疙瘩编程,有时候现场连个能坐的地方都没有,不说了,看我当时的朋友圈(其实很多工厂不给拍照,所以不能带给你们更真实的画面,可能超出你们的想象)。
二、无休止的出差加班和混乱的作息时间
做过这行的都知道,出差是避免不了的,基本就是项目在哪,家就在哪,我曾经一次出差连续跑了六个城市,差不多三个月无休。而且做电气工程师的出差和其实行业的出差不同,前面说了工厂一般在郊区,别的行业出差住酒店(比如我弟是做审计的,他出差都是住高级酒店),我们出差连旅店都很难找到,大部分时间都是住工厂的员工宿舍,居住条件可想而知。还有就是工作时间,没做项目的时候,就是正常的朝九晚六+双休,每天在办公室吹吹空调、做做文档,惬意得很。可一旦出差做项目基本是807模式,早上七八点左右就在流水线旁边守着,晚上起码九点后才能走,甚至通宵。说实话,我还没体验过几次正常的上下班,就会被安排各种项目。长期出差带来另一个弊端就是,你和这个社会会有一定的脱节,可以说我从业的这几年里,几乎没有朋友,也没有什么娱乐活动,就连最喜欢的篮球一年都打不了三次,还落下了一身病(长期饮食和作息不规律,导致现在肥胖和轻度脂肪肝)。
三、工作压力大
做PLC编程的一般都是乙方公司,无非就两类:非标设备公司和方案公司。这两类公司我都待过,做非标设备的公司还好一点,起码机械工程师是自家人,还能面对面沟通解决问题。但是如果是方案公司,就相当于某个项目的电气外包,面对一些别的公司设计的设备编程,一旦运行有问题,甲方不会管这是结构问题还是加工精度问题,都会把锅扣到电气工程师头上,让电气来解决。很多情况就是机械的精度加工不到位,也可能是设计时考虑不周到,但是硬件这种东西,又是非标准设备,一旦做出来就不可能去修改,所以甲方就会让电气工程师来改程序,试图通过软件来弥补硬件的不足。说实在的,电气工程师能解决的问题一般都自己解决了,要是解决不了的问题只能从机械层面解决,但最后都是你的锅,甲方还会屌我们技术水平差。
四、薪资上限低,行业前景差
做工控的都属于制造业,那目前制造业是什么现状想必大家都很清楚,不管是薪资还是职业前景,跟其他行业相比差的不是一点半点。尽管这一行的确越老越吃香,但是当年龄到了三十岁之后,谁还受得了到处奔波、彻夜不眠的生活,谁还不想娶妻生子、安稳生活。问题是这个行业不会让你有半点松懈,公司也不会给你养老。
综合以上各种原因,也包括自身的其他方面的因素,我开始寻求其他行业的出路。
为什么选择嵌入式
有了转行的想法后,我开始收集我感兴趣的行业的相关信息,例如前端、后端、嵌入式,APP开发等计算机相关的,甚至平面设计、金融、自媒体、电商、销售等与技术岗不相干的行业我都一一去了解了一下。
那么最后为什么选择嵌入式呢?其实也纠结过,前后端和APP开发等技术岗都还好,只是我感觉我年龄相当大了一些(当时已经27岁了),担心学成再去找工作,竞争不过同年的应届毕业生。平面设计或者视频剪辑等也有考虑过,大学时为了接此类兼职,还专门学了PS、PR、AE等软件,所以当时这个想法还确实保留了。至于金融行业,人家看重相关专业的学历,PASS;电商行业,起步薪资不高,需要长时间累积,直接PASS;自媒体行业,耗费大量精力和成本,也未必是一分耕耘一分收获,做个副业可以尝试;销售行业,除了头部销售,拿底薪的至少八成以上,毕竟二八定律到哪都是成立的,PASS。
所以我最后选择嵌入式
首先,我个人是非常喜欢那种软硬件结合实现某些功能所带来的成就感,哪怕是一个在内行人士看起来是个很不起眼的小玩意,我也很享受这个乐趣,毕竟这是我自己DIY的。这一方面受到B站UP主稚晖君的影响也是比较大的(毕竟人家是真的天才,属实羡慕他的能力)。
其次,我大学所学专业(电气工程及其自动化专业)有一点点的联系,学过C语言编程,也学过微机原理和单片机,从岗位的专业相关性来看,算是沾上了点边。
第三,我曾经在一家小型的家用电器公司实习过两个月,也算是有一点单片机相关的工作经验。其实这里还有一个小插曲,早在毕业的时候,我本可以以应届毕业生的身份进入嵌入式行业,当时我已经收到了有关单片机和Linux应用开发的多个offer。然而在我准备去入职的前一周,我被一个比我大几届的师兄截胡了。他在某家非标设备公司做工程部经理,也算是小有成就了。他想让我和我舍友一起去他那里工作,先在基层做一段时间技术员,然后再调到工程部做助理工程师(后面我师兄确实没有画饼,我们都被调到工程部了)。当时我就在想,与其入行一个不是很熟悉的行业,不如到一个与专业更相关的行业,而且还有人带,这不能混的风生水起?于是我就顺利入坑了,事实证明,当年还是太年轻了。
最后,当然是薪资问题。前面我说了,我在转行之前算是摸到行业的天花板了,一年下来,差不多每个月有20K左右。转行后我也考虑过会降低收入的情况,但是结合后续职业规划和发展,前期的降薪是可以接受的。嵌入式的起始薪资可能不如做Java等技术的高,但在众多行业也算是很不错的水平了。
那么综合以上,我觉得选择行业最重要的还是自己的兴趣,兴趣是我们选择生涯规划最基本的标尺,只有选择从事自己感兴趣的职业,才能发挥个人的全部实力,并且乐此不疲。最起码我自己是这样的人。
转行前的学习
确定好转行方向后,就开始要做转行前的准备了。对于自己不熟悉的技术行业,我以当时入行电气工程师作为参照,做了入行前的规划。首先是嵌入式的岗位细分,了解嵌入式具体有什么岗位,各中细分岗位具体做什么工作等等都要了解清楚,这不仅对选择专研方向有帮助,对未来的职业规划也有帮助;其次是归类不同岗位需要学习的内容,确定好一个大致的方向后,制定一个最短学习路径。
经过一段时间的资料收集,我大致把嵌入式分为四个方向:单片机开发、Linux应用开发、Linux驱动开发、Android系统开发。
至于职场的岗位称呼或者是各个公司不同的title,我也总结了一张表格,对应四个方向的不同职场定位。
这里我简单谈一下四个方向的就业要求、学习内容、以及我自己的学习路径和方法。
一、单片机开发
这类岗位的要求比较统一,就是熟悉C语言,熟悉单片机原理,熟悉C51,ARM等8位、32位单片机的开发等。至于会使用PCB绘图软件,独立设计单片机外围电路这类要求,我个人觉得这些都太偏硬件了,不应该列入软件开发的选项中,又或者说这些是简历和面试的加分项。一般要求多而杂的基本是小公司,软件硬件都是一两个搞定,建议转行的别去。
好了,知道基本的要求后,就可以开始制定学习的路线了。最基本的就是C语言,我看了许多人的C语言课程,我比较推荐浙江大学翁恺老师的《C语言程序设计》,可以在MOOC或者B站白嫖。C语言也有人推荐郝斌老师的,其实也很不错,我大学时就是看郝斌的C语言课程,不过最大的缺点就是现存视频的画质和授课时的软件,真的很劝退。各位可以选择自己喜欢的一个去学习。
掌握C语言后,就要开始学习单片机了,这里要分为是否有电路基础,如果是毫无电路基础的小白选手,买开发板学习;如果有一定数电模电基础,可以考虑最小系统板+面包板+外设电路的组合学习。不过转行时间紧迫,考虑到时间成本,也可以直接使用开发板学习。这里不得不提两个经典的单片机——C51和STM32。对于这两个款单片机,有人建议不用学C51,直接学STM32,我表示不认同,我建议是从8位的C51单片机开始学。因为C51单片机简单,学习起来也简单,功能也完备,网上也有很多开源的资料可以参考,能够短时间内学会并获得成就感。其实在转行的过程中,稳定心态和获得成就感更重要,因为这样后面学习才更有动力。
C51学的差不多后,开始学习STM32,当然了,STM32不管是学习时间还是学习难度,都要远高于C51。但并不是说一定要全部掌握精通才能去找工作,我的理解就是学的差不多的时候,做一些小项目,例如温湿度监测系统,寻迹避障小车等等,虽然不起眼,但是包含的内容足够多,也很好的体现了开发能力至少还算得上可以,那么去找个单片机开发的工作也是没什么问题,即便工作时用的不是C51或者STM32,那也不影响,因为开发的逻辑是一样的,毕竟触类旁通嘛。当然了,最好是学会在STM32上面运行RTOS,并做一些任务。虽然市面上大部分单片机是裸机开发,但是会使用RTOS是加分项,甚至有的岗位还是必备要求。
至于看谁的视频,C51可以考虑郭天祥老师的《十天学会51单片机》,要是觉得画质不好、视频太长,还可以选择看江科大自化协的《C51单片机入门教程》。至于STM32,我只建议认准这两家的课和板子:正点原子和野火,任选一个就可以了,买了板子都是有课的。如果觉得太贵,还可以去看铁头山羊,自己动手搭建。以上视频全部在B站有全套视频。
至于数电模电画电路板等知识和技能,我觉得可以等到入行后再去深入学习。
二、Linux应用开发
这个方向就业的岗位最多,有做音视频的,有做智能家居的,有做网络安全的等等。不过基本要求都是比较统一的,都要求掌握掌握Linux系统环境软件开发知识,熟练掌握C语言,熟悉Linux操作系统,了解在ARM芯片的交叉编译,精通Linux下多线程、多进程、内存共享、 网络通信、信号处理、IO操作等编程技能。以上都是不同Linux应用开发的共同要求,那学习的方向也出来了。值得注意的是,Linux应用开发的要求中几乎,没有提到硬件(就算有也是极少),那么在学习的过程中,我们甚至可以在不具备硬件知识的情况下学习,这也是我特别推荐的一个转行的方向,因为据我了解到,很多Linux软件工程师他们都是不会单片机的,有的工程师大学读的专业还是软件工程,硬件基本没接触过。
这一部分,我自己是买课程自学的,但是时间紧迫和经济条件可以的人,我还是建议去线下机构培训,因为这一方向的学习路线太复杂,一旦没规划好学习地图,很容易走弯路。首先是C语言部分,这个不用多说,必备技能。其次是Linux系统下的编程,这部分内容的学习量很大,大致就是文件操作、进程、线程、内存共享、信号、网络等。最后是学习一款ARM结构的嵌入式开发板,结合前面学的知识做一些DIY的小项目。这是我自学使用的学习路线,是我根据几个培训机构的培训目录总结出来的,只提供给各位参考。
学习路线有了,那是我怎么学习的呢?很简单,看视频。作为初学者来说,看视频学习是最快捷的方式,一个视频可以反复观看,可暂停,可倍速,我学习的方式就是,先简单的看一遍,大概记一下几个关键信息(我习惯是用草稿纸记),再回头看一遍有代码的部分,并抄一遍代码,看能否实现与视频一样的功能。然后不看视频,不看抄下的代码,自己重新敲一遍并实现功能。如果代码能实现对应的功能,说明这个知识点已经掌握,就到了最后一步:输出总结。可以看我之前的文章,那些文章都是我学习过程中的笔记,这些笔记在之后都有着很重要的作用,尤其是之后的面试阶段(之后我会在其他文章中详细说明)。那么学习嵌入式要不要啃书呢?答案是要,不过不应该在初学阶段,目前嵌入式很多经典的书籍其实并不适合初学者,毕竟书的内容会比较严谨,不会像那些面向初学者的视频那样通俗易懂。比如行业的宝典《Unix环境高级编程》,这本书可以说覆盖了Linux应用开发的全部内容,要边看边敲代码,在Linux上慢慢实验慢慢调试。整本书看完完爆大部分Linux应用工程师,这本书也是大部分Java程序员和C++程序员的差距所在。但是,这本书的内容太多了,需要花大量的时间去消化,并不能帮助大部分人快速入门,只适合已经入门的新手做进阶的学习。所以新手学习,不建议看书。
既然不建议看书,那看视频有应该看谁的呢?这里也同样推荐几个,希望快速入门、快速掌握嵌入式技能的,可以去抖音找上官可编程,买了课程还会有配套硬件,虽然内容相对较浅显,不过学完找个工作是没什么问题的。如果有充足时间的,推荐韦东山老师的课程,Linux的内容讲的很透彻,韦东山老师的课从来不废话,满满都是干货,但对学习者要有一定的基础。当然,这些都是建立在打算自学的前提下,如果自学能力差,而且不够自律,我觉得还是去报培训机构吧,就是比较贵(差不多两三万,学习半年,还不包食宿),华清远见是个选择,不过华清远见是所有机构里最贵的,没有经济能力的就不要考虑了。
三、Linux驱动开发和Android开发
这两个我放在一起聊,主要是这两个方向的岗位我个人觉得并不适合新手或者非科班的人去做。
先讲Linux驱动开发,内核驱动做的是Linux底层的开发,是嵌入式工作做比较困难的一部分。一般企业招聘驱动开发岗位,对工程师要求要有3到5年的应用开发经验。需要非常熟悉Linux的内核机制、驱动程序和用户应用接口,并且掌握系统对设备的并发操作。其实内核和驱动是两个岗位,内核的要求至少熟悉两个以上的内核子系统,这个难度很大,现在的Linux内核1.3万个.c文件,1300w行代码,能看完其中一部分都是大佬级别的人物了。主要是做系统移植,优化内核,提高子系统级的性能等等。而驱动也要求熟悉内核,还要深入理解驱动架构,文件系统,进程管理和内存管理,熟悉字符驱动程序设计和分层分离思想。主要是做新产品平台开发和底层驱动设计和维护等。所以不建议新手或者转行的人选择这个方向,这里的新手包括应届毕业生,因为作为一个应届生,本身没有相关的工作经验,每天面对一堆内核源码和芯片手册(还是纯英文的),所面临的压力是非常大的,当然了大厂除外,一般大厂给的薪资会比较高,也会有导师指导,那么应届生可以去尝试做一下。
再讲Android开发,可能有人会误会是开发安卓APP的,其实不是,开发安卓APP也不会用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。做了超声波感应垃圾桶、温湿度检测器、智能遥控车等等。
完成我的“三步走”后,我用两周的时间简单学了一下数据结构和算法,同时做好了简历和面试准备,转行前的自学,就告一段落了。
关于面试的那些事
四月中旬到五一放假前的这段时间,就是我投简历面试的时间段。投了有二十多家公司吧,收到面试邀请的有19家,最后有4家已经工作地点太偏僻和工资太低被我当场拒了(通勤超过一小时的和薪资低于12K的,直接拒了),我还能拿到8个offer(意料之外)。
有一部分小伙伴跟我年纪差不多,也是二十七八这样,他们会担心这个年纪转行,会不会不被接纳。其实这个问题,我也是考虑过的,我当时的想法就是先入了这行再考虑入行后的细分方向。作为年纪稍大的转行者来说,与应届生相比没有太多区别,都是工作经验为零,唯一比应届生有优势的就是职场经验,这种经验不管是在什么行业都是通用的。
面试前一定要做好充分的准备,毕竟不是经常跳槽,没那么多面试的机会,可以用前几次面试作为尝试,适应一下面试的感觉。面试中多留意一下面试官问的问题,尤其是没回答上来的一些问题,回家后做好总结,方便下次面试。还有在面试中很重要的一点,就是一定要诚实,如果你面对的面试官是一个行业老鸟,你所包装的那些东西,他可以一眼识破(我曾经也是面试官)。如果不幸遇到那种素质不咋样的面试官,那这场面试基本就是被他拿捏了,会被一直刁难。当然了,要是这种人待的公司,我也不会去。所以我自己面试的时候,会主动地说明自己之前所做的职业、为什么转行、为什么会选择嵌入式等。不要去包装自己简历上的项目,主动说明那是非商业性项目,属于自己DIY的,做这个的目的也是因为看别人实现了,也想自己动手实现一下。这样去阐述,只要面试官是个正常人,都会觉得你很真诚,而且也为了转行做了很多努力,学习能力也还不错。只要开始的印象不错,后面的面试即使不太顺利,面试官也觉得情有可原,毕竟要短时间内实现跨行,他也会表示理解。
关于面试一些细节问题,我会单独写出来,这里只简单地聊到此为止。
后续的发展规划
入行嵌入式前,就深知嵌入式是一个巨大的坑,可能填一辈子都填不完,所以安排后续的职业生涯规划就很重要了。
我现在做的是Android系统驱动开发,业务内容就是马达驱动、OTG、USB和PMIC,说实话,与我入行前的规划还是有些出入。我原本是想找Linux应用开发的岗位,经过三五年的学习和经验累积后,再考虑是否转做Linux驱动开发,毕竟驱动开发的难度挺大。但是经过这一圈面试之后,最后还是阴差阳错地做了驱动开发,一方面是薪资的吸引,另一方面是为了先尽快入行。
关于我未来三年内的学习规划,大体上和我之前想的不会有太大的差别。首先还是C语言的巩固学习,《C和指针》、《C陷阱与缺陷》和《C专家编程》是我接下来会研读的三本书。其次就是工作上由于是做驱动开发,所以补上驱动开发的能力也非常迫切,以学习韦东山老师的课程为主,以宋宝华的《Linux设备驱动开发详解》为辅,并发式学习。最后就是学习一门面向对象的编程语言,以我需求应该会选择C++和Java,因为调用底层驱动的语言主要也是这两个,学习这个的目的是为了更好地解决工作上的一些问题,同时也是满足自己的一些爱好需求。不过像数据结构与算法、shell编程、数字电路、模拟电路等等我都会在之后慢慢去补上,不可急躁,事情要一件一件地做,欲速则不达。
这里借用稚晖君被采访时说过的话,以此来激励自己:想做嵌入式开发的话,一定不要只关注自己眼前技术的一亩三分地,否则很难有好果子吃。永远没有完全准备好的人才,年轻时要边打仗边学习。