硬件工程师岗位应聘为什么都要求精通CC++呢,这其中有什么说法吗

硬件工程师岗位应聘为什么都要求精通C/C++呢,这其中有什么说法吗

在这里分享几个回答,有一定的参考价值,欢迎留言讨论!

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

026899f6a3fad26b8804ab2f5345b48d.png

回答1

所谓的大局部单片机项目不用C++是由于整个嵌入式开发行业从业者的平均软件素养已经差到了一个令人发指的地步。

大局部嵌入式工程师出身于电子、通信、自动化等专业,由于专业教育的缺少失和自己进修才能的问题,根本不具有面向对象设计、设计模式、软件工程等根本常识,所以在他们看来C和C++差不多,没必要上C++。

一个基层工程师,整天满嘴都是稳定、可靠、市场、老本、性价比这些屁话,却根本没听说过设计模式、代码复用、可扩展性、单元测试、持续集成这些现代软件技术的精髓。

知道的知道你是一个强行挽尊的嵌入式工程师,不知道的还以为你是什么统领千军的大老板。

(我预判了他们的预判,这段真的戳到了一些传统的嵌入式工程师。竟然有人跟我杠说设计模式、单元测试、持续集成这些不重要?我通篇就是打的这样人的脸,你被打完了还跟我说:你打脸罢了,没打到要害,你根本就不会打人!我笑得满地打滚!)

所有没用到C++的单片机应用项目(底层驱动库不在此列),都是由于其规模过小,应用过于简略,一两个人,最多不超过5人就能够完成全部开发,这种项目不光用不到C++,甚至用不到C,甚至用汇编完成,更用不到任何现代软件工程技术。

作为一个嵌入式开发的候选人,假如你想加入大厂,参与任何有规模的嵌入式项目,你的C++水平就是你的天花板。

13dbe4415b87b26ae6b1853a025a0ffd.png

这里的大厂不止是华为、大疆这种,甚至很多爱好者熟悉的“周立功单片机”老板周立功就屡次在公开场合表示,他们已经全面转向C++,只会C的工程师不会得到工作时机。

Arduino兴许是世界上最著名的AVR(8位单片机)项目,没有之一。

Arduino的封装全面使用了C++和面向对象的设计。广泛使用基于虚函数实现的运行时多态,很多设计遵从了开闭原则、接口隔离、依赖倒置等重要设计原则。

在ARM项目中,用到C++的更多。ARM官方推动的mbed项目大略是ARM单片机领域最知名的项目之一。

假如你要抬杠说Arduino是玩具,不具有工业强度的话,那mbed项目绝对是为工业级应用设计的,从底层RTOS到上层的硬件抽象层HAL都有实现。

mbed是用C++实现的,广泛使用开闭原则和依赖倒置,要求用户通过继承虚基类来完成平台相关的实现,从而实现扩展。

假如你是一个一线嵌入式工程师,却根本不了解我提到的一些专业术语是什么意思,我觉得应该反思一下为什么自己的工资上不去。由于这些都是最根底的面向对象和设计模式常识。

最后答复问题,为什么单片机工程师要求会C++?那还不简略?由于企业不傻啊!

其实我也是C的铁粉,C在嵌入式领域毫没疑问占有举足轻重的地位。

我坚决认为在现代嵌入式系统中,C和C++共存的现象会广泛存在,且具有回升的趋势。在硬件抽象层使用C,在应用层和接口层使用C++是非常典型的实践。

这也是正面答复这个问题,为什么嵌入式要会C++?由于嵌入式应用中C和C++都有用。

说了这么多,假如你的观点还是“C++没用,C++滚出嵌入式”的话,祝你好运!

回答2

大局部招聘说明里可能都是复制同类嵌入式公司的需求,在删删补补,所以这句话一直遗留下来,不算乱写,但其实和招聘的真正要求差别很大。

从我曾经不下20~30次大厂小厂的嵌入式面试经历来说,大局部公司在招聘时不会波及C++(自身公司负责有QT应用产品的除外,但不属于单片机方向),对C语言要求也远远不会到精通的地步,根本上对C语言语法熟练掌握。

75ff77b51f40658a6060a416bcd1a335.png

把>过一遍,后面标注提到的重点细节详细掌握下,笔试根本都是C根底语法(关键字,宏,构造体,枚举,指针和引用,数组,强制转换,位移,大小端,存储区,函数的健壮性),在联合数据构造(排序,查找,二叉树),在波及一些硬件知识类的如(中断,AD的精度,RTC时钟转换)这一类,这里面考察的C语言知识在我看来也远远没有到达精通的地步。

作为嵌入式从业者,以我这些年的经历来说,除非从事嵌入式Linux开发,而且是QT界面应用方向的,C++知识储备是必需的。

对我认识的大局部单片机工程师来说,即便实力比我强很多的,对于C++根本停留在C with Class的程度,掌握模板的都不多,更不要说后面强大的STL,以及波及函数式编程的lambda和模板元编程,也就是我这种闲着喜爱看书码代码的没聊人士,才会花时长去专门进修C++11,甚至去追逐了解前端框架,由于这些知识对于单片机开发事实上真的没啥用。

对于单片机来说,一方面要追求稳定可控,另一方面老本严苛,资源(RAM/FLASH)有限。

所以你能够看到NodeMcu和MicroPython的开发调试玩具卖的火热,却很难看到相应的技术用到产品领域。

这对于C++也一样,使用STL会带来编译结果(代码容量)不可避免的膨胀,假如阉割掉这局部,还不如使用C语言来的简略方便,这也限制了C++发挥的市场。

在单片机领域和嵌入式驱动开发,根本上C语言占有绝对地位,即便在Linux上层应用这块,Android/Java的开发优势也明显高于QT/C++,所以要求精通C++能够说是没稽之谈。事实上精通C++的要求有多高,你能够去相应问题下看看,这种人怎么会使用阉割的C++来从事单片机开发。

最后来说,精通C语言的问题,特别是精通单片机领域的C语言,是一个很艰难的事,至少对于此时的我来说,离精通C语言也差的有些远。

由于精通C语言不仅仅是掌握关键字和语法特性,和下面这些复杂但实用的操作,如位域实现对寄存器的位操作,利用构造体强制转换用于各种协议解析,函数指针实现异步回调,宏定义加##实现的函数格式化;

这些虽然复杂,但至少是有一套规范规则,只有去看书实践就能够了解掌握,但当你用C语言完成复杂稳定的项目代码,攻克各种异常bug时,就会知晓C语言的精通不只上面这些固定的语法知识。

在调试中可能遇到指针越界,栈溢出,共享资源未珍爱,非对齐访问异常,编译器优化错误等,这些问题单独拿出来兴许很容易找出来,但在复杂的十几万行的代码中,往往可能执行错误的地方工作表现是正常的,但干扰到其它局部,导致未出错的地方执行异常,这就须要的不仅仅是C语言的,还包含系统内核,总线架构和汇编的知识,精通C语言的艰难正是在此。

你要了解掌握计算机技术中成体系的东西,对内存分配,总线架构,内核,汇编这些都有清晰的认识。

例如了解函数内的空间是在栈中,那么我们在函数中须要使用大数组时,就要考虑是否定义为静态变量(避免栈溢出),假如多个函数使用数组,就要考虑是否添加内存管理。

e193db2b01ba834fffd15ac630ee80ca.png

假如数组会被2字节/4字节的指针访问,在声明时是否考虑要强制对齐(我就曾经遇到过#pragma pack(1)后面忘了闭合,导致后续全局变量未对齐,4字节指针访问时触发异常,由于中间波及屡次转换,所以花费了很多时长才查找定位攻克)。

另外假如用到了Cache和MPU,那么整个系统又愈加复杂,何时须要写回,何时须要没效CacheLine,volatile的意义,以及配合Cache使用的注意点。

这些知识的掌握,其实都属于精通嵌入式C语言的一局部,因此能够说精通C语言并不简略。

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124381421