我是一个本科期间成绩年级倒数20的差生,没参加过实验室或者重量级比赛。
春招成果
最后也是决定去字节跳动了,因为我最开始接触Android开发就是因为字节跳动和我们学校的校企培训,对字节跳动有感情。
但是无奈自己大学期间没怎么好好学习,所以秋招有点拉垮。 我做了什么 因为在8月份知道自己有些拉垮,于是决定说要在秋招先找一个实习,锻炼一下基本素养,然后在春招发力。这是我的招聘策略。实习期间几乎天天加班,自己学习,锻炼技术,每天写工作总结,维护博客。实习三个月过得比较艰苦,同时也很感激我的实习公司,领我入门,我的负责人也给了我很多技术上以及解决问题上的帮助。
然后在12月份由于学校的事多了起来,所以就离职了,然后也在这个时候我开始琢磨起了我的个人项目。因为我没有拿得出手的Android项目,所以就自己构思了一个,并且开始动手实现。并且在其中加入了我最新接触到的知识点:LiveData、DataBinding、BiometricPrompt、AndroidQ适配、自定义View、TransitionAnimation等。并且在其中使用到了设计模式:工厂模式、简单工厂、单例模式、构造器模式等。并且设计了许多的接口用于多态的相关特性处理。
这些实践都让我在面试的时候能够体现出自己的思考和解决问题能力,而不是单纯地背概念。于此同时,我开始了惨无人道的刷题之旅,从放假到现在3个月时间,我刷了快300道LeetCode……不把自己当人就行了。并且在二月份,我开始在各大平台上搜索Android客户端的面经,将遇到的题目复制下来,自己写了一遍。针对自己不熟练的部分,回归教材反复研究,甚至将知识点加入项目中。比如单例模式我除了用DLC还是用了静态内部类,并且弄懂了原理。
于此同时,我会将自己不清晰的点或者高频考点通过分析源码、写Demo的方式分享成博客,比如之前面经里出现了的触摸事件的分发、Handler机制、ThreadLocal、红黑树平衡二叉树AVL树等。通过将输入转化为输出,巩固自己的记忆。终于,经过了整个寒假的自虐之后,我也成为了Offer收割机。
校招准备步骤 简历+项目+刷题+复习基础+做面经 简历 简历什么的确实没有啥发言权……LZ简历什么的极其拉垮,但是还好学校是985,也有一些公司愿意捞。然后最近发现我的简历出现了不止一处错别字……所以这个方面我没啥好分享的。但是有一点是底线--诚实,不能把自己不会的写上去。面试官是基于简历问你问题,能通过筛选证明用人单位认可这份简历,只要你的表现对得起简历即可。
项目 如果大家不选择像我一样纯从0开始搭建项目的话,可以选择去github上找适合自己方向的项目。基于自己的需求找到对应的项目,把项目跑通、搞懂甚至优化,那这就可以是自己的项目。 刷题 当然可以从简单开始刷,LZ最开始的时候那叫一个痛苦,easy都不会,只能看答案写。抄答案抄了60多题之后就可以自己写了,因为熟练了。再之后发现有些medium可以秒撕了,easy基本看一眼就有思路。
技巧就是最开始抄抄答案没事,抄多了也就会了。无他,唯手熟尔。 复习基础 这个每个方向可能略有不同,LZ只拿Android端举例,Android端的基础从重要往轻排序大概是这样:算法、Java(一门精通的语言)、计算机网络、操作系统(很多厂甚至不问)。算法这点是字节的老师一直强调的,你可以没有基础,但是代码能力必须很强。
对于其他的方面,高频考题一定要复习透彻,拿计网举例,TCP/IP协议族得熟悉吧,OSI模型得熟吧。LZ面了这么多家,没遇到网络方面新的题型,要是达不到理解(下面有个小技巧),那死背总会吧。 做面经 这里是做!不是看,是把题复制下来自己做,只是看很容易忘的。面经一定要自己写一遍,就是打字打出来,不要只是脑子里过一遍。
这是我的部分总结,近一年的大厂客户端面经我都是这么写的。万字肯定破了。推荐使用OneNote。 技巧 经过了整个春招的磨砺,除了硬实力之外,有一些需要自己注意的技巧分享出来:
1、简历不要投太早,容易因为太久没被处理导致心态崩溃。因为我之前2月底投了一波,但是那时候很多厂简历筛选工作还没开始,搞得自己无名焦虑,头发又少了。
2、不要给面试官一种你在背知识点的感觉,要结合实现进行分析。我这里有一句话:数据结构决定算法、算法决定数据结构。就拿TCP举例,你要是遇到TCP的头部结构有什么的问题,是不是就懵了,觉得这是靠背诵的。但是你套上这句话,联想一下知识点:SACK确认机制、滑动窗口、全双工通道、套接字结构……是不是就能够理解为什么需要那些头部结构了,都是有对应的功能需要实现才会出现这些结构的。遇事不决拿结构分析。
3、多看源码,源码里面有很多注释,很多时候看看注释就知道这个类是干什么的了,然后再往下跟,会有助于自己理解逻辑。更重要的是让面试官知道你这种跟源码的学习方式。
4、调整好心态,不要因为某些厂把自己挂了就觉得自己不行。这是我被挂多了之后的心得,此处不留爷自有留爷处。
5、面心仪的公司之前先面几家其他公司,小公司或者同等体量的公司。
6、面试一次复盘一次,整理自己发挥不好的点。不能说一次问你不会两次问你还不会吧,那不是能力问题,那是态度问题。而且很多厂是有面试记录的,二三面专挑你面试不好的问题问你。
7、表现自己对于计算机、码代码的热情以及愿意钻研的精神。这里说的热情不是让你自我介绍的时候说喜欢码代码,而是不经意间透露一些。比如有维护个人博客、比如一直在维护个人github、比如在遇到问题的时候提了各种解决方案最后根据某种选择策略决定了最终方案、比如最近遇到的问题以及现在解决到了哪一步……
我举个例子吧,LZ最近准备的案例是BiometricPrompt相关,这是AndroidP开始有的生物识别类,意在同一生物识别的弹窗样式而让用户对于识别更加放心。但是弹窗会使得背景Activity偏蓝,于是想解决这个问题,找到了源码FragmentDialog,发现里面关于Style和Theme部分的代码是通过从Bundle中取出的值决定的,但是Bundle是BiometricPrompt中利用构造器模式进行初始化的,而且是private的,所以没有接口可以定制。
于是想通过反射试试能否修改对应Bundle中的数据。实现之后发现失败了,因为回看FragmentDialog中,它将Theme和Style对应处理写死了,只是通过int值不同调用不同的case而已。所以修改Bundle是行不通的,现在在想能否利用动态代理相关思想hook一下对应的setStyle或者setTheme方法,达到修复背景颜色问题。
但是这样子又违背了这个类创造出来的目的,所以最近在苦恼这一点。项目里还是利用了AndroidM的相关生物识别操作自定义弹窗做的。 看我加粗的部分:提出问题+初步解决方案+失败了+失败原因分析+下一步操作+对于这个操作的思考。
不要求你解决了什么问题,但是你要体现出来,你真的在思考。这确实是我最近遇到的问题,我解决方案还是使用AndroidM相关库进行的自定义。
上面这段话透露了什么?你乐于思考、会解决问题,你在学习新技术,你知道版本适配问题,你会利用源码作为解决问题的工具,你知道动态代理和hook,你会利用反射解决问题。上述能力都是我想体现的,一个案例就够了。
我通过这个案例已经打动不少面试官了,各位要做的就是按照我的模式找到自己解决的问题。 心得 有不少人问我是怎么学习的,那我确实也有一本书我认为还不错的书推荐给大家《Android插件化开发指南》,网上肯定能下到电子版,版权问题不发链接。这本书不要当做是插件化相关书籍看,他是以插件化的角度介绍了整个Android的体系。 挑对应章节看即可。最后谈一下为什么自己会选择Android开发吧。最开始是因为自己确实不行,然后得找一个缺口大的岗位,借着校企培训的契机得知了字节跳动特别缺Android开发人员。于是就决定自己做Android。但是做着做着就爱上了Android开发,也爱上了非常忙碌的生活,所以一直就有个正循环。
如果大伙真的不知道选什么方向,可以考虑考虑大前端:H5、Android、IOS。尤其IOS缺人缺炸了……
之前复习的时候,我也有把我整理好的面经,面试题整理出来,平台上放不下,就不放了,总而言之,多刷面经,有时间就做思维知识体系整理,在平台上收获到了非常多优秀的面经,也有很多小伙伴特别乐于助人。所以我也就把我自己的经历分享出来,希望能够帮助甚至激励一些人吧。