正在参加校招的同学们,此刻可能是最紧张的了:
- 简历投出去了,什么时候才能收到笔试通知啊?
- 收到了笔试通知,最后两天还来得及做什么准备?
- 面试会问什么问题?怎么才能提升通过率、拿到更好的offer?
不妨先来听一听过来人的故事:
来一起看看这位程序员是如何过关斩将,拿到字节跳动offer的吧。
本人情况:双非大二,软件工程专业,在学校实验室里有两个安卓小项目。
技术面一面 时长 47 分钟(视频面试)
有些问题忘记了,记忆中就只有这些内容
- 自我介绍
- 项目有没有上线
- 项目难点
DialogFragment
内存泄漏的定位过程Leakcanary
的原理Handler
介绍一下Handler
内存泄漏说一下- 说一下设计模式
- 手写单例
- 算法:[112. 路径总和](javascript:void(0);)
技术面二面 时长 48 分钟(视频面试)
- 自我介绍
- 介绍一下项目
- 软件大概样式是怎样
- 首页是怎样做的
- 首页下拉刷新是怎么做的?(说了滑动冲突的处理)
view
事件分发机制怎样- 事件好几层,怎么知道是由哪个控件处理(说了根据触摸的位置啥的,不太了解对不对)
- 提到了责任链,内部链怎么分发的
- 怎么判断哪个
view
处理(根据return true/ false
) - 我们的事件有
action_move,action_down,action_cancel
,所有的事件都是一层一层往下分发吗(说了不一定,down
被拦截了,后续就收不到其他的事件了,然后提到了action_cancel
的机制) - 我听到你首页用了
recyclerView
,那他一般怎么用? - 提到了
adapter
adapter
用来干嘛?adapter
中有哪些是主要方法(说了bindView
,这块不太记得了,说项目中用到的是BRVAH
)- 提到了
ListView
- 为什么用
Rv
不用Lv
(说了1.强制实现viewHolder
(避免findViewById
) 2.缓存机制) Lv
二级缓存怎么判断这个View
是他要的?(答了postion,id
)- 然后问
id
指的是?(这里说忘记了) - 四级缓存是怎么找到
view
他要的?(说了itemType
) - 如果有相同的
itemType
怎么处理?(说了直接使用任意一个) - 如果四级缓存中找不到呢?(说了手动加载)
- 手动加载是哪里来的?(说了从布局
xml
中定义的itemtype
中拿的) xml
怎么关联到Rv
(加载代码inflate
的,不太了解)- 堆内存和栈内存区别
- 5层网络协议包括哪些?
tcp
三次握手说一下equals
和==
区别hashmap
实现原理(说了基本结构,put
)get
是怎样实现的
智力题:
- 5升桶,3升桶,水无限,你给我装出4升水
算法:[82. 删除排序链表中的重复元素 II](javascript:void(0);)
技术面三面 时长 37 分钟(视频面试)
- 自我介绍
- 架构设计主要是什么
- 说一下你提到的依赖倒置
- 除了依赖倒置还有什么重要的原则(刚说完单一职责就被打断)
- MVP注意事项(说了内存泄漏的处理)
- 内存泄漏的原理
- 怎么判断内存不能被释放
- 如何检测内存泄漏(说了线下用
LeakCanary
,线上用Memory profiler
,然后自己扯到DialogFragment
内存泄漏) - 打断,问
final
作用(说了修饰类,方法,变量,作用) - 非静态内部类引用外部类对象,需要
final
关键字吗?(说了应该用static
,转为静态内部类,防止内存泄漏) - 多线程使用过吗
- 说一下线程池的使用(刚说了构造方法实现)
- 核心线程数什么作用(说了线程池的运行流程)
- 核心线程数和最大线程数的设置(
IO
密集型和CPU
密集型,最大线程数的话,看系统支持的并发量) - 一个进程有多少个线程?(说了空间允许的范围内可以一直开辟)
- 实际上是多少?(说了
2g
分配的空间) - 为什么是2g(说了之前看过,具体原理不太清楚)
- 一个异步任务都开一个线程,还是多个任务开一个线程,你怎么决定开不开?(说了耗时的话就开,不太耗时不开,因为线程切换调度的话,存在一定的开销)
- 线程安全怎么保证?
syncronized
内部原理是什么(说了修饰静态方法和非静态方法,代码块)- 修饰静态方法和非静态方法,能够并发执行吗?(可以,因为他们锁的对象不一样,说到了死锁)
- 死锁的原理是什么?
- 出现死锁怎么排查(这个不太会,说了用
jvm
中的jstack
) - 追问怎么用?(说没用过,只是知道)
- 问我他的原理是什么?(不太知道,说看
traces.txt
,看堆栈) - 怎么安全停止一个线程(说了用
volatile
修饰变量,通过while
(变量),手动设置true false
) volatile
原理是什么?(说了java
内存模型啥的,修饰特性啥的)- 网络了解吗
tcp
优点(可靠性,面向连接)- 面向连接是什么?(说了计算机通信前建立连接)
- 面向连接和非面向连接的本质区别是什么?(乱答,不知道)
- 拥塞控制原理
http
与udp
区别(说了层数)http
请求流程
下面开始聊天了
- 反问:
HR 面(24分钟)
- 你是周一面的三面,这几天关于面试你是怎么考虑的?
- 周一面试完,周四周五才给你反馈,有考虑过面试不通过吗
我说周二就给我反馈了
- 面试感受如何?
- 你对面试做了什么准备
- 客户端基础知识方面的话,你是怎么复习和准备的?
- 有做一些刷题吗?
- 字节算法这块,难度怎么样
- 距离毕业还有一年半,你怎么规划这段时间
- 你们是信息安全专业?应该不是计算机专业的同学吧
- 你是什么时候考虑转开发
- 你是大一就打算做开发?还是说进到工作室后,受到师兄的影响才转开发?
- 介绍一下工作室
- 配合方式是怎样的?
- 说一下影响比较深的项目
- 主要是客户端后台都有?
- 这个项目你们老师也是怎样评价的?
- 团队协作有没有遇到比较难推进的时候?
- 你会主动去配合团队吗
- 自己学习或者工作,怎么安排时间?
- 工作的时间占你一天多少时间?
- 任务你是怎么管理
- 你的方法论挺好的,你提到的日程管理软件是哪个?
- 旁边人用哪几个词语评价你
- 你的优点缺点分别是什么?
- 有遇到压力特别大的时候吗?
- 你在学校成绩怎样
- 你对自己的未来的规划
- 什么时候能来?能来多久
- 学校课程怎样
- 反问
面试的一些注意事项
面了几场,也总结出来一些人生经验
1、简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。
2、简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!
3、做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。
大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。
4、选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!
5、面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。
6、另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。
现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤......
所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音 沉稳的描述 好听的嗓音绝对是一个加分项!
7、最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。
希望大家都能找到合适自己满意的工作!fighting!
怎么进字节跳动?
最近字节开始发起校招活动了,预计接下来会有很多学弟学妹们参加字节的技术面试,我这边以过来人身份分享下字节的技术面试流程和注意事项。
首先, 字节的技术面试一般有三轮,如果通过后会有HR面试。其中前三轮面试中,一面注重考察技术基础,四大组件的原理等等,还会考察操作系统以及网络的基础知识,数据结构算法等等。
二面在一面的基础上进行查漏补缺,如一面没有涉及到地方或者表现不好的地方等等,同时也会注重对技术知识的综合运用,观察软素质,如理解能力,思考能力,沟通能力等等。
三面技术可能更多考察对做过的项目的认识和对未来的规划预期,用来考察候选人的技术发展上限。如果通过了前三轮面试,恭喜你基本Offer就稳了,只要不出现诚信问题和严重的沟通障碍问题,HR面一般不太会卡人。
准备面试的时候注意基本知识的理解和运用,不用花太多时间去研究偏难的钻牛角尖的题,如leetcode上hard难度的题型,手撕红黑树等。
最后,好的简历对于拿到不错的面试机会也至关重要,这边建议简历里边能突出自己的水平的事项需要具体一些,如经历过的项目或者实习做过什么具体的事情达到什么样的成果,最好也能提供一些具体的数据。
如果没有实习经历,可以在简历中写做过的课程设计或者实验,明确自己做过的事情,亮点,成果。此外自己的优势,特长,都可以在简历中注明。但是,如果自己不熟悉的内容,建议不要在简历里面提,其实只是有过相关的经历,并不会有优势,反而会可能在面试的时候给面试官带来不好的印象,挑一两条最擅长,最熟悉的技术点写上并突出即可。
面试前的技能储备
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!
- Android学习路线图
首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!
除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~
①看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
②读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
③面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
④2020大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码