2021 面试心得
提笔已经是2022年1月1号,想了想还是准备写一遍文章记录一下,因为疫情的影响,可能很多小伙伴已经在自己公司待了至少2年以上吧,然后就是今天的一个跳槽高峰,从身边朋友或者猎头就能看出,除了金三银四,金九银十,感觉找工作的是从年头到年尾,招聘的也是从年头到年尾,Everyday~
今非昔比
还记得3年前跳槽,出去面试,基本上当天就有结果,要么过,要么不过,而现在真是各种拖延,也可能和跳槽的时间有关系, 我是9月份开始面试的,可能有些公司招人已经不是很着急了,所以建议看机会的大佬们,可以换个时间,我是深有体会😂
面试时间变长,对于看机会的你来说,这将是一个很大的心理考验,面试过的应该有同感吧!
此外还有一个比较重要的就是技术了,从boss上能看到,现在薪资很高,但是要求也很高,所以,想要入坑一个比较满意的公司,那你的技术也要让别人满意,总结一句话:就是问的很深. 比如,我面阿里的蚂蚁财富,因为我简历上写了网络协议相关的内容, 面试管就问,HTTP 1.0,HTTP2.0/HTTP3.0 一个接一个的问,可能有些公司只会问到HTTP1.0和HTTP2.0,然后就over了,后面再说具体面试题
准备
这次的跳槽我准备的时间确实很长,也与我自身平时的工作有关系吧,平时开发只做业务代码开发,没有深入研究底层逻辑,具体准备的就是OC的底层原理,runtime,runLoop,多线程,锁,性能优化,离屏渲染,等等,这些,你可以看下小码哥的课程,确实不错,还有逻辑教育,不过逻辑教育的课程没有接触过深,只是试听过几节,感觉还是有点东西,不过就是有的老师讲课的方式,不好接受.除此之外,我还把swift重新温习了一遍,这个还是必备的,因为Swift是一个趋势,一些公司慢慢从OC转到Swift,你可以从boss上看出来,比如得物就是纯Swift,还有小红书,最后也还是最重要的一部分就是算法,如果你想进大厂,那算法是必备的,我看的算法也是小码哥的课程,讲的确实很全面.
努力奋斗的五个月
如果自己有一个很强烈的想法,你想实现,那么对于平凡的我们来说,只有努力奋斗,没有第二条路,除非,马云爸爸是你家亲戚(😄),准备的几个月基本上是每天早上做地铁就是看自己准备的一些文档,白天工作,中午休息的一个半小时,我会抽出来刷抖音的半小时,直接看视频学习,然后晚上下班,那就是9点到11点,差不多每天晚上要花3小时,想想那一段时间,虽然很辛苦,但是确实也学习到了很多东西,也感谢媳妇对我的支持!
看视频学习,其实这种高强度的大脑输入,说真的,你可能很快就忘记了,那么怎么办:
- 看第二遍
- 写代码,自己根据老师所讲,进行源码跟读
- 自己总结,做笔记
很多东西,只是听听是不行的,一定要自己去写代码,还有应用,要想想在平时开发的过程中,能不能把这些底层知识也运用到.举个栗子:在使用NStimer的时候,持有self会出现循环应用的情况,那么解决这个问题,可以使用NSTimer+block的形式做,还有另外一种方式是使用NSProxy,我在目前的项目中去搜索发现很多三方库也是使用的NSProxy
对于Swift,有些公司除了问你OC的问题,也会问一些Swift的问题,所以Swift你也是必须掌握的,比如:访问权限,面向协议,闭包,函数式编程,结构体和类的区别这些,当然不会问这么简单,还有可选型的本质?lazy是怎么实现的,泛型的本质?
对于算法,只是看视频听课,是不够的,我面试下来,B站,阿里的,还有百度的,其实问的算法没有我们想象的那么难,问的比较多的就是二叉树,链表,排序,对于大厂的面试,就是给你一个和leetCode一样的编辑文本,直接敲出来,另外还要说出时间复杂度和空间复杂度
对于网络,确实面试过程中问的比较多,也是一些常见的问题,HTTP/HTTPS的原理,为什么进行3次握手,TCP/UDP的区别,使用场景,后面再详细说
下面我把自己要准备的一些清单,分享一下,希望可以帮到你,当然这只是一部分
遇到的问题
对于面试,不同面试官,由于个人喜好,不同,所以问问题也不同,有的会问的很细,有的可能只要你答出来思路就可以了,下面我列举一些比较有代表性的问题,上面说的面试问的很深,怎么理解呢? 比如得物,当时面试官问我一个关于RunLoop的问题:使用RunLoop如何监测页面发生卡顿?这个面试题的答案就是新创建一个线程,并将这个线程加到RunLoop中,然后在这个创建的线程中加一个Timer,每隔1秒进行监测,设置一个变量随着定时器递增,同时在RunLoop的kCFRunLoopBeforeWaiting
和kCFRunLoopAfterWaiting
之间设置一个变量,然后将两个变量进行比较,如果两值的差值大于2秒,则说明有卡顿发生,具体代码编写,可以参考简单监测iOS卡顿
那么问题来了,你回答这些,面试官感觉还可以,然后会继续问,如果监听到卡顿,怎么知道那地方有卡顿,堆栈信息怎么获取呢?所有堆栈信息都可以获取吗?有没有更好的获取堆栈的方案? 一连三问,童靴们,你该有何感想😂 这就是我所说的面试深度,这个问题的答案可以参考下获取任意线程调用栈的那些事,其实就是使用系统的backTrace_symbols
作为iOS开发,对于锁,应该都知道,包括互斥锁, 自旋锁,递归锁,问的比较多的就是者的区别,以及在开发中使用到的锁都是那些,NSLock是比较常用的,也是面试问的最多的,它是互斥锁,是对mutex
普通锁的封装,那么问题来了,这些你都知道,是不是感觉准备的OK了,我想说的是我也这么觉得哈哈~,然而现实就会打脸,在我面试饿了吗的时候,面试官对于锁的最后一个问题就是,如果出现了死锁,我们如何检测,如果去解决呢? 苦笑过
在面试京东的时候,有一个问题是这样的:iOS的内存是有不同区域组成的,那么对于一个全局变量,初始化和未初始化的时候,所在的是同一块区域吗?
分析下这个问题,在iOS中内存主要是分为五大区域的:栈区、堆区、静态区、常量区、代码段,然而你不知道的是:
- 未初始化的全局变量和静态变量在BSS区,即未初始化区, .bss(Block Started by Symbol segment)
- 已初始化的全局变量和静态变量, 在数据区, 即初始化区, .data
其他详细的介绍,可以看下iOS内存管理-内存五大区
MultiThreading 多线程
我把多线程单独拿出来说,那么它的重要性就不言而喻了,不管是移动端或者后台,面试是必问的,因为在面试之前,我准备的其实时间挺长的,对于多线程的各种使用以及面试问题,我都是写代码实践过的,感觉,只要是多线程的面试问题,我绝对OK,信心满满,然后现实很骨感~
有一个经典的多线程的总结,我在这放一下:
中通快递面试官的一个问题:如何中断一个线程? 其实这个问题,在平时开发中遇到的可能性不大,但可能业务需求,所有面试官才会问,那么如何作答呢?在OC中,是没有直接中断线程的方法可以调用的,如果用Swift,可以使用
DispatchWorkItem
,但是如果是使用URLSession进行的网络请求,每个task都有cancel方法,直接cancel掉就可以,如果是耗时的计算类线程,需要在合适的地方加上flag,在cancel时把flag置为false,线程就能及时终止.你学废了吗?😝😝😝
还有一个我印象比较深刻的就是小红书的面试官问的问题:对于全局队列,
dispatch_queue_global_t dispatch_get_global_queue(intptr_t identifier, uintptr_t flags);
这个全局队列使用的时候,可以根据传入的参数不同,来让线程按照一个优先级来执行,面试官的问题是,如何使用全局队列来创建一个有序的任务队?
在dispatch_get_global_queue(intptr_t identifier, uintptr_t flags)
使用时,第一个参数是可以传入不同的值,官方提供的几个如下:
-
define DISPATCH_QUEUE_PRIORITY_HIGH 2
-
define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
-
define DISPATCH_QUEUE_PRIORITY_LOW (-2)
-
define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
传入不同的值,所得到的线程执行的顺序是不同的,代码如下:
- (void)_test
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"start task 1");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 1");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"start task 2");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 2");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"start task 3");
[NSThread sleepForTimeInterval:3];
NSLog(@"end task 3");
});
NSLog(@">>>>>>>>>");
}
打印结果如下:
2022-01-02 11:51:11.734788+0800 Interview03-RunLoop[14921:446533] >>>>>>>>>
2022-01-02 11:51:11.734831+0800 Interview03-RunLoop[14921:446730] start task 1
2022-01-02 11:51:11.734852+0800 Interview03-RunLoop[14921:446729] start task 2
2022-01-02 11:51:11.734876+0800 Interview03-RunLoop[14921:446735] start task 3
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446729] end task 2
2022-01-02 11:51:14.737209+0800 Interview03-RunLoop[14921:446730] end task 1
2022-01-02 11:51:14.737220+0800 Interview03-RunLoop[14921:446735] end task 3
PS: 一定是有耗时的任务存在的,一定要3个任务都在同一个线程里面,否则就会有问题,路过的大佬,可以试试~
算法
今天最流行的词就是"卷",算法的面试也是一样,童鞋们,稍微有点规模的公司,多多少少都会问一些,大厂基本上是要求你手写算法,或者给你一个编辑工具直接写,对于一些小型公司,可能会问一些思路,我遇到的公司,分享一下:
B站
手写算法,一共4面,写了3个算法
- 合并两个有序的链表
- 二叉树翻转
- 在数组中找出和为9的值(leetCode原题)
小红书
手写算法,因为我是现场面试的,如果是视频,应该是远程编辑
- 给一个4位数,写一个算法,找出该数中是否包含4和7
大致是这个意思,我记不太清楚了
百度
手写算法:
- 给一个ip地址,然后写一个函数将ip作为字符串返回,并实现字符串转回原来的ip(就是ip <=> string 之间相互转换)
阿里本地生活
视频面试,提供编辑代码工具,自己写代码:
具体我记不清楚了,大致的意思是:
- 给你一个乱序的数组,然后将数组中的元素,按照小、大、小、大的顺序排序
上面是我印象比较深刻的,还有一些小公司会问一些排序的,就不多说了.
那么如何应对,我分享一下我的经验,之前在没有学习算法的时候感觉应该挺难的,其实,如果你去研究学习,花时间投入,一些面试常问的二叉树,链表,排序,并没有那么难,除非一些动态规划的,如果你是年薪60W+的,可能会问,还有算法的难度还和你面试的部门有关系,看面试部门的要求,你是高级还是专家,或者架构师,要求都是不一样的,考察的难度也是不一样的,具体的情况要具体分析
如果你刷题多了,会发现很多题目是有套路的,比如排序的,或者链表,很大部分题可以使用双指针或者多指针去做,还有一些"基本功" 就是一些基本的要求,你一定要在没有参考的情况下,达到手写代码,比如,反转二叉树,前序遍历,后序遍历,层序遍历,计算二叉树的高度和宽度,求一个链表的倒数第k个节点等,这些东西你一定要胸有成竹,然后再去刷题,效果会更好~
还有一个最大的好处就是,你可能在面试的时候,会遇到原题或者比较类似的题目, 那岂不是一举两得~
在这推荐一个大佬的公众号:labuladong,里面文章不错,希望对你有所帮助~
如何面试
准备算法的时候,需要刷题,面试也是一样,需要刷,但刷面试,是有套路的,那就是,你要先面试小公司,我有一个朋友,感觉面试小公司没有意义,其实我感觉并不是,比如我,因为我之前准备的时候,是看了很多视频,很多东西对于你的大脑来说都是输入的过程,而面试,对于大脑来说,是输出的过程,也是一个痛苦的过程,面试过的童鞋应该都深有体会!我记得我面试第一家是追书神器,一个小公司,他们那边iOS团队就3个人,但是那个面试官问的就很全面,基本上把我准备的都问了一遍,面试了1个小时,面试后的感觉是,我头痛[捂脸],把所有的输入转化为输入,这种感觉,你懂的~
一定要把你最想要的公司放在最后去面试,这样你整个的面试状态以及面试的心情是不一样的,Good Luck To You!
大厂的要求
越是比较有名气的公司,要求越高,高在哪里呢? 有可能简历都不过,如果简历过了,面试的每一轮,都有可能不过,我这次面试,机会也不少,让我感触最深的就是,越是大公司,面试官就越低调,而且人都很随和,没有一点架子,让我印象最深的就是现场面试小红书,当我等在面试会议室的时候,面试官进来,先给我握手,然后再让我坐,还有B站的面试,面试法都很nice,会让你感觉很好!
上面说好的一面,下面说不好的一面,那就是技术要求很高,在给你出的面试问题中,特别是一些死的东西,你一定要百分百的答对,如果能举一反三最好,特别是一些大厂,比如阿里,京东,如果问你10个问题,你答对9个,那么不好意思,你这次面试还是失败的,这就是大厂的要求,还有就是手写代码的能力,如果让你手写一段代码,然后你可能不会写,或者激动等其他原因,你给面试官说,可以说下思路吗?基本面试官会答应,但是就算你说的再好,这次面试还是失败的,因为面试官不知道你手写代码的能力, 现实就是这样残酷!
一个人的运气
不知道是不是10月之后,企业是不是只做人才储备,还是不着急,所有的面试安排,给人的感觉就是拖拉,再加上一些假期,时间就更长,然后还有中途停招的[捂脸],不光是我遇到过,我朋友也遇到多,面试都三轮了,说岗位没有了,我遇到的是平安的,一面过了,然后HR给我打电话说,职位停招了,还有百度的,二面的邮件都发了,等到快面试的时候,给我说职位停招了,想哭的心都有,所以,在你没有收到offer之前,一切都是未知,这次对我来说还有一个最大的遗憾就是被B站给拒了,去B站现场面试,从下午1点一直面试到晚上6点多,出去的时候,外面天都黑了,等我走的时候,第四个面试官还加我微信,让我准备薪资证明,有图为证:
B站的面试,最终还是没有给offer😂,当时我的心情是如此的奔溃~,但现在我虽然没有去B站,目前还是在一个我感觉不错的公司,这就是传说中的上帝给你关了一扇门,然后给你开了一扇窗吧!
我说这些并不是让你感觉到灰心,恰恰相反,希望路过的大佬,把握每一次机会,珍惜珍惜再珍惜,有些大厂没有给offer,并不是你不优秀,技术不行,心态要调整好~ 你是最棒滴~
本次面试对自己的影响和后期计划
这次面试,其实对我影响挺大的,告诉了我,切莫要挥霍青春了,如果我早在一年前就开始做知识的储备积累,早一些去学习研究各种算法,这次面试也不必花费这么长时间去准备,还有就是在开发中就要思考,实现业务功能或者遇到问题时,这个代码的实现方式,底层是怎么实现的,原理是什么,有没有更好的解法,其他的大佬遇到这个问题是怎么解决的,就如上面我说的多线程,如果你不自己去写Demo,你永远不知道还能这么玩,而且里面还有坑,大厂的大佬,也就是在日常开发中,多做了研究,总结,踩坑,思考~
只是几个月的努力,其实远远不够的,贵在平时吧~ 一起加油!
这次面试花费的时间挺长的,也感谢之前努力的自己,在此面试了阿里,B站,京东,得物,声网,百度,合合(扫描全能王app),哈罗出行,小红书等在文章末尾,我将自己的一些面试遇到的问题,整理了一份放在github上,有需要的请自取!写作不易,还望各位大佬,点赞支持,哈哈~