人生中第一次面试!袋鼠云nodejs岗
3.4袋鼠云nodejs岗面经 2h03min
1.自我介绍
2.拷打项目,一个一个拷打
● 第一个系统 oss对象存储平台
1.讲讲做的是个什么业务
2 .这里的对象存储具体值得是什么
3.有没有真的实现OSS对象存储
4.项目技术上遇到了什么困难怎么解决的
5.讲讲文件上传分片上传断点续传等;
6.现在回过头看觉得这个项目有什么缺点和改进的点;
● 第二个项目 面对hr的简历分析系统;
1.介绍这个系统的业务;
2.讲讲流程管理模块
3.讲讲数据大屏(开了屏幕共享对着项目截图讲)
4.打开项目框架怎么构思的。
● 第三个项目:
预科志愿分流系统:问了vuex在项目中的运用
● 项目都要求运行展示了,看了代码细节
3.用过哪些js函数库(axios,jquery)
4.了解哪些项目开发设计中的一些规范
5.数据库中事务的四大特性(原子性,隔离性,持久性,还有个一致性忘了)
6.问是否了解redis(没有,过了)
7.问了解哪些数据结构(答了栈,队列,链表,树,图,堆)
8.问数组和链表的区别(答了,数组内存连续,大小固定,延申讲了数组的扩容原理是创建一个更大空间的数组将原数据移动进去;链表内存分散,不固定;讲了数组删除和添加需要进行挪动,但链表只需要改变指针指向更加灵活;)
9.接着上一问,问了数组和链表读取数据的区别(答了数组通过下标直接读取,而链表需要遍历到目标数据上)
10.问了系统中内存为什么能够随机访问(没答出来)
11.列举一下线程的同步方式(只讲了互斥锁和信号量)
12.讲讲JS的事件循环
13.给了一道题目要求输出结果(当时一紧张不记得怎么去看了,明明前几天刚复习过,一紧张嘴巴乱讲话把settmeout说成了是微任务。说明还没理解透彻,没回答正确,但在hr的提示下梳理好了思路)
setTimeout(() => {
console.log('1')
Promise.resolve(2).then(val => {
console.log(val)
})
}, 0)
setTimeout(() => {
console.log('3')
}, 0)
Promise.resolve(4).then(val => {
console.log(val)
})
Promise.resolve(5).then(val => {
console.log(val)
})
console.log('6')
答案是645123
14.问什么是完全二叉树
15.场景题:在一个音乐播放软件中,需要实现统计有多少个用户播放过某一首歌
(一开始说了一个很基础的实现,就是点击播放时将用户id和歌曲id存到数据库中,如何通过sql语句去重查询
然后要我写出查询的sql语句,写出来了,一不小心把count写成了sum😅,hr提醒了我,我才反应过来服了)
后面在hr的提示说第一种方法的问题是数据量太大,所以你需要思考如何压缩需要存储的数据量
然后就说了另一种实现方法,就是设置一个标识属性标志用户是否播放过该首歌,如果播放过就不需要重复存储数据。
后面问有没有更好的实现方法,后面想着是不是用哈希表,但是刚想说,hr就说没事这个问题先过了
16:讲讲osi七层模型,并讲讲每一层的作用和涉及的协议
物理层:(答:和选用什么物理传输介质相关,比如光纤电缆之类的,协议不知道没说)
数据连路层(答:主要作用是校验错误,提供可靠传输,协议忘了没说)
网络层(答:最经典的就是IP协议,在网络中传输包,其中还涉及到路由器转发之类的)
传输层(答:经典协议TCP和UDP分别表示可靠传输协议和不可靠传输协议,作用没讲清楚,磕绊了半天说是负责端到端是数据传输)
会话层
表示层(答:不太记得会话层和表示层的作用了)
应用层(答:主要就是和用户的一些交互比如页面显示之类的,设计HTTP等协议)
17.浏览器输入url到展示之间发生了什么
这个问题比较幸运,面试前半个小时刚给朋友讲了一遍这个过程。
先是回答:浏览器先解析URL,然后将域名转化为IP,转化IP过程要先查看缓存是否存在,没有就要进行DNS查询
这里hr问:是哪里的缓存(回答了浏览器的缓存)
然后继续说:得到了IP之后就要进行三次握手建立客户端与服务端之间的TCP连接
然后继续说:接下来就是客户端向服务端发起请求,这里我延申讲解了协商缓存和强制缓存,巴拉巴拉然后客户端获取到数据了
然后继续说:客户端获取数据之后要进行渲染,渲染的过程就是先解析html生成dom树,再解析css样式表获得css样式树,然后结合他们俩生成渲染树,然后根据渲染树进行布局和绘制,将页面显示在屏幕上。
18.场景题:实现一个二维码的扫码登录。是否有做过这个业务,如果没有的话,从技术员的角度想想如何实现。
先思考了一下,想到了之前做的业务里有登录注册时发送验证码的业务,然后感觉应该原理差不多,试着讲了
回答:没有做过二维码的业务,但是我觉得应该和我之前做的验证码验证的差不多的原理,因为验证码和二维码的一个主要应用场景就是验证身份。我当时写验证码时,是先在服务端生成一串数字,然后通过邮箱等方式发送给客户,如果客户输入的验证码传个后端进行校验成功就可以成功登录。然后二维码的话,因为我们常识知道扫描二维码之后是会解析出一些数据的,这就包含比如说身份数据之类的。我觉得二维码可能就是也是服务端先通过一些第三方库生成二维码图像以及一个类似于标识符的东西,然后客户扫码之后就能解析出一些内容,服务端再进行校验就可以了。
然后说完,hr补充问题,说,你这还没有讲完呀,我们需要的是一个完整的流程,服务端校验之后要怎么让客户端知道验证成功了然后继续下一步操作呢?
hr这句话提示了我,我在思考的时候就想起了前几天刚复习的websocket,然后回答:这里的话是需要服务端给客户端一个响应告知验证成功的,然后这里因为axios的功能呢(胡说八道什么呜呜),服务器没办法主动向客户端发送响应,所以需要用到websocket来实现主动向客户端发送验证结果的请求。
这里提到了websocket,hr就说可以过了这道题
19.在业务中如何获得客户端的真实ip
这个我不知道,但是提出了基于这个问题自己的思考,讲了在获取过程中要考虑到一个安全性的问题,比如说可能会接收到假的ip地址之类的。
然后hr说服务端在接受了数据并进行处理之后通常是要发出一个响应的,如果这个ip是假的,服务端就发不出去,所以几乎不需要考虑这个问题。然后hr说,在你现在比如说你是在学校吗,你所在的校园网,你自己其实并没有一个完全属于你自己的ip地址,那么如果说我们在一个假想的完美环境下,客户端和服务端都在公网中有ip地址,请问我的服务端能够获取到客户端的ip地址吗?
我回答说可以的,因为他们都在公网中可以查询到。
然后hr提示我说还记得ip的报文结构吗?
我说我不太记得了,只记得有源IP地址和目的IP地址之类的。
然后hr说对呀,所以说ip报文数据中存储了源IP地址肯定是能获取到的对吧。(这里才恍然大悟 刚才没想清楚,还是计算机网络忘了很多东西,需要加强),然后给我讲了一下如果如果源ip地址是假的会怎么样。
这里我脑子有点混乱没讲上来,这个问题就过了。
20.问了一下是否了解nat(没有)
21.好像还问了啥 忘记录音了!!忘记了
21.说明公司是不支持远程办公的,问我这边情况如何?
我说之前学长学姐也有大三直接出去实习的,学校的课程只需要完成作业就行。
22.反问环节
● 问了后面的面试流程是什么样的 /还有一轮技术面和hr面
● 问了公司是否是全栈;/否
忘记录音了,还有一些问题不记得了,后面想起来再补充
补充
● 还问了最近在学习些什么新东西
答的nginx和docker,但是是最近刚开始入门的,所以后面说讲讲docker的时候没讲什么
● 还问了是否了解面向对象编程
我回答了java的面向对象编程原理,讲解了封装继承多态
● 还问了是否学习了typescript
回答没有学,但是正计划学了
● 问学习了设计模式之后对你有什么帮助吗
举例了vue的双向数据绑定中观察者模式的运用