最近找工作,好多猎头给我推荐的岗位跟我几乎完全不匹配,有鉴于此,特作此文,以供诸猎头参考。

编程语言:打个比方,我想写一本书,可以用中文,也可以用英文,还可以用俄文,等等。具体到做软件上,也有各种编程语言,目前主流的有C、C++、Java、kotlin、swift、Python、Go等。使用这种编程语言写出代码,机器就可以识别出让它做什么,各项功能也就跑起来了。每种语言都有自己的优势和劣势,都有自己的适用场景,所以没有哪一种语言是万能的。它们有的适合去驱动硬件工作,有的适合在浏览器里展示网页,等等。

Kotlin: 一种编程语言,目前主要用于编写Android应用软件。以前编写Android应用软件全都是用的Java语言,后来Android官方推出了Kotlin语言,作为Android应用开发的官方推荐语言。目前Java、Kotlin都可以开发Android应用,但大体趋势是Kotlin将会越来越占主流。嗯……其实已经是主流了。

Flutter: 一种跨平台的交互界面实现工具、应用开发方案。采用Dart编程语言。以前,在ios、android、windows、linux、网页等各平台上实现同一功能(例如,都是登录功能),需要在各平台上各自去实现一遍界面和交互,因为每个平台上的实现方式都不一样,所使用的编程语言也不一样,而使用Flutter可以做到使用Flutter实现一遍就可以在多种平台上都通用,这样就省去了很多精力和人力成本。一般互联网公司使用Flutter较多,而硬件公司相对来说就少一些,例如,Android手机厂商自己的软件,可能只会安装在自家手机上,不会在iPhone上安装,也就不用考虑跨平台的问题。

React Native: 一种与Flutter类似的东西。与Flutter都是目前比较流行的跨平台实现方案。

应用开发(通常也叫客户端开发):日常手机上用的微信、QQ、美团、滴滴等这些APP都属于应用软件,可以简单理解为你可以在各手机厂家(含苹果)的应用商店里搜到的软件。从事应用开发的人最多。

Android Framework(框架层):该层开发语言也是Java,有些情况可能需要C/C++。android应用开发通常只涉及应用层的东西,而应用层的基础就是Framework,打个比方,Android应用层是省长,Framework就是市长,省长干活要调用市长,市长干活又要调用县长,一层层往下传下去,越往底下,就越接近真正干活的人,而最上面得到的结果都是底下反馈上去的。在大公司,Framework会有专门的Framework开发工程师。Framework可以认为是Android系统的一部分,通常需要自己修改(或者叫定制)Android系统的厂商才会需要Framework工程师,因为纯软件厂商无法(没有权限)修改Framework,打个比方,腾讯是没有办法修改vivo手机的Android系统的。但是熟悉Framework就可以更清晰地梳理清Android应用运行的机制,甚至想方设法绕过一些限制或根据framework的原理找到一些实现需求的方案,从而编写出更加优化的应用。部分人员可以兼通Android应用开发和Framework开发。

Linux: 和Windows、Mac OS一样,都是一种操作系统。Windows、MacOS 都是闭源的,也就是它们的代码是不公开的,分别由且只能由微软、苹果公司去修改,而Linux是开源的,任何公司和个人都可以拿去修改,所以很多硬件厂商会使用Linux驱动他们的硬件。Linux的开发语言是C/C++。顺便说一句,Android系统就是基于Linux的内核搭建起来的。可以简单理解为Android系统最基础、最核心的东西都是用的Linux的。

驱动开发、系统开发、底层软件开发:驱动、系统、kernel(即内核)都是比Framework更靠底下的一层。一般这个职位,C、C++编程语言是必需技能,因为这几项都需要用这两种语言去实现。这个职位与Android应用开发基本完全不搭边,很少有人会兼通。如果是硬件厂家(典型为华米OV、大疆等)招聘WiFi、蓝牙、相机等相关的开发,大概率是对应着这一层。这类岗位的招聘里可能会较高频出现的词汇:驱动、底层、kernel、底层软件、HAL、C/C++、系统开发。如果搞过Linux系统开发,那么搞Android系统开发就会很有优势。广义上讲,Framework开发也可以归到系统开发里。

硬件是驱动和系统的基础,系统是框架的基础,而框架又是应用的基础。以手机为例,每款手机采用的芯片不同,这就需要针对这款芯片做驱动和系统适配,这样才能驱动这块芯片跑起来,而驱动和系统改了,那框架也可能受到影响(例如支持了一项新功能,那就需要框架里也适配,这样应用层才能调用框架层,框架层再调用系统,系统驱动硬件),需要框架也跟着适配,框架修改就又导致应用也可能跟着适配,但是由于技术实现的问题,这种影响是逐级递减的,也就是说硬件变动了,但是这个影响传到应用层的时候可能已经毫无影响了(仅供非技术人员粗略理解,实际情况多种多样),典型场景:你换了一个新手机,把旧手机上微信的apk安装到新手机上,微信仍然可以正常使用。所以软件厂商就会把精力集中到应用(客户端)开发,硬件厂商则需要各层都关注。

Windows应用开发、Linux应用开发:和Android应用开发也不是同一个东西,所需的技术也不一样,它们是两个不同的岗位。以QQ为例,你去QQ主页,可以发现有ios版、Android版、Windows版、Linux版、MacOS版等不同操作系统上使用的QQ可供下载,其中的Windows版QQ就属于Windows应用。同理,Android应用开发、ios应用开发也是两个不同的职位,尽管有些人确实两种技能都会

JNI:这也是目前招聘需求里出现比较多的一个词,即 Java Native Interface。多见于硬件厂商的招聘。如果只是单纯地做一个与硬件无关的Android APP,例如,一个发送文件的APP,那通常只需要使用Java或Kotlin语言就可以做出来了,但是如果涉及到硬件,例如,我要在一个智能POS机上做出一个APP,完成收款、转账等功能,需要控制POS机的硬件做一些操作(例如,在某个步骤需要启动POS机上的安全芯片做一个校验,或让POS机打印出一张纸质转账单),那Java和Kotlin就无能为力了,因为这两种语言无法驱动硬件,此时,可以驱动硬件工作的 C/C++ 语言就要上场了,于是,便出现了这样的场景:Java/Kotlin代码 调用 C/C++ 代码去驱动硬件工作,工作完成后 C/C++ 代码又要给 Java/Kotlin 回复一个结果 —— 两种不同的编程语言之间需要互相通信。JNI就是要做这种互相通信的工作。需要Java/Kotlin程序员和C/C++程序员合作才能完成,当然了,如果这个人Java/Kotlin、C/C++都会那就最好了,就可以一个人完成了(招聘公司最喜欢了)。所以不管是应聘者的简历里还是招聘需求里,出现了JNI时要留意一点:是连C/C++也会,可以独立完成JNI还是需要和C/C++程序员合作才能完成JNI。

综上所述:目前android开发工作基本分为三类,应用(客户端)开发、框架开发、系统开发,其中应用开发人数最多,也是各互联网大厂的主力(因为他们主要做软件),框架开发、系统开发则主要集中在华米OV为代表的硬件厂商,因为他们要根据自家的特色和需求去修改Android系统、添加各种硬件相关的功能。目前应用开发已过巅峰期,以AI为基础的产业正如10年前的应用开发一样开启了一代新的更迭,算法、大模型、大数据、智能硬件、嵌入式相关岗位喷发。江山代有才人出,各领风骚数百年。

--- ---  分割线  ---  --- 继续补充 --- --- 

服务端:也称后端。也就是为手机客户端、网页端等提供数据的后台,也可以理解为云端,与我们的手机、电脑等可能相隔千里,通过网络连接在一起。浏览网页、手机刷新闻、刷视频等,所看到的内容就是服务端提供的。手机、电脑等向服务端发送请求,服务端返回数据,再由手机、电脑浏览器等展示出来,就是我们看到的视频、新闻资讯等。目前Java语言在服务端开发中占有重要地位,所以采用Java语言开发应用的Android应用开发工程师转向服务端开发会更容易一些。

另附找工作体会如下

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐