最近经常看到诸如《大厂已经不收一本以下的员工了》此类标题的文章,这些文章多是夸大了学历的重要性。学历确实是评价候选人的一个重要参考,但肯定不是唯一标准,在各种常见招聘渠道中的所占的权重也不同校招渠道 学历在校招中的作用是很大的。校招的投递量大而窗口期短,需要在短时间内与其他大厂争抢最优秀的人才,没有时间对简历进行一一甄别,在学历上设置门槛可以提升筛选效率。所以双非毕业生想通过校招渠道进入大厂有一定难度。但如果你的简历足够亮眼,并且有靠谱的熟人内推,在内推人的背书下还是有机会进入面试的。社招渠道 随着工作经验的累积学历的权重越来越小,因此社招是很多双非生进入大厂的主要途径。学历权重的降低意味着工作经历权重的上抬,如果你的上家也是大厂那么面试通过率会高很多,如果你的上家默默无名,那么可以通过小厂中厂大厂这样的路线来提升履历上的含金量。当然,如果你对你的能力有信心,可以完全忽视履历、学历的影响,大厂里专科生出身的大牛我也见过好多。实习渠道 实习是一个性价比很高的选项。一般双非生直接通过校招进入大厂是比较难的,但是如果你有实习经历那就不一样了,特别是开发岗的实习生很高的几率可以自动转正,而实习生招聘又不像校招那样学历卡的那么严,一旦你进入大厂实习,即使最终没能顺利转正,大厂的实习经历也能为日后的校招增加筹码。 相对于校招渠道,内推人的背书在实习渠道中的权重更大,倘若是本部门定向内推,那么进入面试的几率非常高。如果你对自己的学历缺乏信心又想在毕业后进入大厂,那么可以通过参与一些社区或者开源活动结识在大厂工作的朋友,有助于帮你获取一些靠谱的内推资源。面经分享 分享一个前不久进入字节实习的同学的面经。候选人虽然学历不出众,但是在校期间就参与不少社区活动并且有多个作品上架,亮眼的成绩外加靠谱的内推帮他拿下了字节客户端的实习Offer,并即将转正。作者:zsqw123(上海工程技术大学) 基本情况:双非学校、非科班生、有三个App上架、目前大三在读 面试流程:4月1日投简历4月中旬参加了笔试4月底收到字节面试邀请5月初一面5月中旬二面5月27日三面6月8日收到Offer 一面(60分钟)个人介绍,什么时候接触的安卓开发,实习能实习多久,介绍一下项目你说你的软件出现了OOM,你怎么解决的?线上crash你是用了什么来分析的?这些项目都是怎么来的?软件中这些内容都怎么来的?你知道后端怎么来的吗?后端是不是爬下来的?每天有多少上传量呢?进程和线程有啥区别呢?为什么要定义出这样的概念来?有什么用呢?哈希表是一个怎样的数据结构?怎么避免hash碰撞?容量有什么样的特点?数据库有了解吗?索引了解吗?怎么实现的快速查找?快速查找的是什么东西?TCP协议如何确保稳定传输?说一下Activity的启动模式Handler有了解吗?说一下原理?你刚才说到Looper是个死循环,那么messageQueue没消息的时候那它不还是会循环占用CPU资源吗?我看你用过一些开源库比如说okhttp,你能说一下原理吗?分析一下okhttp自带的这些InterceptorChain是干啥的?这些Interceptor的用途呢?你觉得有什么你擅长的但是我还没问的?那我讲一下屏幕怎么绘制view的吧为什么多次测量性能差了呢?Compose是怎么解决这些的?onMeasure里面有个东西叫MeasureSpec,你说一下这是一个什么样的数据 算法题:剑指Offer38。字符串的排列 可能当时没答上来的只有个HashMap如何尽可能避免碰撞了 二面(45分钟)你主要用的Java还是Kotlin?(我:Kotlin,面试官:那我问你点Java的东西吧)怎么创建一个线程?start和run的区别?线程和进程的区别?进程可以没有线程吗?Android里面,主线程的作用是什么?刷新UI能放到其他线程里面吗?你说的可以放到其他线程的特殊情况是什么呢?怎么在子线程弹一个toast?(提前Looper。prepare就行了)Looper。prepare做了什么事情呢?能介绍一下ThreadLocal的含义吗,内部实现原理呢?Java里我们要访问本地一个文件,我们应该怎么办?FileInputStream读取的是二进制流数据,怎么读取文本呢?怎么判断读到文件末尾了呢?你有没有遇到什么比较难的问题呢?(我:OOM我项目经常出现(这里想让面试官问我项目,淦他不问))什么场景会产生OOM呢?什么原因呢?怎么解决的呢?假设一个图片很大,应该怎么处理呢?(我:GlideBitmapFactory(这里想让面试官问Glide但他没问)),具体是怎么缩放的呢?假设BitmapFactory的inSampleSize设置为2的话,图片内存占用缩小为多少?ARGB8888和RGB565的区别?HTTP请求常用的header说一下?常见的状态码说一下?206是什么?你用过断点续传吗?介绍一下Jetpack组件的ViewModel和LiveData怎么用的,为什么ViewModel可以跟随Activity的生命周期而在旋屏时候保留数据呢?(这里说到ViewModel我提到了MVVM架构,我想让他问,但他没问)堆内存和栈内存有啥区别呢?(我这里说堆内存是gc的主要区域,我想让他问我gc,淦他没问)分别存啥?Java里面ClassLoder加载机制是什么?是先去parentClassLoder里面加载还是我自己的里面加载呢?这样做的目的是什么呢?Java反射了解吗?这么去访问一些私有的方法和变量呢? 算法题:剑指Offer54。二叉搜索树中第K小的元素 刚开始递归遍历子节点个数,面试官说你这样还会多次遍历啊,能降低一下复杂度吗?然后我用了中序遍历;你这个算法多线程访问可能会出问题啊,你怎么办,你不能限制访问者怎么用,访问者想在多线程去跑这个算法怎么办呢? 一些可能当时没答上来,答得不好的:线程之间共享内存机制呢?线程之间是共享内存的,但是线程之间为什么会出现不同步呢?(多线程可见性)因为除了内存,数据还会被缓存到CPU寄存器和各级缓存中,当修改一个变量的时候,可能会先写到缓存,稍后再更新到内存ThreadLocal实现原理?内部维护了一个简易的hashmap,hahsmap的hashcode是根据当前线程的获取threadLocal的顺序,hashcode是使用nextHashCode方法操作一个atomicInteger,每次都会递增一个指定的值,然后每一个线程都会维护一个ThreadLocalHashMap,ThreadLocal的get和set方法实际上就是操作当前线程的ThreadLocalHashMap对象三面(40分钟)介绍一下项目介绍一下LaunchModeManifest里面activity的process什么用途,为什么要多进程呢?一直在介绍项目。。。反问:团队对Kotlin支持态度?对Jetpack的态度呢?对新人培养呢? 然后三面就过了,没啥难的,问项目那可太简单了,只要对自己的项目有足够的自信应该都没问题最后 面试中虽然问了不少基础问题,但围绕作者的项目也聊了不少。候选人为了这个实习机会提前做的大量准备,通过开发自己的APP有了实战经验,面试中可以重点介绍自己的项目,化被动为主动,相对于面经本身,这种先知先觉才是更值得大家学习和借鉴的地方。 在这里就还分享一份由大佬亲自收录整理的Android学习PDF架构视频面试文档源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。 当然,你也可以拿去查漏补缺,提升自身的竞争力。 真心希望可以帮助到大家,Android路漫漫,共勉! 如果你有需要的话,只需私信我【进阶】即可获取