总结出来的结果就是:99%的初学者都走了弯路,而且都很迷茫,焦虑,不知接下来该做什么。
其中有很大一部分在初学者,在职业定位上,就存在严重问题,就是硬件和软件都想学到独立设计的水平。
抱歉,今天我要泼你们一身冷水:几乎不太可能!
这是全栈工程师的水平,新手想达到这个水平,没几十个项目以上的积累是很难做到的。
就拿硬件设计来说,哪怕做了10年,也不敢说什么产品硬件都能设计,换个没做过的产品,照样够你折腾的。
前期学习一定要有侧重点,不要有软硬通吃的想法。
在刚学单片机的时候,我也不知道还分硬件工程师和单片机工程师,我以为都是一个人完成的。
实际除了非常小的公司,大多数公司一个项目标配就是软硬两个职位,毕竟术业有专攻。
新手期,硬件工程师和单片机工程师,两个你只能先主攻一个。
如果是我,我会先选单片机工程师,因为大多数工资比硬件高点,有核心竞争力点。
这个方向,硬件是需要学,但是不需要学太深,这个度的把握很重要,过头了,就得多走几个月弯路。
假设我回到11年前,零基础,我会怎么去学习,才快速达到我现在的水平?
很多人会好奇,我现在是什么水平?
先声明,我并不是什么大神,只是项目经验比较丰富。
目前只要不涉及复杂算法的单片机项目我都能做稳定,我是指软件方面,硬件不敢说。
能独立把产品软件做稳定,对我来说就够了,技术的终点是解决痛点,创造价值。
做好做稳定的背后,藏着很多学问,比如编程思维、程序架构设计,程序可扩展性和可移植性。
这些学问,只有做中大型项目才是刚需,否则做不稳定。
从零基础到独立开发项目代码的水平,我大概经历了几个阶段。
这个非常重要,只有认识到自己目前处于哪个阶段,才知道下一步该如何去提升。
第一个阶段:初级阶段
这个阶段就是零基础阶段入门。
1.第一个阶段学什么?
学习c语言、基础电路、51/STM32单片机外设之类的基础知识,但是让你做项目做不出来。
2.当初我是怎么学习的?
第一步:学STC89C52开发板
我的硬件基础知识、单片机、C语言主要是通过这个开发板学习的。
第二步:基于开发板做电子时钟
学完基础语法和单片机外设,我就在开发板上用数码管显示,做了电子时钟的功能,巩固我的编程基础,锻炼代码整合能力。
第三步:尝试找工作
没工作和项目经验,没人要。
第四步:做了智能小车项目,解决没项目经验的问题
这是我在2010年在某宝购买的智能小车套件。
做完这个项目,面试时带过去演示,顺利入职。
不过现在门槛高很多,只会这些,找工作基本没啥竞争力。
3.第一阶段推荐的学习方式有哪些?
如果回到10几年前,这个阶段我会怎么学习?
第一个阶段可以用两种方式学习:
①.开发板
优点:能更系统地学习单片机所有外设
缺点:代码不规范,做项目还是没思路,代码水平和整合能力无法提升。
②.项目
优点:让你学到单片机外设实际应用,能锻炼功能实现思路和代码水平。
缺点:项目没用到的外设学不到,基础差学习过程比较吃力。
4.第一个阶段最大的问题是什么?如何突破?
最大的痛点就是单片机外设都能用起来,整合起来做项目就做不出来。
为啥做不出来啊?最核心的是缺编程思路和代码水平。
突破第一个阶段的方法就是多做一些小项目,比如智能小车、电子时钟,商业化项目尤佳。
第二个阶段:普通单片机软件工程师
经历几个项目沉淀以后,单片机常用外设都在项目上应用过了,做一些基于单片机的小产品也够用了,特别是51、STM8单片机级别的项目。
但随之而来的就是另一个瓶颈期,你会碰到下面几个问题:
1.感觉自己代码写的不够好,很乱,逻辑不清晰,代码整合起来就做不稳定。
2.做大一点的项目就把控不住,比如做代码量在50kb以上的项目就有点吃力了。
3.写好的代码经不起折腾,如果要改功能或者换单片机,整个程序框架就崩溃了。
这些我都经历过,那些被领导催到头顶疼的场景还历历在目。
很多工程师做了几年依然处于这个阶段。
1.为什么突破这个瓶颈很难?
想突破这个阶段是最难的,是思维和代码水平整体的提升,是经验积累到某个阶段的成果,不是学习某个技术点。
和认知边界、机遇、主动学习意识有关。
认知边界:就是你认知范围内的,如果你身边全是菜鸟,你的认知边界就局限于菜鸟阶段,如果你身边有厉害的,他会颠覆你的认知,原来程序还能这样写,这个大多数取决于你的圈子。
机遇:你的圈子决定你的眼界高度,你知道你代码写得烂,但是没渠道、没机会可以提升,你碰到的公司做的产品都比较简单的,你也接触不到比你更厉害的人,或者接触到,别人也不会系统地带你,这种情况你是一直无法提升的,跟工作年限无关。
主动学习意识:有时工作稳定下来,人就懒得折腾了,几年时间一下混过去了,但你想混得更好,必须重视持续学习的重要性,主动去寻找渠道,寻找资源学习才会有更多机会。
2.我是怎么突破这个阶段的?
① . 跳出舒适圈,选择辞职
后面实在憋不住了,公司学不到东西工资又低,在激烈思想斗争后决定走出舒适圈:跳槽。
② . 碰到好的平台
好的平台不一定是BAT之类的大厂,大厂分工很细,机会反而更少,我觉得对自己成长最大的公司,就是最好的平台。
后面我就去了一家做智能家居产品的公司,我从头到尾做了3款网关产品(代码量110KB以上),1个蓝牙,2个WiFi+GSM的。
③ .碰到好的师傅
做这几款产品之前,很多功能我都毫无头绪,因为没做过,之前做的都是小项目。
幸运的是,公司之前有个非常厉害工程师做了过类似的产品,有现成的源码和图纸参考。
至今为止,他是我工作以来碰到过,代码水平最高,程序架构设计得最好,对我成长帮助最大的工程师,所以我一直认为,他是我”间接”的师傅。
为什么是”间接”的师傅?
因为我进去的时候他早已经离职了。
所以在开发过程,碰到很多技术难点只能靠自己摸索,硬着头皮去吃透他的编程思路和代码。
④ .主动学习意识
当时对这个项目非常感兴趣,很好奇app控制硬件的整个流程是怎么样的,很好奇TFT屏的菜单UI是怎么做出来的,很好奇传感器和网关是怎么组网的等等。
兴趣驱使我那段时间,每天早上买一瓶红牛,8点第一个到公司,一直干到晚上8-9点。
不是为了在老板面前表现,也不是为了工资,就是纯粹想满足好奇。
项目从无到有的开发过程,对于工程师来说,成长才是最大的。
在我的职业生涯里,大概前5年都一直处于第二个阶段。
我在想,如果能早点碰到好的平台、师傅、项目,成长是不是快很多?
我相信答案肯定是的!
3.突破第二个阶段有捷径吗?
以前我觉得哪有什么捷径,捷径就是想不劳而获。
后面发现我错了,捷径不是说你不用做,而是把时间精力放在最重要的事情上。
如果让我回到零基础,首先我会系统学下51开发板,然后就是不断找项目做、找更厉害的师傅带,从简单到复杂,把基础打牢,而不是去学更高性能的单片机,更复杂的RTOS。
项目数量决定成长速度,项目质量决定成长高度。
我认为这就是捷径了,关键是看你能不能找到好的资源和渠道学习。
很可惜,市面上的大多数教程,哪怕是收费几千块的课程,都只是教你学单片机而已,完完整整做一个项目的很少,能突破第二个阶段的项目基本没有。
所以,在2021年的时候,我们开了项目实战特训营。
带着对我们成长最大的项目,复制我们成长的方法,教大家如何从无到有,一步步把项目做出来,带领认可我们价值的人穿越第一个阶段和第二个阶段。
我们不能保证每个人学了,都能成功突破第二个阶段,但突破第二个阶段的答案都在项目3和项目6里。
想完全吃透我们的思维和代码技巧,还得多实践,把我们的思维和代码框架举一反三,带入到你们以后的项目去应用。
只有突破第二个阶段,你能做的项目才越多,机会也更多,工资自然也越高。
第三个阶段:高级单片机软件工程师
这个阶段,你不仅能把功能实现,而是站在更高的维度去设计你的程序架构和代码细节。
这是做中大型项目必须具备的能力,否则你的产品很难做稳定,哪怕做稳定了,维护起来也很麻烦。
好的体现是什么?主要有两个层面:
1.好的程序架构
程序架构是一个很抽象的概念,主要体现在程序可扩展性和可移植性。
可扩展性:就是你的程序增加/修改功能方不方便?比如现在产品2个按键,如果增加到6个,需要改多少代码,简单来说改的越少肯定可扩展性就越好。
可移植性:在单片机开发领域,很多工程师对可移植性完全没概念,比如说你现在用STM32单片机做的产品,后面STM32涨价了,老板让你换成GD32的,需要改的代码越少代表程序移植性越好。
在写任何功能模块代码之前,都要考虑到这两点,主要为了加速产品开发周期,降低产品后期维护成本。
2.程序执行效率
同一个功能,不同的人写出来的代码,cpu执行这段程序所花的时间可能不同的,时间越短,说明你这段程序写得越好。
但是一般产品,对程序执行效率要求没那么苛刻,一般我们做到尽量用最少的代码去实现功能就够了。
越满足以上两点,代码越精简,你的编程思维和代码水平就越高。
除此以外,其它能力也很重要,比如快速定位、解决问题的能力、电路调试能力,看数据手册能力等。
不过这些,你做项目过程中总能积累出来的,不像编程思维和代码水平那样,能提升到什么高度,跟时间无关,跟机遇有关。