2021 面试心得

iOS成长之路

共 8979字,需浏览 18分钟

 ·

2022-01-11 11:34

提笔已经是 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 的kCFRunLoopBeforeWaitingkCFRunLoopAfterWaiting之间设置一个变量,然后将两个变量进行比较,如果两值的差值大于 2 秒,则说明有卡顿发生,具体代码编写,可以参考 简单监测iOS卡顿[1]

那么问题来了,你回答这些面试官感觉还可以,然后会继续问,如果监听到卡顿,怎么知道哪些地方有卡顿?堆栈信息怎么获取呢?所有堆栈信息都可以获取吗?有没有更好的获取堆栈的方案?一连三问,童靴们,你该有何感想😂。这就是我所说的面试深度,这个问题的答案可以参考下获取任意线程调用栈的那些事[2],其实就是使用系统的backTrace_symbols

作为iOS开发,对于锁,应该都知道,包括互斥锁、自旋锁、递归锁,问的比较多的就是他们的区别,以及在开发中使用到的锁都是那些,NSLock 是比较常用的,也是面试问的最多的,它是互斥锁,是对mutex普通锁的封装。那么问题来了,这些你都知道,是不是感觉准备的OK了,我想说的是我也这么觉得哈哈~。然而现实就会打脸,在我面试饿了吗的时候,面试官对于锁的最后一个问题就是,如果出现了死锁,我们如何检测,如果去解决呢?~苦笑过~

在面试京东的时候,有一个问题是这样的:iOS 的内存是有不同区域组成的,那么对于一个全局变量,初始化和未初始化的时候所在的是同一块区域吗?

分析下这个问题,在 iOS 中内存主要是分为五大区域的:栈区、堆区、静态区、常量区、代码段,然而你不知道的是:

  • 未初始化的全局变量和静态变量在 BSS 区,即未初始化区:.bss(Block Started by Symbol segment)
  • 已初始化的全局变量和静态变量在数据区,,即初始化区:.data

其他详细的介绍,可以看下 iOS内存管理-内存五大区[3]

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 个算法:

  • 两数之和 - LeetCode 1[4]

  • 合并两个有序链表 - LeetCode 21[5]

  • 二叉树翻转 - LeetCode 226[6]

小红书

手写算法,因为我是现场面试的,如果是视频,应该是远程编辑。

  • 判断有效数字 - LeetCode 65[7]

百度

手写算法:

  • 复原 IP 地址 - LeetCode 93[8]

阿里本地生活

视频面试,提供编辑代码工具,自己写代码。具体我记不清楚了,大致的意思是:

  • 把数组排成最小的数 - 剑指Offer 45[9]

其他

上面是我印象比较深刻的,还有一些小公司会问一些排序的就不多说了。

那么如何应对,我分享一下我的经验,之前在没有学习算法的时候感觉应该挺难的。其实如果你去研究学习,花时间投入,一些面试常问的二叉树、链表、排序,并没有那么难,除非一些动态规划的,如果你是年薪 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 站、京东、得物、声网、百度、合合(扫描全能王)、哈罗出行、小红书等。在文章末尾,我将自己的一些面试遇到的问题,整理了一份放在 Github[10] 上,有需要的请自取!写作不易,还望各位大佬,点赞支持,哈哈~

引用资料

[1]

简单监测iOS卡顿: https://www.jianshu.com/p/71cfbcb15842

[2]

获取任意线程调用栈的那些事: https://toutiao.io/posts/aveig6/preview

[3]

iOS内存管理-内存五大区: https://www.jianshu.com/p/2d4acf4a53f9

[4]

两数之和 - LeetCode 1: https://leetcode-cn.com/problems/two-sum/

[5]

合并两个有序链表 - LeetCode 21: https://leetcode-cn.com/problems/merge-two-sorted-lists/

[6]

二叉树翻转 - LeetCode 226: https://leetcode-cn.com/problems/invert-binary-tree/

[7]

判断有效数字 - LeetCode 65: https://leetcode-cn.com/problems/valid-number/

[8]

复原 IP 地址 - LeetCode 93: https://leetcode-cn.com/problems/restore-ip-addresses/

[9]

把数组排成最小的数 - 剑指Offer 45: https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/

[10]

面试题整理: https://github.com/cuilinhao/2021_Interview


浏览 74
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报