前言

本文是给想进入“BAT”等企业的开发朋友们提供思路的,包括了找工作过程中各个环节的技巧和防坑指南,内容全部来自于真实经历。

关于我

大家好,我是十三(化名),iOS 开发工程师。
有些人在毕业的时候就能顺利进入“BAT”、“TMD”、“FLAG”,但是更多的人并没有这个机会,比如我。努力就能改变命运。这是真的吗?
在我看来,虽然我不是特别聪明(但也不笨),但是努力确实给我带来了更多的机会。通过努力,我顺利拿到大厂offer,相信此时正在看这篇文章的你也一定可以的。
所以,无论你是想跳槽去大厂的工作党,还是即将毕业找工作的应届生,如果你想要进大厂却不知从何着手,希望你能将这篇文章反复看几遍,根据本文的内容找到正确且适合自己的方法,努力打磨,然后坚持坚持再坚持,我相信你一定能拿到大厂的offer。

我们都有过的校园经历

我毕业于一所普通的二本院校,大学时曾梦想成为学霸,幻想进入 BAT 大企业。然而,现实啪啪打脸,学渣一名。毕业的第一天,就成为一名待业状态的社会人。
曾经的我就是现实版的“余欢水”:“努力”地活着,却总是被生活“欺骗”。
上大学时,兴趣广泛,但叶公好龙,无一擅长;
我想要成为学霸、有所成就,但好高骛远,无所作为;
毕业那年考研,顺利落榜;
后来痛定思痛,背水一战,参加公务员考试,意外通过笔试,却惜败在面试。
那一年,我深刻地感受到 世界那么大,却没有我的容身之处。

初入职场

迫于生活压力,在亲戚的介绍下,我进入深圳的一家创业公司做 iOS 开发。由于我技术比较菜,工资只有 5k。当时我连 UITableView **的代理方法都不会用,UIView 的 frame 都不会设置**,每次参加需求讨论会的时候,都插不进话,因为我都不是很懂啊。
实在要发言时,却也只能附和安卓的同事,说:俺也一样。

如果连最简单的业务需求都不能完成,是要被开的,所以当时的我就是处于被开的边缘。迫于工作压力,我必须花额外的时间把基础知识都弄懂。
但是,因为虚荣心作祟,我又不想被同事说我太菜,所以每天选择在同事们下班后,一个人在公司疯狂学习。

如果别人正点下班,我就“996”;
如果别人"996",我就"好像也只能996"。

功夫不负有心人,三个月左右,我就能胜任独立模块的开发了。为了向进阶发展,我看完了《Effective Objective-C》、《Core Animations》等当年市面上所有的 iOS 书籍和相关公众号的技术文章,并及时地把一些高级技巧在项目中实践。
由于在公司表现良好(可能是加班比较多😂),领导给我涨薪到 8k。但是我觉得当时我的水平最起码能够得上 12k 以上。在这家公司干满一年后,我决定跳槽了。那年是 2015 年。

职场进阶

2015 年 iOS 的行情还不错,趁热打铁,我自己投简历面试,很轻松就进入一家 Top 10 的金融互联网公司。
大公司的分工更细,流程更规范,我在这里待了两年,时刻保持一颗学习的心态。在这两年中 iOS 开发的大环境已经出现了拐点,由于开发者数量供大于求,整体上找工作的情况不如之前。为了让自己不掉队,我复制在我在上家公司的成长模式——疯狂学习。
我研究并实践了当时社区比较流行的技术,比如 RAC、RxSwift、逆向开发、音视频等等。但我明白,由于我大学时候基础太差,离去一线互联网大厂的水平还有差距。

加入鹅厂

有一天,我收到猎头的电话,问我是否考虑腾讯?我欣然答应,沉睡在我心中多年的幻想又被唤醒。
然而想进入大厂没那么容易,需要对面试做系统性的准备。我开始利用业余时间夯实面试需要的基础知识,经过大概三个月的准备,通过了五轮面试,终于顺利加入鹅厂!

下面我把准备面试的经验分享给大家(为了尊重公司,我不能把原题告诉大家,但我会把方向告诉大家,因为方向里自然有“题库”),分为基本功、软实力、加分项三个方面。下面一个个来说。

基本功

所谓基本功,就是你需要练到有肌肉记忆的技能,当面试官问起的时候,你能够信手拈来。

简历基本功

简历的好坏决定第一印象。
很多人可能技术很牛逼,却没能获得面试机会,就是吃在简历的亏上。比如,错别字连天、排版混乱、语句冗余不通顺。下面是我总结出的要点:
关于简历里放不放照片的争论,从来就没停过。虽然程序员不是靠脸吃饭,但我还倾向于放照片。
通常我在看简历的时候,如果看到一个小伙子的照片很精神,我可能就会想:他写的代码八成会很整洁吧。
没错,照片是别人对你的第一印象,正常人都喜欢美的东西,一张让人看着舒服、甚至是眼前一亮的照片,能增加别人对你的好感。
所以我个人建议,只要你长得对得起观众,就可以在简历里放照片,可以适当美颜一下,但是别搞成了“照骗”。

简历模板

简历模板简约大方就行了。我看过那么多简历里,有些简历太花哨了,有的还配了夸张的封面,这种简历刚打开就想赶紧关上。
求职者初衷是想让自己的简历更好看,和其他简历与众不同,但是有时候炫过了头,就变成 zuo 了。尤其是新人,容易在这方面发力过猛。
如果想找不到工作,就用下图这种试试。

基本信息

个人基本信息,就是姓名、学历、邮箱、电话等,这部分正常写就好了,我只提醒大家别漏了以下几个面试官眼中的加分项。
一般人只在个人信息里写学历,不写毕业院校。如果你的学校名气大,你可以在这部分写上毕业院校。
如果你有一个和岗位相关的的博客、Github、公众号,别犹豫,也写在这里,能显得你爱学习、爱总结分享。
再说一个技巧,拿公众号举个例子,如果你比较高产,在写了公众号名称之后,加一句说明,例如:50 篇原创技术文章。别小看这句说明,能锦上添花。

自我评价

自我评价一定要花时间认真写!
这是对你自己的一个全方位的说明,既是重新认识自己,又可以让对方知道你的长处、目标、价值观。而且你也不白写,以后面试过程中的自我介绍也能用得上。
我看到大部分的自我评价基本是这样“为人吃苦耐劳,责任心强,工作踏实努力,学习能力强,有团队合作精神……balabalabala”。
哎,我真怀疑这是在网上搜了搜,然后把这些词又组合了一遍。看这种文字真是提不起兴趣,没啥说服力,谁都会这么写。你就不能多来点例子、数字?

书写逻辑

请遵循“STAR”法则。即情境(situation)、任务(task)、行动(action)、结果(result)。
比如,“为解决项目中遗留的回调地狱和内存问题,我用了 RxSwift 重构了 XX 模块,在团队内普及了响应式编程思想,受到了团队成员的一致好评”。这通常也是面试官提问的逻辑。
内容
请你一定要熟悉简历中写过的内容。因为面试官的面试思路无非有两种。
第一,顺着你的简历问;
第二,根据他自己的思路来问。
如果你遇到的是第一种,面试官问到你在简历上的内容你却卡壳了,那真的是非常尴尬,面试官很可能怀疑你的简历不太真实。
如果你遇到的是第二种,那么你简历上的内容也会给面试官心理暗示,那么接下来的问题很有可能是你简历上知识点的发散。
比如,面试官看你写了 RxSwift 的经验,很可能会问你 RAC、Promise、FRP 相关的问题。
所以,你可以按照这个套路,写好简历后,仔细对照每一条内容,自己对自己发问。
基本数据结构和算法
这是我惧怕的知识点,虽然我是科班出身,由于基础太差(当时连链表都忘记了是啥),没办法,要想进大厂,只能硬着头皮来啃这些基本功。我当时用的学习资料是《数据结构与算法之美》。
我分为数据结构和算法两个方面分别来学,因为数据结构是解答算法题的基础。

基本数据结构

重点掌握数组、链表、二叉树。
比如,你是否能在三分钟之内手写出一种二叉树非递归遍历?
在刚开始复习时,我连二叉树的递归遍历都要想很久才能写出来,更别说非递归的形式了。经过自己努力复习训练后,我能在一分钟内写出二叉树前序遍历的非递归形式了(swift语言):

var stack = []
var resut = []
func inOrder(_ root: TreeNode?) {
    cur = root
    while !stack.isEmpty || cur {
        while cur != nil {
            result.append(cur.val)
            stack.append(cur)
            cur = cur.left
        }
        if !stack.isEmpty {
            cur = stack.popLast()
            cur = cur.right
        }
    }
}

如果你也遇到同样的情况,请先冷静下来,仔细分析原因,咱们对症下药。
是思路没理解?
还是 API 忘记了?
或是知道思路,代码写不出来?
分析完原因之后,对症下药:
思路没理解,就去看基础直到搞懂为止;
API 忘记了就去看文档,记在你深深的脑海里;
有思路写不出来,说明平时代码敲少了,平时练习时,无论多简单的知识点也一定要务实地敲出来。

基本算法

DFS、BFS、排序、二分查找、递归、动态规划。很多大神在分享经验时,都会说考察的算法题不难,站在他们的角度上确实是这样的。
但是对于我这种学渣而言,翻越算法这座大山就难于上青天了。记得第一次在 Leetcode 上做一道 Easy 难度的算法题时,我连题目都读不懂😂。
然而,在定向持续努力,被题目虐了千百遍后,我也渐渐掌握了套路,成为了 100 道题量的选手。
套路就在于: 一道题如果审题之后,思考了五分钟都没有思路,就直接看答案,看懂答案后,根据自己的理解敲出来直到 Accepted。接着,在之后的五天里,每天把这道题的解法都敲一遍,坚持下去后,你会发现算法题就是“无他,唯手熟尔”。
做题的顺序,我是在 Leetcode 中的“探索”板块选择卡片进行训练。依次做完初级、中级、高级的题目。

如果时间充裕,可以对你的弱项进行针对性训练,比如你对“树”很陌生,你就直接找“树”的卡片,进行训练。

计算机网络基础

TCP/IP 模型、HTTPS 原理、DNS 原理等等。
这些原理不需要死记硬背,只需要你能通过具体的案例来说明这些原理的流程和步骤。
比如在浏览器中访问一个 HTTPS 协议地址的 URL 背后的逻辑。
推荐资料:《图解TCP/IP》、罗剑锋老师的《透视HTTP协议》、刘超老师的《趣谈网络协议》。
客户端开发的基础知识
客户端开发的基础知识: Runtime、Runloop、常用框架、响应链、多线程、Block等等。
这些知识点的掌握程度要达到 “Why” 的程度。
你可以对着 iOS 开发中的基础知识点,按照“What-How-Why”的思路,对自己发起灵魂拷问。比如,

KVO面试题"三连":

KVO 是什么?你一般在项目中如何使用?
它的底层原理是怎样的或者你如何自己设计一套 KVO 的机制?
网上随便一搜就有很多面试题比如牛客网,你可以自测一下。

现在 iOS 开发者的环境已经非常内卷化了,很多面试中用“偏题怪题”来淘汰一部分人,这些题的答案多半是一些验证性的结论,重点考察你的"记忆力"😂:

不用怕,这些题是有套路的。它们多半来自 iOS 技术社区的最新文章或者最新术语,只要你多读文章,多做积累,一定难不倒你。
比如,有一道面试题问,什么是 Functor 和 Monad ?
如果你看过 Swift 烧脑体操(五)- Monad,这道题就会迎刃而解。
所以,平时你在阅读技术文章时,如果遇到比较新鲜的概念或者术语,一定要留心了,说不定就是你将来的面试题。类似这样的题还有很多。
戴老师的课更像一个导论,每一节的内容你都可以挖掘到一定深度,很多面试官也是这些课的忠实读者,有的面试官就直接把“无侵入的埋点方案如何实现?”作为面试题,这道题来自“高手课”的第 9 节。

软实力

3 沟通能力

我用四个词来概括:自信、流畅、耐心、礼貌。
很多小伙伴可能编码技能不错,却不能在面试中表达出来。
在面试过程中,无论面试环境怎样,面试官态度如何,你都要保持积极的态度。请记住,你是在求职,就要创造一切对你有利的因素。
比如,你可以与面试官主动握手,增加好感。
如果面试官问你的问题,你刚好不会,也要尽可能列举这个问题相关的概念,然后推测出这个问题的答案。
比如,面试官问,二进制重排的原理是什么?
假设你刚好不知道这个知识点,你可以答 App 启动前 dyld 相关的概念或者说一下 Mach-O 二进制格式的原理,来推测可能的二进制的重排机制,即使推测错了也没有关系,因为在这个过程中至少展示了你积极解决问题的能力。
当然,如果连相关概念也想不出来,那就诚实地回答不知道或者向面试官请教一下吧。

逆商能力

作为开发人员,难免会在工作中与各种人撕B,能够扛过这些压力,也是一项重要的素质。
比如,面试官问,你的学历背景一般,学校排名靠后,和211、985的毕业生竞争有什么优势?
那你要怎么作答?
如果你是一个心理素质不好的面试者,很可能就会支支吾吾或者愤而离场了。
相反,你应该不卑不亢,冷静作答,因为这恰恰可能是某些面试官看好你的信号。
通过压力面试给你最后的考验,所以千万不要失之交臂。

作答举例:

虽然我的学历不是211、985,但是我仍然通过了前面的技术面试,说明了贵司对我的技术实力的认可;
学历证明了过往的学习能力,我是普通本科,却能与211、985的毕业生同台竞争,说明我的学习能力并不输给他们。

加分项

加分项就是一切能突出你优点的经历,最好是技术相关的。比如,你参加过 ACM 竞赛获得过名次;
曾经造了一个轮子,解决了开发中的痛点,在 github 上发表过;常驻 StackoverFlow 社区,是某个板块儿的资深答主;
有自己的技术博客,常常发表文章,在某一技术方向有一定深度积累,并且博客的订阅量不错。

你还有其他的技术能力 比如

Flutter

音视频

后记

现在很多大公司招人已经明确限制需要 211、985 的学历,而我这种双非二本学历,连敲门砖都木有。但是,我能拿到 offer,是真的很幸运,但是也和我的努力分不开。
如果有什么问题或疑问,欢迎大家在下方留言,一起讨论。
最后,祝愿所有想进入大厂的同学早日如愿!!!

推荐👇:
如果你想一起进阶,不妨添加一下交流群1012951431

面试题资料或者相关学习资料都在群文件中 进群即可下载!