7次面试5个offer,我的大厂秋招求职记录(含详细面试内容和心得)
本人的iOS秋招旅程从8月中旬开始一直到9月末,从网易被拒一直到收到头条offer,这之间也算是一段辛苦的旅程吧,现在打算整理一些面经,供大家参考。
先说一下本人的面试的情况:
- 网易云音乐内推二面跪
- 贝壳找房内推拿到offer
- 美团内推拿到offer
- 携程正式批拿到offer
- 百度正式批拿到offer
- 头条内推拿到offer
- 腾讯正式批HR面被刷
网易云音乐
网易云音乐(提前批,二面挂)
网易的校招挺莫名其妙的,周围有同学简历筛选阶段被刷,我的情况是跟二面面试官聊得挺好被刷,搞不懂猪场……
笔试
笔试的分为选择,4道编程题和2道简答题,选择和编程已经记不清了,都很简单的。编程真的没有考算法,全是暴力就可以做出来的题目,因此心态要放平,尤其我这种算法慌看什么笔试题都不自觉联想什么DP, 贪心那一套,没有必要,能暴力就暴力,不通过全部测试用例也可以拿分。
2道简答题,笔者投的是iOS工程师,因此问的问题都是和iOS相关的。
第一道问的是AutoReleasePool相关的问题。第一问是问在main.m文件里面@autoreleasepool {}这个东西的作用是什么,其实这段语法在iOS工程里是可以去掉的,因为runloop会自己创建AutoReleasePool,详情参见:iOS autoreleasepool in main, and ARC alloc, release ,但是答的时候可不要作死去答这段语法是没有帮助的,我当时答的是这段语法是创建一个AutoReleasePool,来使内部的对象能自动释放;第二问问的是AutoReleasePool的原理,它的内部是采用AutoReleasePoolPage(一个双向链表)来进行管理的,详情参见:黑幕背后的Autorelease,答的时候就答一些主要的点就好了。
第二道问的是和runtime有关的。第一问问的是在Objective-C里面重写一个方法的实现可以有哪几种方式,我答的是:继承,Category和method swizzling;第二问是问用runtime大致实现方法替换的过程,这个我不知道标准答案是什么,我就大致写了一下语法;第三问问的是假如一个类有三个实例A, B, C,怎么只重写A实例的方法,B、C不变,这个也很简单,我们在用runtime实行method swizzling的时候先保存一下原来方法的IMP,当运行到我们替换的函数的时候,判断当前实例是A, B还是C,如果是A, 那就执行下面的逻辑,如果是B或者C就执行原来的IMP就可以了。
总体来说笔试是很简单,而且诚意满满,但是接下来的面试就不同了……
现场面试
笔试之后的一个星期就接到了网易的面试通知,不知道为什么一定要去现场,之前美团的面试官还问我是去现场还是电话面试,现场面试真的是太烦了,昂贵的路费不说,关键是我这种身体奔波一趟是真的累。
一面
一面是比较基础的,面试官也很nice,问的问题主要是根据项目来问的,下面罗列出他问的问题:
- 做一个自我介绍。
- 看你做的工作有一个是相册导入,拿哪个库来实现的。
- SDWebImage的工作流程,图片缓存的过程和解压缩的过程。
- iOS中多线程的几种编码方式。
- 多线程的锁有几种实现方式。
- 有碰到过多线程带来的问题么,怎么解决的。
- 死锁的概念,检测,预防。
- GCD队列的类型,如果在一个serial队列用dispatch_sync会造成什么问题。
- 开发过程中用的什么抓包工具。
- 在开发过程中怎么mock数据。
- MVC和MVP的区别。
- Block带来的问题,和delegate相比有什么好处。
- 常见的造成循环引用的场景。
- NSTimer怎么规避循环引用的问题。
NSNotificationCenter为什么要在最后remove掉注册的Observer,它的通知发送是同步还是异步的,注册通知的线程和发送通知的线程必须是一个线程么。
这些问题都是比较基础的,最多准备一天就ok了(SDWebImage还是昨晚在宾馆花俩小时看的)。需要注意的是基础的runtime,多线程一定要滚瓜烂熟,常见的设计模式要知道,内存泄漏的场景要知道,以及SDWebImage和AFNetworking几乎是必考,源码一定要看。
二面
二面就让我挺摸不到头脑了,感觉答的挺好不过还是跪了,问的问题也比较奇怪。
- 在UITableView/UICollectionView中加载图片需要注意哪些问题。
- 在工作过程中是怎么对UITableView进行性能调优的。
- 对于KVO,重复add相同的Observer会怎么样,看没看过KVOController提供的解决方案。
- SDWebImage存到disk的文件名是根据什么来命名的,假如遇到CDN的问题该怎么办。
- 对于一个超出父View范围的子View,如何保证其响应事件。
- NSArray,NSMutableArray保存的是强引用,怎么设计一个保存弱引用的容器。
- TCP为什么要四次挥手而不是三次。
- 有没有设计过数据库,五大范式记得几个,索引设计的准则。
二面当中的TCP,数据库索引答的还是卡的,可能面试官想要一个基础知识牢固的学生吧,像我这种只知道做工程的还是回去学学理论再去面试吧。
此次去杭州损失是真的惨重,刚下飞机我这个北方人就感到身体有明显的不适,面完之后手机还摔了……可能终究和杭州无缘吧。
美团
美团(提前批,拿到offer)
美团分为三次技术面和一次hr面,前两次技术面是电面,最后一次技术面和hr面是现场面,感觉问的也是挺基础的,答的比较顺。最后hr告诉我要10月中旬出结果,是我面过的几家中出结果最慢的。
一面
一面,电面,问的问题不能再基础了。
- 项目中的难点,怎么解决的。怎么学习iOS的。
- UIView的继承链。
- frame和bounds的区别。
- 多线程的几种使用方式。
- atomic是否保证了线程安全,为什么。
- 哈希冲突的解决方案。
- 最后出了一个多线程的问题,大意为两个线程对同一个变量进行100次++***作,问最后输出结果是多少。
- 大概问了半个小时,挺简单的。
二面
二面也是采用了电面的形式,问的问题比较广泛。
怎么学习iOS的。
- @property里面常见的属性修饰符以及含义,还问了unsafe_unretained。
- weak指针的实现原理。
- 引用计数的原理,除了在SideTable外还能在哪里存放引用计数(TaggedPointer, 优化的isa指针)。
- 常见的内存泄漏的情况。
- 哈希表的优缺点,时间复杂度,哈希冲突的解决方案。
- 几种排序算法的时间复杂度,为什么快排是实际表现最好的。
- TCP为什么要四次挥手。
- https的原理。
- 数据库设计5大范式。
- 死锁的概念和解决方案。
一道智力题,大意是两个人在一个盘里放球,最后一个放不下的人输,自己先放,问有没有必胜的策略。
答的大概还好,面试官总是说“好,下一个”,给人一种绝望的感觉,不过晚上就接到了三面通知。
三面
由于我拒绝了去北京现场面试的邀请,所以三面被安排到了西安,中间等的时间有点长。感觉三面没太多涉及到技术细节。
- 怎么学习iOS的。
- 为什么从安卓转到iOS。
- 为什么不考研。
- 成绩怎么样。
- 对未来的规划。
- 有没有开源过什么项目。
这些开放性问题不作死应该就没啥太大的问题……10分钟后接到了hr面的通知。
hr面不具备参考价值,所以这里我就不写了。
贝壳找房
贝壳找房(内推,已拿offer)
贝壳找房的面试分为笔试,两次技术面和一次HR面,在酒店一天就面试完毕,效率较高,感觉还是挺友好的~
笔试的内容我已经忘得差不多了,印象当中还是挺难的,是除了BAT之外笔过的最难的一家。
一面
一面的面试官是搞C++开发的,因此没有问关于iOS的相关知识,只问了一些基础。
- C++里面const的相关用法。
- C++里面构造函数,析构函数执行顺序。
- 删除链表的下一个节点。
- 找出链表的倒数第K个节点。
内容就是这些,面试官比较看重手写代码对于特殊情况的判断,侧重于基础。
二面
二面问的问题有开放题,也有很多关于iOS的,比较基础。
- 项目中的难点,怎么解决的。
- 关于runtime的理解。
- KVO的原理,怎么实现自己的KVO。
- 关于ARC的理解。
- weak指针的原理。
- Block和delegate的对比。
- 多线程使用方式。
- 如何控制最大并发量(信号量)。
- 给出五角星的五个坐标点,判断一个数组中有多少个五角星。
也不是很难,感觉也是挺友好的。
百度
百度(正式批,已拿offer)
百度除了二面出了一点小插曲,其余的问的也是比较简单的,三次现场技术面。其实面到百度我已经有了身经百战的感觉了,所以不怎么慌。
一面
- 一面问的全是iOS基础,比较友好。
- 自我介绍。
- 项目难点,怎么解决的,在项目中干了什么。
- @property常见的修饰符。
- Block原理,为什么会造成内存泄漏。
- ARC原理。
- 引用计数原理。
- weak指针是怎么实现的。
- atomic的含义,是否保证了线程安全。
- 找出数组中第K大的数。
- 统计数组中指定数出现的次数。
- 简单吧,面试过程也是比较快的,可能人比较多吧。
二面
- 二面出了点小插曲,感觉面试官没有把问题表达清楚,其实他问的还是蛮简单的,可能是为了测试沟通能力?
- 在上次实习中自己的工作。
- 关于runtime的理解。
- 谈一下内存管理。
- AutoreleasePool的原理。
- runloop的原理,怎么实现一个runloop。
- 多线程的几种使用方式。
- 消息转发的流程。
- 怎么用GCD实现一个读写锁。
- 为什么用一个全局的NSURLSession,而不是多个NSURLSession。
- SDWebImage的原理。
- 一个关于多线程的解决方案,大意已经不能描述了,大概是一个生产者消费者模型。
- 数组(面试官说的是队列,感觉是不是对队列有点误会?)和链表的区别。
- 写一个循环链表删除的代码。
- 写一个循环Buffer的代码,问了一下什么是循环Buffer,面试官说就是一个数组写满了再从开头写,是覆盖***作。
- 有没有进行过性能优化,性能优化有哪些优化点。
- 拿到了哪些offer。
三面
- 三面也是类似美团那种,随便聊聊。
- 怎么学iOS的。
- 为什么从Android转iOS。
- 为什么不考研。
- 拿到了哪些offer。
- 常见的设计模式,MVC和MVVM比较。
- 最后是一个关于设计模式的设计问题,很简单,记不起来了。
- 三面完毕一周后收到签约通知,度秘部门,因为还在等腾讯和头条,所以没签。
携程
携程(正式批,收到offer)
携程的面试流程相对比较随意,我的情况是只有技术一面,面试的是酒旅的移动端开发总监,聊得不错。面试完毕之后hr告诉我有的面试官是可以直接决定去留的,没有二面,有的需要二面,就让我回去等通知了。9月底顺利收到offer。
下面说一下面试的内容,基本就是随便聊聊吧。
- 为什么转iOS开发。
- 怎么学习iOS开发的。
- 作品可以展示一下么。
- 社区页面的请求流程,返回的JSON格式。
- 谈一下加载大图的优化算法。
- 谈一下对网络库的封装。
最后面试官和我握了握手,笑着说我真像个做技术的。
腾讯
腾讯(正式批,HR面被刷)
腾讯包括两轮技术面和一轮hr面,早就听说过鹅厂的面试有很多坑,今天总算见识到了,万万没想到居然被hr刷了。
一面
一面问的基础,简单,面试官也很nice。
自我介绍。
- weak指针的原理。
- MVC和MVP的区别。
- 几种常见的设计模式。
- 快速排序,手写代码,时间复杂度,几种实现方式。
- 之前公司中git的协作模式。
- 拿了哪些offer。
- 腾讯和头条选哪个。
感觉面试官挺友好,边问技术边聊天。
二面
第二天开始二面,二面面试官是做C++后台开发的,这也是我第一次(希望也是最后一次,两个专业不同的人真的没啥聊)被不是移动开发领域的人面试。面试官上来问我了不了解后台开发,因为我之前做过Java Spring,所以就说了解……下面是二面中的问题。
- C++中const的使用场景。
- 多态在C++, oc, Java中的表现形式。
- 出了一道关于Java的题,写出输出的结果,幸亏我Java底子好……
- 讲一下虚函数表。
- 3sum closest问题,没做出来。
- TCP用什么机制保证可靠性。
- 如何优化http连接的速度。
- ***作系统内存管理有几种方式,这几种方式的区别。
- 1000桶酒,其中一桶有毒,酒可以混合,问最少用多少只老鼠能试出哪一桶有毒。
- 512MB内存,统计一个10G文件中Top10关键字,文件当中存放的记录是搜索记录,有重复。
- 怎么学习iOS的,看过哪些书,看过哪些博客。
二面体验极差,基本开放问题我都没有让面试官满意,面试官问我拿了哪些offer,我就说百度,头条和美团……然后面试官就让我去见hr了,多拿几个offer还是有加成的。
之后hr就随便聊了几个问题,回去之后第二天就被刷了,之后就安心等待头条的offer了。
今日头条
今日头条(内推,拿到offer)
宇宙条的面试果然是专业啊,一个下午完成了三场面试,面完之后气喘吁吁。
一面
- 自我介绍。
- 合并K个有序链表。
- 数组中连续最大和。
- 关于runtime的认识。
- 内存管理机制,引用计数原理。
- AutoReleasePool的原理。
- 消息转发原理。
- AFNetworking源码看过没,原理。
- SDWebImage源码看过没,原理。
- 死锁怎么检测,怎么解决。
- 多线程常见的使用方式。
- KVC用过没,讲一下。
- 一个实例对象的内存布局
- Block底层原理,本质是什么,struct类型在内存上是怎么分配的,__block原理。
- https原理。
一面过后感觉凉凉,因为我的算法真的是硬伤,感觉二个算法都没答好,第一个还是在面试官提示下做出来的,晕。
很快接收到了二面通知,HR说反馈不错……受宠若惊!
二面
二面感觉才是一面啊……问的很基础。
- 自我介绍。
- 在实习中的工作。
- 浏览器敲一个网址,回车,经历了什么。
- DNS原理。
- LRU算法怎么实现。
- 一道算法,关于栈的,很简单。
- 二面还是有点慌,因为面试时间很短。
10分钟后三面通知……
三面
感觉也是和技术leader随便聊聊。
- 自我介绍。
- 怎么学习iOS的。
- TCP怎么保证可靠性的。
- 问了关于项目的一个解决方案的问题,导入一个长视频怎么办。
接下来面试官开始谈自己所在的部门,问我最想去哪里。然后说已经过了,等通知吧。
之后接收到hr电话通知,二周内有结果,感觉宇宙条挺注重基础的……。
一周后顺利收到offer,提着的心也放了下来,秋招旅程到此结束。
心得体会
下面总结一下自己这一个月来的心得体会,只有最后成功了才敢回首啊……
1、心态最重要
在秋招面试中,总会遇到各种奇葩的问题,像是猪场莫名其妙的回拒,百度二面双方对“队列”的理解差异,腾讯二面面对不同领域面试官等等……遇到这些问题难免心里会沮丧,但是最重要的是别崩溃,不要去怀疑自己,调整心态准备下一场,不要让一时的沮丧影响到自己全局的决策。好的心态比过硬的专业能力更为重要!
2、关于笔试和刷题
《剑指offer》这本书是一定要刷完的,面试过程中遇到了好多里面的原题。关于笔试,我周围有很多同学都被笔试刷掉了,这种情况要狂刷leetcode或者牛客网。笔试成绩不如意也不用太过担心,有的公司对笔试成绩要求不是那么高的,像百度,笔试非常难,后面的编程一道也没有ac,照样得到了面试机会。
3、关于简历
如何准备精美的简历这种问题网上一搜一大堆,在这里我只说几样能加分的:
github 附上github地址,面试之前多提交点东西,面试官会去看的。
4、个人技术博客
这也是展示自己学习能力的好东西,最好带个目录,整个人技术栈一目了然。
5、实习经历
如果有比较好的实习经历的话,一定要写到简历里,并突出自己在实习中做了什么!