随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得。由于我面试的都是比较大的公司,所以自然也是做了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学。另外,由于经验本来就是主观性极强的东西,加之笔者水平有限,所以如果有不认可的地方,万望诸君呵呵一笑,抛之脑后。
接下来,我就斗胆分享一下自己在准备和参加面试的过程中的收获、对面试的思考,以及一些可能对大家有用的建议。最后附赠一份大礼包,希望能帮助每位读者找到自己心仪的工作。
什么是面试
有些人可能会把面试看的太重,觉得面试过了就能进入大厂,技术和财富兼得……
我倒是觉得,面试没有这么夸张(抱歉做了一回标题党),它其实是一次你和面试官互相了解的绝佳机会,借此机会你还可以对未来的工作有初步的了解。
面试本身并不能完全评价一人个的实力。面试通过的人,也许只是恰好在面试时遇到了自己熟悉的问题,面试不通过,也有可能是面试官自身的问题,并非每个面试官都具备客观评价别人的能力。
换句话说,面试没通过也许是面试官没有发现你的才华,面试通过了也并不代表你就能胜任工作,因为进入企业之后可不是每天负责回答面试题!
所以从这一点来看,面试有点像相亲。你满意我,我满意你,王八对绿豆——看上眼了,那就一拍即合,否则就分道扬镳。我本人非常希望能够多几轮面试(实际并不总是能做到),这样大家都有充足的时间互相了解,决定去留。
网上某些面经中,介绍了一些“装逼”的方法,还有所谓的“面试技巧”,我是不太认可的。技巧需要有,这是为了让你更好的展示自己,而非坑蒙拐骗,无理取闹,无中生有。我更想展现一个真实的自己,如果面试官不认可,说明我们没有缘分,或者说自己的能力还不够。
面试要准备什么
有一位小伙伴面试阿里被拒后,面试官给出了这样的评价:“……计算机基础,以及编程基础能力上都有所欠缺……”。但这种笼统的回答并非是我们希望的答案,所谓的基础到底指的是什么?
作为一名 iOS 开发者,我所理解的基础是 操作系统、网络和算法这三大块,不同的开发方向可能有不同的侧重,但基础总的来说就是这些。我不推荐通过去网上看教程来学习这些基础知识,因为能用短短几篇文章讲明白的事情不叫基础,至少我没见过写得这么深入浅出的文章。
不知道有多少读者和我一样有过这样的困扰:“我知道某些东西很重要,所以去百度查了资料,但是查到的文章质量很差,正确率没有保证”。这其实是正常的,优秀的文章一般都放在优秀的作者的个人博客上,这恰恰是搜索引擎的盲区,所以一般只能搜到 CSDN、博客园这种地方的文章。自然就无法保证文章质量。
出于这种考虑,我在文章最后的复习资料中,提供了用于学习相关基础知识的书籍,如果您恰好是 iOS 开发者,还可以阅读我收集的一些高质量文章,正确性比较有保证(我写的除外)。
除了准备通用的基础知识以外,简历也是一个很重要的环节。一直很仰慕唐巧老师的猿题库,无奈简历太差,都没有收到面试邀请。后来好好改了简历以后,就没有这种问题了。关于简历的书写,推荐两篇文章:如何写面向互联网公司的求职简历、程序猿简历模板。你也可以参考我的简历,没有亮点,就当是抛砖引玉。
最后,当然是准备好相关岗位的基础知识了。作为 iOS 开发者,虽然 Swift 已经发布了快两年,但是大公司转向 Swift 的动作还不明显,所以 Objective-C 几乎是必备项,Swift 都不一定能算是加分项。iOS 方面的知识也必不可少,虽然招聘信息上写着如果基础扎实,零 iOS 基础也可以,但是现实往往是比较残酷的。
我的面试经历
扯了这么多,终于进入正题了,分享一下我的面试经历。题目如下,破折线后面是简单的解决思路。
百度
一面:约 1.5 小时
首先是四个算法题:
- 不用临时变量怎么实现 swap(a, b)——用加法或者异或都可以
- 二维有序数组查找数字——剑指 offer 第 3题
- 亿级日志中,查找登陆次数最多的十个用户——(不确定对不对,我的思路是)先用哈希表保存登陆次数和ID,然后用红黑树保存最大的十个数。剑指 offer 第 30题
- 简述排序算法——快排,
partion
函数的原理,堆排(不稳定),归并排序,基数排序。
然后有一个智力题,没完整的答出来,好像影响不是很大。
最后是 iOS 相关,面试官问的很开放,都是谈谈自己的理解:
- 说说你对 OC 中
load
方法和initialize
方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的? - 说说你对 block 的理解。—— 三种 block,栈上的自动复制到堆上,block 的属性修饰符是 copy,循环引用的原理和解决方案。
- 说说你对 runtime 的理解。——主要是方法调用时如何查找缓存,如何找到方法,找不到方法时怎么转发,对象的内存布局。
- 说说你对 MVC 和 MVVM 的理解。—— MVC 的 C 太臃肿,可以和 V 合并,变成 MVVM 中的 V,而 VM 用来将 M 转化成 V 能用的数据。
- 说说 UITableView 的调优。——一方面是通过 instruments 检查影响性能的地方,另一方面是估算高度并在 runloop 空闲时缓存。
- 谈谈你对 ARC 的理解。ARC 是编译器完成的,依靠引用计数,谈谈几个属性修饰符的内存管理策略,什么情况下会内存泄露。
一面的问题非常基础,主要是算法和 Objective-C,因为准备比较充分,基本上答出来 80% 吧。大约一周后突然二面。
二面:约 0.5 小时
二面比较突然,显示简单的自我介绍,然后问了三个问题:
- 野指针是什么,iOS 开发中什么情况下会有野指针?——野指针是不为 nil,但是指向已经被释放的内存的指针,不知道什么时候会有,如果有知道的读者还望提醒。
- 介绍 block。—— (接第一问) 我让面试官提示我一下什么时候会有野指针,他说用 block 时,我表示还是不知道,只知道 block 会有循环引用。于是就扯回了一面的问题。
- 说说你是怎么优化 UITableView 的。——还是一面的问题。。。。。。。。。。。
虽然通过了,但是几乎又问了一遍一面的问题让我感觉对方不太认真。
三面:北京 onsite,约 2.5 小时
首先是给一个小时,手写算法:
首先是给一个小时,手写算法两个算法题。接下来问了 TCP 握手相关的。最后问了 OC 的一些细节问题。
网易
笔试
主要是计算机方面的大杂烩,涉及操作系统,网络,移动开发,算法等。难度不大,目测是为了淘汰浑水摸鱼的人,就不列出题目了,算法有三题,直接在线写(木有 IDE 表示很忧伤):
- 很长一道题,读了很久才读懂,目测是 DFS,但是最后没时间了,写了个思路。
- 把 "www.zhidao.baidu.com" 这样的字符串改成 "com/baidu/zhidao/www"。——老题目了,剑指 offer 的,两次逆序排列即可。
- 求数组中和为某个值的所有子数组,比如数组是
[5,5,10,2,3]
一共有四个子数组的和是 15,比如[5,10]
,[5,10]
,[10,2,3]
,[5,5,2,3]
。这个就是简单的递归了,分两种情况,当前位置的数字在子数组中,以及不在子数组中。
一面
全部是 iOS 题,可能是觉得算法已经面过了:
- 介绍 block。——我提到栈上的 block 在 ARC 下会自动复制到堆上,面试官问我从 iOS 4 还是 5 开始支持这一特性,表示不知道,我又不是学 OC 历史的,后来想想可能是公司内部老项目有这个坑。
- ARC 会对代码做什么优化?——比如
NSString *s2 = s1; s2 = nil
这样的语句,可能就不会有retain
和release
方法了。 - 介绍一下 MVVM 和 RAC。——可能是我简历的某个角落写了用过 RAC,被挖出来了,大概谈了一下,结果面试官问我数据的双向绑定怎么做,
bind
函数了解过么,果断说已经忘了