程序员、网络工程师、数据库管理员这类人构成了 IT 共和国的主体,这个阶层是十九世纪的产业大军在二十一世纪的再现,只不过劳作的部分由肢体变成大脑,繁重程度却有增无减。在渺如烟海的程序代码和迷宫般的网络软硬件中,他们如二百多年前的码头搬运工般背起重负,如妓女般彻夜赶工。信息技术的发展一日千里,除了部分爬到管理层的幸运儿,其他人的知识和技能很快过时,新的 IT 专业毕业生如饥饿的白蚁般成群涌来,老的人(其实不老,大多三十出头)被挤到一边,被代替和抛弃,但新来者没有丝毫得意,这也是他们中大多数人不算遥远的前景…… 这个阶层被称做技术无产阶级。
节选自:刘慈欣科幻小说《2018 年 4 月 1 日—刘慈欣》
你们感觉写的真实吗?其实,回过头去想想,随着时代的发展,从互联网到移动互联网再到所谓的人工智能智能时代,大数据,云计算,世界可能确实也越来越需要程序员,程序员也越来越多,然后再想想我们自身的工作,每天重复的复制,粘贴,确实像码头的搬运工,每天干着苦力,而这个苦是脑子的苦,而不是身体的苦。
而我们Android程序员面临的悲哀不光是中年危机、而是信息技术的更新迭代。突然发现行业已经缩减Android开发岗位了,我们快失业了!
移动互联网时代到来之后,移动 App 成为新主流,需要大量开发 Android、iOS 端,曾经还有 Windows Phone 等不同版本,早期以 PhoneGap 等为代表的 Hybrid 形式和内嵌在 App 中的 WebView 开发为主,非常浪费人力物力。
然而从 2015 年 React Native 开始,Weex、Flutter、Kotlin-Native 等跨平台框架相继出现,加上微信小程序以及手机厂商联合推动的快应用,前端技术在移动端有了越来越多的使用场景。因此,越来越多的公司也在组织架构上做出相应调整来适应这种大前端趋势。以前的团队构成以移动端程序员为主,如今除了 Android / iOS 开发之外,还有 RN / H5 / 小程序等开发人员。
那么,大前端趋势是否意味着传统 Native Android 程序员需要转型?
如今移动端主流操作系统只剩下 Android 和 iOS。以前者为例,目前 Android 已被广泛应用于手机、平板、汽车网络、物联网、智能电视等领域,是名副其实的终端霸主,另外 Android 端在国内手机市场占有 80% 以上的市场份额,短期内被其他 OS 所取代的可能性非常低,所以 native 程序员还是有非常大的市场。
现在的技术分工越来越细,这也意味着大部分企业需要专精的人才,***是精一门、通多门。去大公司面试 Android,如果你的 Android 技术不深,剩下的前端、后端、python 技术,面试官也没兴趣了解了。所以并不是会得越多越好,一定要做好减法,先专精一门,再去学别的技术。
在大前端时代下,一个合格的开发者应该是 JS + iOS / Android。可以是一个熟练的前端,学习一点 native,或者是 native 程序员会 JS。如果公司是以 App 为主且注重用户交互体验,一个合理的路线是 native app 开发者坚持把 native 部分做精,然后学习 JS 前端知识、拓宽技术栈。
一. 从初中级到高级,移动端程序员的进阶宝典
想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。
下面我们就以 Android 开发为例,从硬技能和软技能两方面,梳理大前端趋势下移动端程序员从初级到高级进阶所需的技能点,并且推荐一些实用的书籍资料。
(一) 硬技能:专业的技术知识
1. Java / Kotlin开发语言
(1) Java
**常用数据结构:**ArrayList、Vector、copyOnWriteArrayList、HaspMap、ConcurrentHashMap、HashTable 等使用场景。
JVM 虚拟机包括 Java 内存管理,GC 垃圾回收机制,类加载机制。推荐书籍:《深入理解 Java 虚拟机 JVM 高级特性与***实践》。
**多线程编程,**包括线程池,锁机制,线程同步 。推荐书籍:《Java 并发编程实战》和《Java 多线程编程核心技术》。
AOP 编程实现,包括 JDK 动态代理实现,ASM 直接操作字节码、cglib 实现,其原理封装了 ASM,使用更方便。
Javassist:在字节码加载前直接修改需要切入的方法,以及注解处理器 APT,这在 Android 中开源的库应用较多,比如 DataBinding , ButterKnife, EventBus3 等等。
异常处理 Exception,包括检查性异常、运行时异常处理。
IO 流相关,包括堵塞型 IO 和非堵塞型 IO。
Java 的一些高性特级,比如反射、代理、泛型、枚举、正则表达式等等;同时了解一下 jdk1.8,1.9,1.10 等新特性。相关书籍比较多,推荐**《Thinking in Java》和《Effective Java》**。
(2) Kotlin
Kotlin 是一个基于 JVM 的新编程语言,在 Google IO 2017 中被 Google 宣布成为 Android 官方开发语言。
Kotlin 有哪些优点?
**①简洁性: **提供了很多标准函数,大大减少样板代码的数量。
**②安全性:**避免空指针异常等错误。
**③互操作性:**充分利用 JVM、Android 和浏览器的现有库。
**④工具友好: **可用任何 Java IDE 或者使用命令行构建。
在 Kotlin 中要树立函数式编程思想。把函数理解为一个值到另一个值的映射关系,以函数作为单元来处理各个业务逻辑,函数既可以做参数,也可以作为返回值。多使用 Kotlin 提供的标准函数,比如 let、run、with、apply、also、 Lambda 表达式。尽量使用闭包和高阶函数。
Kotlin 的另一个突出特点是协程,为设计异步、非阻塞的程序提供了强大的范式。协程是一种轻量级的线程,它提供避免阻塞且更廉价可控的操作: 协程挂起。将复杂异步操作放入底层库中,程序逻辑可顺序表达,以此简化异步编程。
简单说下 Kotlin/Native,它的设计初衷是支持在非 JVM 虚拟机平台环境的编程,如 iOS、嵌入式平台等,同时支持与 C 互操作。推荐书籍:《Kotlin 实战》*。
2. Android 进阶技术点
进程相关,包括 App 进程原理以及 AIDL 原理。
性能优化,包括:内存,cpu,耗电量、网络请求、UI 布局、线程、数据库等优化方法以及优化工具的使用。
Android 源码相关,包括:Binder 机制,Activity 启动流程,Handler 原理,AMS ,PMS,WMS 原理,View 的绘制流程,Touch 事件传递机制等等。
编译打包流程,从 java/kotlin 源码到最终形成 APK 的过程。
热修复的实现原理,目前热修复框架的种类繁多,常见的包括底层替换、类加载和 Instant Run 方案。
逆向工程原理,主要是为了防止 apk 被反编译破解,以及了解 apk 加固方案。
插件化,目前方案同样很多,主流的技术实现是 Hook 方式,注册 Activity 进行占坑,使用占坑 Activity 通过 AMS 验证,还原插件 Activity,其他组件的原理也大致类似。
NDK 开发,调用 JNI 以及回调 Java 的方式。
自定义控件,需要注意 onMeasure,onLayout,onDraw 的调用时机,以及 Touch 事件分发机制。
动画 View Animation,视图动画在很早的 Android 版本系统中就已经提供了,只能被用来设置 View 的动画。
属性动画 Property Animation,只对 3.0 以上版本,可以设置给任何 Object,包括还没有渲染到屏幕上的对象。这种动画是可扩展的,可自定义任何类型和属性的动画。
Webview 中 Native JS 交互,常用的 JSBridge 等。
Gradle 的特性以及 DSL 语法,比如 Gradle Transform API 的使用,它允许第三方插件在 class 文件转为 dex 文件前操作编译好的 class 文件。利用这一特性,我们可以在代码编译阶段实现代码注入或者代码修改,这也是很多埋点技术和热修复技术的基础。
**安全性:**HTTPS 通信原理,数据加密方式,包括 MD5,RSA 等,webview 安全性,代码混淆,数据验签,组件通信安全,服务器通信。
CI 持续集成:Jenkins ,Gitlab CI 等搭建持续集成开发工具。
Sersor 传感器:包括陀螺仪,加速传感器,方向传感器,重力传感器,光线传感器等。
Android 开发国际化。
ART 和 Dalvik 虚拟机的区别,主要是 AOT,Ahead-Of-Time 预编译。
熟悉 DEX 文件结构。
单元测试:JUnit4,AndroidJUnitRunner,Mockito 框架的使用。
自动化测试:Monkey / Monkey Runner ,Espresso ,UI Automator 等。
掌握模块化开发方式:主要注意分好层、模块间跳转通信。
代码重构能力,推荐书籍:《重构改善既有代码的设计》、《重构与模式》
Google 动态化框架 App Bundles。
Jetpack,Google 推出的新一代组件、工具和架构指导,旨在加快 Android 应用开发速度。Jetpack 主要分为 4 部分:
Android开发常用的第三方库:
响应式编程:RxJava、RxAndroid,Google 的Agera
网络库:包括Retrofit,OkHttp,Volley
图片:Fresco,Gilde,Picasso
依赖注入:Dagger2
数据库:Realm,Ormlite,GreenDAO,ObjectBox
数据总线:EventBus,otto
内存泄漏检测工具 LeakCanary 等
各个技能点如果详细拓展开,会形成相当庞杂的一张知识图谱,建议大家自行梳理总结消化。
3. OOAD 和设计模式
在架构设计方面,首先要掌握的就是面向对象的开发和设计。具体知识点包括:
**面向对象三大特性:**封装,继承,多态。
五大基本原则(SOLID 原则),单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口分离原则。
23 种设计模式:常用的有工厂、单例、适配器、桥接、组合、代理、命令、观察者、策略、状态模式等等。
4. APP架构设计
包括 MVC、MVP、MVVM、MVI、VIPER、Clean Architecture、Flux。目前除了 MVC 外 MVP 和MVVM 用得比较多,具体的架构设计还要结合业务去考虑。
(二) 软技能
人在职场,行走江湖,想进阶高级程序员光有技术深度是不够的,还需要掌握众多软技能,注意综合职业素养的磨练。有很多人一开始重视程度不足,在职场后半段的上升过程中,容易遇到瓶颈。
下面是我个人总结出的高级程序员必备软技能,供大家参考。
**1. 快速学习能力:**包括技术深度和广度,能够不断探究新技术,不断学习。
**2. 沟通能力:**加强表达、阅读、编写能力,即使在技术发达的今天也绝不会过时。因为任何方式的沟通在企业内部都是非常有必要的。
**3. 团队协作能力:**开发人员很容易陷入孤立的人际交往状态,但开发工作永远都不可能是一个人完成,只有成员真正能融入团队内,顺利与其他同事沟通合作,才能体现出其真正的价值,被列为未来职位晋升候选人的几率也更大。
**4. 时间管理能力:**可以参考时间管理「四象限法则」,有重点地把精力和时间集中用于处理重要但不紧急的工作,这样可以做到未雨绸缪。
**5. 影响力:**一方面是业务影响力,另一方面是技术影响力。其中,提高技术影响力的方式包括:多参与技术分享,把积累的知识进行总结和传播;参加技术方案评审,把技术经验分享出去;帮助新同学解决技术问题;在博客、Github、StackOverflow 等平台上对外分享。
6. 文档编写能力:
代码注释。很多程序员很少写注释,或者注释过多,都是不合适的。多参考开源项目的注释规范。
此外推荐一本书:《软技能——代码之外的生存指南》
二. 技术专家VS管理,哪条路更适合你?
工作 3-5 年后已经进阶到高级程序员了,很多人开始面临一个问题:未来发展方向是技术专家还是技术管理,哪一条职业发展路径更适合自己?
选择哪条路线,首先要明确自己想要什么。想做技术还是管理,都跟目标和职业规划有关,每个人的实际情况不同,目标就不同,建议尽量做和自己的性格相符合的选择,并且坚持。哪怕一时半会看不出效果,长期总是能够看到效果的。
1. 怎样的程序员适合做技术专家?
*技术专家的核心就是深入而精通。对某个技术领域很熟悉、对代码编写保持热情、持续学习新的技术、能够静下心来做技术,而不是急功近利。性格相对内向、不擅长沟通协调、不希望花大量时间带团队、主要负责把关键技术做到专业和,这样的人更适合往技术路线发展,比如技术专家,架构师。
2. 怎样的程序员适合转型技术管理?
首先要明确,通常所说的技术管理者都需要做哪些事?
- 团队建设:人员激励、团队文化、梯队建设。
- 任务管理:任务分工、任务协作。
- 管理规划:新技术调研,支撑新业务的重构等。
相应地,需要的能力包括:向上汇报向下传达能力、团队管理能力、人员培养能力、上下游部门合作把控能力、业务需求沟通能力、重大问题的决断能力、长远目标规划能力、执行力等等。
综合来看,管理能力和技术能力的要求差别较大。作为技术管理者首先应该有角色认知的改变,不能以程序员的角度去看待问题,需要站在更高角度,从全局思考问题。推荐有志走管理路线的移动端程序员参考这本书:《成为技术*》**。
3. 两种发展路径的异同点
**(1) 不同点:**技术专家更依赖个人技术能力,需要结合业务做好技术规划,框架设计,性能优化以及技术创新;技术管理者是协助团队一起把产品做出来,负责团队内外的组织沟通和相互协调。
**(2) 相同点:**终究需要面对管理,只是管理工作的多和少之分。即使你是架构师,也需要 lead 一个技术团队。
因此,不论你未来是走纯技术路线还是非技术路线,都需要增长自己的管理技能,因为到***总归是需要管理沟通的。当你级别非常高,却还不跟任何人打交道,完全靠个人能力来贡献的情况是很少见的。
4. 如果选择错误,是否还有二次选择机会?
我认为需要先把职业目标和职业规划想好,经常改变对职业影响较大。
**(1) 技术转向管理:**要提前掌握相关管理知识并在角色认知上做出改变,以团队为出发点去思考问题,对业务了解更多,提高部门内的影响力,有合适的晋升机会可进行转型。
**(2) 管理转回技术:**如果你面对诸多跨部门沟通,在性格等因素上感觉不合适,需要尽快做出决策,转回技术开发。
三. 大前端趋势下,移动端程序员如何保持竞争力?
我从招聘网站上摘录了某些一线公司的职位描述要求:
3 年以上工作经验、深入了解移动端的底层和原理、独立主导或开发过一款以上产品的核心项目、丰富的项目经验或管理能力、有 React Native 或者Weex 的实战经验、掌握一些前端开发技术,HTML / JavaScript / CSS 等。前后端开发经历是加分项。
可以看到,市场对 Android 程序员的要求越来越高,除了深入掌握 Android 底层原理,对前端 JS 等技术也有要求。
**今天我们已经进入了终端碎片化的时代。**从 2007 年 iPhone ***代发布至今的 12 年里,智能手机并没有被取代的迹象。但创新仍在继续,比如智能手表、TV、眼镜、头戴 VR 等等,可以想象这样的设备仍会继续增多。
这些新设备也是新平台,与智能手机类似,可以安装第三方应用,且这些平台基本都支持浏览器或内嵌浏览器引擎。早期 Hybrid 和后来 React Native 等探索,在显示终端应用的开发上,前端开发已成为必备技术。
**因此,大前端趋势对移动端程序员而言,*的影响就是新的移动开发技术栈。
移动设备作为主流终端,其应用开发技术也应该是大前端最关注的技术。以前移动开发技术栈以原生开发为主,现在的趋势是跨平台技术愈演愈烈。
那么,在如今技术快速变化的环境下,移动端程序员该如何保持竞争力?
首先,加强 Android / iOS 技术深度储备,深入理解系统底层原理,对新技术持续投入。
其次,逐步完善前端技术栈,广度扩充,熟悉前端 JS,以及 RN,Flutter 等跨平台框架。
选择 Android 细分领域并提高,比如应用开发、逆向安全、音视频、车联网、物联网、手机开发、SDK 开发和智能电视盒子开发等等,在其中选择一个并不断深入。
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…