Open ShannonChenCHN opened 7 years ago
时间:2017.10.19
这是 1 年多来第一次出去面试,准备的也比较仓促。 下午过去面试的时候,经过他们的办公区,坐了大约 50 来人,但是很安静,可能正好是午休时间吧。
面试官的是他们的 2 个 iOS 开发(简书的 iOS 客户端就是他们俩负责开发和维护的),技术面时 HR 也在场旁听。
图文快照部分
回顾:大概讲了下功能和主要实现逻辑,其实答的不是很好,没有先理清楚再讲,最关键的地方也没讲到,里面既涉及到各个技术细节和优化点,还有架构方面的设计。面试官问的也不是很多,然后马上就换另外一个问题了。 总结:下次一定要自己提前模拟一下。包括主要逻辑、涉及的技术点、架构设计,自己比较了解的、自己觉得做得比较好的、而且比较有价值的地方可以突出一下
JS Bridge 的应用
回顾:面试官问的是对
WebViewJavaScriptBridge
的原理是否有了解,有些地方不太记得了,但因为自己仔细读过源码,所以按照大概思路讲了一下,回答的还算可以。然后还问了“除了 JS Bridge 这种方式,还有什么别的方式可以实现 JS 和 Native 的通信?” 我回答说还可以通过借助JavaScriptCore
来实现,他补充了一下WKWebView
中系统提供了WKScriptMessageHandler
协议和WKUserContentController
类可以实现,我补充了一下这个只能在 iOS 8.0 以上才能使用 总结:WebViewJavaScriptBridge
的源码都看过了,但还是有些地方记得不太清了,导致讲的时候断断续续,主要原因还是在于面试前没有复习过。
会员页的架构优化(POP、tableView、网络层的改进)
回顾:面试官就问了下 POP (Protocol Oriented Programming)是什么,然后问对会员页的列表框架做了什么改进,网络层怎么优化的。我大概讲了一下我是怎么做的,然后他们也没追问什么。 总结:对于这块,我还是比较有信心的,因为之前花了不少功夫去想、去调研并实践过的,但是每次一讲话就紧张,感觉讲的也比较急,应该也是因为没有预先演习过的原因,所以一讲起来就找不到节奏。
URL Routes
回顾:只是简单地讲了下怎么用 JLRoute 框架,怎么定协议规则,实际上究竟怎么去设计路由还没搞明白 总结:这部分的技术自己当时也只是简单用了一下,具体也没研究过,也没做过优化,其实应该要么不写,要么面试前自己花时间研究一下
AOP 埋点
回顾:大概简单说了下 Aspects 中用到的 runtime 知识,面试官追问了一下是否读过 Aspects 的源码,但我并没有仔细读过,细节都不太知道 总结:这部分也是没有做好准备,把自己的亮点或者研究说出来
UIWebView 中加载 WebP 图片
回顾:大概讲了下实现的思路,基本上还是讲明白了,但是由于时间隔的比较旧了,所以最后提到的图片解码那部分没说清楚 总结:同样是缺乏准备,所以讲起来不够丰富,不够透彻,另外对于图片处理这方面还是没有理解透,接口返回的图片数据是二进制数据,图片解码后的数据也应该是二进制数据
copy 和 mutableCopy
回顾:这方面由于之前也没复习到,所以也不太理解,凭感觉说的,答得比较乱 总结:复习,复习,复习,而且要理解,不然很快就忘了
属性关键字有哪些,什么时候用?
回顾:这部分基本上都答上来了 总结:其实还可以研究的更底层些
block 相关
回顾:面试官问了两个问题,一个是 block 属性的关键字为什么是 copy,另一个是 block 为什么不能直接修改捕获进来的变量的值。第一个问题答得还行,第二个问题答错了 总结:还是需要复习+理解,block 几乎是面试必问
是否了解过安全相关的问题
回顾:我大概提了下接口加密,其他的也没做过 总结:这个问题其实算是开放性的问题,自己如果平时了解的比较广泛的话,可以好好讲一讲的
时间:2017.10.23
他们的 CTO 叫 Larry,是简书的联合创始人。我是晚上 7 点赶过去的,过去时看到他们公司的人几乎都走了,看来还真是不加班😀。
CTO 问了我几个问题:
最近的项目中做了些什么
回顾:我大概讲了下最近做的会员页、Hybrid 优化和快照功能,他接着问了一下 web view 这方面的问题,中间也穿插了一些随机的问题 总结:感觉自己没有说出什么两点来,仅仅是你问我答的状态
刚开始做 iOS 开发工作时,是怎么上手的?
回顾:一开始改小bug,然后是做一些专题首页,UIWebView 加载 WebP 图片,两个 APP 共享同一设备 ID 这些 总结:正常回答就行了把
曾经遇到过什么线上 bug?
回顾:我大概讲了一下去年做 UIWebView 加载 WebP 图片时没清缓存的问题,后来他也提到这样的问题的确很难被发现,即便是专业的 QA 总结:我也不知道到底怎么答才算好
如何保证程序的质量?
回顾:我简单说了一下,首先是仔细阅读文档、用正确的方式去实现,然后是代码要规范,最后是单元测试。这个我其实也没有提前准备,算是临场发挥了。我自己感觉还行,但是从他的表情来看,并不是很对味 总结:这种问题主要还是靠平时的工作积累和自我要求了
Code Review
回顾:他问我们团队现在做 Code Review 吗?我说看情况,不忙的时候就会做 总结:如实回答应该就行了吧
除了 iOS 之外,还实践过其他技术吗?
回顾:我先问了一下他是指在工作中用的吗,他说是的,我就说曾经在 CI 中加过一段 sed 的脚本 总结:其实我应该不要给自己加限制的,可以讲讲自己学过 React Native,JS/HTML/CSS 。另一方面,自己也确实需要学点其他领域的技术了,比如 h5、后端、Python 爬虫等等。
我问了他几个问题,其中印象比较深的一个问题是: 优秀的程序员应该是什么样的? Larry 的回答是:
- 核心/能力
- 架构
- 语言
- 基础知识:数据结构、算法
- 工作要求
- 超出预期
- 解决问题
- 踏实,持续稳定,专业素养
由于投的是深圳那边的岗位,所以一面是电话面的,结果不出意料地一面就挂了。
一开始就是自我介绍,一开始介绍自己大学毕业后巴拉巴拉,结果被面试官直接打断了,说可以直接说重点😅
自我介绍,前面讲了一些废话,应该尽量压缩
UIWebView 加载 WebP 图片,WKWebView 中可以实现吗?怎么实现?
回顾:先大概说了下我当时是怎么实现的,然后提了一下 WKWebView 可以通过调用私有 API 来实现,具体哪个 API 我记不清了,反正也是注册 protocol 来拦截的 总结:其实面试前应该自己先过一遍的,争取答得更有逻辑性,有亮点才行,比如当时遇到对的最大的难点是什么(好像是 UIWebView 的缓存问题),原理上的理解,WKWebView 的了解
说说你是如何解决跑马灯导致机身发热这个问题的?
回顾:其实这是给自己挖了个坑,因为自己对 profile 工具算不上熟悉,只是用过,我当时就说了下自己解决问题的一个大概过程:同事反映机身发热现象->定位触发场景->发现跟导航栏有关->用 profile 工具找出是哪个函数调用过多地占用了 cpu 总结:思路基本上是讲出来了,但是也还是没讲出闪光点来,比如说说自己对 profile 工具的了解,机身发热和 cpu 有什么关系,为什么会出现这个问题,以后如何避免等等
你是如何解决 UIWebView 加载 h5 出现崩溃的问题的
回顾:大概说一下背景,因为只在 iOS 8.3 的系统上出现了奔溃,所以只针对该版本做了特殊处理——使用WKWebView,但是具体原因是什么,不清楚 总结:这里同样是给自己挖了一个坑,因为都是凭记忆说了自己怎么做的,没有证明出来自己的亮点(牛逼之处)在哪里,还有些原理也没讲出来,做技术的就是要刨根问底,比如,为什么在 iOS 8.3 的系统上会奔溃, WKWebView 比 UIWebView 好在哪里
做过比较难的问题吗?
回顾:说了两点,一是 UIWebView 中针对 WebP 图片加载的处理,另一个是关于视频聊天功能的,给融云 SDK 添加自定义滤镜,谁知道这其实是自己给自己挖了个大坑
总结:以后碰到这种问题,一定要提前做好功课,这种问题几乎是必问的,而且是开放式的,考察的就是解决难题的能力,更是展示自我的机会,所以要讲的话就讲的漂亮些,讲一些自己真正得意的经历,没啥亮点可讲的就不要给自己挖坑了。 什么样的事情算是难得呢?难题就是你和你身边的人,都不是一下解决得了的问题,还以可能是因为以前就一直没人能解决的遗留问题。回顾一下我自己的一些经历,最难的有:
- 美囤妈妈商品详情页 UIWebView 中加载 WebP 图片 ⭐️⭐️⭐️⭐️
- 美囤妈妈专场详情页头图(UIWebView)的高度问题 ⭐️⭐️
- 美囤妈妈 UIWebView 中加载全球购首页(h5)崩溃的问题⭐️⭐️
- 美囤妈妈新版首页框架的实现 ⭐️⭐️⭐️
- OnlyU 网络层的设计 ⭐️⭐️⭐️
- OnlyU 第一版首页动效的设计(半成品)⭐️⭐️⭐️⭐️
- OnlyU 视频聊天匹配逻辑的调试 ⭐️⭐️
- OnlyU 视频聊天滤镜处理(半成品) ⭐️⭐️⭐️⭐️⭐️
- YHOUSE 中 Hybrid 架构优化 ⭐️⭐️⭐️
(接上个问题)说说你是怎么实现视频聊天功能,给融云 SDK 添加自定义滤镜的?
回顾:凭借记忆大概讲了下 yuv420 转 RGB 的过程,流程是讲明白了,但是原理还是云里雾里的,因为当时是在老司机的帮助下才弄出来的 总结:这种自己不太明白的,其实也可以不引出来,不然就是在给自己挖坑
(接上个问题)在做添加滤镜功能时,格式转来转去的,估计效率会比较低,很耗性能,所以你有没有做过什么优化,优化的思路是什么?
回顾:我一开始说,因为项目后来不做了,所以这个功能也就没再继续开发了,然后面试官直接说,“不管后面项目如何,我就问问你自己如果去做优化的话,该怎么做呢”,我只能说,我也不知道咯┑( ̄Д  ̄)┍ 总结:这个问题一方面是考察我对视频处理的了解,另一方面看面试者在平时开发中有没有做过或者去想过性能优化方面的问题
你用过什么调试命令?平时断点是怎么用的?(Xcode 调试工具的使用)
回顾:我只记得 po 命令和 expression 命令,断点的话就讲了下我自己用过的条件断点和 symbolic breakpoint 总结:这其实是考察面试者平时对开发工具的了解,换句话说就看你专不专业了,越是了解开发工具就月有效率
Objective-C 内存管理机制
回顾:我凭记忆说了一下 《Objective-C 高级编程》书上说的那几点 总结:这个纯粹是送分题啊,但是好像说错了,凭记忆是不管用的啊,还是得提前做好准备啊
ARC 和非 ARC 的区别
回顾:我说的是 ARC 下,编译器会在编译时自动插入 retain、release 这些语句,结果面试官说就只有这些吗?。。。。 总结:这种问题我真是不太了解,还是书读得少啊😂
autorelease 的实现了解吗,看过相关的 oc 源码吗?
回顾:我只能说不知道了。。。。。我说我只看过 GNUStep 的源码,结果被面试官反问道,“为什么放着苹果的源码不看,而去看别的源码呢”,不过我确实是没看过苹果的源码😂 总结:以后还是花些功夫研究些底层实现吧。。。
从底层讲讲系统中两条线程抢占资源的问题
回顾:我哪懂什么底层啊,所以我直接说不知道了,面试官就跟我说,“你可以简单说说你自己的理解啊”,然后就跟他扯了在同一个窗口买火车票的问题,结果不出意料地又被鄙视了😂 总结:还是准备的不够啊,基础知识也了解的不够,多少也要说些有料的东西来啊,以后还是要自己补补课了
(接上个问题)iOS 中提供了哪些方案可以解决这个问题
回顾:我列举了一下 NSLock、GCD、@sychronize,面试官接着问 @sychronize 是怎么实现的,知道吗?我直接一脸懵逼。。。。。 总结:其实跟前面是一样的 problem -->基础知识欠缺了解+底层原理欠缺了解+复习不到位
时间:2018.01.11
自我介绍
技术问题
项目经历 居然没问,自我发挥的空间都木有了 😅
时间:2018.01.22
一共 30 min
时间:2018.03.21
总结: 感觉计算机基础(网络、计算机系统、计算机组成原理、算法和数据结构)还是差了点,项目经历亮点、难点没有体现出来,iOS 基础算是刚过线。
booking 的面试是典型的外企面试风格,考算法,对英文水平要求较高,整体流程比较规范(其实也是个缺点,个人觉得流程有些过于冗长了),HR 相当专业,每次面试前都会有很详细的建议,面试完也会有详细的反馈(这个必须点赞)。
booking 的面试流程如下:
比想象中的要简单,不像一般公司问的那么细,主要还是偏向项目实践方面的。
一面是 iOS 组长,主要是围绕简历问了项目经历,APM、性能优化、热修复、埋点相关的。
印象比较深的是,当时面试官问我们用的啥工具来检测内存泄漏,我说是微信读书团队开源的 MLeaksFinder,他接着问我知道它的实现原理吗,MLeaksFinder 的原理之前了解过,但是没看过源码,所以当时就想不起来了。
二面是整个大前端的老大,主要也是围绕简历问了项目经历,看了下我的 GitHub 和博客,后来让我讲一下自己对于 MVC、MVP、MVVM 的理解,我在黑板上边写边吹了几分钟,最后扯到我自认为的亮点上来了——YHListKit,这招确实让面试官很买账😉。
接着又问了一个关于设计模式的实际应用的问题,反正我是不敢说单例模式,就举了个类簇模式的例子。
最后一个是关于算法的问题:说出几个常用的排序算法,以及它们的时间复杂度。
哒哒的面试效率很高,我说下午还有面试,他们的面试官和 CTO 特地安排中午就面完,当天就发了 offer。这里还是要感谢一下包哥的推荐🤝。
主要问的两个方面:
因为 iOS 组长不在,所以他们的 CTO 就直接终面了,大概闲聊了下,后面讨论了几个技术细节:
主要是问了一些 iOS 相关的基础知识:
setAssociatedObject
这个函数的几个参数分别是什么(第二个参数把我搞迷糊了)
面试前必读
面试问题汇总
2020~2021年 iOS 面经