一面
2017 年 9 月 23 日上午 11:00 左右,小雨,在上海瀚海明玉大酒店,面试官是个女的,面试过程大概经历了 40 多分钟,其中大部分时间都由我在讲,全程问题都是围绕我的自我介绍和项目经验展开,我很主动。
自我介绍
毕业,我虽非计算机相关专业,但我较为系统的学习过计算机相关知识 ……
(以时间为线索)
2014 年 ……
2015 年 ……
2016 年 ……
2017 年 ……
项目介绍
自我介绍中有讲在腾讯大连实习,参与了 PC QQ 看点和 TIM 消息漫游等项目的开发,因此对项目做了简单的介绍 ……
安全处理
因为自我介绍中提到了 WEB 安全升级,问了我做了哪些安全防范,从前端到后端都答了,因为之前有总结过,具体可以看我之前的博文
WEB 性能优化
项目中提到了性能优化,然后问我做了哪些优化,这些问题都是比较广,比较开放,还好之前总结过,按照总结的思路逐一说,从前端到后端都有做优化,从如何减少 HTTP 请求(webpack js/css打包) –> 减少 TCP 连接(keep-alive) –> 压缩(gzip/deflate) –> 缓存等,大到传输、计算、存储,小到 HTTP 各种版本之间的区别,我会的都说了,面试官一直在耐心的听,偶尔打断一下我,偶尔补充一下。最后一句是对 MySQL 做优化,所以面试官又问下一个问题了……
数据库优化
面试官问了我对 MySQL 做了哪些优化,因为这些问题我都已经写好答案了,所以直接按照 这个答就行,从建表建库到引擎选择,索引选择,到 SQL 优化到分表分库,读写分离、主从复制等。从原理到实现,反正我会的都讲了,一直滔滔不绝,看得出面试官很满意 ……
数组去重复
数组去重实际上是因为我项目中遇到了,从面经中也看到京东会问数组去重,所以就故意说项目中的业务有去重,所以自然就问我怎么去重复了,当然我的答案是结合项目回答的。待我详细说说
QQ 看点的项目中,QQ 客户端 —–> 中间件 ——-> QQ 后台。从客户端到后台拉取新闻时,需要由中间件对数据处理,其中业务之一就是如果返回的文章中已经在前端页面中展示了,那么该文章属于重复,应该去重。去重的常规方式一般有 PHP 系统函数 array_unique() 或 array_flip() 键值反转函数,然而查阅 PHP 源码不难发现,array_unique 是使用 zend_qsort (zend 引擎的快速排序) 先排序再实现的,平均复杂度是 O(nlogn), 而 array_flip 是 hash 结构的键值反转,因此需要遍历数组,复杂度为 O(n)。我的项目中自然就使用 hash 结构去重,如果单纯判断一篇文章是否重复的话仅需要 O(1) 的复杂度。
跨域问题
跨域问题也是我总结好的,常用两种跨域方式 CORS 和 JSONP ,CORS 之前有详细总结过,而 JSONP 跨域的原理按照 jQuery.js 源码实现方式说,就是动态创建 script 结点,使用 script 标签中 src 属性不受浏览器同源策略影响的特点实现跨域, 面试官显然也满意。
以上几个问题以后,时间就过了 40 多分钟了,期间我有两次强调自己虽然是非计算机相关专业,但从大一开始就系统的学习计算机相关知识,为了不让面试官鄙视为半路出家、强行转行等。最后面试官也两次和我强调,她说不用担心自己是非计算机相关专业,她们更看重实力,然后问我有什么问题,我说我从外地来,如果有二面的话希望早一点,她说:“好的,我给你标注一下,安排你早一点面试”。
一面完。
二面(项目经验)
自我介绍
讲其中一个项目经验
项目的架构图
跨域
- jsonp 跨域
- cors 跨域:简单请求和非简单请求,如果设置请求头信息以实现跨域请求
讲了数组去重复, Hash 冲突解决方案
array_unique() 函数和 array_flip() 函数,HashTable 数组去重
拉链法、链接法解决 Hash 冲突
问了另一个项目
问了为什么用 Node.js 为什么用 MongoDB
事件驱动,异步 IO 、非阻塞
key-value 存储,文档存储
问了 Promise
回掉处理: callback –> genarator –> promise –> async 函数(ES 7)
项目中 Token 延时机制
像 SESSION 一样缓存,设置缓存过期时间
项目中文件状态锁
MongoDB 实现事务而已
问了如何获取来访 IP
$_SERVER['REMOTE_ADDR'] || $_SERVER['HTTP_CLIENT_IP'] || $_SERVER['HTTP_X_FORWARDED_FOR']
<==> Apache || IIS || 代理服务器
二面完。