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

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

❶ 每月工资去掉开销还存不到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. Vue3全家桶升级指南一composition API

    1.setup() vue3中的composition API中最重要的就是setup方法了,相当于组件的入口,所有的composition API都必须放到setup()中的使用. setup是在组 ...

  2. 腾讯云TKE-基于 Cilium 统一混合云容器网络(下)

    前言 在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案.公有云 TKE 集群添加第三方 ...

  3. SQL 清除数据库日志

    exec sp_detach_db 'MCS4WLSQM','true' --运行上一个命令. --改名LOG文件后再关闭上一行代码,然后再运行下一行代码 exec sp_attach_single_ ...

  4. k8s结合jumpserver做kubectl权限控制 用户在多个namespaces的访问权限 rbac权限控制

    圈子太小,做人留一面,日后好相见. 其实这个文章就是用户用jumpserver登录到k8s master节点 然后执行kubectl的时候只有自己namespaces的所有权限. 背景 1,k8s 有 ...

  5. 两台主机间docker容器网络互通

    服务器1: 网络172.30.0.0/16 服务器2: 网络172.31.0.0/16 服务器1和服务器2上的docker容器网络之间是无法互通的,如果需要互通,需要做以下配置: 服务器1上执行: i ...

  6. Hadoop:Hadoop的学习路线

    Hadoop生态架构技术   1.语言基础 Java:掌握javase知识,多理解和实践在Java虚拟机的内存管理.以及多线程.线程池.设计模式.并行化就可以,不需要深入掌握. Linux:系统安装( ...

  7. 32. Longest Valid Parentheses **堆栈

    description: Given a string containing just the characters '(' and ')', find the length of the longe ...

  8. Go nuts

    含义: to behave in a crazy, enthusiastic, or violent way. 发起狂来 详细讲解 go 在这里也不是"去"的意思,而是和 get. ...

  9. 如何修改Windows 11 任务栏大小

    1.首先Win+R输入regedit打开注册表编辑器         2.进入注册表编辑器后,在地址栏中输入: HKEY_CURRENT_USER\Software\Microsoft\ Window ...

  10. 「HEOI2016/TJOI2016」排序

    「HEOI2016/TJOI2016」排序 题目大意 给定一个 \(1\) 到 \(n\) 的排列,每次可以对这个序列的一个区间进行升序/降序排序,求所有操作后第 \(q\) 个位置上的数字. 题解 ...