工资8000以下的Android程序员注意了!接下来要准备面对残酷现实了……
最近在知乎看到一个测试,特扎心:
以下三种情况,哪个最让你绝望?
❶ 每月工资去掉开销还存不到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
自动化构建系统Gradle4.项目实战
启动速度
流畅度
抖音在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程序员注意了!接下来要准备面对残酷现实了……的更多相关文章
- IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架
每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...
- Android程序员学WEB前端(1)-HTML(1)-标准结构常用标签-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522043觉得博文有用,请点赞,请评论,请关注,谢谢!~ 8月份了,换工作有2个月了 ...
- Android程序员问答题
前言 最近三个月内,不断地进行移动应用开发在线测试题,也积累了不一样的知识.这也将对android studio有很好的掌握,对将来面试也很有好处.那么我就分享给大家.分享是一种幸福,这是一种质的飞越 ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- 给Android程序员的六个建议
给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...
- Android高薪之路-Android程序员面试宝典
Android高薪之路-Android程序员面试宝典
- Android 程序员必须掌握的三种自动化测试方法
在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app开发 一般对软件质量有更高的要求(你可以想一下 一个发出去的版本如果有重大缺陷 需要强制更新新客户端是多么蛋疼的事 ...
- 悲惨的Android程序员
Android程序员太悲惨了,连Android官网都访问不了,整个Android程序员的水平都被拉低了一个等级.受不了了.说说悲惨的遭遇吧. 起源:高射炮打苍蝇,驴受伤了 Android一个纯技术网站 ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
随机推荐
- Go 中的 channel 与 Java BlockingQueue 的本质区别
前言 最近在实现两个需求,由于两者之间并没有依赖关系,所以想利用队列进行解耦:但在 Go 的标准库中并没有现成可用并且并发安全的数据结构:但 Go 提供了一个更加优雅的解决方案,那就是 channel ...
- 35、cobbler自动化安装操作系统
35.1.cobbler介绍: Cobbler是独立的,不需要先安装Kickstart然后再安装Cobbler: Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速 ...
- echarts 根据geojson 数据绘制区域图(精确到镇)
步骤:1)先获取区域(县.镇)json数据 :2)使用echarts 绘制地图: 先上一波效果图(昆明市东川区) 一.获取区域json数据 1.下载工具"水经微图", 2.下载东川 ...
- Java:Apache Commons 工具类介绍及简单使用
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. Commons简介 组件 功能介绍 commo ...
- SpringCloud:路由ZUUL的配置详解
以下是两种配置文件的配置方式,可以根据需要选取对自己项目有利的配置. 自定义访问路径(path) 配置application.yml文件 #provider-user:是你的微服务模块的名称,及spr ...
- Flask(9)- 蓝图的基本使用
前言 在前面的例子中,所有的页面处理逻辑都是放在同一个文件中,随着业务代码的增加,将所有代码都放在单个程序文件中是非常不合适的 不仅会让阅读代码变得困难,而且会给后期维护带来麻烦 Flask 中使用蓝 ...
- NSDate小结
dateFormat用法: y - 年 2013年,yyyy=2013,yy=13 M - 月 3月,M=3,MM=03,MMM=Mar,MMMM=March D - 一年中的第几天 d - 一月中的 ...
- FreeRTOS+LVGL|Freertos+lvgl如何配置lvgl的心跳和任务管理器
目录 配置lvgl心跳(Tick) 配置lvgl任务管理器(Task Handler) LVGL中文手册 lvgl需要系统滴答声(心跳)才能知道动画和其他任务的经过时间,所以我们必须要配置好lvgl的 ...
- VMware中的虚机如何挂载U盘
1.将U盘插入到宿主机上. 2.在VM Client上,点击宿主机,右键,扫描存储设备(目的是为了发现新USB存储) 3.在需要的虚拟机上编辑配置,添加硬件,添加USB设备(如果不进行以上2个步骤,此 ...
- ADB打开快手APP
aa="adb -s {0} shell am start -n com.kuaishou.nebula/com.yxcorp.gifshow.HomeActivity".form ...