一个人经历过一年,甚至更久的工作之后,总会经历大大小小的事情。每一次面试之前的总结,不光是为了面试,更是为了让你在跳槽之前认清自己,并且清楚自己所需要的提升到底在哪,这才是跳槽真正的意义所在。

  很多人跳槽都是盲目的,并且每次跳槽之后都感觉不是很满意。其实有一个很重要的原因,就是你没有在面试之前认真的总结自己,你不了解自己现在到底优势在哪,劣势在哪,你需要弥补哪方面的空缺。以至于在跳槽时,除了薪资待遇以外,很少考虑到自己的职业发展问题。就算考虑了,但是由于没有好好总结自己的经历和技术,也很可能会选择了一个自认为正确但实际上却是错误的方向。
——左潇龙

周一晚上下班时,接到了阿里打来的面试电话,本来之前我还以为简历被刷掉了,所以接到这个电话我还是比较激动的。值得称赞的是,由于当时电话没来得及接被挂掉了,后来我主动打过去,那边的主机自动帮我转接了之前打给我的号码,而不是让我自己拨分机号。(给阿里点赞👍)

面试经过

面试官先是让我简单介绍一下自己,包括项目经历,然后就问我做过的项目中有哪些有代表性的经历,接着简单浏览了一下我的博客,问了一下 SDWebImage 实现原理和性能优化相关的问题,以及年终总结,最后问了一些 iOS 相关的知识点。

尽管过去好几天了,但是自己当时慌慌张张、大脑一片空白的感觉,现在依然记得很清楚,虽然相比上次面试腾讯的经历,稍微好那么一丢丢,但是依然觉得自己好像还缺点底气。

反思

通过这两次受虐,我自己也深刻反思了一下,发现了自己现在存在的一些问题:

  1. 缺乏足够的准备,导致面试过程中非常紧张,半天想不起来要说什么,甚至出现了退缩心理。为什么会底气不足,极度紧张呢?就是因为没有提前做好准备,人对于未知事物的恐惧是本能的。
  2. 缺乏面试经验,不知道随机应变,不知道以什么心态去面对。
  3. 平时学习和实践的方向不够清晰,或者说没有在面试前好好总结梳理,导致在面试时没有闪光点可讲。我以为 Github 和博客是最重要的,其实这些只是加分项,只是一种表现形式。真正重要的是我们所具有的能力和经历,以及面试时如何把这些能力表现出来。

亡羊补牢,为时不晚

1. 了解目标公司、团队、职位

首先要做的就是了解潜在的目标公司、团队,了解外界,对外交流,知道自己想要去的公司、团队的要求是什么样的,知道自己跟他们的差距在哪里。比如说要去饿了么和阿里,也许我们就要对架构、Hybrid、weex/React Native、JavaScriptCore、组件化、性能优化等等非常了解。

现在 iOS 还有人要吗?最近看了韩帅写的面经,他说:

现在大公司 iOS 空位很多,如果你有两年以上(没有水分的)开发经验,抓住机遇,好好准备,跳大公司问题不大。

其实,我自己也收到了阿里、腾讯的面试机会,甚至还比较轻松地拿到了一个其他厂的 offer,这说明 iOS 的岗位需求还是有不少机会的,但是要求都比较高,所以求职者多的话,就要看谁能突围了。

去哪里找机会呢?在微博上会经常看到一些大佬会转发招聘信息,平时也可以留意一下,另外,找认识的朋友内推,也是一条不错的路子。对于想进大厂的同学,Enum 有个建议特别好:

想进大厂,肯定是要向大厂的同行们取取经的。他们最近在做什么,会什么,看过什么书,啥时候招人,能不能内推等等。这些信息能像灯塔一般给你指出一条明路。

2. 了解面试流程

然后就是面试流程,不同公司的面试流程不太一样,但也差不了太多,大部分公司的面试流程都是这样的:

1
2
3
4
5
6
投递简历 --> 电面、技术面(多轮) --> HR 面
||
\/
------------------------------------------
| 自我介绍 -> 项目经历 -> 技术问题 -> 面试者提问 |
------------------------------------------

我们只需要把可能出现的环节都考虑到就行了,比如压力测试、白板编程、电面突袭、现场要你解决一个问题或者实现一个功能等等。另外还可以请教一些大牛,面试时要注意什么。

关于 IT 面试的要点,其实《剑指 Offer》这本书中已经讲的很详细了。

3. 准备简历

个人觉得比较重要的几点(主要是参考了 Enum 的建议和韩帅的简历):

  • 简洁大方就好,排版不要太乱,一些无关紧要的东西就不要写了。(感觉自己的简历排版有点乱,项目经历和工作经历其实可以分开来写)
  • 简历里的每一条内容都要做好被问的准备,但是不要写太多,内容控制在两页以内。(我写的有点多了,看起来太杂,面试官和 HR 看了后估计也会“疲劳”,不知道突出点在哪)
  • 项目经历要有亮点,也就是解决过什么难点和痛点,做过什么改进优化和创新,少写没营养的东西。(感觉这点自己并没有梳理好,写明白,可以再改改)
  • 用词尽量谦虚一点,精通最好不要乱用。
  • 准备一个杀手锏。从现在开始,准备一个细分领域做一点点深入的研究,比如优化,Hybrid,架构等,到时把它写上。如果面试官有兴趣,你又能说得出内容来,胜出的概率就很大了。(我自己对架构这块比较感兴趣,但经验还不够,对 Hybrid 和列表接触得多,还有音视频也接触过几次,到底选哪个方向,其实我自己也一直在纠结😅)

4. 模拟面试

说到模拟面试,也就是拿着自己的简历问自己(也可以找个朋友帮忙),列出所有可能会被问到的问题,不断练习,找自己的不足,直到真正熟悉了所有的问题和答案,等到真正面试时心里也就有底了。

考前模拟这个方法其实我们已经用过很多遍了,比如在高考和考驾照时都用过,记得当时考驾照时,教练还让我们把考试时要做的每一步都写下来,然后再记下来在脑海中不断回想。

除了技术之外,有些面试官可能还会问一些工作经历、职业规划、平时如何学习这类开放性的问题。另外,还有算法题平时也要练习一下。

一般在面试结束后,很多面试官会问我们有什么要问的,这个也可以提前想好。还有 HR 面时可能会聊到的问题,都要提前预演一下。

关于技术面的一些技巧

  • 面试绝不仅仅是面试官问我来答,还要主动展现自己,主动回答问题,主动引导方向。你自己都不知道自己擅长是什么,难道还要面试官来帮你找吗。
  • 自我介绍时能主动说出自己的亮点,也就是能给自己加分的,能让面试官感兴趣的,其实这跟第一点的目标是一致的。
  • 面试项目经历时,也是一定要把自己的亮点讲出来,可以说一些“装逼”的词,但装逼必须得有真材实料,要提前做好功课,要知道 What、How、Why,以及自己的一点思考。大公司面试最喜欢刨根问底和问性能优化这方面的问题了。
  • 最重要的一点是,一定要把面试官往你熟悉的领域引导,这真的很重要,因为如果你不引导,面试官不了解你的项目,看不到你的亮点,就只能一直问技术问题刁难你,人家在大公司待这么久了,还不是轻松碾压你。所以你在引导的同时,时不时提及一些事先准备好的关键词,技术官一问,你马上能回答得上来。
  • 面试时身边最好随身带上纸和笔,手机安装好要演示的 APP。

记得阿里面试官在问我关于 SDWebImage 的源码时,就直接指出“你说的这些靠的是背,而不是靠理解和思考”。这让我想起了有一次在『得到』上听过的一篇文章,讲的是“六经注我”读书法,读书分为四种境界。最低的境界是我们大多数人所做的,读什么书都是学习的态度,见山是山,见水是水,我就是这种境界😅。而最高的境界是,读之前就有自己的目标,读的时候把别人的知识拆解消化掉,最后重组改装,为我所用,自成体系。

5. 系统复习、工作积累

技术面考察的是基本功和工作积累,包括深度和广度两个方面。所以我们需要要做两方面的准备,一方面是粗粒度地完善知识体系,查漏补缺,另一方面是结合工作、学习实践,深入研究一个方向。

5.1 知识体系
  • 计算机基础知识
    • 操作系统
    • 算法和数据结构*
    • 计算机网络*
    • C 语言
  • iOS
    • Objective-C*
      • 内存管理
      • Runtime
      • block
      • category
      • 对象拷贝
      • KVC、KVO
    • Swift(可选)
    • 多线程、Runloop*
    • 网络*
    • 事件传递和响应机制*
    • Hybrid*
    • 架构设计、组件化*
    • 性能优化*
    • 调试*
    • 开源项目源码的实现原理(主要是自己常用的)
      • AFNetworking
      • SDWebImage
      • Mantle
      • WebViewJavaScriptBridge
    • 动画、绘图、音视频等
    • 其他
      • 函数响应式编程
      • React Native

5.2 书单

把看过的重新复习一遍,书上的东西肯定不是一次就能全部吸收的,很多东西看过就忘记了。而且,有句老话说得好,“好书常读常新”。所以,在面试前要全部重新复习一遍,加深印象。

  • 《Effective Objective-C 2.0》
  • 《Objective-C 高级编程》
  • 《Objective-C编程之道:iOS设计模式解析》
  • 《剑指Offer》
  • 《程序员的自我修养》
  • 《图解HTTP》
  • 《网络是怎样连接的》
  • 《iOS Core Animation Advanced Techniques》

5.3 平时的积累

  • 保持好奇心,养成精益求精的好习惯。
  • 在一个适合思考的时刻(比如下班路上),去思考和总结自己所经历的过去以及所掌握的技术,要总结到精髓,并且挖掘出自己至少一个亮点。
  • 保持良好的代码风格。
  • 在 Github 上开源一些不错的轮子,参与别人的开源项目。
  • 写一些有质量的博客。

常见问题

Q:如何克服紧张情绪?

A:首先还是要提前做好充分准备,这样到真正面试时会好很多。如果面试时真的很紧张,就告诉自己专心理思路想问题就行了,答不上来或者答错了也没关系,即便失败了也很正常。但是一定要自信,要让面试官看到你的积极性,而不是越说声音越小。就像 Enum 说的那样,“自信,不要怂。面试时候就觉得自己是大神,最坏的结果不就是没过嘛。”

Q:面试官一直追问怎么办?如果遇到自己真答不上来的问题怎么办?

A:看看文末『推荐阅读』中 bestswifter 的那篇文章中的建议。

Q:算法题怎么答?

A:看看文末『推荐阅读』中 bestswifter 的那篇文章中的建议。

Q:面试前到底该不该刷题?

A:适当刷题还是有必要的,但是要明确的是,刷题的目的不是为了背答案,而是考察自己对各方面知识的了解程度。比较推荐的面试题,还是 sunny 和 MrPeak 的那两套。

最后的最后

不管能不能进入理想的公司,我们都应该始终保持一颗积极思考、敢于行动的上进心,每次失败都是成长的机会。时刻准备着,当下一次机会来临时,勇敢地抓住它。

推荐阅读: