共计 3744 个字符,预计需要花费 10 分钟才能阅读完成。
最近有一位读者去面试 Android 开发,这位读者师出名门(BAT 中的一家公司),是有十年的软件开发教训的资深 Android 工程师,但却以没有技术深度回绝了他。
发现他做模仿面试的时候也发现了这个问题,因为从简历上看他的出身,呆过两家出名的互联网公司,面试官肯定会不盲目的晋升对他的冀望。他尽管有丰盛的我的项目教训,但真正交换下来又发现尽管在出名公司工作却没有把握“外围科技”,他的劣势一下就变成了劣势。
随着年龄的增长,你原来的劣势都在缓缓变成你的劣势。
写给资深或行将资深的 Android 工程师
当咱们是高级工程师的时候,最心愿的就是有丰盛的我的项目教训,好把本人红润干瘪的简历填的炫丽丰满。然而随着工夫的积攒,简历上的我的项目是挺“丰满”的了,但咱们只看“表面”的行为造成了本人另一个窘境:看似很资深,其实又没有做过什么有难度的事件,工作了十年可能只是 1 年的工作教训用了 9 次。
正如这位去面试的读者,从简历上看的确是能看到他辉煌的我的项目经验,在经验之下会发现简历中没有深刻的中央。有些尽管写的很有技术,然而的确只是在应用 API 的水平而已;有些解决问题的形式很有技巧,但还不成体系。
惋惜没有多走两步,没有去钻研和扩大。
那么如何扭转呢?
对方也在问我这个问题,而且很迫切,迫切到心愿我明天说明确之后他今天面试就能够变得深刻。
我很无奈且间接的阐明了这个多半不可能。如果是可能的话,他人也能够很快把握核心技术变得很深刻。但长期的话我认为是可能的,比方给本人半年的工夫,对以前我的项目中的某一项技术框架进行学习扩大和实际。*能利用一下你目前所在公司的资源,比方做这个框架的项目组,和他们搞好关系,向他们学习、和他们探讨你遇到的每一个问题。
然而相对没有其余的形式,能够让你通过看一下或者临时准备一下就晋升到有深度的境地。如果你能做到,必然是曾经在某方面是个很精湛的高手了,天然能够疏忽我说的话。
没有深度的起因
咱们没有技术深度,最重要的起因有两个:1 是回避问题,第二是没有趣味。
当咱们在工作中遇到问题的时候,对于难点抉择往往是回避它,不论是从设计上还是从技术上,或者找到其余的代替计划,如可应用他人的开源库,应用他人造出来的轮子。这样做无可非议,但如果咱们想有更深一步的晋升或者更有技术深度的话,咱们肯定要把这个问题搞明确,至多把他人是怎么能解决这个问题的思路和形式搞明确。
第二对于趣味,很多人没有往更深刻的中央多走两步,很重要的一点就是没有趣味,一点都不好奇。如果咱们遇到一些很有意思的解决方案、框架或者一些诡异的问题,但咱们齐全不想去“招惹”它们,唯恐避之而不迭,天然,咱们也失去了在这些点上有冲破与深刻的机会。
如何晋升本人的技术深度呢?
- Java 语言进阶与 Android 相干技术内核
Android 利用是由 Java 语言进行开发的,SDK 也是由 Java 语言编写,所以咱们要学习 java 语言。另外,虽说 kotlin 语言失去了 Android 官网的热推,然而 kotlin 也是编译成了 java 语言再运行的。对于 Android 来说,只有 SDK 没有用 kotlin 重写,那么 Java 语言是都须要学习的。而且 Android apk 的后盾服务器程序大概率是 java 语言构建,所以学习 java 也是一种必然。那么 Java 中哪些货色是咱们 Android 程序员须要学习的呢?因为 Android 程序员习惯了 C V 代码块,所以与 Android 中比拟相干的略微比拟难的 Java 根底简直都是一个门槛,像 泛型,多线程,反射,JVM,Java IO,注解,序列化等,都是被 CV 的对象,而程序员是不懂原理的。
- App 开发框架常识体系(APP 亦对象)
这块常识是现今使用者最多的,咱们称之为 Android 2013~2016 年的技术,然而,即便是这样的技术,Android 开发者也往往因为网上 Copy 代码习惯了而导致对这块常常“应用”的代码相熟而又生疏:相熟的是简直天天在和它们打交道,天天在复制这些代码;生疏的是尽管天天和这些代码打交道,然而并没有深入研究过这些代码的原理,代码深处的外延。所以咱们须要从新的角度去剖析这些知识点,深入研究他们,要学习源码,模拟源码,而后再 hook 源码,这样能力说本人懂这块的常识。这些都是做 Android 开发,做高级工程师的根底。
3.Android App 全方位性能调优
一个 app 的性能好不好咱们须要从两个层面致力。*个层面:从写代码的时候就须要留神,让本人的代码是高性能高可用的代码,这个过程是书写高性能代码;第二个层面:对曾经成型的代码通过工具查看代码的问题,通过查看到的问题来领导咱们进行代码的删改,这个过程被称为调优。
如何写出高性能的代码呢?那就须要咱们具备深厚的代码功底,这就是代码的根底,如:数据结构达到能够依据利用场景写出合乎以后场景的非凡构造,比方 google 针对 Android 平台特色研发了 sparseArray 代替 HashMap。另外,对罕用的算法有本人独到的见解,leetcode 上有刷个上百道题,这样差不多能够达到精通最罕用的排序查找动静布局等算法的能力。再者,高效的算法以及节俭内存的数据结构如果配合优良的合乎利用场景的设计模式,那么,这些就为高性能的代码提供了实现根据。
另外一个就是对写好的代码进行调优,那么调优的方向就是应用 Profiler 工具进行测试和查看,看哪里有性能耗费大的操作,而后剖析对于代码的问题。调优的方向就变成了如何对内存调优,对耗电调优,对网络流量调优,当然,还有对启动速度,页面切换成果与速度,开机白屏体验,闪屏方面的起因等进行剖析和调优。*再加上一个屏幕适配相机适配。
音视频 / 高清大图片 / 人工智能 / 直播 / 抖音等等这年与用户最严密,与咱们生存最相干的技术始终都在寻找最终的技术落地平台,以前是 windows 零碎,而当初则是挪动零碎了,挪动零碎中又是以 Android 占比绝大部分为前提,所以 Android NDK 技术曾经是咱们必备技能了。要学习好 NDK,其中的对于 C /C++,jni,Linux 根底都是须要学习的,除此之外,音视频的编解码技术,流媒体协定,ffmpeg 这些都是音视频开发必备技能,而且 OpenCV/OpenGl/ 这些又是图像处理必备常识,这些都是原理级的实战我的项目。
因为篇幅起因,还有很多点须要大家晋升的像混合开发、小程序开发、架构专题等,在这边就不进行赘述了.
本人该在哪个点上深刻呢?
咱们工作了很多年之后,技术肯定是须要具备肯定的深度和广度的,广度天然不用说,你也会明确它的必要性。深度 * 是跟本人的趣味或者比拟靠近的工作模块相干,如果你在公司相干的模块深刻,你能够利用更多的资源。或者是你感兴趣的模块的话,即便没有资源,因为你很有趣味,你也会有方法去找到你须要用的货色的。
咱们永远不缺办法。
率领和被率领
技术的深度是一个率领和被率领的关系。
对于这点我自身就有一个粗浅的领会,在我刚开始做 Android 开发的时候,我的工作是去保护 Android 自带的零碎利用,客户提的问题或者进行二次开发,我都能很好的解决。而后就会有一些闲暇的工夫,反正也是闲着,我就找了个零碎利用外面最简略的一个利用(记事本)练练手。
我想既然这么简略,那我就本人照着写一个吧,就从零开始实现一个记事本利用。当我开始写时,颠覆了我对安卓利用的了解,我发现以前认为懂的中央本人都没懂,我遇到了很多毫无脉络的问题,就这么一个简略的利用,我要靠不停的对照原版的代码实现能力发现自己的问题所在,而后才确信真正的做和看两头的差距有多大。
如果你只是在他人的根底下来做事件解决问题,哪怕你感觉本人想出了很好的点子,如同灵光一闪,很奇妙的解决了客户的问题,但其实这只是一种技巧,在怎么建造这个利用、构架和设计组织这种大的方向上,你并没有多大的本质提高。
这个时候你只是一个跟随者,你是被他人的源码率领着的。
即便你看过和应用过很多利用框架,但纸上得来终觉浅,只是增加了些许夸夸其谈的资本。你始终是一个被率领的人,率领者给你定好了框架,给你定好了一条大路,而后你在他定好的路线上耍了一下滑头,却生出一种假象:感觉本人很厉害,很有技巧。
而你本人写一个这样的框架,或者去设计一个思路,去指定一个方向和门路的话,你会发现它没有你设想中的那么简略。
你是要做率领他人的人?还是要做一个被率领的人呢?
小结
没有技术深度是大多程序员的一种常态。
并不能说这是一种坏的或者好的景象,这只是一种正当的状态,因为很多工作,很多人从事的我的项目并不需要有多少技术深度。即便你有深度,你也可能发现用不上。对于大多数人,合乎感性的做法不是去谋求技术深度而是够用就能够了。
但转到集体的话就不一样了,在技术上你须要够用,然而在某方面上你须要有肯定的深度,以突出你本人的学习了解和使用的能力,而且这个能力是要有胜利案例来背书。
特地是当你成为一个资深的工程师的时候,很多公司并不心愿你还是那样平庸,没有深度。尽管你会纳闷,我就算有深度你们也不肯定用得上呀?然而到了这个级别的人需求量并不像初中级开发那么多,公司更感性和稳当的做法是抉择有深度的人,不是吗?
关注公众号支付 Android 材料,纯干货
https://blog.csdn.net/qxf8656…