自学Android,学多久可以加入字节跳动?

131 阅读18分钟

在回答自学Android,学多久可以加入字节跳动之前,我们先需要了解加入字节跳动的岗位职能要求,下图是我们从boss直聘上选取的今日头条Android工程师职位描述。 职位要求

假如我变成了一只小白。我想自学 Android,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。

即便是这样,我敢肯定,找到的工作肯定不会太好,勉强能够维持生活吧,毕竟是零基础入门啊。如果想更进一步,真正成为一名不可或缺的高级Android工程师,时间需要更久,两年、三年、五年,直到秃的那天。想着想着,我就觉得有必要为那一天做点准备,以备不时之需。

  • 1、熟练掌握Java语言,深入理解语言特性;熟练掌握Android Studio或其他开发环境;
  • 2、熟悉Android Sdk、Framework、基础组件,对重要系统特性和原理有一定的理解;
  • 3、能够使用常用的第三方库、基础组件,并对其特性和实现原理有一定的了解;
  • 4、了解MVC/MVP/MVVM等设计模式,熟悉面向对象思想及相关设计模式;
  • 5、了解常用的Debug工具和方法,熟练掌握异常处理机制;
  • 6、热爱技术,能够快速学习,始终保持技术更新;
  • 7、关注业务,对产品有好奇心,关系用户体验;
  • 8、有Kotlin开发经验者优先,有独立开发产品级APP经验者优先;

1、熟练掌握Java语言,深入理解语言特性;熟练掌握Android Studio或其他开发环境

Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。我们先就第一点熟练掌握Java语言,深入理解语言特性,展开说明: 首先熟悉java基本语法,然后熟悉设计模式等。
a) Java基础语法:看下面的《Java知识点列表》
b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。

Java基础

  • Java Object类方法
  • HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理
  • HashMap 和 HashTable 区别
  • HashCode 作用,如何重载hashCode方法
  • ArrayList与LinkList区别与联系
  • GC机制
  • Java反射机制,Java代理模式
  • Java泛型
  • Synchronized原理
  • Volatile实现原理
  • 方法锁、对象锁、类锁的意义和区别
  • 线程同步的方法:Synchronized、lock、reentrantLock分析
  • Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等
  • ThreadLocal的原理和用法
  • ThreadPool的用法和示例
  • wait()和sleep()的区别

Java高阶

  • Java虚拟机,Java运行,Java GC机制(可达性分析法,引用计数法)
  • Java对象的完整生命周期
  • JVM内存模型
  • 进程间通信,线程间通信
  • JVM类加载机制
  • Java引用类型
  • 设计模式:除常用设计模式之外,特别的,反射机制,代理模式
  • HTTP协议和HTTPS协议
  • Socket协议,Socket实现长连接
  • TCP和UDP协议
  • HTTP协议中GET和POST的具体实现
  • 序列化和反序列化
  • 线程池的实现原理
  • 数据库基础知识:多表查询、索引、数据库事务

设计模式基于六大原则

  • 开闭原则:一个软件实体如类、模块和函数应该对修改封闭,对扩展开放。
  • 单一职责原则:一个类只做一件事,一个类应该只有一个引起它修改的原因。
  • 里氏替换原则:子类应该可以完全替换父类。也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。
  • 依赖倒置原则:细节应该依赖于抽象,抽象不应依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由低层的实现层来完成。
  • 迪米特法则:又名「最少知道原则」,一个类不应知道自己操作的类的细节,换言之,只和朋友谈话,不和朋友的朋友谈话。
  • 接口隔离原则:客户端不应依赖它不需要的接口。如果一个接口在实现时,部分方法由于冗余被客户端空实现,则应该将接口拆分,让实现类只需依赖自己需要的接口方法。

熟练掌握Android Studio或其他开发环境

2.熟悉Android Sdk、Framework、基础组件,对重要系统特性和原理有一定的理解

SDK 的实现目标,概括来说:简洁、稳定、高效。 简洁

对于用户而言,一款好的产品应该是简洁易用的,不该让他们花费太长的时间学习。SDK 也当如此,它不该出现复杂繁琐的对接工作,使用者通过阅读代码和文档,花费很少的时间就能做好 SDK 的对接。

稳定 稳定站在 SDK 使用者角度来看,我们期望第三方 SDK 的服务是稳定高效的,体现在提供稳定可靠的服务,同时运行时性能要高效。这就要求我们在设计实现 SDK 时要尽可能做到以下几点:

  • 对外提供稳定的 API。SDK 的 API 一旦确定,除非特殊情况不可更改,提供方变更 API 的成本非常大。
  • 对外提供稳定的业务。在提供了稳定的 API 后,必须要有稳定的业务作为支撑。运行时的稳定。确保 SDK 自身稳定运行,不能出现因为接入了 SDK 而导致宿主应用不稳定的情况。
  • 版本稳定更新。SDK 版本迭代非常缓慢,要尽可能对使用者屏蔽迭代过程,避免带来不必要的适配成本。

高效

无论是普通的应用开发还是 SDK 开发,都应该考虑到性能问题,SDK 设计者要着重考虑以下问题:

  • 更少的内存占用。一般 SDK 和 App 运行在同一进程,此时 SDK 要管理好自己占用的内存,合理分配,注意释放。
  • 更少的内存抖动。在占用更少内存的前提下,SDK 设计者必须减少频繁 GC 造成的内存抖动问题。
  • 更少的电量消耗。低电量消耗和高性能表现之间很难做到权衡,可以从 CPU 计算量、屏幕刷新帧率等角度考量。

如何学习Android Framework

  • 1.深入解析Binder Binder机制作为进程间通信的一种手段,基本上贯穿了andorid框架层的全部。所以首先必须要搞懂的Android Binder的基本通信机制。
  • 2.深入解析Handler Message 源码分析,再到MessageQueue 的源码分析,Looper 的源码分析,handler 的源码分析,Handler 机制实现原理,既是面试常考,又是工作必备技能。
  • 3.Dalvik VM 进程系统 Andorid系统启动、init 进程、Zygote、SystemServer启动流程、 应用程序的创建使用,Activity的创建、销毁 Handler和Looper。
  • 4.深入解析 WMS 窗口管理框架 系统动画框架 View的工作原理。
  • 5.PackagerManagerService 包管理服务。 资源管理相关类

Android Framework精编内核解析 需要AndroidFramework开发笔记完整文档的,点击我 即可获取资料免费领取方式!

3、能够使用常用的第三方库、基础组件,并对其特性和实现原理有一定的了解

随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,还有65535,应用之间的互相调用等等问题,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。

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

Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等Android第三方开源框架,只有将掌握这些Android第三方框架,并对其特性和实现原理有一定的了解,相信你离字节跳动面试跟进了一步!

高级Android组件化、插件化强化实战手册 需要高级Android组件化、插件化强化实战手册的,点击我 即可获取资料免费领取方式!

4、了解MVC/MVP/MVVM等设计模式,熟悉面向对象思想及相关设计模式

MVC、MVP、MVVM是我们工作和面试中都比较重要的一块,但很多时候我们却有点迷惑。比如看了好多篇文章都搞不懂MVC到底是个啥本来想写个MVP写着写着就变成MVC了,到底Databing和MVVM之间有啥见不得人的关系。

MVC 可能由于MVP、MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM。因为后两种都是基于MVC发展而来的。 1、MVC眼花缭乱设计图

我们从网上搜索mvc相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图

2、MVC设计图解释

到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从mvc的发展说起。 MVC框架模式最早由Trygve Reenskaug 于1978年在Smalltalk-80系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型Model-View-Control。

MVP

1、MVP说明

MVP跟MVC很相像,文章开头列出了很多种MVC的设计图,所以根据MVC的发展来看,我们把MVP当成MVC来看也不为过,因为MVP也是三层,唯一的差别是Model和View之间不进行通讯,都是通过Presenter完成。 前面介绍MVC的时候提到了算是致命缺点吧,在android中由于activity(god object)的存在,Controller和View很难做到完全解耦。但在MVP中就可以很好的解决这个问题 看下MVP的设计图:

一般情况下就这两种。 MVVM

1、MVVM说明

MVP中我们说过随着业务逻辑的增加,UI的改变多的情况下,会有非常多的跟UI相关的case,这样就会造成View的接口会很庞大。而MVVM就解决了这个问题,通过双向绑定的机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了很多在View层中写很多case的情况,只需要改变数据就行。 先看下MVVM设计图:

一般情况下就这两种情况,这看起来跟MVP好像没啥差别,其实区别还是挺大的,在MVP中View和presenter要相互持有,方便调用对方,而在MVP中 View和ViewModel通过Binding进行关联,他们之前的关联处理通过DataBinding完成。

5、了解常用的Debug工具和方法,熟练掌握异常处理机制

Android Studio 你需要掌握的Debug技巧

6、Kotlin

Google 几年前就开始走 “Kotlin First” 的路线,目前很多官方的文档和 Demo 都是使用 Kotlin 语言作为默认,Kotlin 的重要性不言而喻。

Google 官方也出了个“Refactoring to Kotlin”的教程,其介绍如下:

此 Codelab 的适用对象为任何使用 Java 并考虑将其项目迁移到 Kotlin 的开发者。我们将从数个 Java 类入手,引导您使用 IDE 将它们转换为 Kotlin。接着,我们会审视转换后的代码,研究如何加以改善,使其更符合使用习惯,同时避免常见错误

数据结构与算法

1.1.1 常用的数据结构有哪些?

1.1.2 数组 (1).如何在一个1到100的整数数组中找到丢失的数字

相关知识点: [数组](javascript: void(0))[数学](javascript: void(0))[位运算](javascript: void(0))

相关知识点: [数组](javascript: void(0))[数学](javascript: void(0))[位运算](javascript: void(0))? (2).如何在给定的整数数组中找到重复的数字? (小米) (3).如何在未排序整数数组中找到最大值和最小值?(字节跳动) (4).在Java中如何从给定数组中删除多重复制? (5).大数相加(今日头条)

1.1.3 链表 (1).那查询第一个跟倒数第二个呢?(这就不一样了,第一个直接给了头结点,倒数第二个需要从倒数第一个开始查询,走两步) (腾讯) (2).arrayList底层原理 (滴滴 字节跳动) (3).如何在一次遍历中找到单个链表的中值?(中国平安) (4).如何证明给定的链表是否包含循环?如何找到循环的头节点?(优酷) (5).两个有交叉的单链表,求交叉点 (华为) (6).如何得到单链表的长度? 360 (7).如何在不使用递归的情况下逆转单链表?小米/美团) (8).怎么判断链表有环? (滴滴1.1.4 队列&堆栈 (1).如何使用栈实现队列的功能?(广州荔枝FM) (2).两个栈实现一个队列蘑菇街) (3).两个队列实现一个栈 (腾讯) (4).对比一下队列和栈,以及它们底部实现 (腾讯

1.1.5 二叉树 (1).如何在给定的二叉树中执行先序遍历?百度) (2).如何实现后序遍历算法?百度) (3).如何在给定数组中执行二分法搜索?苏宁) (4).已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?58 (5).输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。 (爱奇艺) (6).请实现两个函数,分别用来序列化二叉树和反序列化二叉树。 (YY) (7).平衡二叉树红黑树的区别?(字节跳动) (8).什么是平衡二叉树,它有什么特征 (美团) (9).B 树,B+树

1.1.6 HashMap (1).HashMap的底层原理是什么?线程安全么? (百度 美团) (2).HashMap中put是如何实现的? (滴滴) (3).谈一下hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的? (4).什么是哈希碰撞?怎么解决? (滴滴 美团) (5).HashMap和HashTable的区别 (小米) (6).HashMap中什么时候需要进行扩容,扩容resize()是如何实现的? (滴滴) (7).hashmap concurrenthashmap原理 (美团) (8).arraylist和hashmap的区别,为什么取数快?(字节跳动

1.1.7图 (1).旋转输出矩阵 (2).给定一个矩阵 int matrixA[m][n],每行每列都是增序的,实现一个算法去寻找矩阵中的某个元素 element. 搜狗

1.1.8排序算法有哪些? (1).top-k排序(堆排序,位图法) (美团) (2).冒泡排序的手写 (华捷艾米) (3).堆排序算法的手写 (华捷艾米) (4).椭圆形场地有两个赛道,可以同时提供两匹马比赛,两匹马比赛后,可以获知两匹马中跑的快的那匹马,但是没有计时工具。问题,如何最优的算法(比赛次数最少),获知10匹马中速度最快的三匹马 (阿里) (5).输入一个整型无序数组,对堆排序的方法使得数组有序 (阿里) (6).如何使用快速排序算法对整数数组进行排序? (CVTE

1.1.9 查找算法 (1).有序数组的二分查找算法百度

1.1.10 串 (1).给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。 (字节跳动) (2).给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

1.1.11 请写出以下算法的时间复杂度 冒泡排序法 插入排序法 堆排序二叉树排序

1.1.12 其他算法 (1).常用的对称加密算法,有什么同? (字节跳动) (2).如何在无序(有负数)的数组中查找是否存在和为target的两个数组合,twoSum();(字节)

完整版数据结构与算法PDF解析

本文在开源项目:github.com/Android-Alv… 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...