`
嘉宾介绍:朱有鹏,互联网课程品牌《朱老师物联网大讲堂》创始人。精通U-Boot、linux kernel移植及驱动程序开发;精通C、C++、Java、C#等高级语言,熟悉ARM Cortex-A、Cortex-M3/M4等体系结构;熟悉三星平台S3C2440、S3C6410、S5PV210等处理器系列的linux、WinCE下的开发流程;授课风趣幽默,讲解条理清晰,对知识有自己独到见解,善于发散学生的思维。
采访内容如下: 社区小助手:您是什么时候开始接触嵌入式这个领域的?又是什么让您与嵌入式结缘的呢? 朱有鹏老师: 说实话,我大学时并不喜欢软件编程,C语言课程甚至才七十多分。后来毕业后也是直接做电子工程师,具体工作偏硬件和项目经理多一些。真正让我对单片机和嵌入式技术有认知是一件小事,当时我所在公司做了一款LED照明台灯,当时的老大用了一颗PIC单片机和几个按键,输出PWM波做出了亮度和色度可多档调节的台灯。现在大家可能觉得这种产品很普通很常见,但是当时(2010年)这种产品是非常惊艳的创新,我被深深的震撼了。以前做惯了纯硬件电路的东西,原来只要一颗小小的单片机,加上软件功能就能让一个产品如此有灵魂和震撼力。我当时就决定要弃硬从软。
那时年轻,执行力非常强。当时就买了一个PIC单片机开发板开始自学,当时开发板是真贵,我记得那个板子700多块一个。后来很快就自学上手了,到DS18B20之前都很顺利,到了这个温度传感器这里我怎么都学不会了,就是不出来温度,耽误了很久没有进度。后来学会了之后才明白原来在这里卡住我的就是“时序”这个概念。因为我完全自学,那时根本没有好的教程,根本无法理解时序,甚至根本不知道时序的存在。类似这样的困难在我整个嵌入式的学习生涯中国非常多,最终都是通过大量的阅读,翻箱倒柜的查资料,日思夜寐的琢磨才明白过来的,所以这也为后来我去讲课打下了良好的基础。很多同学觉得我的课程能讲到痛点,能听懂,能学会,其实真实原因就是我自己去学的时候在哪里卡住,哪里会有什么疑惑,我都记得,我只是把我曾经花费很多时间才琢磨过来的东西有条理的分析给你,带你走过这一段路。
后来做了一年多单片机开发,搞过几个项目(我记得有一个是指纹锁,还有无线通信的几个项目)后单片机对我来说就太简单没有快感了。正好公司项目当时用到上位机,我就把单片机部分交给同事自己又开始从零学起上位机Windows编程了,那时候学习热情真是高涨,VC++、C#、Winform、WPF等等一路学过去,也学会了用数据库。想想最开始做单片机项目时根本不知道还有数据库这玩意,要存点结构化数据都是自己格式,后来知道了xml用了一段,后来学了数据库才发现这些真是弱爆了……
之后就是由上位机Windows做到了嵌入式的WinCE,然后就遇到了linux,从此一发不可收拾,开启了嵌入式linux的学习与研究、做项目的旅途。一路走来最大的感触就是,真正喜欢技术的人做技术其实不辛苦,乐趣很多,编程是一件能让人愉悦让人欲罢不能的事儿,非常有成就感。
社区小助手:可以聊聊您工作生涯中印象最深的一个项目吗?印象深刻的缘由是? 朱有鹏老师: 我从2012年末就开始兼职讲课,2015年就全职做教育了,所以其实也好几年没有在一线做研发了。现在想想,印象最深刻的还是一开始菜鸟时做过的项目,可能是因为当时什么都不懂,做项目要到处查资料,到处问人,调通一个东西会有非常大的喜悦,所以才难以忘记吧。
我记得当时做过一个高端办公家具的指纹锁项目,用了一个新加坡公司的指纹芯片。印象比较深的有这么几个点:一个是开发环境,那个指纹芯片是在Unix环境下开发的,所以他们给的是Cygwin开发环境。当时什么都不懂啊,就跑去研究,现在想想那应该是我第一次接触类Linux的开发环境。然而我一直浑然不觉,直到一年多后开始接触嵌入式linux我才发现我其实早就会基本操作了。另一个点是当时取了指纹数据后要通过无线传输,当时boss给的无线方案是2401点对点,我很快就调通了2401,但是这东西一包只能发64个字节,然后一个指纹数据有2k多(也可能是几十KB,记不清了),必须分包传,但是分包又会丢包或者乱序要设计重传机制。当时什么都不懂就去到处看,现在想想现在对通信协议的理解都是从那会儿来的,确实功夫没白下。
说到这里顺便说一下个人职业选择的事。因为我大概就是从做这些项目开始慢慢的丢掉我的硬件设计技能的,直到现在我已经连画板软件都不会操作了,提到画板子感觉非常陌生,然而2009、2010年那时候我画了至少几十块板子的。我这些年也一直在反思到底是不是犯错了,最终得出的结论是没有。因为有得必有失,你的精力和资源是有限的,不可能什么技能树都点上。我认为最终决定一个人走向的还是你的性格,你的喜好,你的追求。当我越来越多的学会软件和编程,尤其遇到嵌入式linux技术时,我就知道我真正喜欢的是这个,不是做硬件,所以就算很可惜,还是砍掉了这个本已经长起来的技能树。所以有同学问我要不要学嵌入式,我的答案是问你自己,去实际学一学去做一做,感觉你喜欢不喜欢,有没有乐趣和快感。如果都是痛苦根本不吸引那你别做了,迟早你都会走的。
社区小助手:很多网友想了解有关技术项目方面的知识(特别是大学生),作为一个资深人士,能不能给我们分享一下从项目开始到结束的整体流程,项目运行过程中应该关注的关键点? 朱有鹏老师: 一个项目的一般流程是:项目导入->需求分析->产品定义->方案选型->软硬件研发调试->测试与bug消除->出货与后续维护升级。
项目导入一般由市场部完成,他们会根据市场需求来决定要做什么产品。需求分析一般有市场部和产品部等部分来做,他们会分析这个产品的针对客户、参数要求、功能设计、创新点,甚至是成本控制等。
产品定义是在需求分析之后,结合本公司的市场观念和实际情况,定义这个产品的过程。这个定义包括了外壳(譬如用塑料还是金属,圆的还是方的)、功能(几个按键?分别能干吗?触摸屏还是按键?功能怎么实现?等),所以产品定义不止要结合需求,还要结合实现。一般是市场部门和技术部门来共同决策的。
以上部分基本都没有具体的研发人员参与,能参与进去的都是高层有经验的研发经理级别的。普通技术人员接触一个产品都是从下面实际的研发过程开始的。
首先是方案选型,这个一般也是经理或者架构师或者资深技术人员去选型,譬如说选主控是用STM32还是PIC还是51单片机就行了,譬如温度传感器是选普通几块钱的DS18B20还是专业级别几十块甚至几百块的型号等等。这个选型过程有时还需要伴随功能调试,根据调试结果再去调整。
方案定下来后就是软硬件研发工作了。硬件开发人员根据产品功能和外壳约束等去设计原理图,PCB,做板子来调试硬件等。软件开发人员来调试软件,譬如一个典型的嵌入式linux项目,底层软件开发人员会先用开发板等通用平台去移植uboot、kernel、定制rootfs,适配和测试板载硬件驱动这些,提供一个可以成功运行linux系统的环境给上层应用开发人员。而应用开发者则早早就在通用环境下开发纯应用代码了,到时真正的硬件到了后再去部署联合调试。这个过程是整个研发的核心环节,也是技术含量最高的部分,最耗费研发精力的部分。这部分研发完成后就可以出样机了,样机必须实现产品定义的所有功能。
样机和最终产品最大的差异就是样机有很多bug,这些bug有些是软件上的,有些是硬件的,甚至是选型的或者生产带来的。一般一款产品很难研发完成后就直接上市就是因为bug太多,必须经过完整的测试,确保大部分bug都被揪出并且解决掉后才能上线销售。当然了,销售后可能产品还是有bug的,譬如锤子手机曾经爆出镜头极易磨花,android系统自带的OTA升级功能也是为了系统发布后还能再次升级以解决bug才设计的。
Bug解除到一定程度后产品就开始批量上市了,之后的研发工作量就很少了。只需要根据市场反馈进行少量的调整、bug修复和功能升级即可。这时候整个研发团队的大部分精力和人力就已经转移到新产品上去了,一般只会留少量人员专门长期服务该产品了,很多小公司因为做的产品简单甚至量产后根本再不用理会直接全部转去新产品了。
一个项目整个研发环节中各步骤都很重要,要说哪个最值得关注是很难的,因为离开谁都很难运作好。而且这个和公司规模大小,和你做的产品的复杂度有很大关系。一个做手持加湿器产品的公司和做智能手机的公司完全不是一个量级的,根本无从对比。
社区小助手:在您看来,学习Linux开发最困难的部分在哪?对于初学者有什么学习建议吗? 朱有鹏老师: Linux的学习曲线确实很陡峭,回想我自己的学习历程也很艰辛。但是我客观公正的讲,学linux难不是linux的问题,是学习的人的问题。尽管这样讲很多人可能不喜欢听,谁都不希望别人说自己有问题。
首先,linux毕竟是一款操作系统。大家不妨回顾一下,你在学习linux之前是否有学习过其他操作系统。有人说windows,其实是不对的,你只是使用windows并不是学习。当你试图去学习在windows上编程(就是VC++那一套)时你会发现也很难。很多人不光是没学过一款操作系统,甚至根本没学习过关于操作系统的任何课程,不知道什么是调度,什么是内存管理,什么是文件系统。这就是所谓的零基础,这种情况去学习linux感觉难,这是linux的问题吗?
其次,linux不是凭空运行的,他必须在硬件载体上,而且不是MCU这种简单硬件,必须是带MMU的MPU级别的SoC才可以。而很多人根本MCU都玩不溜,MPU更是完全没接触过,这就是所谓的零基础,你去学习linux能不难?
最后,也是我要说的重点,就是C语言。进入任何世界的大门永远是语言,语言不通自然无法交流。之前我看过一篇文章讲姚明为什么在NBA混的好而其他国内的大牛到了美国就不行了,除了技术外最大问题就是语言和交流能力。姚明能真正融入NBA,和麦格雷迪等美国球星交朋友,融入他们的圈子,这样才能真正风生水起。你想想你如果英语这一关都过不了,你凭什么在美国风生水起?然后很多同学就是在C语言完全不通的情况下跑去学linux,这就好像英语都不会说跑去NBA打球,谁会传球给你?
所以如果让我说评说学习嵌入式linux的最大难点,我觉得是基础。大部分人学不会就是因为不具备基础。这一方面源于国内的大学教育不够接地气,另一方面源于大部分人大学时的不努力。总之结果就是什么都不懂,从头从零开始学linux,得出结论:学linux好难。真不是linux的锅,哥哥们。
所以我在《嵌入式linux核心课程》这套课程里讲了很多东西,所以这套课程有400多小时。这么多时间都是在讲linux吗?我只能说都和学习linux有关,但是大部分不是直接相关,而是你学习linux的必须基础。所以我们这套课程很受欢迎,很多同学都数次放弃治疗了最后还是通过这套课程学会了嵌入式linux。主要的功能就是这些基础,这些成体系的路线。
另一方面,我这套课程包含了很多基础,这些基础学好了可以去做linux,也可以去做别的啊。譬如vxworks,譬如做opencv做AI,譬如做视频处理编解码等等。其实这些IT类开发所需的基础是很相似的,只要基础打好了想去做任何主流的应用领域都很容易。所以我一再强调不要执着于嵌入式,说的就是这个意思。不是说嵌入式不好,不要学嵌入式,而是说要学宽了,学深了,然后你会发现出路不止嵌入式linux,说不定过两年鸿蒙OS来了又是一波机遇呢?
社区小助手:您认为对于嵌入式工程师来说,必备技能是什么?有没有什么建议分享给职场菜鸟? 朱有鹏老师: 说几个重要的吧。
第一必备技能就是编程语言。对于嵌入式工程师来说,C/C++绝对是核心中的核心,是你吃饭的家伙。我的所有课程之中,迄今为止好评最多的还是《C语言高级专题》(隶属于嵌入式linux核心课程第4部分)。直接原因就是因为很多人通过这个课程学好了C语言,然后发现去面试时笔试题都是这个课程讲过的,很容易笔试脱颖而出,自然好评。还有很多做单片机多年的老鸟死活入不了嵌入式的坑,后来学了C高级后发现其实是单片机的C语言和嵌入式的C语言差距非常大造成的……
第二必备技能就是庞大的知识库。嵌入式被有些同学说是“学的多,难度大,工资低”,至少在学得多这点上是没错的。作为一名成功的嵌入式工程师确实要懂很多,不止软件的甚至硬件相关的也得懂点,至少要能看懂原理图吧。你的知识面很大程度决定你的理解深度,你譬如说S5PV210的启动过程,很多人第一反应干嘛搞这么复杂啊。但是当你知道了SRAM、DDR、NorFlash、eMMC等存储的特性后你就明白为什么系统要这么设计了,这个硬件带来的设计要求直接决定了软件架构,所uboot分为BL1和BL2两部分。所以知识库很重要,那知识库从哪里来呢?就是我前面说的基础的学习了,所以你以为400多个小时都在讲什么?
讲到这里顺便说说,学的多我不反对。但是难度大和工资低我反对。其实难度并不大,你只要按部就班顺理成章去学,实际上不难理解的。至少我的嵌入式linux核心课程这几年来很少有同学跟我说实在理解不了,甚至连问我问题的人都很少。很多人觉得我几千上万名学生是不是每天要回答很多问题呢,其实并没有,有时候今天都没人问我问题,因为课程讲清楚了,他们都能听懂,问什么?再说工资低的问题,真正的嵌入式软件工程师工资哪里低了?很多人只是名义上是嵌入式软件工程师,根本就没能力,你凭什么工资高?做java的也有四五千的也有三五万的,那你说做java到底高还是低?所以当你觉得工资低的时候,搞清楚:不是行业工资低,是你工资低而已。
第三个必备技能就是良好的思维方式和解决问题的能力。很多人可能觉得这个有点虚,不好评判。我这里说的良好的思维方式指的是一个人遇到事情的时候他是心态和思维,够不够灵活、够不够坚韧等等,解决问题的能力指的是当你遇到一个问题时能否有足够的方法去快速定位问题、找到资源、然后解决问题。譬如说你遇到一个SegmentationFault,有时软件运行3天也不出现,有时运行几分钟就出现,很诡异,让你来解决,你怎么办?我当年第一次遇到这种问题时非常苦恼,折磨了好几天,后来突然想到一个方法:就是把软件的功能按照开发时的顺序逐个模块逐个模块去屏蔽(#if0 #endif),屏蔽一个测试一下再继续,直到某个时候这个bug消失了。这样我最终找到了这个“鬼”并且成功的解决了问题。我后来就明白了,没有问题是解决不了的,关键看你是否能换个思维。
没了,我认为重要的就这些。说白了我认为的核心技能就是:良好的基础+好用的头脑。有了这2项你遇到什么不会的可以迅速学会,遇到什么不懂的能快速搞懂,遇到什么棘手问题能迅速换几种甚至几十种方法去挨个尝试,总有一款能解决问题。所以这2项核心技能是最核心最关键的。有人可能会说这2项好像和嵌入式关系都不大都不直接啊。本来就是,所有的技术工作对人的要求都是这样的,嵌入式有什么不同吗?
社区小助手:入行多年来,您发布了很多视频教程,覆盖面也很广,可以说影响了不少工程师,可以聊聊您做教程的想法吗?初衷和目的是什么? 朱有鹏老师: 最开始做视频教程其实是偶然,2014年我和几个伙伴一起合作开线下培训机构,我主要负责教学。培训机构有个试听环节,就是把新来的同学塞进教室试听,让他看能不能听懂,老师讲的好不好,再决定是否报名学习。嵌入式学习是循序渐进的,要听懂都得从第一节开始啊。但是人却是每天都有新来的,所以前面的课程要反复讲。后来我就想出个办法,把从头讲的前面几天的基础课录制下来,新来试听的同学就给他试看这个录制视频。这些课程就是我《嵌入式linux核心课程》的基础预科的第2和第3部分,分别是linux基础和C语言基础。
后来这些录播视频发布到网上,很多同学联系我,希望看后续的课程。于是就动了心思去专门录制视频,于是乎有了嵌入式linux核心课程。当时录制这一套视频的时候,主要目的是想把自己几年来在嵌入式linux领域的学习、做项目、教学等积累的东西做个总结,给自己一个交代,然后主要重心就转去物联网方向。也没想到这套课程会怎么样,但是后来的反馈还是超出了我的想象,同学们的支持和学习效果给了我信心去持续不断录制新的课程。
说实话,讲课是个厚积薄发的事儿。其实很多有名的老师都有自己的代表作,或者说都有很拿手讲的很好的课程,但是后来都会止步于此。主要原因就是他那个代表课程是多年积累换来的,讲别的东西就很难有这个积累,所以显不出那个水平了。我深知这个道理,所以这几年除了讲课完全不敢放松自己,一直在参与一线项目研发,就算自己不写代码至少也要参与方案制定、架构设计、关键模块讨论,让自己保持行业敏锐性。同时不断学习去跟上新技术的发展,我们现在定下的未来长期发展技术方向是AIoT,我个人认为这个领域是嵌入式工作者最好的转型和扩展方向。我也会身体力行去向AIoT方向迈进,做很多工作,获取更好的资源,最后转化成好的课程给大家。
社区小助手:电子行业在飞速发展,现在有哪些技术或者开发方向是您比较看好的呢? 朱有鹏老师: 我最看好的就是AIoT,也就是AI和IoT。先说IoT,其实我2015年开始做嵌入式linux核心课程时就看好IoT了,所以我们的课程品牌叫:朱老师物联网大讲堂。很多同学不理解,一直问我怎么不叫嵌入式大讲堂?因为我一开始瞄准的就不只是嵌入式,而是物联网。
物联网的发展势不可挡,这几年在不断积累势能。虽然大家感觉发展缓慢,也确实有很多阻力和难点,但是方向不会改变。这就好像一个小孩子,你天天管着他看着他感觉怎么还是这点大,但是你得知道十几年后这就是一个小伙子,二十几年后这就是一个男子汉,这种趋势是确定的。所以我非常推荐有长远眼光,近十几年还不想退休,不想转行的兄弟们多关注物联网。
AI的热度这几年非常大,都不用我鼓吹了。AI大致分2种,一种是云端的AI,利用云计算技术在云端实现AI服务器,然后开放能力给网络客户端使用,典型的如华为云和阿里云都有提供云端AI能力。阿里的含光800,华为的昇腾鲲鹏等都是为了云端AI未来战争做备战。另一种就是端侧AI,也就是在嵌入式设备端实现本地AI(或者本地与云端协调的端云协同AI),譬如海思的HI3516DV300、HI3559等都是用来实现智能识别的摄像机的端侧AI解决方案,还有RK3399PRO这种也是实现人脸识别支付等项目的端侧AI方案,还有像嘉楠勘智的K210和ST后续会推出的一些都是弱端侧AI方案,性能弱但是性价比高。这些都是AI和嵌入式可以深度结合的地方。
很多人一听说物联网和AI就激动,感觉遥不可及。其实这些东西也不过是我们一直在做的嵌入式技术的延伸罢了。对于有嵌入式linux的开发经验的人,去继续学习掌握这些新的应用并不困难,甚至是顺理成章的事儿。我经常讲一句话:难的学不会是因为简单的没学好,天底下没有什么新鲜事儿。所以还是要厚积薄发,注重基础,一边脚踏实地打好基础,一边仰望星空转型未来。
社区小助手:采访到这里就快要结束了,有什么话想要对大家说的吗? 朱有鹏老师: 其实具体的技术点和学习方法等在视频课程中我都讲了太多了,这里没必要再复述。这里我不想谈术的层面,却想从道的层面来讲一点。那天看到一句话我深以为然,它说:对未知事物的好奇心和兴趣是促使一个人前进的源动力。
我常常在想,现在生活多好,大家要吃有吃要喝有喝,也没有生存威胁,那怎么样才能让一个人心甘情愿的累死累活去学一个东西呢?还是要靠好奇心和兴趣。如果你不想掌握这个新技术,不想学会这个新技能,你的兴趣点不在这里,那你会有一百种理由说服自己我学不会。然而你如果有兴趣了有好奇心了那你会半夜睡不着爬起来学习,怎么又会学不会呢?
我有时经常在想,其实做一个好的老师,最重要并不是讲知识和内容,而是通过讲述让别人对这个技术感兴趣起来,对你讲的东西充满好奇心起来,这样别人才能调动热情和兴趣去学习。只要他真的有了兴趣了,只要课程讲的不是太烂总能学会的。
所以如果你对嵌入式已经绝望了,已经放弃了,不妨再去看看我的课程,说不定会重燃希望和信心之火。我有个说法:劝人学习,胜造七级浮屠。 -----------------------------------------------------------------------
往期社区之星回顾: ******************************************************* 社区之星招募 不限专业领域、不限技术方向,只要你是一个乐于分享的开发者,只要你愿意把自己的经验收获分享给大家,帮助更多从业者共同学习、共同进步,你就是我们的社区之星!
`
|