前言
首先我想说的是不问出身,做嵌入式的同学,基本都是计算机科学、电子信息、通信类专业。刚毕业的本科生,就学到的知识,名校与非名校在起点上相差不多,大家在校园里学的都是那几科,看的书也都差不多,如果不是很小就接触计算机写代码,那毕业时的代码量也都差不多。
而对于工程作业来说,对学术能力的要求没那么高,只要有一定的学习能力,技术是很容易掌握的,大可不必对自己的学历不够自信。
对于嵌入式软件工程师,一般是分成两类,嵌入式Linux、嵌入式单片机,我这里只讲单片机的部分,Linux的部分有机会再聊。
一. 认知的四个阶段
在刚工作的第一年,基本是一个学习的过程,很难有有效的产出,这个阶段是完成从一个生涩毕业生到企业员工的身份转换,如果校园里接触过比较多的代码,看过类似Linux源码那种级别的代码,对你快速学习还是很有用的。
这时你写的代码,也能正确的点亮一个led灯,能实现老板的需求,可日后来看,肯定是惨不忍睹的,说难听点,就是“像屎一样”。但这时你还不知道这些,你甚至“不知道自己不知道”,你觉得自己表现的还不错,可能偶尔会冒出“这个代码这样写会不会更好”之类的念头。
每个人都可能冒出这样的念头,不同的是,有的人念头一过就去干别的了,刷刷剧玩玩手机也是一天;有些人,没有让念头溜走,顺着念头走了下去,去找“这个代码换一种写法会不会更好”的答案。
找答案无非3个方式:问其他人(包括搜索引擎)、看书、看源码。
你当然可以问其他人,但你不能总问其他人,而且其他人不一定什么都能解决。
你开始看源码,你会发现,源码看不懂,随便打开个开源项目,一行都看不懂。
你一定会吓到,你想找本书来压压惊,随便翻一翻,竟然发现自己“这个也不知道”,“那个也不知道”。
这也是好事,至少你已经“知道自己不知道”了。
问人是最快最具体的;看源码不能一蹴而就,大师的代码我等凡人刚开始都是看不懂的,没关系慢慢来,多看几遍;看书是最系统的,如果你能带着问题去看书中的具体章节当然就更好啦。
现在,你有了学习的动力,你要做的,是开始填补知识空白,还等什么,快开始吧!
上面列举的三种方式,最系统也最有效的,当属看书了,我这里推荐几本书。
对于语言层面,当然最多用的是C语言,学校学的教材比如谭本《C程序设计》只介绍语法不说,还有很多误导,坚决不要看了。我推荐你读K&R版本的《C程序设计语言》,Bryant,R.E.的《深入理解计算机系统》,接着就是Andrew Koenig的《C陷阱与缺陷》、KennethA.Reek的《c和指针》、LinDen,P.V.D的《C专家编程》,对于C语言基础,这些已经够了。
看完这些,你最起码了解了计算机程序到底是怎么一步步生成的,对语言、对系统又有了进一步更详细的认识。
与此同时,可以看些实用性强的书,W. Richard Stevens的《UNIX环境高级编程》、《UNIX网络编程》,把语言上的所学的进行实践,了解编译器编译流程、Linux的基础命令,固件的交叉编译。注意,这2本书都很厚,不用强迫自己全看。
下一步,开始看你的专业相关,你所在公司总有一个具体的方向,音视频、图像处理、家电等等,我从事物联网安全行业,当然最关注的是嵌入式软硬件、网络、安全技术,那就要针对这3个方面找书了。
3.1 软硬件
做软件工程师也应该知道些硬件知识,模电、数电的基础还是要了解的。
硬件架构,用arm比较多,推荐看Joseph Yiu的《ARM Cortex-M3与Cortex-M4权威指南》,然后就是各个芯片的芯片手册了,我还记得第一次看芯片手册的感受,“天书!” 写的都是啥,全然看不懂——后来我发现所有的芯片手册竟然都是一个套路,只要看完一个手册,再看其他的就很快了。
我还推荐你学习些FPGA的知识,用Verilog尝试做些简单的硬件设计,会让你更深入的了解硬件的工作原理。
操作系统是一切软件的地基,对于嵌入式操作系统的学习,推荐左忠凯的《FreeRTOS源码详解与应用开发》和FreeRTOS、RT-Thread的源码。
3.2 网络
先扫一遍《TCP/IP详解卷1》,这些本科课程学过就扫一遍,没学过就仔细看看了。
接着可以看实现,我用lwip比较多,推荐看朱升林的《嵌入式网络那些事》,配合lwip源码一起看。这本书看完,可以看看《TCP/IP详解卷2》和《TCP/IP详解卷3》,这2本也都是神级科学家W. Richard Stevens的著作,超级厚,还是那样不要强迫自己全读完,有选择的看。
3.3 安全技术(换成你自己的领域)
我这里只推荐一本密码学入门,结城浩的《图解密码技术》,写的通俗易懂,又不是特别深入,适合初学者,其他就要去找更加具体的资料了,读者们从事各个领域,自然知道要找什么书来看。
对于这些书,我希望你能带着问题看,解决问题就合上,只看你感兴趣的部分,其他的章节偶尔翻翻混个眼熟就好;
很多书都是翻译过来的,有些表述并不准确,读起来不是那么容易,我也没有什么好办法,只能劝你静下心来慢慢看,反复看,多看几遍;
希望你能边看边实践,确认书中说的是对的,实践了才能内化成自己的。
为什么要“混个眼熟”?就是你要知道这本书还讲了什么,以后有类似的问题,就可以来有目的的翻阅了。
我认为,真正学的学会一样东西,有以下3个阶段,这3个阶段可能不是线性的,尤其第三个,可能是你很久以后恍然大悟才能达到。
3.4 真正知道的三个阶段
3.4.1 会用
比如那些网络接口函数,硬件驱动接口,你可以利用它们写出没有bug的代码,完成了项目任务,那就是会用了。
3.4.2 了解怎么实现
会用之后就是学习它背后是怎么实现的,这时你就要去查深入些的资料,看深入些的代码了,幸运的是,我们目前所能接触到的问题,大部分在互联网上都有答案,很容易就能找到,那些热爱求知的前辈们早已经为我们准备好了答案。
了解了实现,你就可以对之前写的代码进行优化了,你之前只能保证写出的代码没有bug,现在你知道它为什么没有bug了,遇到难搞的问题,你的思路会很开阔,马上找到问题点。
3.4.3 明白为什么这么实现
第三个阶段,就是你不单单要知道它怎么实现,你还要探求它为什么这么实现。
比如TCP/IP,为什么要分那么多层,还有没有其他的网络协议栈,几种协议栈不同之处在哪里,为什么其他协议栈就没这么普及呢?
比如各类嵌入式操作系统,为什么都宣称自己又快又小,他们的性能怎么评估,技术上实现的不同点在哪里,各个系统的作者为什么要那么实现?
当你能「评估」一类方案/技术的几种实现形式,说出各个形式的好坏差别,你就能做到融会贯通,在项目层面,你就知道如何取舍选择了。
以上是认知的第三个阶段,即不断的学习,真正的学会。这个阶段应当是贯穿整个职业生涯的始末,别人问一个问题,你第一时间的反应是”知道自己知道“,然后脑子里搜索答案。
买过很多书,看过很多书,你就形成了买书的习惯,看到一本新书,发现一本你没看过的书,你就想买来看。
买来新书,抱着学习的激情翻看目录,扫一遍,找到你感兴趣的章节开始读,边读边发现,咦,这说的不就是xxx原理吗,在xxx那本书中介绍过啊,这作者怎么换了个说法又讲一遍,这书真是买的多余。这时你其实不用怪作者,而是应该恭喜自己,恭喜你来到认知的第四个境界“不知道自己知道”。
你已经不需要再过多的看基础技术图书了,遇到一个问题,你自然有自己的解法,你不知不觉将之前从很多书中吸收的知识融汇贯通,任意组合,付与实践,而这些都是自然而然的事,你在解决问题时,不知道自己已经在用那些曾经学习到的知识了!
对于嵌入式领域的认知,我引入一个简单的问题,这是我认为的嵌入式技术里的终极问题,这一个问题能知道你处于上面哪个状态,这一个问题也足够让你“学海无涯苦作舟”了,如果能把这个问题详详细细说的明明白白,你的嵌入式能力已经炉火纯青,至少不会遇到技术层面无法解决的问题了。
“有2个嵌入式设备A、B,通过网络连通可交互数据,其中A有外接按键,B有小显示屏,2个设备实现这样的程序:A键盘上按下某个按键,B显示屏将按键值显示出来。
请问:从A按下按键那一刻起,到B显示屏看到按键值,”按键值“这个数据是怎么从A的按键传输到B的显示屏的?
二. 升级打怪
写了这么多,是不是学完这些就可以独步天下了?
当然不是!这只是万里长征的小小一步,这小小的一步在我看来,一般需要5-10年左右的时间,有些人只是有着一个念头但从没有抬起脚。
这一步什么时候迈都不晚,最难的是你有勇气抬起脚。
迈过来后什么什么样的世界呢?我引用吴军博士的五级工程师划分来说明你的职业规划。
如图,吴军博士在他的很多书里提到这个五级工程师的划分,我们刚刚说的,完成那些学习与解决问题后,基本可以说,你已经站在这个金字塔的最底层了。五级工程师,你好,你看这塔,一点也不高。
这个时候你该做的,不单单只是一心沉浸在技术的海洋知识的海洋里了,因为我们毕竟是工程师,而非科学家,要开始运用知识,解决实际问题,再解决更大的实际问题了。
解决更大的实际问题就要向着四级工程师迈进,这时你不单单要自己懂技术,还要想办法尽快把你的”鱼“和”渔“授给其他人。
你还要学习管理知识,掌握与上、下级沟通的技巧,如何推动自身和团队快速进步是你的挑战。
对于三级工程师,除了具备4级工程师的能力,还需要能够紧跟时代,预判市场,懂得营销,不单单做得出产品,还能卖得出产品。
二级工程师是指能做出先前没有的东西,世界会因为这多少有点不同,吴军博士举了这两人作为例子:北极光风投的创始人邓锋、Google云计算的发明人迪恩(Jeff Dean)。我见识有限,所知甚少,嵌入式领域我能想到的人包括大疆的汪滔,柔宇的刘自鸿,这里大胆激进的把他们放在第二级。
第一级是开创一个产业的人,包括爱迪生、福特、贝尔等人。
各位应该好奇我处于第几级呢,我给自己定在4.5级,目前可以独立完成老板交代的任务,也在努力学习提高自己团队的整体效率,产出更具创造性的成果。
三. 一点点建议
由于实际经验有限,我也在探索如何爬这个塔,不敢妄加定义,引人入歧途,下面只说一些个人看法,权当抛砖。
计算机专业的同学不要只专研技术,也要看看经济、政治、生物、天文、地理、艺术、医学、历史等等,要知道,计算机这门学问,诞生不过几十年,放在人类历史长河中,比前面那些学科简直就是沧海一粟。
看杂书多的人理解力要比看的少的人强,看的多了,就会有一种「类比」的能力。
比如对于“面向对象”,如果在学习面向对象之前,你了解过亚里士多德的唯实论和他对「共相」的阐述,你就会理解的很快,根本不用老师教思想,只用学学语法就行了,而且你免不了会在心里嘀咕,面向对象的设计者是否正是受亚里士多德「共相」启发而设计出了这样的软件开发方法?
爬金字塔呢,就是攒的过程,很多人浮躁,学知识只学一半;有些人自以为聪明,总想找捷径;有些人勤奋刻苦,但不得其法。
文章一开始我说过,工程作业不比科学家,是不是名校,成绩好不好都不是大问题,想想你本科接受的教育也才4年,况且4年只是有那么一丁点基础知识,而工作是一场人生马拉松,可不单单要跑4年的。
只要一个人有学习能力,就可以解决大部分遇到的问题,区别无非学的快慢、攒的快与慢。
有些攒的快些,N年后,他们被称为「神」,这个比例是1%;
有些人攒的慢些,N年后,他们被称为「牛」,这个比例是9%;
有些人基本没攒什么,N年后,他们仍是「农」,这个比例有90%。
N ≥ 20
不好意思,上面这个比例是我杜撰的,我故意把「农」的比例增大,目的是警惕自身,也希望读者能警惕不要成为那90%。
进入那9%的「捷径」就是慢慢积累,我们普通人只要坚持学习积累,就一定能达到。
进入那1%可能就比较有挑战了,据我所知,好的工程师年薪会到百万美金以上(股票+奖金),注意这仅仅是工程师,这个层次能达到最好,达不到也不要强求。
总结是使人加速进步、聪明进步的很好的手段,对程序员来说,对代码最好的总结就是重构。
重构代码能带来至少两个好处,一个是对公司的,优化代码,易于维护,日后有其他人接手会更快上手;另一个就是对个人了,谁重构谁获益,这是学习的最佳手段,如果你写了10个项目,没有重构过一次,那你第11个项目用的数据结构、模块划分方式可能和第1个项目是还是一样的。
而如果你但凡重构过哪怕一次,当你写下一个项目时会更加得心应手高屋建瓴。
重构,不单单是为了优化过去,更大的好处是指引未来。
这就是爬金字塔的方法,不断的重复:学习-->实践-->总结,这个闭环。
全文完,希望你能从文中得到或多或少的启发。
联系客服