深度思考:已经开发8年的你,为何跳槽被多家大厂拒绝?为什么会迷茫Android开发还有什么能学习的?

Posted Android-until

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度思考:已经开发8年的你,为何跳槽被多家大厂拒绝?为什么会迷茫Android开发还有什么能学习的?相关的知识,希望对你有一定的参考价值。

前言

“Android 开发还有什么可以学习的?”近半年来,大家对于职业的未来发展、个人的成进阶都有一些迷茫和焦虑。

为什么会这样呢?放眼现在互联网行业,各大公司已经从争夺用户转为争夺用户时长。而小程序、快应用的崛起,也让许多 App 的增长达到瓶颈。

移动开发的前景似乎并不明朗,再加上竞争激烈以及技术变革放缓,我们感到迷茫、焦虑就不难理解了。但这是不是就意味着移动开发没有前途了呢?

并不是,移动开发不局限于 App 开发,所有新的技术浪潮其实都可以融入到移动开发的体系里,比如 IOT、音视频、边缘计算、VR/AR, 我们要做的,就是打好基础,不断学习新技术,建立完备的知识体系,提升个人能力和价值,以迎接新的挑战。

接下来给大家举例android开发需要学习的一些技能及知识点:

Android开发需要学习的技能

安卓基础知识

安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 APP 升级的时候搞过一个前台的 Service,但是面试的时候就会问你 Service 生命周期,如何绑定,如何跨进程通讯,如何关闭Service 等等,你肯定不能说"我没用过我不会"。

所以我们就要复习,一来我们可以应付面试,二来我们也可以通过基础知识的积累来提高我们的能力。

主要知识点:

1.Activity 任务栈和 4 种启动模式关联性问题
2.IPC 非常重要,想要达到中级和高级的水平就必须要读懂,跨进程几种方式必须了解
3.Binder 肯定是必问的,当然还有 AIDL
4.自定义 View 的 draw measure layout 过程,事件的分发,拦截,处理,处理滑动冲突的思路,view滑动的几种方式
5.动画的几种实现方式
6.Window 在 Android 里的作用。它和 Activity 和 View 的关系
7.四大组件的工作过程,这个确实有难度,按自己能力钻研吧,也别陷的太深 但是,四大组件的使用方式必须会,Service 的启动和绑定,广播的使用方法,写个简单 ContentProvider 这些都是必须的
8.Looper,Handler,MessageQueue 的关系
9.主线程为什么是主线程,如何开启线程,线程池和安卓常用的四种线程池 他们的特点和使用场景
11.AsyncTask 原理,并发问题,缺点等
12.如何面对大的 bitmap,如何自己设计一个 ImageLoader
13.其实可以扩展为,如何设计一个 okhttp,如何设计一个 retrofit,eventBus 等等
14.其实就考察对开源框架的认识和使用的熟练程度
15.如何避免和处理 Crash 和 ANR 16.优化篇,过度绘制,OOM,内存泄漏,布局优化,MAT, Lint

大厂相关面试题:

  • 有个问题很常见:你了解过哪些开源框架?
  • okhttp 或者 retrofit 必须了解一下底层原理,即使不能读好源码,也要看看别人是怎么分析的
  • 如今热更新和插件化特别火,一定要能说出来几种,并简单说明原理
  • MVC MVP MVVM 优缺点,一点要说出自己的切身体会
  • Fragment,生命周期和使用方法
  • Rxjava 尽量也看看
  • 注解机制,现在这么多使用注解的框架
  • Acitvity的生命周期是什么样的?
  • Acitvity的生命周期,如何摧毁一个Activity? (美团)
  • Intent显示跳转与隐式跳转,如何使用?(美团)
  • Activity A跳转B,B跳转C,A不能直接跳转到C,A如何传递消息给C?(美团)
  • Activity如何保存状态的?
  • 请描述Activity的启动流程,从点击图标开始。(B站)
  • 你会在什么情况下使用Service?
  • startServer和bindServier的区别?(美团)
  • Service和Thread的区别?
  • IntentService与Service的区别?
  • ContentProvider如何自定义与使用场景是什么?
  • BroadcastReciver的静态注册与动态注册的区别?
  • 广播的分类与工作原理

Java 基础知识

我是参照的《Thinking in Java》这个书和网上的博文,别的我也没买。网上 Java 的资料非常多,但是确实有很多写的不好,甚至有一些错误的,大家阅读要小心了。

主要知识点:

1.修饰符
2.类 接口 抽象类 匿名内部类 回调机制
3.几种基本类型,长度,边界
4.从 Iterator 到 Collection,再到 Set List Map(必问)
5.从以下几个角度理解学习:用法,具体实现类,线程安全性,底层数据存储结构,某些场景下如何选用?比如 ArrayList 和 LinkedList 如何选用 线程相关(必问)
6.锁机制 synchronize 用法
7.实现一个死锁
8.同步,生产者消费者模型
9.Thread 中的几个常用方法 比如问你 sleep 和 wait 区别
10.线程安全
11.JVM 了解一些,GC 了解一下,堆和栈的区别等
12.静态代理,动态代理 反射
13.设计模式 单例模式(要会写),工厂模式,抽象工厂,观察者模式等

大厂相关面试题:

  • 什么情况下会发生栈内存溢出?
  • 如果让你写一段栈溢出的代码你会什么写,一个栈大概有多大,为什么?每个线程都有这样大小的一个栈吗? (美团)
  • JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代?
  • 介绍下GC回收机制与分代回收策略。
  • Java中有几种引用关系,它们的区别是什么?
  • GC收集算法有哪些?它们的特点是什么?
  • 如何判断一个对象是否被回收,有哪些GC算法,实际虚拟机使用最多的是什么GC算法?(美团)
  • Jvm内存 结构说一下。(东方头条)
  • JVM DVM ART的区别(360)
  • 描述GC机制。Class会不会回收?用不到的Class怎么回收?(东方头条)
  • StackOverFlow与OOM的区别?分别发生在什么时候,JVM栈中存储的是什么,堆存储的是什么?(美团)
  • Java虚拟机和Dalvik虚拟机的区别?
  • 请描述new一个对象的流程。
  • Java对象会不会分配到栈中?
  • String, Stringbuffer, StringBuilder 的区别是什么?(东方头条)
  • String StringBuffer StringBuilder在进行字符串操作时的效率;这里主要考察String在内存中是如何创建的。(字节跳动)
  • String为什么是不可变的?(字节跳动)
  • String为什么设计成final的?
  • final 、finally、finalize 区别。
  • 抽象类和接口的区别。
  • 重载和重写的区别 (京东)
  • 什么是值传递和引用传递,Java 是值传递还是引用传递?

算法和数据结构

主要知识点:

1.数组,链表,队列,栈,图
2.不会直接问你,会让你找到用处,比如Activity任务栈
3.算法
4.基本几种排序复杂度和思路
5.几种查找复杂度和思路
6.串的处理

大厂相关面试题:

  • 如何在一个1到100的整数数组中找到丢失的数字? 腾讯
  • 如何在给定的整数数组中找到重复的数字? 小米
  • 如何在未排序整数数组中找到最大值和最小值? 字节跳动
  • 在Java中如何从给定数组中删除多重复制? 百度
  • 常用的数据结构有哪些? B站
  • 一个数组插入删除查找和链表的效率对比?如果一个数组要反复插入删除怎么优化降低时间复杂度? 腾讯
  • arrayList底层原理 滴滴 字节跳动
  • 如何在一次遍历中找到单个链表的中值? 中国平安
  • 如何证明给定的链表是否包含循环?如何找到循环的头节点? 优酷
  • 两个有交叉的单链表,求交叉点 华为如何得到单链表的长度? 360
  • 如何在不使用递归的情况下逆转单链表? 小米/美团
  • 怎么判断链表有环? 滴滴
  • 如何使用栈实现队列的功能?广州荔枝FM
  • 两个栈实现一个队列 蘑菇街
  • 两个队列实现一个栈 腾讯
  • 对比一下队列和栈,以及它们底部实现 腾讯

推荐 LeetCode 刷题和读《剑指offer》。

性能优化

主要内容:

1.ANR
2.内存溢出
3.内存抖动
4.内存泄漏
5.UI卡顿
6.冷启动优化等方面

大厂相关面试题:

  • 内存优化,内存抖动和内存泄漏。(东方头条)
  • Bitmap压缩,质量100%与90%的区别?(东方头条)
  • TraceView的使用,查找CPU占用(东方头条)
  • 内存泄漏查找 (酷我音乐)
  • ANR查找
  • ANR是什么,怎么解决?(美团)
  • CPU波动
  • 当前项目中是如何进行性能优化分析的
  • 冷启动、热启动的概念(酷我音乐)
  • View层次过深怎么优化,选择哪个布局比较好?(美团)
  • 怎样检测函数执行是否卡顿 (字节跳动)
  • 什么时候会发生内存泄漏?举几个例子(美团)

学习Android路上的一些弯路(避坑)

在学习之路上,每个人都会走一些弯路,犯一些错误,前世之事后事之师,真心希望Android初学者不要重蹈我的覆辙。

1、在外包待的时间太久,外包学习投入的时间过多,技术上没什么长进
2、没有早一点接触互联网技术
3、没有早一点拥抱开源,Github上有那么多牛逼的代码,多读,多写,然后就拼天赋吧。
4、不要妄自菲薄,技术上不自信,认为自己写不了牛逼的代码
5、不要闭门造车,多关注最新技术,提高眼界
6、尽量不要接收二手知识,比如能看英文就不要看翻译版了
7、不要惧怕大块头的书,像 thinking in Java,算法导论,一天掌握一点,一年也差不多掌握了8 不要过早地做管理,先写个五年代码再说
8、Java基础一定要扎实,虽然说并不需要首先精通Java才能上手安卓,但良好的Java功底确实会有很大的帮助。

有句话叫做基础不牢,地动山摇,大家可以制定一个安卓学习计划:

第一步:书籍

我之前入手的第一本书就是android疯狂讲义,七八百页,其实我感觉我们不用全部都学,比如说动画、视频、传感器先可以不学,安卓疯狂讲义的有些设计不是很合理,把很多难的内容放到了前面。

没有做到从易到难,我们学的过程中可以先把一章整体看一下,然后再安排学习的顺序,把里面的每一个例子都自己敲一遍。因为我上下班坐公交车时间很长因此我都是在公交车上看书,这样一个月过去了,疯狂讲义的主要部分学了一遍。

第二步:视频

我看过收集的视频也很多,每天看7个,中间也有耽搁的这样过去了一个月,所有的看了一遍,主要的,难懂的看了两到三遍。

第三步:高仿项目

做完前两步,自己感觉水平应该可以了,于是就想去独立开发一个app,但是还是不知道怎么下手,于是从网上找了几个开源项目,开始模仿去做,有仿新浪微博,仿美团,闹钟,这样过去了一个月,终于有些底气了。

第四步:android官网

要想去安卓官网还需要翻墙,这个大家都懂,首先官网上面的api guide看一下,最后都能仿着写一遍代码,然后再把training上的几个例子也仿着写一遍。这样学上面的例子用了一个月。

第五步:独立开发app

开始设想独立开发一款app。

Android学籍推荐

我 Android 开发快八年了,做为一名过来人的角度,给大家推荐几本书籍。

Android 开发,目前主要是以 java/ kotlin 语言为主,学习 Android 之前,最好要先学习 java 语言。对 java 语法,基本数据结构有一定的了解。

Java

1.《Effectve Java》
2.《Java编程思想》
3.《深入理解Java虚拟机》

Android

1.入门的话,主要推荐郭霖的《第一行代码》书籍,写得通俗易懂。
2.进阶推荐两本书籍《Android内核剖析》,《Android开发艺术探索》

C++

学习完 Android 的话,想进阶的话,还要学习一下 C++,没错,现在很多疑难问题都是 native 层的,只有学习 C++,才能成为一名真正的高手。

1.《深度探索C++对象模型》
2.《UNIX环境高级编程 第3版》

学什么知道了,怎么学呢?

做得越多不见得越厉害,而是对自己的知识体系做总结

我认为学习的阶段应该是这样的:

学习新知识--->灵活应用--->自我总结--->创造新知识

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典

  • Android学习路线图

首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!

  • 模块化学习资源

接下来是每个模块我整理出来的文档学习资料,帮助大家更细致化的学习。

《Android汇总复习资料—Java》

《Android汇总复习资料—Android》

《Android汇总复习资料—Android扩展》

《Android汇总复习资料—Kotlin》

《Android汇总复习资料—Flutter》

《Android汇总复习资料—算法》

除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~

Android进阶学习

①看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

②读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

③面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

④2020大厂面试高频知识点

  • 图片
  • 网络和安全机制
  • 数据库
  • 插件化、模块化、组件化、热修复、增量更新、Gradle
  • 架构设计和设计模式
  • 性能优化
  • Android Framework
  • Android优秀三方库源码

以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

以上是关于深度思考:已经开发8年的你,为何跳槽被多家大厂拒绝?为什么会迷茫Android开发还有什么能学习的?的主要内容,如果未能解决你的问题,请参考以下文章

2021最新Java开发面试大全,跳槽大厂必看!

一个小镇出身的程序员为何拒绝加入大厂?

一个小镇出身的程序员为何拒绝加入大厂?

测试开发面试真题 | 测试老兵进阶突破,成功挑战大厂 P7 Offer!

求解!开发十年大厂高级Android工程师,面试字节被怼“没有技术深度”,Android还要学习什么?

Android开发者跳槽面试,深度好文