iOSer疫情期间的虐心面试经历,真题 + 总结
这篇文章大概会涉及大厂真题、面试小技巧、狗血面试现场、面试资料选择等。
大概从去年10月份就有出去看看想法了,12月份开始利用业务时间开始复习,1月份开始利用下班时间看算法,2月份开始看项目相关的,3月份系统复习,3月底出征。虽不是大佬,写点面经算是对于自己过去几个月面试经历的总结,记录历程,如你恰好看到,希望对你有帮助。
从3月底开始参加面试,投递的岗位基本都是互联网大厂,阿里腾讯、字节快手美团、小米陌陌等。正值疫情期间,面试都采用视频面试,有的在牛客网,有的公司用腾讯会议,有的公司用Zoom会议。
这里非常郑重的告知一件事儿,视频面试过程中,不要切浏览器,不要切浏览器,不要切浏览器。至于为什么,“可想而知”,且不说面试官都看得到,咱们面试还是靠真才实学比较好。
提前交代下,本人大概面试了6、7个公司的10来个职位吧,最终拿到了腾讯、快手、美团的offer,最开始战略性失误,浪费了几个非常好的机会,这里一个猎头跟我推荐的先用小厂或者意向一般的岗位试试手,然后再去面试心意的岗位。因为我目前不考虑小厂所以开始比较固执的开始面试心仪的岗位,导致准备不充分,下面我要说的这些完全都还没概念,接连失败,不仅是浪费了几个很好的职位,还导致士气大大受挫,身心俱疲,不过好在及时调整,顺利拿到几个还算不错的offer。
iOS基础部分
iOS基础部分的复习资料:《编写高质量iOS代码的52个有效方法》、《iOS程序员面试笔试真题与解析》和《iOS程序员面试笔记宝典》以及博文《招聘一个靠谱的iOS》,基本这些本书覆盖了面试中基础部分百分之70-80的问题,那么剩下百分之20-30要不是更深入的知识点深挖,要不是边边角角的知识点,比如问你动态库调用静态如何操作。这些很早就买了,平时工作也会当做手册来查,所以看起来不算很费尽,前前后后都看了3编左右,后续的面试过程中涉及到这部分因为都顺利通过了。
大厂面试基础常见考题
因为面试的岗位太多了,题目也非常多,一多就失去了其参考价值,看完这篇分享就扔到脑后,不如我捡几个必考题,在看完复习资料的基础上,着重看看这些题目。
一般一面内容是基础部分,但也不排除有一面面试官直接上来考察项目,中间穿插问基础的。
- 关键字,strong、copy、assign、atomic等,面试官喜欢延展问atomic哪里不好,底层如何实现的,更严格的面试官会接着问锁相关的问题。
- 苹果如何现weak修饰的变量置位nil。
- KVO的底层原理,进而引出使用KVO注意事项,如何规避crash,或者做过crash防护吗?各种常见crash的防护实现,这题书本上没有,业界也有可行方法,但当时真把我难住了,没做过,面试那么紧张知道面试官拿着标准答案等我呢,想不出来。
- GCD关于并发、串行、同步、异步的概念。各种常用GCD用法,深一点的会问栅栏函数干啥用的,与disatch_group使用场景有哪些不同,disatch_group、信号量使用过程中需要注意啥,有哪些坑。
- Runloop的相关问题,通过runloop可以引出非常多的问题。如线程、常驻线程、Timer、进程与线程区别、使用runloop解决哪些问题、屏幕刷新、绘制等等问题。首先要对于runloop的机制烂熟于心,另外要对引出的这些小问题驾轻就熟。说到线程还会引出一个大boss——自动释放池,变量如何释放,自动释放池的结构等问题。
- Block底层实现,引出三种block类型,forwarding指针,引起大boss —— runtime,runtime机制,runtime内存布局、苹果的runtime设计理念,使用runtime解决那些问题,进入引出热修复。
- 分类的底层实现,进而引出dynamic关键字的使用,运行时启动的何时加载分类,关联对象实现原理,方法覆盖问题,load方法和initialize方法区别等。
- 第三方库的实现原理,如何常考的AFNetworking、SDWeb、YYKit,进而开始考察网络,缓存,淘汰算法(有面试官当场让我写LRU算法)渲染,绘制等方面的问题。
- 其他相对比较基础的问题就不多说了,现在面试高级、资深基础部分基本上面这些问题是必考的,要求严格的厂会针对没个问题进行更底层的深挖,对于这些问题的掌握目前局限在书籍和苹果官网水平,所以挖的太深就说不出来所以然了。
项目经验
1.项目经验一般面试官会通过你简历上项目内容进行发问,2.也有在自我介绍的过程中就直接发问的,3.最友好的方式面试直接让你自己说,挑一个你觉得自己做的还不错的项目详细阐述。
关于这部分每个人不一样,但是有几点还是想着重说明分享下。
- 细节、细节、细节一定要掌握,比如让你做过图文混排,表情如何处理的,@某人、#话题如何做的,有效电话号码的正则如何写的,如果你记不清楚了,劝君还是别说这块。否则你与面试官的对话将是:“我从网上找到,直接在项目中使用的,具体啥我也记不住了”,如果你透漏你是用百度找的,那么恭喜你,你将收到面试官鄙夷的目光。
- 设计模式,如果你对于除了“单例模式、代理模式、观察者模式、通知模式(这几个面试官耳朵都起茧子了)”这几种模式有更多的佘略,面试官会很开心,如果你把设计模式用到了你做的项目中,面试官会更开心。
- 优化类型的项目,指标、指标、指标。要量化你做的项目,提升多少帧率,减少多少启动时间,带来多少收益。如果你不量化,对于面试官基本等于不是你做的。
- 开放问题,比较资深的面试官会揪着你项目的某一个细节一直深挖,直到你说不出来未知。比如你做过启动优化,那么可能会具体问题pre-main阶段rebase和bind到底干了啥,咋干的,这个问题我是不会的。对于这类问题,面试之前自己给自己讲一遍项目,尝试着多问自己几个为什么,然后查查资料,说不定能蒙对一个,那么可能你就通过了面试。
关于项目一直都是不是我的强项,面挂的十之八九都挂在这上面了,所以没有太多可供参考的精力,老铁们自己多总结总结。
算法
哎,我知道算法是多少同学的噩梦,也是最不愿意面对的地方。从我面过的几家公司来看,字节、快手的算法稍微难一些,相对偏一些,其他美团、腾讯、滴滴等其实都还好,基本leetcode刷200道题(独立完成才算数),剑指offer题目都手动敲一遍,其实目前对于iOS岗位(除去字节)都够用。就我参加十几场面试来讲,80%的算法题是都给出了正确答案的。另外的20%都发生在了字节跳动的二面,结果可想而知,以至于我对于字节的面试产生了心理阴影。
我是去年刷过一个月半月,今天准备面试又刷了一个月。首先把极客时间算法通关40讲看了两遍,第一遍只看不写,第二遍要独立使用其他Swift完成,并总结相关模板。再次剑指offer看了一遍,在leetcode把题目又敲了一遍,又 看了一本薄薄的书《算法图解》来稀释畏难情绪,另外在 Github 创建了一个仓库,把笔记和刷题记录总结归纳到上面,同时也敦促自己每天尽量过去点绿一个方块,😃。
敲重点一:目前面试中算法的部分主要是:字符串、数组、链表、二叉树遍历以及非常少的图(目前我只接到过一次图的考题,还是在快手的设计类的题目中)。另外可能涉及到点,常见的排序算法(比如归并排序的最后一步合并两个有序数组不止一次被面试过),二分思想(记住模板),递归写法的迭代实现,常见数据结构(栈和队列)使用。
敲重点二:尽量做到bug free,重点考虑 栈溢出、数值类型的溢出、边界条件(为空、负数、0、最大最小值等等吧,太多我也罗列不过来了)。
其他
- 网络问题,常见的问题 网络的七层模型、https和http区别,http1.0和2.0区别,加密算法、TCP和UDP区别,BT的面试官可能会让你回答“浏览器输入baidu.com”到页面显示出来发生了什么,这个考察就太全面了,当时回答的并不好。
- 设计模式,最好可以多说些,如果看过《架构整洁之道》和《Head First设计模式》应该难不到你。
- 计算机更底层,编译器,链接器,Clang等问题。这个太硬核了,期待别考吧,反正我本人还有待提升。
狗血面试现场
前方高能警告,负能量爆棚,如您不感兴趣,可以就此打住
面试的过程中,见识了各种各样的面试官,有聊得非常愉快的,有开始面试2分钟就想罢面的。
- 字节二面,上来一道算法来个下马威,撕完后,开始问项目,一个一个的问题,抠细节,抠到我开始听不懂面试官的问题,全程面试官画面不清晰,我以为他一直在微笑,头不听的在屏幕上转来转去,感觉是不是颈椎有问题,临结束了又搞了一个面试题,没做出来,面试官又出了一道,居然和一面题目一样,我这个人比较老实如何告知了情况,面试官感觉有些尴尬,又出了一道,做出来80%,有些边界没考虑好,挂了。。
- 腾讯二面,面试官临近面试两分钟告诉我会议室链接,之前的腾讯都是早早发了面试邮件,告知会议室链接,这个面试官的做法我感觉不好,可能是个刺头,果不其然,面试官画面进入我的电脑屏幕是经过处理的,只有个人头在屏幕中晃荡,其他地方全部都马赛克了(是家里有不可告人的秘密吗,哈哈)。。基本这种性格特性的面试官面试的过程都不会太愉悦,全程冷脸,生抠,硬抠,明确表示这块我不是很清楚,依然不依不饶的问,真心累,想尽快结束面试。
- 滴滴一面,去年这个时候拿到了滴滴的两个offer,因为薪资没有谈妥没有过去,心想针对滴滴的用人要求应该没啥问题,然后开场2分钟我意识到问题的严重性,这个面试官不好对付,首先上来对于我们的项目指手画脚,哪里哪里做的不好,为什么你们做到极致。然后开始问基础,参加这么多面试,面试官问我的问题我居然这么多回答不上来,问的基本都非常偏(大概因为我知识面不够吧),比如某个冷门的库的API具体是啥,非对称加密算法有哪些,具体算法内容是啥(我真的不知道,这方面是真),哎呀,想着头疼,不说了。
- 小米一面,参加工作以来这是面试经历最差的一次,从自我介绍开始面试官没有让我说完话,直接打断。我回答的问题的时候正在激情中,面试官不带有任何过渡性语句,直接下一道题,一度我专注于上一题无法听清楚他突然发问的第二道题,需要他重复给我,非常不耐烦。从第一次打断我,我室友就坐不住了,跑去厨房玩手机去了。我一直在心理暗示以后还要参加小米其他部门的面试,我要忍住,于是这场面试就硬生生的拖到了40分钟,双方都很火大挂断了视频。
其实面试过程中遇到各种各样的面试官很正常,有的很比较友善,有的人比较严肃,有个人心情不好,有的人喜笑颜开,有的人温文尔雅。面试是一个双方面试的过程,面试官将来是要合作的同学,如果在面试过程中你发现面试官不好相处,性格怪癖,十之八九你入职后也要花费心力去相处,这也是我拒绝了某团一个很重要的原因,虽然最后我通过了面试。另外面试也是缘分的事儿,我个人抱着不必强求的态度,有的时候就是八字不合,看不对眼,那么权当长经验了,只要技术过关,我相信终究会遇到伯乐的。
就到这里吧,如果后续想到啥会更新,希望我的总结可以帮助到你一点。