APP下载

浅谈嵌入式学习和就业

2017-04-1307

单片机与嵌入式系统应用 2017年10期
关键词:工程师嵌入式编程

07

浅谈嵌入式学习和就业

北京大学软件与微电子学院07级硕士毕业生张博

不少人或许还并不是很清晰地知道什么是嵌入式,IEEE对它定义的原文是:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants。从一个嵌入式软件工程师的角度来看,简单地说,就是对一些硬件进行编程,使其完成既定功能的操作。

接下来我就结合自己的亲身经历,谈一谈对嵌入式学习、择业以及发展前景的一些感想。

嵌入式学习需要肯下功夫

嵌入式应该属于门槛比较高的技术方向,因为你所要打交道的不只是软件,很多的时候还需要了解硬件的知识,只有了解它的工作原理,才能正确地对其进行编程。一些错误的理解可能会导致运行结果与预期相去甚远,所以说嵌入式是一项软硬件紧密结合的技术方向。

作为一名嵌入式工程师,需要了解的知识包括如下方面:硬件部分,电路结构、芯片逻辑设计、时序等;软件部分,操作系统、编译原理、汇编语言、高级语言等等。要学习的知识可谓多之又多,想在短时间内掌握这些知识并不容易。在过往的经历中,确实见过不少同学缺乏足够的耐心,或者早早失去兴趣,从而放弃了嵌入式行业,转投其他领域。

但是,从某种角度来说,嵌入式又是相对简单的,因为所见即所得。只要对硬件进行一些简单的编程,就可以看到一些特定的行为,及时的反馈结果也是非常的直接。从嵌入式软件来讲,一些简单的嵌入式系统并没有大型软件那么高的复杂度,几个特定行为的实现不过是对一些寄存器进行编程而已,所以从简单系统入手,有助于建立起对嵌入式学习的信心,我也曾经是从0到1,对此有着深刻的体会。

从容易到困难,是学习的一般规律。这个过程没有问题,但是必须强调的是,从一个初级嵌入式工程师到高级嵌入式工程师,甚至是资深嵌入式工程师,并不是一件容易的事情,这中间会遇到一些瓶颈,需要克服很多困难,只有不断地提升自己的能力,才能面对后面复杂的嵌入式系统。

举个例子,作为一个嵌入式软件工程师,也许刚开始的时候只要能够配置硬件的寄存器,然后完成其正常的行为,就可以让一个足够简单的嵌入式系统正常工作。但随着工作的进行你会发现,你面对的并不全是简单的所见即所得的硬件,比如多核非对称系统,包含一个MCU(可能是ARM,通用处理器),再加一个DSP(专门做信号处理的处理器),它们之间的通信就比较复杂,你需要学习共享内存、学习信号量、学习生产者消费者模型,而实际上两边各有不同的操作系统,情况会比描述得更为复杂。

也就是说,嵌入式工程师在跨入一个新的阶段的时候需要学习大量的知识,之前遗漏的或者当时认为有难度暂时忽略的知识,都将在此时补课回来。不过,这些内容虽然看似量大,但并不难理解,因为它并不具备大型互联网软件的复杂度,由于设计模式的原因,嵌入式领域用到的无外乎那么几种,当然做上层嵌入式应用的除外。学习起来,完全可以按部就班,有条理地对知识进行组织,因为调用关系十分明确。

选择嵌入式,何必犹豫?

就目前的情况而言,步入嵌入式领域的人才确实有所减少,很多人或许抱有这样的观点:嵌入式不如做上层软件变化多,方向有些狭窄,就业不容易,收入在计算机行业内也不算理想……

事实上,我们不得不承认,当前国内情况确实如此。主要有以下几个原因:首先,嵌入式不是当前最流行的技术,目前最火热的技术当属机器学习和大数据。其次,嵌入式公司在国内创业的并不占多数,嵌入式行业的就业基本限制在芯片公司和移动设备公司。最后,嵌入式的投入产出比不够理想,影响到了嵌入式从业人员的薪资待遇水平。

针对这几个问题,我来谈谈自己的看法。

1.嵌入式从业者需要与时俱进

首先,流行的技术是应该学习的,这个观点我十分赞成,不过,这与从事嵌入式行业并不矛盾,因为我完全可以结合当前的主线附加一些支线学习任务,比如学习机器学习的相关知识,而嵌入式目前也在这个领域大有可为。举个例子,做inference芯片,帮助诸如TensorFlow、Caffe这样的工具训练出的网络,能够加速跑在移动设备上。另一个例子是Google的TPU,从训练的角度帮助提升速度和效率。显然,如果你选择做嵌入式,不但没有和这个时代脱节,而且不断在跟最流行的技术进行交流。

最流行的技术总是在更新换代,学习的速度需要更快,而嵌入式用到的大部分基础知识实际在最近一些年并没有本质的变化,而所谓的学习新内容不过是学习一些新的应用场景,但是万变不离其宗。

最流行的技术,也意味着从业的人员数量很大,在如此多的竞争者中脱颖而出并不容易,如果想出类拔萃,除了努力或许还需要一些天赋。

2.嵌入式就业随“心”所欲

嵌入式公司中创业数量少这个问题,实际上是相对于互联网创业公司而言的。近年来,我们能看到很多做智能家居的公司层出不穷,这对嵌入式从业人员来说是利好的消息。这意味着,需要大量的嵌入式工程师来做一些基础工作,而且很多工作是基于一些相对成熟的解决方案来实现的,所以门槛相对没有那么高。

另外,智能手机的几个巨头,也可以作为嵌入式人员从业的目标。要维持一定的出货量,这样的公司势必要拥有大量的工程师以支撑多条产品线,所以人员缺口自然也比较大。

而那些想要做得更加底层,更想去造轮子而不是做汽车的嵌入式工程师,个人建议你找一家芯片公司,从Bootloader开始到上层应用,无所不及,相信一定可以满足一个技术极客的需求。当然,日后还可以把你的代码贡献给开源社区,帮助提升开源软件的质量,成就感可以得到更大的满足。

3.把握好现在,定会有美好未来

与互联网公司相比,嵌入式从业人员的薪资度的确并不讨喜,但是这也要看你的水平级别。一个优秀的嵌入式工程师,完全能够做到衣食无忧。况且,试想,是在一个人员紧缺的行业里更容易出类拔萃,还是在一个竞争激烈的领域更加容易?

在嵌入式行业,如果热爱,就全身心投入,否则就放弃。很多时候方向固然重要,但绝非全部。打个比方,每个工程师都有自己的船,你就是船长,但目的地并不是只有一个。虽然大海茫茫,你没有一张航线图,但是只要一直向前走,由于目的地足够多,最后你总能到达其中一个,即便这个目的地并非最优,但也足够受用。倘若一味地追求最优,不断地切换航线,而对于这片大海,如果没有十分精准的GPS,那么最后很可能你还在原地打转。

因此,我认为,是否选择嵌入式,当下是最重要的,未来可以思考,但并不见得是关键。正如《新世界 灵性的觉醒》一书的作者所说:觉醒不发生在未来,只发生在当下。所以,我们把握好现在,才是一切!

如何学好嵌入式?

关于如何进行嵌入式的学习,分享一些个人的经验。笔者身为一名软件工程师,对于硬件并没有非常深入的了解,所以只谈谈如何学习嵌入式软件。说到这里可能有很多人会提出一个问题:是应该更重视理论基础,还是多做项目多动手?对于这个问题我的回答是:两者都很重要!听起来好像是没什么指导意义,但这确实是我这些年进行嵌入式开发的切实体会。

首先说说理论基础学习。嵌入式的软件开发不同于一般的软件开发,如果你做过3~5年的纯软件编程再转向嵌入式,就会发现,很多时候软件出的问题其实是硬件的不可靠造成的。如何对这些问题进行定位并解决呢?我认为,这需要相当扎实的理论基础,当然,有经验会事半功倍。为什么这么讲?因为在嵌入式开发中,你遇到一个问题之后,可能没有办法像开发其他软件那样,换一个方法照样可以实现同样的功能,而是卡在那里,止步不前,直到找到问题的根本原因,业内称之为root cause。

这时,就需要一步一步进行排查,如果理论基础不扎实,对于一些知识点模棱两可,那么在看问题的时候可能没有办法搞清楚导致问题发生的原因所在,比较含糊、似懂非懂的记忆会让人在一个问题上大费周章。我也曾经有在某些不感兴趣的知识点上看个大概、浅尝辄止的经历,其结果就是卡在某个问题上,不得不回去补课,知识夯实之后再回过头来解决问题。

做一段时间研发就会发现,莫非定律在嵌入式领域发生得非常频繁,即怀疑可能会出问题的点,一定会出问题。也就是说,在不了解原理的情况下进行程序编写,似是而非的代码导致的问题终有一天会爆发,到那个时候,势必需要花更多的时间了解其根本原理。

理论基础主要是指编译原理、操作系统、数据结构与算法。如果不懂编译原理,那么有可能在遇到栈溢出、符号或调用无法找到等问题时无所适从。操作系统理解得不透彻,可能就会在中断、进程线程调度、内存使用等方面碰壁。数据结构与算法的薄弱,则会让你在想要实现一些功能时把数据组织得比较差,性能上会出现问题。

如果立志做一名嵌入式工程师,我认为基础再多巩固也不为过。而对于多做项目这个问题,应该是说做得越多越好,毕竟纸上谈兵不是嵌入式工程师的角色。这些项目可以来自于实验室、公司,乃至于开源社区。

最开始的时候不必瞄准非常专注的方向,因为你并不知道什么更适合你。说到适合我是这样认为的,每位工程师可能在不同的领域有天赋,如果选择的方向适合,那么将展现出你非凡的能力(当然,我说的是普通工程师,不排除某些天才可以在每个领域都出类拔萃)。当做了很多模块之后,再选择一个方向深入研究,努力成为这个领域的专家,此时既有方向和目的性,又不会因为过于狭窄的知识面而导致管中窥豹、盲人摸象。

多做项目的另一个好处是,可以有更多的机会与他人合作、沟通交流,很多时候一个人钻牛角尖、不得要领,却可能在他人的一句提示下茅塞顿开。Open source就是一个很好的例证,众人拾柴火焰高。

嵌入式从业之路,前景无限

关于嵌入式未来的发展方向,这个话题比较大,因为未来的事情难以预测,尤其是在这样一个日新月异、瞬息万变的时代。从短期来看,我认为,嵌入式开发的方向主要有:

(1)移动终端

手机仍然在不断发展,更加智能化应该是一个共同的方向。目前,越来越多的解决方案都加入了当前最火热的人工智能、机器学习模型的inference加速芯片在手机里面,使得训练完备的模型能够运行在移动终端。无论你是学机器学习算法,还是学嵌入式编程,这里都是一片新天地。

(2)智能家居

目前涌现出越来越多的智能家居设施,比如空调、净化器、扫地机器人等等,这些无疑方便了人们的生活,而如何添加一些更易用的功能就成了一个新的挑战。作为嵌入式从业者,完全可以从这个方向切入,不断创新。

(3) VR和AR

这个可能并不是大众市场,它们代表的是娱乐方向。我们可以参考游戏机的发展,从掌机到红白机,再到SEGA、土星、PS、 XBOX,其实都是在完成一件事情,让游戏更加真实。AR和VR更是如此,让人身临其境,得到沉浸式的体验,有朝一日,或许《黑客帝国》中的故事真的会发生。嵌入式工程师在这里或许会成为游戏规则的制定者,你准备好了吗?

(责任编辑:芦潇静)

猜你喜欢

工程师嵌入式编程
《机械工程师》征订启事
Kenoteq的工程师研发环保砖块
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
青年工程师
纺织机上诞生的编程
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
工程师变成“资本家”