一个 Android 技术专家,至少有 2~3 个专业领域。android
连接:https://www.techyourchance.com/android-developer-skills/
做者:Vasiliy Zukanov,独立 Android 开发及软件顾问
译者:罗昭成,Android 开发者程序员
许多 Android 开发者常常会问我,要学会哪些东西才能成为一个优秀的 Android 工程师?对于这个问题,他们的描述或多或少都有些差别,可是,整体来讲,咱们都须要学习一系列的技能,才能成为一个优秀的 Android 工程师。web
在我看来,存在这样的困惑是正常的。Android 是一个巨大而且动态的生态系统,你可能须要花好几周时间去了解并学习它相关的一些工具和概念,可是最后你会发现,它们有好多都不是很重要,或者说并非很是有用。所以,在本文中,我将分享我在 Android 开发中所使用到的重要技能,但愿可以帮到你,让你把你的精力集中到重要的事情上。面试
固然,若是你是一个经验丰富的 Android 开发者,这些知识可能你都知道。有不少技能和观点都须要不少基础知识的沉淀,当你没有足够的经验的时候,很难看到这些技能点。文中,我不可能列出全部 Android 开发者都须要的技能。因此,我根据不一样的经验,将这些知识点进行了粗略分组。请注意,这只是一个粗略的分组,并不必定是很精确的。设计模式
若是你只是一个想成为 Android 开发者的人,而且尚未写过任何应用,那么这篇文章对你来讲,还有点太早。本文主要是为了帮助开发者成为一个更专业的人。网络
本文,我会给你不少建议,不会让你空手而归。文章中列出了如何在短期成为一个专业的开发者。读完文章,须要你本身去练习,并时常回来看看这些技能。多线程
在本文开始以前,我就当你已经在 Google Play 发布过 Android 应用而且使用 GitHub 来进行源码管理。架构
Android 是一个很是复杂的框架,它拥有陡峭的学习曲线。有一些复杂的概念的确是 Native 的 Android 开发者须要学习的,但另外一部分倒是因为 Android 的缘由,形成了它的复杂度。并发
当你向专业进军时,除了你的软件开发工做之外,你应该学习 Android 框架,忘记语言、架构、流行的开源库,专一于核心概念,并进行深刻的研究。app
具体来讲,我建议你更多的了解如下内容:
Android 内存管理和进程调度
当面临「Low Memory Killer」的时候,如何保证你的应用程序稳定可靠的运行?这是一件很复杂的事情。长话短说,当用户切换到其它应用时,你应用的生命周期就会被打乱,可是当用户过一下子从新切换回来的时候,用户却但愿你的应用程序像任何事情都没有发生过同样,正常运行。
在本文中,我并不会介绍内存管理的任何细节,若是你想了解它们,能够看看这篇文章。
生命周期
若是有人要我说出 Android 应用程序中的复杂度和 Bug 的主要来源,我会立马大声告诉他是“生命周期”(而后捂住脸哭)。
Application、Activity、Fragment、Service、BroadcastReceiver、ContentProvider 和一些 Android 框架的核心组件,都拥有复杂的生命周期,而且它们的生命周期还不同。若是你以为这还不够多,Google 也一直在推出新的库和框架,这些库都有本身的复杂性和独立的生命周期。Loader, ViewModel 和 LiveData 都是为了解决这些问题而推出的。
有件有意思的事情,我历来没有看到过任何有关“生命周期“的定义。咱们一直在使用它,可是它究竟是什么意思呢?据我所知,在某种程度上,你只是把一些节点串联在一块儿,构建出一个生命周期的图。我对生命周期有过不少的思考,在这里,我将尝试对它进行定义。
组件的生命周期是一个抽象的状态机。这里的抽象的意思是指,这些状态机的状态是预先定义好的,它们之间的转换条件也是定义好的。可是这些定义是不完整的。你须要去实现缺乏的部分,使他们能够正常工做。这些缺乏的部分是这些组件方法的子集,咱们称其为“生命周期回调”,除了状态机自己以外,这些生命周期回调中,也有不少隐式的限制和约束。这些限制有些写在了文档中,而有些却并无记录。
生命周期到底有多复杂?咱们先来看一下这张图 (它有点不完整,还有点过期)。这张图,看起来有点可怕。不过,你也不要慌,大多数 Andorid 开发者都搞不明白这个图。事实上,即便 Google 的 Android 开发者也搞不明白生命周期的问题。Google 在发布 Lifecycle 组件的时候,里面引入了一些有关 Fragment 的 bug, 直到后续的新版本发布了才得以修复。
虽然如今你不须要彻底掌握 Android 的生命周期,可是你必需要知道一些重要的细节。不然,你的代码会变得混乱不堪,而且容易出现一系列难以解决的问题。我写了两篇文章 Activity 生命周期与 Fragment 生命周期 ,描述了生命周期的细节。当你不知道如何使用 onStart 和 onResume 时,你能够去看看这两篇文章。
当你掌握了生命周期的基础知识,你能够去看看 Gabor Varadi 写的 Android 开发的十宗罪 ,这篇文章,列举出了大多数开发者都会犯的错误。这些错误大多数都与生命周期有关。
顺便说一下,在面试中,生命周期相关的问题也会被常常问到。这也是你必须好好学习生命周期的缘由。
Context
在每个 Android 应用程序中,都有一个或多个上下文对象。
和生命周期同样,它也很难被解释。它就像是一个“上帝类“同样,它有很是多的能力。咱们很难用一两句话就把它描述清楚。尽管如此,理解 Context 职责和不一样 Context 以前的区别也是很是重要的。
本文中,没有更多关于 Context 的内容,我建议你去读一下 StackOverflow 中关于 《What is 'Context' on Android?》 的回答和这个回答的内容.
UI 线程
每个 Android 应用程序都有一个特殊的线程 —— UI 线程。这一个线程在屏幕上绘制出 UI 页面。若是你让 UI 线程超负荷运行,你的应用程序将会变得卡顿,不响应。在极端状况下,UI 线程中的错误会致使整个应用程序出错(至少看起来像是出错了)。
若是你想详细了解线程背后的机制原理,你能够去看这个视频,视频中详细解释了 Android 中的多线程,包含 UI 线程的相关细节和可能存在的问题。
逻辑拆分
从总体上说,Android 框架的代码很不“整洁”。它包含着不少的上帝类,这些类中,每个有数千行代码,而且咱们还必须去扩展这些类,才能让咱们的应用程序运行起来。在多数状况下,无论是 Application, Activity ,Fragments 仍是 Service,咱们都是在一个很大的类中,作不少的事情。
虽然在 Andorid 开发中,这是一个常见的作法,但这样子作并不利于长期维护咱们的代码逻辑。所以我建议,要尽量的注意这个问题,多找机会去重构代码,将逻辑拆分到独立的类中去。
说实话,我如今并不认为,一个初级开发者能够对架构和设计作出太多的改善工做。正确的封装代码逻辑,提取出有意义的类,都须要一些开发经验。固然,我也不但愿你不去思考代码拆分,你能够作一些力所能及的事情,避免出现不可控的状况(例如,一个 Activity 中写了超过 5000 行代码)。
刚开始,你能够尝试拆分这篇文章中描述的与 Context 有关的逻辑。
当你在你的职业生涯中工做几年,你变成经验丰富的 Android 开发者,经过研究和学习,你能够很轻松的实现一些非专业化的功能。那下一步,你该作什么?
我认为,在这个时候,你已经很熟悉 Android 框架的基础知识了,能够尝试去学习更高层次的技能。这些技能不局限于 Android,它们是一些通用的软件开发的技能。具体来讲,你能够研究如下主题:
依赖注入
依赖注入是一个关注结构分离的设计模式。它主要是用来进行分离应用程序的两个功能:应用程序和核心功能、核心功能组件实现之间的连接。
从某些方面来讲,实现了依赖注入的代码库就好你一个计算机:依赖注入的基础库就像是主板同样,而其余的功能组件就好像是 CPU、内存、外设等。只要你的代码中实现了依赖注入,你就能够很方便的插入新功能,而且能够很容易的重用其它组件的功能,也能够很方便的使用新组件的功能。虽然这个比喻有点夸张,可是在我看来,它也确实很好的反映了依赖注入背后的思想。
不幸的是,如今关于依赖注入的文章,不少都存在误解,这给初学者带来不少干扰。所以,若是你想学习依赖注入,我建议你读一下这篇文章,本文中,我分析了众多依赖注入的“神话“。
UI 分离
因为 Android 框架自己的架构,形成了咱们在开发的过程当中,使用户页面与应用程序中的其它逻辑耦合在一块儿。几乎全部的 Android 初学者都会这样。这种耦合会致使咱们写一个很大的类,这个类里面有应用程序的 UI 绘制、网络处理、多线程处理、应用业务逻辑等。
根据个人经验,UI 逻辑与其它逻辑耦合在一块儿,会致使代码的可维护性愈来愈差,早晚会使用代码变得难以理解,没法阅读。到最后,可能会由于功能上的一点小变化,引发很大的反作用。
要将 UI 逻辑与其它逻辑进行分离,能够用使用 Model- View - X 的架构模式。例如: Model-View-Contoller(MVC)、Model-View-Presenter(MVP)、Model-View=ViewModel(MVVM)。这些架构模式都属于同一类架构,固然,这一类架构不只仅包含列举的这几个,还有其它的架构模式。在这里,为了更方便的描述这一类架构模式,我把他们统称为 MVx 模式。
当你在学习 MVx 模式的时候,请记住,这些都不是架构,而是一种架构模式。这些架构模式仅用于 UI 展现逻辑。所以仅仅使用 MVx 并不能给你一个好的架构,要有一个好的架构,你还须要在其它方面作出更多的努力才能实现。
多线程
有经验的 Android 开发者都会了解多线程,而且了解他们对应用程序的影响。你也许会说,我精通 AsyncTask、RxJava、协程等。我想表达的多线程不是你理解的这个。会使用多线程框架并不等同于理解多线程。
举个例子,众多 Android 开发者都认为,使用 AsyncTask 会致使内存泄漏。这个观点来自 Android Studio 默认的多线程 lint 规则中。既然如此,那这个观点就是对的了吗?很不幸,这个观点是错误的。在这里,我不讲解它们的细节,你能够读一下这篇文章,里面有不少关于 AsyncTask 的内容。
我认为要理解多线程程,就必须可使用任何多线程框架,甚至是基于基础的 Thread ,均可以写出正确的并发代码。要实现这个目标,你不只仅须要知道你喜欢的多线程库的 API,你还须要理解多线程的细节。这些多线程库虽然好用,但若是你不理解多线程的基础细节,那么你的应用程序出现多线程的问题只是时间问题。
若是你想学习多线程,从这个视频 开始,视频中讲解了全部 Android 开发人员都须要知道的基本概念与原理。
自动化测试
据我所知,不少 Android 项目,都没有使用任何的自动化测试。在使用自动化测试的项目中,大多数也是 QA 人员使用 Appium 之类的工具来完成的。这是整个 Android 行业的现状,很是可悲。之因此没有自动化测试,这个问题能够追溯到 Android 起源,Google 也在很长一段时间里,没有关注过第三方应用的自动化测试。
现现在,有单元测试和 UI 自动化测试经验的开发者需求量很大。即便你到一家没有使用过任何自动化测试的公司去面试,若是你说你会自动化测试,就会给你的面试加分。反之,若是你去的是一个普遍使用自动化测试的公司,你没有自动化测试的技能,这会给你面试减分,处于劣势。
所以,我建议每个 Android 开发者都去学习一下自动化测试的相关知识。就我的而言,我更喜欢单元测试。而一些开发者喜欢 UI 自动化测试。因此,能够选择一个你更感兴趣的技术,尝试一下。
若是你对 Android 已经有了很是丰富的开发经验,那么,是时候学习一些“元”技能了,而且在特定领域进行深度研究。在我看来,如下技能对专业的开发人员来讲,都是很是不错的方向。
技术方案评估
若是你尚未作过这件事情,那么如今是时候开始作了。每个重要的技术决定,都须要进行评估、权衡。有时候,这种决定带来的结果很是好,立竿见影。可是大多数时候,并不是老是可以立竿见影,看到效果。一般状况下,须要决策的范围越大,所涉及到的评估范围就越大,除了能够简单进行决策的事情,还有不少可评估项都是很是抽象,短期内根本看不到结果的。
在本身丰富的经验水平下,面对众多选择,你至少应该知道如何找到取舍。若是你能对技术方案评估提供有用的建议,你就很是优秀了。技术方案评估权衡这是一项很是复杂的技能。一般,在与其它开发者、项目经理甚至是其它部门员工讨论的时候,你能找到折中方案,就能进行方案评估。所以,在大数状况下,你只须要掌握评估方案的能力就够了。
那咱们所说的“技术方案的评估”究竟是什么意思?说实话,很难具体说明它是什么。不过,咱们能够提供一些反例,来解释为何不适合在开发中使用。举个例子:
咱们应该将多线程的使用迁移到 RxJava, 而不是 AsyncTask, 由于 AsyncTask 会致使内存泄漏。
正如我前面所说,AsyncTask 并不会致使内存泄漏。因此上面这句话是错误的。说这句话的开发者并无深刻的研究多线程。此外,他也没有提到 RxJava 的问题。对于一个项目中的开发人员来讲,RxJava 存在一个很陡峭的学习曲线。
咱们应该为咱们的新代码写单元测试,而且设定一个长期的目标,覆盖全部的代码,以确保咱们的代码质量。
这句话包含几个前提,首先,咱们如今开始单元测试是不可能的,至少须要开发人员投入时间来学习这种技术。编写单元测试是一个很明智的决定。咱们不能为全部代码编写单元测试,由于有一些部分是不稳定的。最后,达到特定的覆盖目标并不会自动提升“质量“。在这个例子中,开发者并不了解单元测试,他们没法肯定在项目中使用单元测试所涉及的问题和影响。
我但愿,你对“技术方案评估”已经有了大体的想法,若是你有一个重要的决定,你须要完成全部必要的调研,若是你依然看不到整个评估中存在的复杂网络,那多是你的调研没有作好。在作决定的时候,有些事情可能超出技术范围,你也须要考虑你的决策对其它部门同事的影响。
专业领域
如何区分一个技术专家和一个普通开发者?是咱们熟悉的概念的数量吗?我认为,在技术方面,区分是不是专家主要在于知识上的深度。
做为一个技术专家,你应该有一个或者多个专业领域。你知道这些领域的详细细节,比通常的开发者知道的要多得多。你须要持续深刻的研究,来保证你的专业深度,了解专业领域的最新发展,不会对新的工具和技术感到惊讶。此外,即便你并无在任何项目中使用某些技术,你也须要研究这些技术使用上相关联的各类成本。
现现在,有一个本身的专业领域很难。这不是从博客中挑选几篇好文章进行阅读就能够的,也不是读完几本好书、上完几门好课就能够的。固然,经过这些内容进行学习,对你的专家之路都是有帮助的,可是要有本身的专业领域,惟一的方法就是积极参与其中进行学习研究并得到大量经验。
我很喜欢物理学家尼尔斯·玻尔说的这句话:
An expert is a man who has made all the mistakes which can be made, in a narrow field.(专家就是把领域内全部该犯的错都犯完的人。)
咱们能够在哪些领域进行深刻研究呢?实际上,几乎全部的均可以进行深刻的研究,在软件开发领域,没有任何一个领域会由于过小而不能设置成专业目标。对此,我也有一些建议:
UI
构建系统
离线工做
并发
NDK
持续集成
性能
架构
监测
项目管理
专业知识领域
还有不少不少。须要注意的是,上面我列出来的内容,一些并不属于严格的技术领域。只要你能为你的雇主产生价值,你能够选择你喜欢的任何领域并进行深刻研究。
我认为,一个 Android 技术专家,至少有 2~3 个专业领域,例如,个人专业领域是:架构、单元测试、并发、依赖注入。我相信,在不久的未来,我可以将“重构祖传代码”添加个人专业技能列表里面。
因此,若是你有 4 年以上的经验,你的专业领域是什么?
以上,这是我建议你,做为一个专业的 Android 开发者应该具有的技能。
你可能已经发现,个人文章标题是 《Android Developer Skills for 2020(2020 年,Android 开发者须要的技能)》,可是这篇文章中没有什么内容是特定于 2020 年的。我能够在一两年前写这篇文章,由于本文内容适合全部时间,基础和重要的概念不会常常改变。
如今,若是你对 Android 生态系统的最新发展感到好奇,你能够阅读个人另外一篇文章 ,我总结了 2019 年末 Android 发展的情况。最后,我再重复一次,若是你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情作深度研究。
一如既往,感谢你的阅读。你能够在下面留言评论和提问。
最后小编想说:不论之后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来讲,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提高本身,历来都是咱们去适应环境,而不是环境来适应咱们!
当程序员容易,当一个优秀的程序员是须要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每一个阶段都须要掌握不一样的能力。早早肯定本身的职业方向,才能在工做和能力提高中甩开同龄人。
想要拿高薪实现技术提高薪水获得质的飞跃。最快捷的方式,就是有人能够带着你一块儿分析,这样学习起来最为高效,因此为了你们可以顺利进阶中高级、架构师,我特意为你们准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了之后保证薪资上升一个台阶。(如下是一小部分,获取更多其余精讲进阶架构视频资料能够点击下面的小卡片获取)
当你有了学习线路,学习哪些内容,也知道之后的路怎么走了,理论看多了总要实践的。
如下是今天给你们分享的一些独家干货:
《Android架构视频+BAT面试专题PDF+学习笔记》
【Android开发核心知识点笔记】
【Android思惟脑图(技能树)】
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【Android高级架构视频学习资源】
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!如今都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现现在市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破本身涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
上述【高清技术脑图】以及【配套的架构技术PDF】点击:《Android架构视频+BAT面试专题PDF+学习笔记》
便可获取!
以为不错,记得点个关注,第一时间获取最新资讯和技术分享哦