文章作者:rapospectre
文章链接:https://www.rapospectre.com/blog/2017-backend-interview-share
背景
博主本人 2015 年毕业于郫县某 985 大学通信工程系,因为大学期间一直自己创业所以错过了大四秋招春招,毕业后又在北京继续创业一年,但在创业公司一直无法沉淀技术累积,于16年年底萌生进大公司学习的想法,于是从16年年底开始通过社招找工作。虽然大学就开始做研发,但无奈简历只看毕业工作经验,所以本人简历只有一年工作经验。
在此总结一篇文章给各位参考。
阿凡题
应该算是人生第一场面试,早上 11 点开始,公司是做 k12 在线教育相关业务,在五道口那边;
一面
前台登记后发了一套笔试题,开始写,主要都是 Python 基础知识,不算难,基本就是 可变对象不可变对象区别、 Python 垃圾回收机制之类的题目,有一两道编程题也很简单,最后有个根据题目设计数据表的问题也不难,搞定后等面试官开始二面;
二面
面试官好像是个主管,开始让做自我介绍,他在看我的笔试题,然后根据简历问了一些项目相关的问题以及简单的一些系统设计问题,之后大概问了问笔试题里一些问题和补充,感觉聊的比较开心,面试官也对之前我的经历比较感兴趣,于是去通知 CTO 进行三面;
三面
CTO 面里问题的广度和深度都很大,从服务器部署的相关知识到 Nginx 一些细节问题都有问到,不得不说问的还是比较全面的,印象最深的应该是这个问题:「浏览器的一个请求从发送到返回都经历了什么,讲的越详细越好」
我大概讲下我的答案:
1、先从网络模型层面:
client (浏览器)与 server 通过 http 协议通讯,http 协议属于应用层协议,http 基于 tcp 协议,所以 client 与 server 主要通过 socket 进行通讯;
而 tcp 属于传输层协议、如果走 https 还需要会话层 TLS、SSL 等协议; 传输层之下网络层,这里主要是路由协议 OSPF 等进行路由转发之类的。再向下数据链路层主要是 ARP、RARP 协议完成 IP 和 Mac 地址互解析,再向下到最底层物理层基本就是 IEEE 802.X 等协议进行数据比特流转成高低电平的的一些定义等等;
当浏览器发出请求,首先进行数据封包,然后数据链路层解析 IP 与 mac 地址的映射,然后上层网路层进行路由查表路由,通过应用层 DNS 协议得到目标地址对应的 IP ,在这里进行 n 跳的路由寻路;而传输层 tcp 协议可以说下比较经典的三次握手、四次分手的过程和状态机,这里放个图可以作为参考:
2、应用层方面:
数据交换主要通过 http 协议, http 协议是无状态协议,这里可以谈一谈 post、get 的区别以及 RESTFul 接口设计,然后可以讲服务器 server 模型 epoll、select 等,接着可以根据实际经验讲下 server 处理流程,比如我: server 这边 Nginx 拿到请求,进行一些验证,比如黑名单拦截之类的,然后 Nginx 直接处理静态资源请求,其他请求 Nginx 转发给后端服务器,这里我用 uWSGI, 他们之间通过 uwsgi 协议通讯,uWSGI 拿到请求,可以进行一些逻辑, 验证黑名单、判断爬虫等,根据 wsgi 标准,把拿到的 environs 参数扔给 Django ,Django 根据 wsgi 标准接收请求和 env, 然后开始 startresponse ,先跑 Django 相关后台逻辑,Django 拿到请求执行 request middleware 内的相关逻辑,然后路由到相应 view 执行逻辑,出错执行 exception middleware 相关逻辑,接着 response 前执行 response middleware 逻辑,最后通过 wsgi 标准构造 response, 拿到需要返回的东西,设置一些 headers,或者 cookies 之类的,最后 finishresponse 返回,再通过 uWSGI 给 Nginx ,Nginx 返回给浏览器。
谈完后 CTO 根据我说的一些细节提出了一些问题,最后当时就谈了 offer ,CTO 说不走 hr 那边了直接和我谈,比较意外的是 offer 给的比我自己要的还高 5k。对于第一次找工作的我来说当时满心激动。
最后大概说说环境:公司在五道口一栋写字楼内容,规模还算比较大,听 CTO 谈做的事情也比较有意思,有机器学习、大数据等等 ( 主要是处理各种初高中学科的题目,涉及到文字识别深度学习等等,当然我如果进去肯定要从业务写起 ),包午餐、下午茶之类的其他我就不太清楚了,因为下午就走了,不过公司好像是每周六天班。公司发展感觉还是比较高速,感兴趣的同学可以去试试。
学堂在线
公司也在五道口,清华科技园里,Google 前中国办公室对面的楼里 ( 好像现在搬到 Google 那里了 )
一面
一面面试官应该是个后端研发工程师,感觉有些羞涩,全程一直不看我,主要聊了一些简历里的项目经验,系统设计,然后问了几个简单的算法题和一些 Python 的基本知识,然后就去叫二面面试官了。
二面
二面面试官是部门主管,嗯,这次总算看着我跟我聊了,哈哈,感觉目光交流也很重要,同样问了一些系统设计的问题和经验问题,因为博主 Django 相关的经验还算比较丰富,感觉他们也主要是找业务研发,所以没什么意外就过了。
三面
hr 面,主要问了一些薪资期望,发展规划之类的,主要是聊天,然后就发了 offer。
学堂在线主要是做慕课平台,并且是和国内各大高校合作,福利方面因为最后没有去所以不是特别了解,公司环境还是不错的。
果壳
果壳在国贸百朗园里,在园区最里面,不是很好找,一进去先发了一套面试题和一张登记表,登记表连父母家庭资料都要,不是很理解要面试者这些信息干什么,又不一定去你家,等入职再填不行吗?所以除了本人信息,其他我没填。( 面了这么多家就果壳要填这个,还要填特别详细的信息,不能懂 )
一面
面试题难度适中,不过涉及到的面比较多,还要写数据库查询语句等等,博主非科班,只大概自学过数据库,然后一直在用 orm ,毕业后就没怎么写过原生 SQL ,相关题目只能凭借记忆大概写了下,还有一道题是 用 O(1) 的复杂度实现一个 栈 的出栈入栈和返回 max、min 值的操作,其他就是一些 Python 基础和表设计题。
这里说下这道设计栈的题:
出入栈函数 O(1) 没什么问题,主要是 max、min 操作( 博主找工作时没看过面试题目,只是刷了一些 LeetCode ,后来发现这道题很经典,网上很多答案)当时没遇到过这种需求,但是可以肯定想要时间复杂度下降,肯定是要用空间去换时间,所以当时有设计了额外的数据结构存 max min,但当时设计的还是有问题,后面又和面试官讨论了一下,还是没有得出最好的方案,最后回去网上搜了下发现其实很简单,当时只差最后一步,感兴趣的同学可以看下:栈在 O(1) 时间内求 min
二面
面试官一上来就直接拿着笔试题开始一道一道问,嗯,连我叫什么都没让介绍,更别说介绍项目什么的,感觉有点懵逼,全程没一句废话,全是纯技术问题和算法,然后自己擅长的面试官感觉不太感兴趣,我不太熟悉的他很愿意追问,嗯,二脸懵逼,之后又问道 tcp 流量控制,当时直接说错给说了拥塞控制,面试官表示我 tcp 掌握的不好( 确实是我的问题,回去之后又整个看了一遍 tcp )。
最后又问了很多数据库底层的东西,博主完全没接触过,所以面试官表示下一轮面试官有事 ( 哈哈哈 ),接着问我有什么想问的,我问了两个问题面试官表示自己还有事。。。好吧,那就不聊了。
总结:数据库知识很重要,即使你投的是研发不是 dba ,你也一定要懂数据库底层的基本原理,至少要知道 索引原理、MySQL 数据引擎等等,因为之后凡是博主挂的面试都有数据库的锅。
果壳环境看上去有些乱,但比较温馨,但实在不敢恭维面试的方式,所以挂了博主也没惋惜。其他方面就不太了解啦,因为根本没拿到 offer。
Veeva
公司也在国贸附近,是一家给生物科技企业( 药厂 )做 crm 的外企 ( 不过国内的好像和国外母公司没什么关系,就是个单独的子公司 ),不算是互联网公司,但是薪资很给力。
一面
首先是 phone interview,hr 大概问了问跳槽的原因,项目经验,发展规划等,然后发来 homework,做完后提交;
二面
homework 比较简单,就是一个判断是否润年的函数,不过这里是有坑的,当题目很简单时,人家考验的就不是智商了,而是看你的编码能力,工程化能力及面向对象抽象能力,所以果断完整的写了个工程,加上完整的测试,然后提交之。
三面
hr 说技术同事看了 homework 感觉还是比较 ok 的,所以约面试,首先来的面试官好像就是个 leader,问了很多 Python 和 Django 相关的基础知识和算法题,现场有个白版,直接在上面她出题,我写,然后她 review ,基本上就是 LeetCode easy 难度的题,没有太大问题。
四面
应该是个技术大牛,问了问经验开始系统设计,我记得当时是让设计一个短网址生成方案,有一些额外要求,比如不能按照字符顺序生成短网址,而是要随机生成,如何避免碰撞,如何最大效率利用所有空间。
具体方案可以看知乎,上面有人讨论过: 短链接是如何设计的
然后面试结束。
面试完后接到 hr 电话说技术同事感觉不错,问我有没有意向入职,但当时考虑还是想去互联网公司所以就拒掉了。不过 veeva 的薪资很给力,感兴趣的同学可以去看看。
知乎
博主的 dream company,哈哈,去面试的时候特紧张。知乎在 768 创意园,环境很棒。
一面
一面面试官问了项目经历及一些个人信息后开始考基础,主要是面试官出题,然后我在纸上写代码,难度适中,因为面试的比较久了,记不太清楚全部题目,记得让手写了快排,然后 Python 相关基础知识,一些 LeetCode 题,tcp 相关知识,epoll 服务模型、tornado 的一些原理 ( 可以看博主之前文章 tornado ioloop 分析 )数据库知识 ( 坦白掌握不多 )末尾问了下二分查找,一面就过了。
二面
面试官好像是商业化后台的主管?问了项目经验,问了经历,对我大学期间创业经历表示赞扬,但毕业后又创业一年表示不满意( 不是很明白为什么 ),之后开始问一些系统设计相关题目,印象比较深的是设计微信抢红包的构架,嗯,当时根据自己的见解说了一套系统和注意的点以及分配红包的算法,感觉面试官应该不太满意。回去后看了看网上,还真有写,果断研读了一发: 微信红包构架设计.
后面又聊了一些系统设计相关的内容,然后让我等等。
三面
等了半个小时,期间看到前两面面试官一直在和 hr 讨论,应该是要不要我的问题,半个小时后 hr 来跟我聊了聊规划和项目以及为何来知乎,然后就回去周五前给回复。
到此大概确定应该要我的可能性不大,应该是当做备胎了。 这里自己的问题主要是系统设计方面当时并没有准备,另一方面数据库这块明明果壳问到了但是没有重视起来。最后,年底出去找工作还是要谨慎,很多大点公司没什么招聘需求,除非特别优秀。
最后,周五没有收到消息,基本确定挂了,果然在下周周一的时候收到了拒信,这点要赞一下,至少有明确的拒信,不像一些其他公司,嗯,就不明说了。
知乎氛围觉得还是挺赞的, 福利也很好,包三餐,不加班,嗯,不多说了,都是泪。最近知乎开始大量招人了,大家可以去试试哦,替我完成我的 dc 梦,哈哈哈。
春雨医生
春雨医生在知乎隔壁,真的是紧隔壁,环境也不错~
一面
照例进行自我介绍,然后问项目经验,开始纸上写代码,不过这里要赞一下春雨,面试题都非常接地气,全是根据实际项目里的问题进行编码,比如有个给医生和病人聊天记录分组提醒的题目,都是类似的实际场景题目,完全没有那种纯算法题目,之后又聊了一些 Python Django 基础相关的东西,顺利进入二面。
二面
问了一些项目信息,然后开始系统设计,没记错的话应该是设计一个类似 QQ 的聊天工具,要求有群,并且可以发送图片、语音等各类消息,群管理员可以进行群管理等等。后面又问道数据库,直言数据库基础掌握的比较少,面试官也没有为难我。
三面
三面的时候到晚上饭点了, hr 姐姐超级好,带我去外面中餐馆点菜吃饭,回来后 CTO 面试, 考了阿凡题 CTO 问过的问题: 浏览器的一个请求从发送到返回都经历了什么
于是本人又根据上面那个流程讲了一遍,接着又问了问自己的发展规划和期望,然后我问了问春雨相关的一些问题,面试结束。
隔天收到了 offer, 请我吃饭的小姐姐发给我的,哈哈,但是由于年前无法到岗,只能拒掉了。
总体讲,春雨环境也很不错,但其他福利我也没有问,所以其他不太清楚咯,有兴趣的同学可以去试试。
360
360 在酒仙桥,最不靠谱的面试。。。
直接通过拉钩邀请第二天早上面试,当时已经下午五点。完全没打电话发短信,接到邮件的我一脸懵逼,于是主动打电话过去确认,得到肯定后第二天做两个多小时车赶往望京。 ( 我住在八宝山这块 )
一面
前台不让进,让通知面试的人来接,等了会儿面试官来接我,然后七绕八绕不知道绕道哪去给了我一份笔试题,让我做,着重强调不要看手机 ( 本来就没打算看好嘛,我坐的头顶有个摄像头,你让我怎么看,哈哈哈 )写完让我打他电话,然后他就闪了。
我一看题目,除了前三道是 Python 之后全是 Linux 基础题,当时心里想:不亏是做安全的啊,要求就是不一样,然而博主半吊子 Linux 水平只会一些常用的命令,笔试题里的高端用法实在是臣妾不会做啊,于是本着诚实的原则做完会做的打了电话。
二面
面试官来没有让自我介绍,直接对着题目开始问 ( 我的内心已经产生了抵触感,和果壳一样 )。第一题是个 Python 改错题,面试官问为何这样改,我大概讲了下,然后是讲了下 lambda 表达式并提供编程例子,面试官看完也没说什么,接着是一个用两个队列模拟栈,写实现代码,也没有太大问题,只是面试官也没有看代码,就是问了我怎么实现。
接着到了 Linux 部分,基本都不会,会的也只能写出简单的命令,面试官直言:你这个笔试题做的不好啊。怎么都不会 ( 确实有我的问题,Linux 基础不好,但是直接否定了前面其他部分有点冤啊 )
接着问了一些项目经验,看到我的开源项目 djanog-simple-serializer 问这是干嘛的,然后我说了下是序列化解决方案,面试官说:序列化不是很简单嘛?( 我也没说难啊大兄弟,只是其他的没有好用的自己写了个嘛 )接着面试官问了我一句让我十脸懵逼的话,作为一个不懂 Python 的人,你能给我简单讲讲 Django 和你做的东西吗?当时我的内心全是黑人问号脸,wtf ?不懂 Python ?那你招 Python ? 怎么面试啊大兄弟,虽然我知道其他语言用的 6 写 Python 也没问题,但是招进来就要写业务你怎么也得找个有相关经验的面试吧,这下我明白为啥之前 Python 部分面试官不怎么看了。 此刻我只想赶紧离开了,于是就说感觉招聘需要和我不太一致,就不耽误时间了。
好吧,应该我算是遇到个例,请大家不要对 360 产生偏见。
今日头条
今日头条在中航广场,人民大学旁边,不得不说,是我面试过离我最近的公司,头条大楼很霸气。发展也很迅速。
一面
面试前一天晚上莫名失眠,真的是一宿没睡,睁眼到天亮,然后一脸懵逼的去面试,到了头条前台我勒个去,从没见过这么多人来面试,大厅做不下了,当时心里想:完蛋,这么多人,竞争得多激烈,昨晚还失眠,血崩。
在前台签到,领了候选人的牌子,等了一会儿就叫到了我,由于面试的人实在太多,我实在 -1 楼食堂进行的面试,一面面试官是广告投放部门的工程师,先自我介绍,谈创业经历,问了 redis 用法及原理 ( 前面几次问到数据库的前车之鉴,博主特意狠狠看了下各种数据库的基本原理 ),然后根据我说使用 hash table 的经验,提了一个分布式 redis 使用 hash 的潜在问题,当时没有想出来,面试官提醒了下大概说到了点子上,主要是分布式机器 hash 后可能存在储存分配不均匀问题。然后 hash 表又问了冲突解决方案,主要是拉链法和进位法,之后聊了 tcp ,没什么问题。 问了排序算法的最小时间复杂度及原因。接着出了一道费那波数列的题,要求在常数空间复杂度内计算任意 fib(n) 当时可能没听清,估计没睡的原因,听成了常数时间复杂度,向面试官确认是常数时间复杂度 ( 面试官可能没听清我说的,以为我说的空间复杂度 )于是苦思冥想无果,面试官提示动态规划,于是开始推导转移方程,最后面试官说没那么复杂,这时一对才发现我们理解岔了。其实很简单:
def fib(n):
a, b = 0, 1
for x in xrange(n):
a, b = b, a + b
return b
一面问题结束,在我写题的时候面试官看了我的博客和 GitHub,表示满意 ( 有点惊讶,第一次有面试官看我博客和 GitHub ,虽然简历上有,但从没有人说看过 ),然后又带我把一面所有问题过了一遍,我不清楚的地方都完整的给出了答案,没见过这么好的面试官!!不知道他们给我多少分,我给他们满分!
二面
二面面试官是头条广告后台组主管,对我的创业经历很感兴趣,问了很多相关问题,然后看到我的开源项目又问了一些问题,然后提了一个很有意思的题目,在极端情况下,系统缓存全部失效,该如何防止流量全部打到数据库上,当时从很多方面考虑但是感觉面试官没有非常满意,不过也算是答到了点子上,也就算过了。回去后特意看了看,缓存失效的解决方案,感兴趣的同学自行搜索 “缓存重建”。
然后问了问一些项目相关的经验和解决方案,出了一道单链表逆置的题目 ( 和面试官透露非科班,没有出很难的题目 ),然而当时大脑基本处于停转状态,太困了,最后写出来有个 bug,其实题目很简单,回去稍微想了下就写了出来:
def revese(node):
p = node
cur = node.next
p.next = None
while cur:
tmp = cur.next
cur.next = p
p = cur
cur = tmp
return p
面试官表示 coding 能力需要加强,当时也不好说自己没睡觉,就直接说确实能力需要加强。面试关说让我等等去找下一轮面试官,等了一会儿告诉我下个面试官不在,当时觉得我是挂了 ( 结果是面试官真的不在 ),面试官好像看出了我的想法,重复了一句面试官真的不在。让我回去,稍后 hr 约下次面试时间。
三面
三面是一周后的下午 6 点,这次终于来到了面试室,里面有一块白版,三面面试官是广告大组的 leader,进来没有再考基础题,问过经历后出了五道系统设计题,于是开始在白板上写,大概记得有多端登录管理、二维码登录等等一些设计,要求设计出系统结构,相关数据库和表,博主设计完后给面试官讲了一遍,感觉面试官比较满意,也没再问其他的,直接去叫下一轮面试官了。
四面
四面面试官是头条 data 部门的 vp,感觉人超级和善,进来直接跟我说一起去吃饭吧,刚好体验下头条食堂,然后,第四轮面试是在饭桌上进行的,主要谈了谈我的项目经验和发展方向以及为何来头条,最后吃完饭面试官说本来这一轮也会考技术,但是感觉聊得不错,就不聊技术了,让我回去等 hr 电话。( 头条食堂真的不错呀,只是当时没好意思多打,哈哈 )
五面
hr 电话聊了聊个人发展及规划,然后确定了薪资,就发了 offer ~~
头条环境非常不错,包三餐,自助食堂,无限水果零食还有下午茶,晚上 10 点后打车报销,入职发 mac, 住公司周围房补,大小周加班有加班费等等,总之福利非常多 ( 为何我知道的这么多 )还是推荐大家来哦。
总结
最后,博主选择了头条的 offer 。( 已经找到当初面试我的大神们,哈哈,开心 )
从去年底找工作找到今年节后,终于找到一个满意的 offer,曾经也纠结过,感觉自己高不成低不就,有段时间甚至拒绝出去找工作。
很多大公司社招都是三年经验起,所以像博主这种毕业一年的人在没有内推的情况下参加社招非常尴尬,在这里奉劝各位学弟学妹,一定要抓住校招的机会啊!!社招跟你竞争的可不光是你们同级的人。
找到工作后偶然发现一本神书 《剑指 offer》我面试过基本所有问题上面都有,推荐大家一定过一遍( 要是早点看到就好了,哈哈 )
这里还有博主当时刷过的 LeetCode https://github.com/bluedazzle/leetcode_python ,可以参考一下,之后有时间博主也打算一直刷下去。
平时一定要注意多积累,有条件的情况下尽量自己多写一些自己的项目,这样面试会有很大的加分,比如博主之前写过的小程序:式神猎手 ( https://www.rapospectre.com/blog/create-an-onmyoji-weapp-in-24-hours ) 在面试中就很有益处。