有付出就有回报,写了三千多字的春招面试总结

前言

年后我就开始准备面试了,包括两方面:

  1. 基本的数据结构和算法。从去年11月份开始,我开始有计划性地写 leetcode 算法题,前前后后有刷100多道题目(还有 lintcode 以及刷微博知乎遇到的题目),算是比较慢的了(解题记录 和 Repo)。
  2. 完善个人简历上提到的项目,把想到的坑都补完(比如提到了MySQL,就把MySQL 相关的面试题准备下)。
关于投递渠道

毫无疑问,内推是最靠谱的。除此之外,v2ex 求职版块的资源非常非常好,可能比内推效率更高。一般大公司的技术团队,都会单独发布招人信息,等于是直接走内推渠道。个人感觉,按照靠谱程度排名是这样子的:内推 > v2ex > 官网 > 拉勾等第三方求职网站

面试经历(开始时间排序)

由于硕士阶段学的是非常底层的计算机基础方面的知识,在选择投递岗位上,我没有特别偏好(但不想做太底层)。所以主要投递两个岗位:后端开发工程师(自己更擅长)和前端开发工程师(很早有涉及,在2016年开始关注和了解 React 以及 node.js)。考虑到自己的前端项目经历不够丰富,我花很多时间在复习前端方面的知识,以至于后来面试后端岗位的时候,大部分靠之前积累的知识。

1. 蚂蚁金服支付宝前端工程师(社招、V2EX)

整整用了将近一个月的时间,一共五面,包括最后HR面试(阿里的HR权利比较大),一面应该是以后工作的同事面我的,计划是4道leetcode medium 难度的题目(后来实际给我出了3道题目,加一个简单的问答题)。一开始我根本没看懂题目,题目是让你写一个数据结构来存储给定的 JSON 格式数据,我花了很久联想到之前做过的一题 copy linkedList with random pointer,于是按照那个思路来写,终于写出来了。第二题类似第一题,有点 copy double linkedList 的感觉,但是每个 node 会有head, next, previous pointer,需要逐一解决,比较像 reverse linkedlist。第三题是一道DFS + 回溯的题目,如果一开始没想到这种解法,短时间里很难解出来。一面是我在IDE上写好了代码之后,粘贴给面试官看,我自己写的时候非常紧张,还好面试官没有给我太大压力,中途我虽然写题目,但是中间一直在和面试官讨论思路。一面一共花了1个半小时。

二面是直属 leader 面试,三面是部门 leader,都面了我大概37分钟,主要内容是描述自己的个人项目经历,以及前端项目经历,我二面差点以为挂了,因为面试官问到了我对 react redux 的理解,尤其是问我 redux 里面的 store, action, reducer,如果不需要 action 会怎么样,我按照自己的理解回答了很多,但是最后面试官说我理解有误,整个人心都凉了。还好最后给通过了。
四面是交叉面试,别的部门的面试官来面我,总的来说,没有很为难我,主要聊的是自己为什么选择前端方向和过往项目经历。
阿里的面试流程非常长,几乎是两周3轮面试。

2. 小红书后端开发工程师(社招、拉勾)4面拿到offer

小红书的面试虽然是提前一个礼拜安排的(我特意要求HR在下周安排面试,这样我可以在上海用几天时间把预约好的公司面试完毕),但却是最意想不到的,因为整整面试了4个小时(下午3点到7点),由于之前搜到的面经几乎没有,也只能硬着头皮上了。
小红书的公司在复兴SOHO二楼,办公室高大上,我被带进了一个会议室之后,就开始了漫长的车轮战。
一共3个面试官,前两个是后端开发的工程师,第三个是电商部门的leader,每个人面试我的过程是一样的:

  • 一道 leetcode easy 难度的白板算法题,(类似 leetcode happy number,split function implementation,rotate sorted array )
  • 个人项目经历
  • 两道系统设计题目以及相关的 follow up

其中系统设计题目很有压力,自己的项目当中很少遇到实际业务导向的题目,印象中的题目有:

  • Restful API 设计
  • 数据库 sharding 分片是什么,MySQL怎么做扩容
  • 对电商系统有多少了解?库存系统数据库设计包括哪些,尽可能详细的描述从用户请求发出到系统后台处理的全部过程
  • 订单下单30分钟内可以取消,数据库和业务逻辑该如何设计(涉及到锁)
  • 哈希的原理,为什么hash的查找和加入都是O(1)
  • 订餐系统设计数据库设计(要求同一时刻进餐的桌数不能超过总桌数,同时需要考虑多人预定不能冲突)

第三轮面试是压力最大的,面试官总能一针见血的问到你的薄弱处,比如问到我订餐系统数据库的时候,我绞尽脑汁想了三种方案,才最后让我通过。最后HR面试之前,已经确定拿到了offer,所以终于舒口气了。
总的来说,小红书的面试是最艰难的,虽然算法难度简单,但是系统设计题目由于没有准备的很充分,加上缺少业务经验,我几乎是想到了所有能想到的方法来解答。

3. Bilibili Python/PHP 开发工程师(内推) 二面挂

B站的面试安排在小红书面试的第二天上午十点半 on site,到了公司先让我从 python 和 php 两套试卷里选一套写,题目主要考的语言熟练度和一些基本常识,我选的是 php 试题(然而我 php 已经大半年没碰了),写到20分钟左右,一面的两个面试官过来面我,没有算法题,全是系统设计或者和语言相关的题目,印象中的题目有:

  • injection dependency 是什么?
  • 浏览器 跨域是什么,如何跨域以及如何防止跨域?
  • php isset() 和 empty() 的区别
  • php的autoload有了解么?
  • paxos 原理 (我有提到研究生上课看过很多分布式系统论文,比如 paxos,然后就被问了,那还是一年前看的,已经忘记的差不多了,所以千万不要给自己挖坑,最后我只好说自己印象不太深)
    二面应该是部门 leader 面试,难度明显提升,印象中的题目有:
  • node.js 的事件循环机制和异步模型
  • unix select 和 epoll 的区别
  • unix 中如何产生子进程,父进程和子进程的区别是什么
  • MySQL 索引策略,为什么 B+ 树当中key是递增的
  • redis 消息队列实现(我在描述简历的时候,有提到消息队列,结果面试官就一直问我redis消息队列的实现方式还有数据类型,又是给自己挖坑,悲剧了)
  • 为什么有 nginx 做负载均衡了,还需要 pm2 来管理 node 进程

b 站面试一共用了1小时40分钟,由于给自己挖了太多坑,但是又都没有填好。面试官最后让我回去等通知,我觉得应该是悲剧了。

4. 杭州有赞前端开发工程师(校招、官网)二面挂

一面是远程视频面试,两道在线编程题目,其中第二题是写一个 JavaScript 事件模型。其他问题包括不限于:

  • CSS 盒子模型
  • JS 继承
  • CSS 文档流(块元素和内联元素)
  • UDP 和 TCP 的区别
  • 为什么 TCP 会有第三次握手,第三次去掉可以么

二面是晚上9点半接到的电话面试,突然接到电话,电话聊完了,我才发现这是二面。整个电话面试基本上围绕了一个问题来说:你怎么看待前端工程师处理切图这种琐碎工作的?我回答的显然没有得到对方的满意。20分钟面试就结束了。我当时最好的做法应该是和面试官安排第二天再面试才对。当晚9点之前已经花了1个半小时做完了美团前端工程师校招的笔试题,脑袋有点混沌的感觉。

5. Strikingly node.js 工程师(社招、V2EX)一面挂

Strikingly 是位于上海的一家创业公司,主要面向海外用户提供建站方案,早年拿了YC的投资,一直有关注,技术团队在国内的前端领域比较有名。
然而我一面就挂了,面试我的是公司的CTO 郭达峰,没有算法题,问的是 node.js 相关的知识点,还是准备得不够,问到我 shrinkwrap, micro 和 macro task 没有回答出来。skype面完之后,留给了2道 JavaScript 编程题,一个是写带有定时器的函数(函数调用依次间隔1s, 1.5s, 2.25s),第二个是写一个类似Vue的双向绑定库。有写出来,但是写的不够好。

6. 搜狐研究院Web开发工程师(校招、内推)二面等通知

HR先打电话安排了一面电话面试,整体感觉比较轻松,由于之前的面试经历,问答题问到的问题都有准备过,算法题是一道简单的二分法题目。面试官感觉不错,在等二面通知。

7. 其他

主要投递上海和杭州的公司。北京的公司也投递过,但是社招的在简历环节就被筛掉了。其实三月末到四月份才春招的高峰,比如美团的校招和网易的校招补招。

结语

错过去年九月份的校招真的是非常遗憾,因为很多大公司在今年的春招面向的是2018年的大三或者研二的学生。只有少数公司还有去年秋招补招的名额。** 所以就只能好好尽全力去准备了,等机会来了,至少不能因为自己没准备好而错过。** 还有就是不能一直闷着头做准备,感觉差不多的时候就可以出手了,机会有时候会比状态更重要。

算法和数据结构方面,必须要有一定的积累和练习(我觉得可以另开一个话题聊刷题心得了)。而且往往临场的环境是很难预料的,我在技术笔试或者 on site 面试的前一晚,都会手写代码,把一些重要的基本题型再重新捋一遍思路。就算法题而言,leetcode easy 和 medium 难度的题目以及可以应付绝大多数的面试了。

另外,我觉得需要注意到下面几点,都是血泪的教训:

  1. 只要接到面试电话,不管在不在外面,都给自己一点时间调整下状态(比如安排一个小时候之后)。如果是比较重要的笔试,或者算法面试,一定要和面试官安排晚几天面试。一般面试官不会拒绝。
  2. 如果是现场面试,一定要提前半小时到现场,尤其是早高峰时间。
  3. 遇到不会写的题目,先尝试冷静,然后联系过往知识,比如数据结构的题目,一般来说离不开常见的数据类型。还有,先别急着写,把暴力破解或者最简单的解法和思路和面试官说,一般面试官只要认可你的思路,就一定会问:有没有时间复杂度更低的算法。这等于告诉你了你,你的思路是没问题的。就算最后没有写出最优解,你也至少能把暴力破解的答案写出来。
  4. 系统设计的题目也一样,把所有可能的答案和思路先说出来,看面试官的反应,只要不差太多,都能够答到点上。
  5. BAT大厂的简历,早点投递,因为面试流程较长;创业公司的简历,尽早投递,因为相对更缺人。
  6. 尽量选一些简单的公司面试来攒点面试经历,等面到难一点公司心态上不会太紧张。我3月份的第一个面试就是支付宝,写算法题的时候,紧张到不行。
  7. 我自己感觉选择上午10点半面试,状态最好。

你可能感兴趣的:(有付出就有回报,写了三千多字的春招面试总结)