小米、百度、bigo 、滴微博、快手、拼多多等iOS 面试后的一次阶段性总结

1,151 阅读15分钟

前言

2020 一场突如起来的疫情,打乱了很多人的生活节奏。我恰好在年后因为一些原因要找工作,也看到周围很多朋友有聊到在疫情期的求职百态,掺杂着个人五年来的从业经历和思考写下的了本文。

面试过程

在疫情期间都是远程面试,下边先介绍一下疫情期间面试的一些公司的面试情况。同时拿到了其中几家的 offer。下边介绍的面试题只还原了其中印象比较深的部分,会存在不足的情况,并不代表面试的全部。

小米

一面

  • 介绍有哪些设计原则,并让比较详细的说了其中开闭原则在项目中的应用。
  • 介绍设计模式,然后其中主要问了我抽象工厂和适配器两种模式。
  • 介绍 runloop 相关的知识和在实际开发中的使用情况
  • 要求详细的描述事件响应链

二面

  • 介绍过往的项目经验,因为曾经的项目和所面试的部门岗位需求匹配度较高,所以这块的时间占比较多。
  • 回文算法
  • (算法)判断一个字符串是不是对称的字符串,比如 abba 或者 aba 这样的就是对称的。
  • block 的实现原理
  • 比较详细的介绍 https 的过程。
  • 过往开发中做过哪些优化向的工作,问的也比较详细。
  • 如何检测项目中的卡顿问题(比如假死)
  • 比较详细的介绍消息转发流程和事件响应链
  • GCD 的底层线程调度原理
  • 介绍 hash 算法的原理

三面

  • 一个二叉树逐层打印的算法题
  • 介绍自己的过往的项目经验,会结合项目问一些架构向的思考
  • 如果现在做一个新的网络层框架,有哪些需要考量的点

百度

百度只有一面,因为面得是百度的商业化部门,对于细节的要求非常严格。个人感觉自己的表现确实不是很好。

  • 判断一个字符串是不是 ipv6 地址(要求尽全力的考虑所有异常的情况)

PS:当时面试官明确告诉我,这个面试题做不好,面试是直接结束的。

  • 介绍界面卡顿的优化有哪些可以优化的点。

  • 介绍 UIResponder 的继承链。然后说事件响应链。

Bigo

感觉面试的这些公司,Bigo 对于基础的考察最全面。

一面

  • (算法)找出一个页面中漏出部分面积最大的试图,重合的部分按照最上层的面积算漏出,会有时间复杂度的要求。
  • 简单地介绍的过往的项目经验
  • 控件的点击事件和添加在上边的手势谁先响应,并说明原因
  • 谈 CoreAnimation 和 CoreGraphic 的区别
  • 说 @synchronized 锁的实现原理,并说明其中可能存在的问题。同时介绍了 iOS 开发中常见的锁。
  • 介绍编译的过程和原理
  • 谈对于 bitcode 的理解和作用。
  • 详细的介绍了 Https 的过程。

二面

  • 介绍属性常用修饰符,介绍 assign 和 weak 之间的区别。这块会延伸到内存管理相关,比如引用计数的方式。
  • 聊对于 GCD 的理解,和 GCD 底层是如何进行线程调度的。聊 GCD 中常见方法的使用 (group ,信号量 ,barrier 等)
  • 详细的介绍了 KVC 和 KVO 的原理。
  • 介绍消息转发过程
  • 介绍对于 Runloop 并介绍知道的应用场景。再具体场景中会有追问。
  • 介绍项目优化的经验,这一块会聊的比较细。
  • 介绍对于静态库和动态库的理解。
  • 在 webview 使用过程中存在的问题和解决方案。

三面

  • 介绍了过往 RN 的使用经验和对于 Flutter 的理解。
  • 谈对于组件化的理解和市面上常见的组件化方案
  • 问了一些 APM 向上的问题。
  • 谈个人对于项目架构选择的理解。自己如何进行架构的选择(主要对于 MVVM,MVC等,后文有个人对于这一块的理解)
  • 谈个人规划

滴滴

一面

滴滴的一面分为两部分。

  • 第一部分:过往项目经验,会对自己的过往项目经验,结合自己的描述,面试官问你介绍到的项目中涉及到问题,然后会据此引申出一些问题,这一部分占比比较大。
  • 第二部分是基础知识面
  • 谈属性修饰符,如果 assign 修饰对象可能存在的问题和原因。
  • 比较的深入的聊了内存管理的内容,包含引用计数和 weak 修饰的对象的内存管理的过程。问的会比较深入。
  • 讲 runloop 的过往使用经验。
  • 介绍自己比较熟悉的三方库的实现原理

二面

  • 对于锁的理解(自旋锁和互斥锁),以及 iOS 开发中常见的锁。同时要求介绍个人在开发过程中在哪些场景下用到过锁。
  • 在实际开发中遇到过哪些多线程问题以及如何进行解决的。
  • 为什么不能在异步线程中更新页面,介绍原因。
  • 对于内存泄漏的了解,以及介绍知道的解决方案。
  • 一些优化向上的问题,主要是根据自己介绍的优化进行较为深入的追问。
  • 一个坦克从一个空间的起点到终点,中间在某些位置上有阻隔的情况下,判断从起点到终点是否有可行路径的算法题。

三面

  • 比较详细的介绍之前的项目经验和主要负责的内容
  • 介绍过往项目中最有挑战的事情,并会据此深入的聊。
  • 介绍了一些架构向的理解
  • 谈个人规划

快手

快手的一面是跨部门面试,二面是本部门面,所以一二面面试题会有一些重复,只写了一次。

一面

  • 介绍过往的项目经验
  • 两个不算难的算法题(具体的忘记了...)
  • 聊了 assign 修饰对象可能存在的问题
  • 聊过往项目中的优化经验
  • 介绍消息转发流程

二面

  • 比较详细的聊到的 block,深入的讲了其中的实现原理,并介绍不同变量的引用方式。
  • 介绍开发中常见的循环引用,并说明其中的原因和解决的方案和原理。
  • 介绍 Runloop 并讲应用场景。
  • 二叉树翻转

三面

  • 一道多线程实际场景下的问题,要求远程写出实现方案的代码
  • 聊对于 MVVM,MVC 和 MVP 的理解。
  • 介绍过往项目中 RN 的使用经验和遇到的问题。
  • 讲如何将一张内存极大的图片可以像地图一样的加载出来(只说实现思路)
  • 聊对于组件化的理解,对于市面上的组件化方案的理解,优劣分析等。

其他

除了上边介绍的公司外,还面了平安,51 talk,58 同城,好未来,美篇。

因为绝大部分面试内容和上边的基本上只是重复,只对差异性的面试题进行了总结。

  • 对图像编解码的了解
  • 在子线程中是如何进行内存管理的
  • JSBridge 是如何实现的,以及和原生的调用关系。
  • 问到了一些 AFNetworking 和 SDWebImage 相关的实际开发中的问题。

iOS 的一些面试准备

上边聊完了面试过程中遇到的面试题,下边聊聊自己在面试之前的一些准备工作。

其实这次跳槽对于个人而言是很早之前就有准备了的,所以疫情对于我的影响并不是很大。此外想突出强调的是 iOS 面试中的基础知识在于日常的积累和总结,单纯的靠面试前的短期准备个人感觉是不够的。

下边根据上边的面试题和之前个人的面试准备,对整个面试过程做了一次梳理。

1.算法

《剑指 offer》 半个多月的时间用 Swift 敲了一遍,然后用 OC 手写了一遍。

之前断断续续刷了 LeetCode 上 Medium 和 Easy 的题有 150+

对于国内的小伙伴,基本上客户端面试涉及到的算法知识是足够覆盖的了。当然快手的三面算法题还是被虐了...

拼多多

拼多多应该是自己面的一个相对较大的公司,面试过程中和面试官有了点小分歧,后面问我源码在哪个文件哪一行,后面问得问题也基本上是我之前没怎么接触过的。

一面

  • 算法: 手写LFU(用字典写了二十多分钟,面试官让优化只知道可以用双链表优化,但是集体没能写出来)
  • 一个操作如果耗时5s后返回nil,否则返回一个字符串,你怎么设计(要求手写代码)
  • GCD中常见的操作(要求写代码)
  • Struct中有一些成员变量占多少字节
  • 一个OC对象在iOS中所占内存的字节数(这边和面试官争了下,我说是iOS中至少16个字节,因为内存对齐,面试官问你确定我说我确定,然后就有了后面的问题)
  • 你看过alloc的源码么,你刚刚说的代码是在哪个文件哪一行
  • dealloc的整个过程
  • NSURLSession相关的内容(具体忘了)
  • web和native怎么共享cookie
  • xx(前司)有动态库打包么,你看过xx ipa(前司app)的结构么
  • 内联函数和普通函数的区别
  • 怎么hook一个C函数
  • 有什么想问的么

百度

百度问得和iOS相关的较少,CS基础相对较多。

一面

  • 聊项目:主要问了项目的技术栈选择,以及项目中有哪些难点
  • http header 和 body
  • GET和POST请求
  • GET请求参数一定是放在URL中的么
  • HTTPS (TLS是啥,怎么建立连接等)
  • 动态库和静态库的区别
  • +load 和 initialized方法的区别
  • +load的调用时机
  • +load分类中的处理
  • 分类的实现机制
  • 分类和类别的区别
  • 分类中添加属性
  • 关联对象的原理
  • 算法:有一个很大的整形数据,转成二进制求1的个数(因为前面聊比较多,只要求说了下思路)

二面

  • 聊项目:自己项目偏后端,问了很多和后端相关的内容,后续问的问题也基本上要求从客户端和后端双重角度回答
  • 你了解的网络协议
  • HTTP和TCP、UDP的联系
  • HTTP和HTTPS的区别
  • HTTPS的原理
  • 在HTTPS建立连接的时候都用了哪些加密算法,为什么要这么设计
  • 常见的加密算法
  • 对称加密算法和非对称加密算法的区别
  • 说说点击一个按钮后打开一个web页面从发送网络请求到页面展示都做了啥
  • 为什么能通过一个URL就能请求到对应的资源(域名解析等)
  • 如果客户端上有个按钮,点击会触发一次网络请求,在短时间内快速点击,怎么处理(从客户端以及服务端角度思考)
  • 知道什么是HTTPDNS么
  • GET请求和POST的区别,POST请求参数能放在URL中么为啥
  • 你了解的HTTP请求响应状态码
  • 说说为什么要设计304这个状态码
  • Web登录时怎么保持会话状态的
  • 你知道cookie和session的区别么
  • 你知道常见的网络攻击么
  • 什么是中间人攻击原理,怎么预防
  • 平常用过抓包工具么,说说抓包的原理
  • 如果让你设计一个HTTPS抓包你回怎么设计
  • 进程和线程的区别是啥
  • 进程的通信机制
  • 进程A和进程B通过管道通信的话是在同一个管道么
  • 多线程容易出现的问题,怎么解决
  • 死锁产生的条件以及对应的解决方案
  • 自旋锁和互斥锁的却别
  • 什么是虚拟内存,虚拟内存和物理内存的关系和区别
  • 行间的换页算法有哪些
  • LRU、LFU
  • 继续问项目,为啥要做这些东西,碰到了什么难点
  • 你觉得你的优势和缺点是啥
  • 自己的未来规划
  • 还有什么想问的么

三面

  • 百度三面中主要问的和职业规划相关的内容,没有太多的参考价值,这边不再叙述

腾讯

因为一开始是在音乐的流程里,约面时间相对较晚,pcg那边想和我先聊下,然后再做选择,于是腾讯面了腾讯音乐和PCG两个部门

PCG

pcg在音乐之前面,面完一面后说一面过了,但是因为流程在音乐,所以让我选择一个流程走,我选了音乐,后来音乐挂了后没有好意思去舔回来。

一面

  • 聊项目
  • category的实现原理
  • weak的实现原理
  • 开发中遇到的crash
  • 怎么处理这些crash的,有什么好的解决方案么
  • 循环引用问题,怎么解决
  • NSTimer相关,和runLoop的关系
  • NSTimer、CADisplayLink以及GCD Timer的对比
  • 算法:求N!

腾讯音乐

腾讯音乐感觉业务不是很多口,感觉面试官不知道问我什么好,一面后就没有后续了。

一面

  • 前面聊项目:背景收益等
  • 想看机会的原因
  • RN是这么做到和native通信的
  • 如果让你实现RN的效果你会怎么设计(这个问题看你功底了)
  • Native是怎么将方法暴露出去的
  • 需求中的难点,你是怎么解决的
  • A调用了B方法都做了什么事情
  • ISA指针
  • 64位后怎么获取ISA指针
  • runloop、runtime工作中有接触过嘛
  • 手指触摸屏幕后系统都做了哪些事情
  • 怎么监听页面的卡顿
  • 怎么监听函数执行时间
  • 还有什么想问的么

微博

微博有点迷,感觉面试官就是对着题库问问题,感觉自己回答还OK,但是一面后不了了之了。

一面

  • 基本上都是一些iOS的基础,和本文面经提到的高度重复,不再叙述。

Bigo

Bigo整个流程推进很快,一面二面都在当天完成,但是bigo三面后挂了,有点迷,我猜测是因为二面的算法题没有给出最优解。

一面

  • 算法(三道手写)
    • 字符串转整形
    • 反转链表(递归和非递归)
    • 将两个有序链表合并成一个有序链表
  • iOS基础:
    • Objective-C的内存管理
    • ARC和MRC的区别
    • Timer的使用,怎么避免循环引用
    • autoreleasePool的底层实现机制
    • autoreleasePool的底层数据结构,为什么要这么设计
    • iOS中常见的多线程技术
    • 常见的锁,有什么区别
    • 如果让你设计读写锁,你怎么设计
  • RN、flutter、weex:
    • 你怎么看待这些动态化技术
    • RN、flutter以及weex的区别
    • RN怎么和native通信的
  • 后面简单聊了下未来的规划

二面

  • 算法: 山脉数组找目标值(要求logN的时间复杂度)
  • QA发现了一个按钮无法响应点击事件,可能是什么原因导致的(说了五种情况好像没有答到面试官要的点)
  • iOS响应者链,怎么寻找最合适的响应者,如果为nil会怎么办
  • frame和bounds的区别
  • 如果bounds的origin不是00会怎样
  • 你平常用过Charles么,说说Charles的抓包原理
  • Charles能抓HTTPS么,怎么实现
  • HTTPS怎么建立连接的
  • 中间人攻击,怎么避免
  • 多线程一般会有什么问题,请举个例子
  • 为什么会造成上述问题以及解决方案
  • 主队列和主线程的关系
  • 全局并发队列一定在主线程上运行的么
  • 项目相关,用了什么技术,有哪些难点,怎么处理的

三面

  • 自我介绍
  • 为啥想看机会
  • 聊了下项目
  • 怎么看待RN、Flutter
  • 平常有看过什么技术书籍吗
  • 有看过开源框架吗
  • 工作中遇到最难的事情后面是怎么解决的
  • 有什么想问的么

贝壳找房

贝壳找房也感觉有点迷,和面试官感觉聊很不错,问得问题都很开放,很考验功底,最后还问我你感觉你过了么。但是一面后就没有然后了。

一面

  • 自我介绍
  • 聊项目
  • GCD 看你能说些啥
  • Runtime看你能说些啥
  • 内存管理看你能说些啥
  • 几个简单的链表问题(具体忘了)
  • 有什么想问的,以及根据简历给我的一些建议(简历偏向全栈,意思是我工作时间还不是很长,需要有深度,广度相关的可以后续再考虑)