关于嵌入式的学习和职业发展

最近我的工作太忙了。身边朋友问我如何学习嵌入式,在这个行业健康的发展。我一直未能做一个系统的回答。这里我想写篇文章,彻底的回答这个问题。嵌入式,这是个术语。在我看来,嵌入式系统是:为了应用高度定制软件和硬件的计算机系统,满足一系列的特定应用需求。国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。IEEE(国际电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。原文为:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants。(此段来自百度) 从我个人的理解,到普遍的定义,再到IEEE的权威。可以看到,嵌入式系统首先是计算机系统。我们不能忽略这个问题。既然是计算机系统,那么学习嵌入式,计算机的基本理论知识我们要不要学习呢?比如说,,编译原理、数据结构、操作系统、离散数学、计算机系统体系结构。个人认为,没学走,就学跑是非常要不得的。很多人意识不到这点。加之国内很多学校没有培养嵌入式的专业,没有相应的人才输出。很多学习嵌入式的人都是从电子类的专业,自动控制类的专业等等转过来的。这个转型也意味着理论上的巨大缺憾。如果要问,排序算法有几种,恐怕只知道冒泡和希尔,不知道堆排序,快速排序,基数链式排序这些算法,更不知道还有内部排序和外部排序之分。查找算法只知道个基本的2分查找。对于树的查找算法一无所知。怎么说呢?也许很多从业的程序员,不乏专业水平相当优秀的,认为这些并不重要。我只能说,你命好,做这种具体的工程大于理论的东西。实际上,如果从一个嵌入式的程序员成长为系统设计者,或者更高的技术职位,要从更深的层次看问题。理论起到了非常大的支撑作用。比如说,设计一个普通的微波炉控制系统。说实话,这个代码应该是非常简单的。但是,作为精细的设计者,不仅仅要考虑需求是否完成。还用从整个程序的空间杂度、时间杂度上去分析,并降低整个代码的复杂度。从而进一步降低软件结构、算法实现对处理器的要求,达到对成本的节约。一般来说,成本不光光是BOM成本,还包括人力成本,运营成本,开发成本,维护成本等等。任何软件系统都要测试,然而一份代码要怎么才能比较好测试呢?这个问题并不好回答。我这里先卖个关子,回头我在另外一篇文章里详述。尤其是嵌入式代码,测试方法虽然沿用了PC机的一些做法,但是仍然有许多工程限制。做起来难度颇高。马克思说过,一切的节约可归结为时间的节约。代码结构简单,空间杂度小。那么也意味着更小的工程量,更短的测试时间,更稳定的产品质量。如果是个理论性稍微强点的产品,汽车导航系统。地图的路径搜索算法。定位位置的搜索,以及地图的分类加载优化等等,都不是太容易就能做好的。更需要坚实的理论基础。许多刚出学校的大学生朋友们,没出校门就把相关的知识还给老师了。其实,我经常问公司新来的同事,设计算法的思路是什么?这个是从计算机的角度去考虑一个问题的解决办法。很多新人是计算机毕业的都无法完整的回答我的问题,失望之余,更想说的是:经验很重要!但是比经验更重要的是知识,比知识更重要的是方法。在理论的指导下去积累经验。减少从经验下获取知识,减少体验式学习这种状态,养成系统的认识分析问题的方法,理论联系实践的方法,实践检验真理的方法,经验必须能被理论解释的方法。所以,这第一点建议,就是希望从事嵌入式的朋友能把计算机基础课程全部系统的学习一遍。

我们还是来看嵌入式的定义,这个定义是相对的概念。什么计算机系统不是“高度定制的软硬件计算机系统”呢?PC机。不严谨的说是这样。嵌入式在工程上有非常多的特点,相对于PC系统说,如果把PC系统看成一个完全的标准的“大嵌入式系统”,我们用大鹏鸟来形容它。那么,像“蜂鸟”这样的最小的小鸟,像“麻雀”这样的常见系统。也就不难理解了。从技术上讲,PC系统的知识量,难度都要比一般的嵌入式高出N个数量级。但由于PC系统在计算机历史上发展得比较早。因而,其智力投入、完善性、应用的广泛性重要性是别的系统平台无法比拟的。然而,正因为发展了这么久,其平台的封装性稳定性是非常高的。操作系统级,支撑软件级,应用软件级。特别是应用软件级,一些与平台无关的软件,基本上很少涉及操作系统的知识,以及一些内部的原理。如浏览器里的Javascript开发,基本上不涉及操作系统的知识,只是受不同的浏览器的影响;又如Java,只涉及较少的系统平台的知识;就算是C/C++语言,开发应用程序,也就是一套API的应用。涉及的操作系统的东西也只是冰山一角。由此可见,PC平台的优良封装,极大的简化了问题的复杂度,使开发者和应用者能把主要精力放在自己的业务上,提高开发效率。嵌入式领域就没有这么幸运了。其为应用的高度定制,造成了以效率,应用为优先的特点。封装层次太多必然对效率有所伤害。同时规模变大,测试变得复杂。开发周期变长。所以嵌入式的层次结构相对于PC系统,边界没那么清晰,封装考虑的问题没有那么全面。完成同样的一个工作,需要了解的内容更多,才能做得更好。如果一定要拿嵌入式和PC系统比,个人觉得,PC系统的开发有时候比嵌入式系统还要难。由于封装的比较完善,PC开发的门槛比较低,但是做好,做精通,做全面,比嵌入式难多了。嵌入式因为一开始就要了解相当规模的东西,所以入门的门槛变得比较高。纵观这些东西,其实PC系统和嵌入式系统很大一部分都是重叠的。

所以,第二点,我推荐大家读(俞甲子 / 石凡 / 潘爱民)写得《程序员的自我修养》。这里多说两句,首先,嵌入式只是比PC开发要多了解些东西,本质上来讲并无区别,这些知识当中有一半是与具体工程相关的东西。也就是说,照着流程做,并无太多的为什么,如果硬要问为什么,其实也就是一些工程上的需求。一些嵌入式应用之间可能略有一些区别,可能有些区别还很大,但大致的流程还是相似的。有个比较好的PC开发功底,了解了这些流程,开发嵌入式应该是没什么特别的障碍的。其次,《程序员的自我修养》这本书是针对PC平台的,书中的许多东西是PC平台特有的,比如说动态加载等。但理解动态加载也会对Bootloader加载应用程序和操作系统有一个直观的比较。由于并不是针对嵌入式平台的(我没发现有专门讲嵌入式的书),所以,很多东西需要自己在嵌入式中去体会。另外书中对一些嵌入式中比较在意的问题描述的并不够详细,比如说链接脚本还有ABI。PC平台这些问题被很好的封装起来了。所以,有些问题在嵌入式领域,还需要进一步深挖。这本书作为嵌入式入门的理解是非常合适的。找回自我,歇够了,再飞回来,继续面对自己的人生。

关于嵌入式的学习和职业发展

相关文章:

你感兴趣的文章:

标签云: