最近在知乎看到一个测试,特扎心:

以下三种情况,哪个最让你绝望?

❶ 每月工资去掉开销还存不到3千;

❷ 家人突然急病住院,医药费10万;

❸ 同班的家长都在争先恐后给孩子报名各种辅导班、兴趣班,但一个班就2、3万,你报还是不报?

在知乎本次测试的评论区里,讨论的热火朝天,其中有位叫盛男的网友说:任何一种情况都足以击倒我。

行业内流传,程序员年轻时,加班是家常便饭,为了公司付出了青春和年华,到了35岁,惨遭公司优化的非常多,35岁似乎是一个魔咒,这个魔咒,我们能打破么?对于这个困局,大部分程序员选择的破局方法,主要集中在以下三种:

一、走技术路线,成为技术专家!

这条路线,需要持续学习!每时每刻都在发生技术的升级和变革,只有持续不断的学习,才能对老的架构有新的认识,对于老的问题产生新的解法。同时需要持续思考。现在层出不穷的技术,比如组件化、插件化、Kotlin、jetpack、Hybrid等等,如果不敢去尝试,不敢接触新的技术,就会落后于人呀。

成为一个普通学历,但技术牛,薪水高的人不香吗?

我自己做Android开发已经是第5个年头了,在毕业后的第二年,有幸加入到字节跳动这个大家庭。在字节的4年,见证了太多人的来来去去,印象很深一个同事,跳槽阿里薪资直接double,但也看到很多人镀着“大厂”的金四处碰壁,终究还是倒在了技术上!

我自己或许也算是个成功的例子,在4年的时间里从1-1做到了2-2,当然,这背后的“辛酸泪”就留到日后再说。总的来说,归功于自己不断地学习,复盘总结,提升技术!以下分享一下我4年来具体的学习路线及笔记文档,希望能帮助到有心提升技术的朋友!

一、架构师筑基必备技能

安卓手机的开发语言是Java(Kotlin也是对java的封装),Android Framework 也是默认使用Java 语言,熟练掌握Java 语言是Android 开发者的必备技能。

本篇包含知识点:

1.深入 Java 泛型

2.注解深入浅出

3.并发编程

4.数据传输与序列化

5.Java 虚拟机原理

6.反射与类加载

7.高效 IO

二、高级UI

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

三、Framework精编内核解析

众所周知,Android是一个基于Linux实现的操作系统。但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别。

所以Android也需要运行环境,需要Linux内核在启动完成后加载Android Framework运行所需要的资源。当Framework完成初始化后才能继续启动相应的APK应用程序。

主要内容包含:

  • 深入解析Binder
  • 深入解析Handler
  • Dalvik VM 进程系统
  • 深入解析 WMS
  • PackagerManagerService

四、360°全方面性能调优

在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。

另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。

主要内容:

  • 1.设计思想与代码质量优化

  • 2.程序性能优化

    启动速度与执行效率优化

    布局检测与优化

    内存优化

    耗电优化

    网络传输与数据储存优化

    APK大小优化

  • 3.开发效率优化

    分布式版本控制系统Git

    自动化构建系统Gradle

  • 4.项目实战

    启动速度

    流畅度

    抖音在APK包大小资源优化的实践

    优酷响应式布局技术全解析

    网络优化

    手机淘宝双十一性能优化项目揭秘

    高德APP全链路源码依赖分析

    彻底干掉OOM的实战经验分享

    微信Android终端内存优化实践

五、Android第三方框架

随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生。

当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。

本篇内容要点(1042页)

  • 热修复设计
  • 插件化
  • 组件化框架设计
  • 图片加载框架
  • 网络请求框架
  • RXJava 响应式编程框架设计
  • IOC 架构设计
  • Android架构组件Jetpack

六、NDK模块开发

NDK是原生开发工具包,这套工具允许Android使用C/C++代码,并提供了众多的平台库。

主要内容包含:

  • NDK 模块开发
  • JNI 模块
  • Native 开发工具
  • Linux 编程
  • 底层图片处理
  • 音视频开发
  • 机器学习

七、Flutter学习进阶

2019 年无疑是 Flutter 技术如火如荼发展的一年。

每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。

本篇知识要点:

1、Flutter跨平台开发概述

2、Windows中Flutter开发环境搭建

3、编写你的第一个Flutter APP

4、Flutter Dart语言系统入门


八、Android相关源码解读

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

有需要的朋友直接点击此处免费获取完整文档。

二、走管理路线,成为团队管理!

这条路线,变成团队负责人之后,你的焦点是在人而不光是代码,还有思想,创新,产品等交付物。没有人,就没有代码,没有产品。需要着眼于建立一支优秀的团队,优秀的团队才能做出伟大的产品。

在这里,分享一份一线大厂BATJ,TMD(头条、美团、滴滴)内部面试题合集!不容错过!

百度 Android 面试真题解析

Android 面试题

  • 跨进程通信的几种方式
  • wait 和 sleep 的区别
  • String,StringBuffer,StringBuilder 的区别
  • View 和 SurfaceView 的区别
  • View 的绘制原理
  • 简述 JNI
  • 简述 TCP,UDP,Socket
  • 音视频相关类
  • 进程和线程的区别
  • 内存泄露如何查看和解决
  • View 的分发机制,滑动冲突
  • RecyclerView 和 ListView 的区别

    .........

Java 面试题

  • HashMap
  • ArrayList
  • LinkedList
  • Hashset 源码分析
  • 内存模型
  • 垃圾回收算法(JVM)
  • 垃圾回收机制和调用 System.gc()的区别?
  • 类加载过程
  • 反射
  • 多线程和线程池
  • HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手 过程
  • 设计模式(六大基本原则、项目中常用的设计模式、手写 单例等)

    .........

kotlin

  • 、=和 equal 的区别?
  • var 和 val 的区别?
  • Kotlin 中默认参数的作用以及原理?
  • Kotlin 中顶层函数的原理
  • 中缀函数是什么?注意点?
  • 解构函数的本质?
  • 扩展函数的本质?
  • 扩展函数和成员函数的区别?
  • Kotlin 中常用的类的修饰符有哪些?
  • Kotlin 中可见性修饰符有哪些?
  • Kotlin 中的内部类和 Java 中的内部类有什么不同?
  • Kotlin 属性代理背后原理?

    .........

网络

  • HTTP 是哪一层的协议,常见的 HTTP 状态码有哪些,分别代表什么意思?
  • HTTP 1.1 和 HTTP 2 有什么区别?
  • HTTP 和 HTTPS 有什么区别?
  • SSL/TLS 的握手过程?
  • TCP 的三次握手过程,为什么需要三次,而不是两次或者四次?
  • TCP 的四次挥手过程?
  • TCP 和 UDP 有什么区别?

    .........

腾讯 Android 面试真题解析

Java 基础部分

  • HashMap 和 HashTable 以及 CurrentHashMap 的区别
  • synchronized 和 volatile 、ReentrantLock 、CAS 的 区别
  • JVM 类加载机制、垃圾回收算法对比、Java 虚拟机结 构等
  • Java 的四大引用
  • Java 的泛型,<? super T> 和 <? extends T> 的区别
  • Java 线程有哪些状态,有哪些锁,各种锁的区别
  • final 、finally、finalize 区别
  • 接口和抽象类的区别
  • sleep 、wait、yield 的区别,wait 的线程如何唤醒它?
  • java 中==和 equals 和 hashCode 的区别
  • String、StringBuffer、StringBuilder 区别

    .........

Jvm部分

  • Jvm 内存区域是如何划分的?
  • Jvm 内存模型是怎么样的?
  • String s1 = "abc"和 String s2 = new String("abc")的区别, 生成对象的情况
  • 如何判断对象可回收?
  • GC 的常用算法?
  • Minar GC 和 Full GC 的区别?
  • 说一下四种引用以及他们的区别?
  • 类加载的过程?

    类加载的机制,以及为什么要这样设计?
  • .........

计算机网络部分

  • TCP 与 UDP 的区别
  • 三次握手、四次挥手。为啥是三次不是两次?
  • HTTPS 和 HTTP 的区别。HTTP 2.0,3.0?
  • 浏览器输入一个 URL,按下回车网络传输的流程?
  • TCP 建立连接后,发包频率是怎样的?
  • OKHttp
  • 如何验证证书的合法性?
  • https 中哪里用了对称加密,哪里用了非对称加密,对加 密法(如 RSA)等是否有了解?
  • client 如何确定自己发送的消息被 server 收到?
  • 谈谈你对 WebSocket 的理解
  • WebSocket 与 Socket 的区别
  • 谈谈你对安卓签名的理解
  • 请解释安卓为啥要加签名机制?

    .........

Android 面试题

  • 什么是 ANR 如何避免它?
  • Activity 和 Fragment 生命周期有哪些?
  • 横竖屏切换时候 Activity 的生命周期
  • AsyncTask 的缺陷和问题,说说他的原理
  • onSaveInstanceState() 与 onRestoreIntanceState()
  • android 中进程的优先级?
  • Bunder 传递对象为什么需要序列化?Serialzable 和 Parcelable 的区别?
  • 动画
  • Context 相关
  • Android 各版本新特性
  • Json
  • Jar 和 Aar 的区别
  • Android 为每个应用程序分配的内存大小是多少
  • Merge、ViewStub 的作用
  • ContentProvider 使用方法
  • Android 怎么加速启动 Activity?

    .........

Android Framework 相关

  • Android 系统架构
  • View 的事件分发机制?滑动冲突怎么解决?
  • View 的绘制流程?
  • 跨进程通信
  • Android 系统启动流程是什么?
  • 启动一个程序,可以主界面点击图标进入,也可以从一 个程序中
  • AMS 家族重要术语解释
  • App 启动流程
  • ActivityThread 工作原理
  • 说下四大组件的启动过程,四大组件的启动与销毁的方 式
  • AMS 是如何管理 Activity 的?
  • 理解 Window 和 WindowManager
  • WMS 是如何管理 Window 的?
  • 大体说清一个应用程序安装到手机上时发生了什么?

    .........

性能优化专题

  • 你们做了哪些稳定性方面的优化?
  • 性能稳定性是怎么做的?
  • 业务稳定性如何保障?
  • 如果发生了异常情况,怎么快速止损?
  • 启动优化是怎么做的?
  • 启动优化有哪些容易忽略的注意点?
  • 你们内存优化项目的过程是怎么做的?
  • 你做了内存优化最大的感受是什么?
  • 你在做布局优化的过程中用到了哪些工具?
  • 布局为什么会导致卡顿,你又是如何优化的?
  • 做完布局优化有哪些成果产出?

    .........

算法合集

  • 排序
  • 二叉树
  • 链表
  • 栈 / 队列
  • 二分
  • 哈希表
  • 堆 / 优先队列
  • 二叉搜索树
  • 数组 / 双指针
  • 贪心
  • 字符串处理

    .........

kotlin 专题

  • 基础
  • 函数
  • 类、对象和接口
  • lambda
  • 类型系统
  • 协程

    .........

flutter 专题

  • Dart 当中的 「..」表示什么意思?
  • Dart 的作用域
  • Dart 是不是单线程模型?是如何运行的?
  • Dart 是如何实现多任务并行的?
  • 说一下 Dart 异步编程中的 Future 关键字?
  • 说一下 Dart 异步编程中的 Stream 数据流?
  • 请简单介绍下 Flutter 框架,以及它的优缺点?
  • 介绍下 Flutter 的理念架构
  • 介绍下 FFlutter 的 FrameWork 层和 Engine 层,以及它们 的作用
  • 介绍下 Widget、State、Context 概念
  • StatefulWidget 的生命周期

.........

JNI 模块专题

  • 静态注册
  • 动态注册
  • 数据类型映射
  • 对象数组引用类型
  • jni 函数默认参数
  • jni 是如何访问 java 中的方法和字段
  • jni 访问 java 中的静态方法
  • jni 访问 java 中的字段
  • jni 访问 Java 中的静态字段
  • jni 中更新 java 的字段内容
  • jni 中创建 java 类实例
  • jni 中的异常
  • 常用函数封装

    .........

(由于文章篇幅有限,仅能展示部分面试题,面试题的详细解析我都整理成了几个文档,有需要的可以点这里直接领取,无偿分享给大家,算是一个感恩回馈吧。)

三、在其他赛道发力

相信,前段时间今日头条28岁前端程序员郭宇宣布退休的事件,大家都看过,他大学非计算机专业自学程序,面腾讯,挂了,入阿里,稳了,开启行业生涯,后跳槽糗事百科被字节跳动招安,字节跳动6年爬到资深技术专家,手握字节跳动0.5-4个亿RMB的期权价值,长期大量买入并持有美团和拼多多等其他公司的股票,28岁财务自由,宣布退休!彻底走向人生巅峰! 除了关注技术之外,投资也做的很棒!

工资8000以下的Android程序员注意了!接下来要准备面对残酷现实了……的更多相关文章

  1. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  2. Android程序员学WEB前端(1)-HTML(1)-标准结构常用标签-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522043觉得博文有用,请点赞,请评论,请关注,谢谢!~ 8月份了,换工作有2个月了 ...

  3. Android程序员问答题

    前言 最近三个月内,不断地进行移动应用开发在线测试题,也积累了不一样的知识.这也将对android studio有很好的掌握,对将来面试也很有好处.那么我就分享给大家.分享是一种幸福,这是一种质的飞越 ...

  4. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  5. 给Android程序员的六个建议

    给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...

  6. Android高薪之路-Android程序员面试宝典

    Android高薪之路-Android程序员面试宝典

  7. Android 程序员必须掌握的三种自动化测试方法

    在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app开发 一般对软件质量有更高的要求(你可以想一下 一个发出去的版本如果有重大缺陷 需要强制更新新客户端是多么蛋疼的事 ...

  8. 悲惨的Android程序员

    Android程序员太悲惨了,连Android官网都访问不了,整个Android程序员的水平都被拉低了一个等级.受不了了.说说悲惨的遭遇吧. 起源:高射炮打苍蝇,驴受伤了 Android一个纯技术网站 ...

  9. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

随机推荐

  1. 深入理解 Android ANR 触发原理以及信息收集过程

    一.概述 作为 Android 开发者,相信大家都遇到过 ANR.那么为什么会出现 ANR 呢,ANR 之后系统都做了啥.文章将对这个问题详细解说. ANR(Application Not respo ...

  2. 如何使用原生的Feign

    什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi. JAXRS-2.0.WebSocket 等类库.通过 Fei ...

  3. CSS水平居中与垂直居中的方法

    一.水平居中 1.行内元素水平居中 在父元素里添加text-align:center即可.代码如下: <style> .container-1 { height: 50px; border ...

  4. java swagger ui 添加header请求头参数

    我用到的swagger 主要有三款产品,swagger editor,swagger ui 和swagger codegen. swagger editor:主要是一个本地客户端,用来自己添加api, ...

  5. 构建自己的dockerfile

    一)创建自己的CentOS 构建dockerfile的原理图 Docker Hub中99%的镜像都是从FROM scratch这个基础镜像过来的.然后配置需要的软件和配置来进行构建. FROM #基础 ...

  6. cobbler安装4个报错汇总及解决方法:ImportError

    安装完,检查cobbler:cobbler check发现这个问题ImportError: No module named yaml 具体报错如下: [root@www localdisk]# cob ...

  7. 今日英语 词组——come together

    come together 1. 解释含义 词面意思 一起过来 实际意义:重归于好,汇集 英英释义:if two or more different people or things come tog ...

  8. Http2.0详解

    前言 HTTP/1.1协议为现在网络提供了20年的支持.从那时起,网站已经从静态的.文本驱动的文档发展为交互式的.富媒体的应用程序.在此期间底层协议保持不变这一事实正好说明了它的通用性和能力.但随着网 ...

  9. CPU 几核

    1.设备管理器:打开"处理器",出现几个就是几核

  10. PYTHON 当前.PY文件名不能与引入的模块同名

    当前文件名:sqlite3.py 文件引入import sqlite3 运行会出错,因为调用sqlite3的方法首先从当前文件找方法,当然找不到,所以会报错了