Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
121 lines (80 sloc) 10.2 KB
layout title date categories
post
面试斗鱼后端工程师后感
2017-12-01 09:00:05 +0800
面经

前两天去了面试ofo的后端工程师,被吊打,具体经历可以查看《面试ofo后端工程师后感》

昨天我参加了斗鱼的校园招聘笔试以及面试,从下午一点半一直战斗到晚上的六点半,特别是面试过程中,对精神消耗很大,一个会议室狭小、密闭的空间里,一直进行面试。技术一面、技术二面、三面(我不确定第三面是否是HR可能更加倾向于技术团队的管理)、HR四面。

笔试

HR给每一个人相应的笔试题,前端、PHP后端、Golang后端、Java后端、产品经理、数据分析等等。我应聘的是Java后端,前几道题目主要是关于 Java 语言的基础(接口与抽象类的区别、抽象类与普通类的区别,创建对象的方式,多线程,基础类型以及对应封装类)、MySQL 的表操作(同时使用 JOIN ON / CASE WHEN / GROUP BY / WHERE / SELECT 等操作)、前端 JS 响应 select 下拉条代码、字符串操作、排序去重算法。

其中 MySQL 题目如下:

  • 有 A 表,其中记录着每个学生的每一科目的成绩(name、score、subject);
  • 有 B 表,其中记录着每个科目占总成绩比例(subject、percent);
  • 求在 059、6089、90~100的学生比例

对应的 SQL 查询语句:

SELECT
  sum(
    CASE
      WHEN stuScores.score BETWEEN 0 AND 59 THEN 1
    ELSE 0
    END) / count(*) AS 0t059,
  sum(
    CASE
      WHEN stuScores.score BETWEEN 60 AND 89 THEN 1
      ELSE 0
    END) / count(*) AS 60to89,
  sum(
    CASE
      WHEN stuScores.score BETWEEN 90 AND 100 THEN 1
      ELSE 0
    END) / count(*) AS 90to100
FROM (SELECT sum(A.score * B.percent) as score
      FROM A JOIN B ON A.subject = B.subject GROUP BY A.name) as stuScores;

没有了解过 JS 对于前端的响应事件,没有写出代码,只留下一句声明:不了解 JavaScript

对字符串的对称翻转("01234567" 转化为 "32107654"),Java 中 String 对象是不可改变的,所以每次修改 String 中的内容,都会重新创建一个新的 String 对象,所以这条题目我猜面试官想要看到的是把 String 转化为 char[] 进行操作。

最后一题,把随机序列排序并去重,[1, 3, 4, 2, 3, 4] 转化为 [1, 2, 3, 4],最后还要求算出时间以及空间复杂度。我的想法是使用平衡二叉树进行排序,在排序的过程中将去重操作一并完成,无奈忘记了平衡二叉树的调整算法。

使用平衡二叉树算法时间空间复杂度:

时间复杂度 = O(nlog(n))
空间复杂度 = O(n)

还可以对数组先使用快速排序等算法,然后再开创另一个新的数组,从头到尾一个一个插到新的数组,记录上一个插入的数字,如果下次要插入的数字等于上一次插入的数字就放弃,否则就插入到新的数组里面。

时间复杂度 = O(nlog(n))
空间复杂度 = O(n)

技术一面

面试官在看我简历的时候,顺带让我也进行自我介绍。部分问题我忘了,他问了我大概这么几个问题:

面试官面试我的时候,其实很多问题我都了解过,但是没有深入了解过,回答的时候感觉底气也不是很足。

技术二面

同样的套路,在看简历的时候让我进行自我介绍。

二面中,面试官问了很多我简历写的项目上的一些技术细节(实现的模式、原理),比如电商平台的抢购功能、博客评论中的楼中楼、如何确保数据安全同步以及更多的实现业务逻辑的思路。

他的问题,没有问到技术的细节,而是其中的道理,大概是大道至简,只要把其中的原理弄清楚了,那么将思路方法通过其他编程语言或者框架的难度不大。我仍然记得,ofo面试管对我说的,如果公司只要招一个对语言或者框架熟悉的人才,那么花几个月对新员工进行培训就可以做到,更加重要的是扎实的技术知识,基础不扎实会成为个人成长的瓶颈。个人感觉确实是这样的,我从 Java Web 往 Python Web 转,只在两个星期就上手了,成本相对低。

在面试中,我主动问了一些关于笔试题的一些答案,或者面试官认为有没有更优的实现方案。比如上述 CASE WHEN 的解法就是他教我的,数组的排序并去重也给出了他的意见。针对 SQL 我还提问了真正项目开发中,会不会写存储过程等 SQL 编程。他给出公司中的 DBA 不建议写存储过程,因为这样会将业务逻辑往 DB 转,不仅增加数据库压力,而且会在业务逻辑改变时需要更新多个 DB 的存储过程,成本很高,而且可维护性低。

因为斗鱼公司在高峰时,有上千万人同时在线观看斗鱼视频,我对他们的高并发处理很感兴趣,咨询他们的技术解决方案。他列举了很多 CDN 缓存、反向代理、浏览器端缓存、分布式等,还有列举一个曾经使用 PHP 无法解决的性能问题,转到 Golang 就很好地解决了性能问题。现在确实很多互联网方面的公司在往 Golang 转,Why Golang

既然抛出了 PHP(脚本语言)和 Golang(编译语言),我就问面试官在脚本语言和编译语言中的选择问题,他给我的答案是公司鼓励多语言发展,语言只是实现工具,不要被语言局限了视野,只要打好基础,学习一门新语言是很轻松的,具体开发中要根据具体情况选择合适的语言。

PS:面试官没有问技术细节一部分原因很可能是我简历上写的项目都是用 Java Python 方面技术写的,而面试官是主要从事 PHP 开发的。

三面 + HR 四面

我不确定三面是从事什么的,进行车轮战,这时候我的头脑已经不是很清楚了,他进门的时候对他自己进行了简短的自我介绍,但是我没有听清楚,我也尝试过看他的工牌,但是看不清楚。

面试官一开始坐下来,跟我聊了聊技术、项目方面的问题,他说进来之前,看过我的博客,说我的博客是自己搭建的,而不是使用第三方平台或者是使用开源模板搭建的,然后就对我的博客产生了兴趣,比如对博客会不会进行再开发之类的深入问了几个问题,我提到了未来可能添加一个资源聚合功能,从知乎等爬取优质网站,放到我们博客上。他跟着问了一些爬虫的是否合法以及数据安全等问题,问我有没有对自己博客采取反爬虫等机制。接着他问了我平时使用的操作系统,以及有没有使用阿里云等云服务器(我PC使用 Linux Mint,在腾讯云购买了两个云服务器,学生优惠很大,建议计算机类大学生去申请资源)。

接着他跟我聊了聊公司内的氛围、团建活动、健身器材等,描述斗鱼公司在光谷人均消费500RMB下的都尝了一遍,我更关心健身器材,因为我有保持健身,失望的是,他们居然没有举重等无氧运动设备,但他补充说,斗鱼正在建立自己的园区(4年不到建立园区,可见斗鱼发展之快),斗鱼很快会有更加健全的健身设施。而且看得出他很喜欢现在的工作,对公司的价值观很认同,表示自己与公司正在同步成长,可见在认同的公司中工作是多么重要的,表示斗鱼公司有很多内部分享和参加技术峰会,让内部员工有更多的机会学习成长。

他表示除了技术方面,还要多了解点其他东西,多学点东西,对技术要有热情、专研精神。和他还是聊得很愉快的,而且他也很友善,问我职业发展规划怎样的,而且给出了他的建议。他也问了有关我毕业设计等问题。

HR四面,没有聊太多东西,可能更多的是了解个人性格等,她也要求我对个人进行简短的介绍(非技术方面,更多的是学习状态和性格),谈谈我对斗鱼公司的了解。令我惊讶的是,她也和我谈项目,问我最愿意拿出来和她分享的是哪一个项目之类的问题。谈了没多久,时间确实已经很晚了,她让我先回去等电话通知。

总结

  1. 不要把自己不熟悉的内容写到简历上,不要不懂装懂,否则面试官可能针对它不断发问
  2. 需要通过自我介绍和简历引导面试官往自己熟悉的方面发问
  3. 需要打好基本功,数据结构与算法、操作系统、网络协议以及所使用技术
  4. 面试前需要对公司有一个大概了解,比如公司产品、服务以及技术
  5. 敢于问为什么,在面试结束前,可以请面试官解答一些问题
  6. 平时学习要把其中的“道”弄清楚
  7. 最好有一两个项目可以让面试官发问,不然面试官自由发挥,后果自负