首先根据我在小型私企工作几个月的经验和我在网上找的一些经验贴的知识来看,我应该是基本了解了这方面的学习方向,这里我做成经验贴供有缘人参考
岗位情况
我目前做的嵌入式安卓是个什么情况呢?大体是软件层面,但是又不是纯软,会有很多和硬件层面打交道的时候。首先如果你有看过《第一行代码Android》这本书里面的内容,就应该能了解到这本书里面讲的安卓知识都是用来做一个安卓app的。所以和一般的软件开发很类似,可以看作是搞桌面开发。我目前学习到的内容以及接触到的第一个项目也是做安卓app。但是我这个岗位的后续方向远不止这一点。
我后面的工作内容更多的会深入到Android架构的HAL层、Kernel层、Loader层等,去这里面动刀子。我们会将安卓系统的源码(这里是不同源厂商给出的方案的源码)进行修改和完善,让他符合我们的需求。然后再将代码烧录到板子上。简单的来说,桌面开发的内容是做上层应用软件,而我们需要对系统内部动刀。这对个人的能力提出了更高的要求。并且会更多的涉及到硬件层面的知识交融。
给大家看一点我从别人博客里看到的嵌入式的岗位分支:
嵌入式硬件开发:这是硬件工程师来做,一般出身为自动化,电子,通信等专业,他们要求熟悉电路等知识,非常熟悉各种常用元器件,掌握模拟电路和数字电路设计的开发能力,熟悉硬件开发模式和设计模式,熟悉各种芯片及外围设备,熟悉8位16位32位处理器嵌入式硬件平台开发。有的要求有FPGA的开发经验,精通常用的硬件设计工具:Protel/PADS(PowerPCB)/Cadence/OrCad。一般要有4~8层高速PCB设计经验。由于本人不是做硬件的,对这一块的不熟悉,所以不敢妄言。
嵌入式驱动开发:这个可以硬件工程师来做,也可以软件工程师来做,主要还是取决于设备。目前驱动开发,除非是简单的设备驱动,实际上很多时候都是移植,所以更多的是需要掌握目标平台的硬件和系统特性。所以至少得掌握一些操作系统、系统结构、计算机组成原理、数据结构相关知识。熟悉嵌入式ARM/MIPS/PowerPC架构。具有单片机、某种或多种32位嵌入式处理器的移植开发能力,熟悉bootloader过程,具有扎实的硬件知识,理解硬件原理图,能独立完成相关硬件驱动调试,能够根据芯片手册编写软件驱动程序。如果涉及到网络设备,或许还要掌握很多高层的网络协议的原理。个人感觉这一块虽然大部分不是很难,但却是极为重要的。当然如果要在这一层次提供对上层的多线程支持,某些驱动也是很难写的。
嵌入式系统开发:这个没听说硬件工程师来做的。做这块,熟悉操作系统的原理是必不可少的,比如内存管理,比如线程调度,比如文件系统等等;还要精通处理器体系结构、指令集、寻址方式、调试、汇编和混合编程等方面的内容;熟悉操作系统启动流程。对于linux,要熟悉Linux配置文件的修改,掌握内核裁减、内核移植、交叉编译、内核调试、启动程序Bootloader编写、根文件系统制作和集成部署Linux系统等整个流程。这一块要是真写起来,困难程度那是相当恐怖的,好在大多都是移植,很少听说有公司要去开发个操作系统的,没Google的实力啊。
嵌入式软件开发:这个嘛,没有操作系统的话,程序一般不会特别复杂,如果有操作系统的支持,又和一般的软件开发很接近,所以尽可以看作是搞桌面开发。这个要求就是熟悉系统的API,精通C语言的高级编程知识,包括函数与程序结构、指针、数组、常用算法、库函数的使用等知识、数据结构的基础内容;掌握面向对象编程的基本思想,以及C++语言的基础内容;精通嵌入式Linux下的程序设计,精通嵌入式Linux开发环境,包括系统编程、文件I/O、多进程和多线程、网络编程、GUI图形界面编程、数据库;熟悉常用的图形库的编程,如QT、GTK、miniGUI、fltk、nano-x等,掌握各种应用层的网络协议使用,以及各种音视频技术等。
上面这块内容简单看一看就好,我标粗体的是我正在这段时间内有了解和听说到的部分。感觉我好像,下面三个内容都会涉及一些。我特意问了一下我的师傅,我们要做的事情是这样的:我们会拿到芯片原厂的芯片放到我们的板子上,然后我们的其他模块(比如WiFi模块,蓝牙模块,音频模块等)他们也会从不同的厂商采购,然后不同的厂商有自己不同的驱动。我们要做的就是将这些模块驱动移植到我们的安卓系统的kernel里面。以后更多的是设计kernel的修改,然后可能会动到一些Bootloader等。
技术需求
岗位情况说完了,那就来讲一讲我这个岗位的一些技术需求是什么吧。上安卓框架图!算了,图有点长我感觉不好看,所以还是我口述吧。
- 安卓的上面几层(系统app这种…)就是java写的,所以《第一行代码Android》这本书里面也都是java代码。但是深入到下层,就是C/C++的代码了。因此c++和java都要会。
- 因为我也会有要开发安卓app的时候(现在已经在了),所以对于Android App开发、GUI图形界面(目前学了QT)、还有一些其他的UI工具包(目前学了FLutter)都要会一些。这都是我现学的。
- 因为要把代码烧到板子上,所以交叉编译,嵌入式的开发流程也要熟悉。
- 剩下的就是对安卓底层原理的理解了吧,这部分目前我还小白一个
基础需求
当然还有一些程序员都要拥有的基础能力,这是我在其他人的博客里面看到的,这里也放进来:
- 开发平台的熟悉,目前的嵌入式开发大多数是在linux或者类linux下的环境下进行的,那么linux的使用应该熟悉吧,shell脚本得会写吧,配置文件得会改吧,GCC GDB 得会用吧,Make工具得会吧,adb要能用吧?(这里面我现在目前Linux使用会,shell脚本在学,adb会用,其他的待学QAQ。Linux我也不敢说我会用了,很多管道符操作之类的我现在也没怎么熟悉)
- 项目管理工具的使用,都什么年代了,不会用CVS,也不会用SVN?请问,你还活在软件时代的原始社会么?(这里我们组用Git,现在好像大家都用Git。也不能说我之前完全不会用,但是工作这几个月对我的鞭挞才让我真的对git有更多的了解,以前都只用一两条命令)
- 数据结构和算法,搞软件开发,不懂数据结构,不会算法优化,不会衡量复杂度,太不靠谱了吧?当然,这个不是要求啥算法都会,啥数据结构都记得住,最起码得知道有那么种东西,有什么作用,这样用到的时候好歹也能查啊。(这部分嘛…我知道很重要,但是我不能说都不懂,也不敢说懂。以前学过现在忘记的太多了,能用上多少不好说,但查一查还是会的。另外这里我补充一下设计模式也很重要)
- 编程语言,关于JAVA,我知道现在JAVA的异军突起,很是震动了编程语言界,但是在嵌入式开发下,不会C或者C++语言,实在说不过去。当然现在很多手机应用完全用java写的,如果你只想搞嵌入式的上层软件开发又不想深入下去,只用JAVA也未尝不可。关于汇编,嗯,这个可能挺难,毕竟跟具体的硬件架构(主要是CPU)有关,但是真的很有意思,而且在某些时候,它是不可替代的。(C++和java都得会)
我觉得一段很有道理的话
有时和同事讨论起现在的行业需求,说到各个公司总是招不到人,程序员又总说找不到工作,自己就有很多感想,是公司要求高,还是程序员要求高?有时候看到一些招聘的职位要求,总是打击到自己的信心,一条一条数下来,好像自己能做到的还真没多少,只好让自己再努力些再努力些;当然有时也会觉得某些招聘不靠谱,看那一条条的要求,个人感觉要是全做到,普通人怎么也得努力个十年八年的,这样的大牛们,估计看不上给出的那薪资吧。
对于程序员来讲,做技术真的是很累很难的一件事情。网上搜一下,遍地的抱怨贴,情感贴,都充分反映了这个职业对身体和情感的考验。如果你不畏艰难,想把技术做下去,那么努力吧,也许某天你会随便拿起一份招聘启事,鄙视一眼:“靠!就这点要求,老子去都掉价!”,那么你就是真正的大牛了!
是的是的,一看那些招聘要求,好打击人啊。我哪儿敢精通XXX,再给我三年我也不敢说
职场新人一些很重要的点
工作上
- 积极性:
- 做事情不要拖拉,能快速做好就不要拖(当然你汇报的进度和实际的进度那得斟酌,DDDD)
- 面对一些技术问题主动留下来加班把他弄懂
- 遇到困难主动学习各方面的资料,勤做尝试,用事实去验证,多请教老师傅
- 学习力:
- 一方面是对新出的技术和技术栈能不断学习(长久的学习力)
- 另一方面是当急需用到新的技术的时候利用好(二八法则)快速能够运用新的技术。
- 专注力:
- 稳定的心态和强大的意志力。项目遇到问题和瓶颈是肯定会有的,这时候既不能遇事慌乱,也不能畏难止步。尤其在突发状况下需要冷静的思考并专注于问题的解决。
- 沟通力:
- 团队内的沟通,团队外的沟通。对内要侧重于宏观把控和具体细节,既要统一好努力的方向也要注意到细小甚微的地方,明确时间观念,职责划分,有问题一定要及时反馈。
- 对外侧重于站在对方的角度思考,对方想要了解的是什么,针对不同的身份采取不同的表述方式让对方更好理解。此时详细说明还是抽象概况也需要按情况选择。
- 擅做笔记和记录
- 知识过了脑子很容易忘记的,一定要做好记录,除了自己做大段笔记也可以直接记下别人的笔记网址,需要的之后直接跳转过去看。知道知识在哪里获取和掌握这些知识同样重要
- 另一个做记录的好处就是,你能感受到自己是在不断学习和进步的,而不是每天好像做了什么又好像啥都没做。
生活上
生活上的经历和收获才是我这段时间感悟和收获最多的,也许和你的感受不一样甚至很颠覆,但请不要骂我。
- 不要太在乎别人
这里不要太在乎的意思不是让你趾高气昂、没有礼貌、不把别人放在眼里。是说你首先要爱自己,然后再爱别人。不要过分的关注别人的生活,在意别人的行为。不要因为同事本来和你玩的好好,突然和别人玩一起了你就不开心了生气了,每个人有自己的生活和选择,玩不到一起也别强求。也不要因为同事身上有一些你觉得不好的地方你就表现的很明显不想和对方接触,接触是不可避免的,不要搞僵了关系,就当成工作上的合作就好,把内心的想法藏在心里。另外也不要关注同事在工作外的私生活,每个人都有自己的空间,上班是上班,下班是自己的时间。 - 谨言慎行,少说多做
千万不要在同事面前说其他同事的坏话,同事在你面前说其他同事或者公司的坏话的时候你也不能表达出自己的观点。否则…很容易出事,反正祸从口出,交心这个事情还是要谨慎。谨防背后被人捅刀子。 - 培养多方面的爱好习惯,周末多出门走走,认识新的朋友
这点很重要,每天上班这么久,看到的都是一样的面孔,时间长了肯定很累。还会觉得自己每天都在做差不多的事情虚度光阴。我就保持每天看书的习惯,到现在三个月看了40多本书了,每次看完书之后感觉整个人都放松了,焦虑的情绪一下子舒展。周末也要多出去走别窝在家里,多认识别的人。不然周一上班还是会觉得很累,因为你又看到了相同的人。 - 多和以前的朋友保持联系
属于自己的时间里难免会孤独,多找以前的朋友吧。交流一下大家的工作,目标,一起打游戏,很好的。 - 有自己的方向和目标
一定不要安于现状,得过且过,不思进取哦!温水煮青蛙的道理都知道吧,你要安于一隅那么一辈子也就只能待在这一隅了。做好职业规划和你的目标计划,使用OKR管理法管理目标进度,并经常复盘。最近有个词很火“重启人生”。我希望大家也能在浑浑噩噩的时候及时醒悟,“重启人生”。 - 要懂得取舍,懂得满足,不要只想着和别人比较
这点我很有发言权,本来我看了一圈周围和我一起找工作的同学的工作情况和我比较,我觉得我过得挺好的,十分满足。但是又看了看自己读研的同学们,考上了很好的学校的研究生,然后还看到了研究生学长那好高好高的薪资。我又瞬间动摇,差点想回去考研。反正就,不同的选择有不同的人生,不一定另一个选择就比现在好。不要想一出是一出。emmm,就少动摇。这一条和上一条不冲突哈。我这里强调的是老和别人比是比不完的,别难为自己。