普通二本从小白到加入鹅厂的通关秘籍 | 掘金技术征文

1,633 阅读13分钟

前言

本文是给想进入“BAT”等企业的开发朋友们提供思路的,内容全部来自于真实经历。

关于我

大家好,我是小白(化名),一名 iOS 开发工程师。

有些人在毕业的时候就能顺利进入“BAT”、“TMD”、“FLAG”,但是更多的人并没有这个机会,比如,最典型的——我。

努力就能改变命运。这是真的吗?

在我看来,虽然我不是特别聪明(但也不笨),但是努力确实给我带来了更多的机会。通过努力,我顺利拿到大厂offer,相信此时正在看这篇文章的你也一定可以的。

所以,无论你是想跳槽去大厂的工作党,还是即将毕业找工作的应届生,如果你想要进大厂却不知从何着手,希望你能将这篇文章反复看几遍,根据本文的内容找到正确且适合自己的方法,努力打磨,然后坚持坚持再坚持,我相信你一定能拿到大厂的offer。

颓废的校园经历

我毕业于一所普通的二本院校,大学时曾梦想成为学霸,幻想进入 BAT 大企业。然而,现实啪啪打脸,学渣一名。毕业的第一天,就成为一名待业状态的社会人。

曾经的我就是现实版的“余欢水”:“努力”地活着,却总是被生活“欺骗”

上大学时,兴趣广泛,但叶公好龙,无一擅长; 我想要成为学霸、有所成就,但好高骛远,无所作为; 毕业那年考研,顺利落榜; 后来痛定思痛,背水一战,参加公务员考试,意外通过笔试,却惜败在面试。

那一年,我深刻地感受到 世界辣么大,却没有我的容身之处

初入职场

迫于生活压力,在亲戚的介绍下,我进入深圳的一家创业公司做 iOS 开发。

由于我技术比较菜,工资只有 5k。当时我连 UITableView 的代理方法都不会用,UIView 的 frame 都不会设置,每次参加需求讨论会的时候,都插不进话,因为我都不是很懂啊。

实在要发言时,却也只能附和安卓的同事,说:俺也一样。

如果连最简单的业务需求都不能完成,是要被开的,所以当时的我就是处于被开的边缘。 迫于工作压力,我必须花额外的时间把基础知识都弄懂。

但是,因为虚荣心作祟,我又不想被同事说我太菜,所以每天选择在同事们下班后,一个人在公司疯狂学习。 如果别人正点下班,我就“996”; 如果别人"996",我就"10106"。

功夫不负有心人,三个月左右,我就能胜任独立模块的开发了。为了向进阶发展,我看完了《Effective Objective-C》、《Core Animations》等当年市面上所有的 iOS 书籍和相关公众号的技术文章,并及时地把一些高级技巧在项目中实践。

由于在公司表现良好(可能是加班比较多😂),领导给我涨薪到 8k。但是我觉得当时我的水平最起码能够得上 12k 以上。在这家公司干满一年后,我决定跳槽了。那年是 2015 年。

职场进阶

2015 年 iOS 的行情还不错,趁热打铁,我自己投简历面试,很轻松就进入一家 Top 10 的金融互联网公司。

大公司的分工更细,流程更规范,我在这里待了两年,时刻保持一颗学习的心态。

在这两年中 iOS 开发的大环境已经出现了拐点,由于开发者数量供大于求,整体上找工作的情况不如之前。 为了让自己不掉队,我复制在我在上家公司的成长模式——疯狂学习。

我研究并实践了当时社区比较流行的技术,比如 RAC、RxSwift、逆向开发、组件化等等。但我明白,由于我大学时候基础太差,离去一线互联网大厂的水平还有差距。

加入鹅厂

有一天,我收到猎头的电话,问我是否考虑腾讯?我欣然答应,沉睡在我心中多年的幻想又被唤醒。

然而想进入大厂没那么容易,需要对面试做系统性的准备。

我开始利用业余时间夯实面试需要的基础知识,经过大概三个月的准备,通过了五轮面试,终于顺利加入鹅厂!

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

基本功

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

简历基本功

简历的好坏决定第一印象。

很多人可能技术很牛逼,却没能获得面试机会,就是吃在简历的亏上。比如,错别字连天、排版混乱、语句冗余不通顺。下面是我总结出的要点:

排版

我走的是极简风格,直接使用 Markdown 进行书写,然后转换为 PDF 格式。

作为一个 GUI 开发者,你也可以把简历制作成一个静态页面,加上漂亮的动画效果,来展示你优秀的基本功,给面试官眼前一亮的赶脚。比如,我的一位朋友就是这样制作简历的,当时也顺利地通过了面试。

书写逻辑

请遵循“STAR”法则。即情境(situation)、任务(task)、行动(action)、结果(result)。

比如,“为解决项目中遗留的回调地狱和内存问题,我用了 RxSwift 重构了 XX 模块,在团队内普及了响应式编程思想,受到了团队成员的一致好评”。这通常也是面试官提问的逻辑。

内容

请你一定要熟悉简历中写过的内容。因为面试官的面试思路无非有两种。

第一,顺着你的简历问; 第二,根据他自己的思路来问。

如果你遇到的是第一种,面试官问到你在简历上的内容你却卡壳了,那真的是非常尴尬,面试官很可能怀疑你的简历不太真实。

如果你遇到的是第二种,那么你简历上的内容也会给面试官心理暗示,那么接下来的问题很有可能是你简历上知识点的发散。

比如,面试官看你写了 RxSwift 的经验,很可能会问你 RAC、Promise、FRP 相关的问题。

所以,你可以按照这个套路,写好简历后,仔细对照每一条内容,自己对自己发问。

基本数据结构和算法

这是我惧怕的知识点,虽然我是科班出身,由于基础太差(当时连链表都忘记了是啥),没办法,要想进大厂,只能硬着头皮来啃这些基本功。我当时用的学习资料是王争老师的《数据结构与算法之美》。

我分为数据结构算法两个方面分别来学,因为数据结构是解答算法题的基础。

基本数据结构

重点掌握数组、链表、二叉树。

比如,你是否能在三分钟之内手写出一种二叉树非递归遍历?

在刚开始复习时,我连二叉树的递归遍历都要想很久才能写出来,更别说非递归的形式了。经过自己努力复习训练后,我能在一分钟内写出二叉树前序遍历的非递归形式了:

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,这道题就会迎刃而解。

所以,平时你在阅读技术文章时,如果遇到比较新鲜的概念或者术语,一定要留心了,说不定就是你将来的面试题。类似这样的题还有很多,你可以参考这个题库

推荐资料:戴铭老师的《iOS 开发高手课》。

戴老师的课更像一个导论,每一节的内容你都可以挖掘到一定深度,很多面试官也是这些课的忠实读者,有的面试官就直接把“无侵入的埋点方案如何实现?”作为面试题,这道题来自“高手课”的第 9 节。

软实力

沟通能力

我用四个词来概括: 自信、流畅、耐心、礼貌。

很多小伙伴可能编码技能不错,却不能在面试中表达出来。

在面试过程中,无论面试环境怎样,面试官态度如何,你都要保持积极的态度。请记住,你是在求职,就要创造一切对你有利的因素。

比如,你可以与面试官主动握手,增加好感。

如果面试官问你的问题,你刚好不会,也要尽可能列举这个问题相关的概念,然后推测出这个问题的答案。

比如,面试官问,二进制重排的原理是什么?

假设你刚好不知道这个知识点,你可以答 App 启动前 dyld 相关的概念或者说一下 Mach-O 二进制格式的原理,来推测可能的二进制的重排机制,即使推测错了也没有关系,因为在这个过程中至少展示了你积极解决问题的能力。

当然,如果连相关概念也想不出来,那就诚实地回答不知道或者向面试官请教一下吧。

逆商能力

作为开发人员,难免会在工作中与各种人撕B,能够扛过这些压力,也是一项重要的素质。

比如,面试官问,你的学历背景一般,学校排名靠后,和211、985的毕业生竞争有什么优势?

那你要怎么作答?

如果你是一个心理素质不好的面试者,很可能就会支支吾吾或者愤而离场了。 相反,你应该不卑不亢,冷静作答,因为这恰恰可能是某些面试官看好你的信号。 通过压力面试给你最后的考验,所以千万不要失之交臂。

作答举例:

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

加分项

加分项就是一切能突出你优点的经历,最好是技术相关的。比如,你

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

我技术优势没太多,但是英语还可以,大学考六级时有 600 多分,我把这项写进了简历,也成功引起了面试官的兴趣。

后记

现在很多大公司招人已经明确限制需要 211、985 的学历,而我这种双非二本学历,连敲门砖都木有。但是,我能拿到 offer,是真的很幸运,但是也和我的努力分不开。

如果有什么问题或疑问,欢迎大家在下方留言,一起讨论。

最后,祝愿所有想进入大厂的同学早日如愿!!!