三月份过去了,笔者的春招实习面试也告一段落了。在这接近一个月的时间,经历了面试时的紧张、失败时的痛苦、拿到offer的兴奋。目前面了字节、美团、腾讯、清远墨墨、阿里。并拿到了字节、腾讯、清远墨墨的实习offer。
这次就先从笔者就从自己的心路历程结合面试干货娓娓道来。(ps:由于笔者没有面试完就及时写面经的好习惯,以至于一些细节有些忘记了。我会在想起来的第一时间回来补充)
初面试-字节跳动(头条部一面)
这是笔者人生第一次面试,有些紧张。面试官是一个有点严肃的小姐姐,看到她第一眼笔者就觉得是自己心目中程序媛的形象。
let j = ()=>{
return 2
}
new Promise((resolve, reject)=>{
resolve(1)
}).then(j).then(req=>{
console.log(req); //2
})
这次面试表现得不是很好,很紧张,写编程题的时候手都在抖。幸运的是当天晚上就被告知通过了。第二天开始二面。
字节跳动(头条部二面)
二面面试官是一个小哥哥,没有露脸,全程语音交流。
1.实现一个add方法
add(1)(2,3)(4).value() 输出: 10
function add(...num) {
let curr = function (...out) {
return add.apply(this, num.concat(out))
}
curr.value = function () {
return num.reduce(function (pre, cur) {
return pre + cur
})
}
return curr
}
2.实现一个异步队列Queue,要求按时间依次执行callback
new Queue().task(1000, function () {
console.log(1);
}).task(2000, function () {
console.log(2);
}).start()
答案1:
function Queue1() {
this.queue = []
this.task = (time, fn) => {
this.queue.push({fn, time})
return this
}
this.start = () => {
let deffer = 0
for (let i of this.queue) {
deffer += i.time
setTimeout(i.fn, deffer)
}
}
}
答案2:
function Queue2() {
this.queue = []
this.task = (time, fn) => {
this.queue.push(function (resolve) {
setTimeout(function () {
resolve(fn())
}, time)
})
return this
}
this.start = async () => {
for (let i of this.queue) {
await new Promise(i)
}
}
}
这次面试的笔试题写的时候全是bug,给面试官留下很不好的印象。不过这次面试结束的时候,面试官给了我一些学习上的建议,并给我一定的鼓励。晚上的时候HR来点说要进行评估,无奈评估未通过。不过想起二面时面试小哥哥对我的鼓励,决定再战。
清远墨墨
笔者最开始接触清远墨墨是考四级的时候下载了这个app(虽然从来没有真的用过)。面试的时候有个hr小姐姐加了我,给我介绍公司,通知我面试。
面试的时候是在企业微信上,boss和技术一起面我。
原谅我只记住了这些,这次面试技术上更偏向于js基础知识,问了很多口头判断题,只需要回答yes or no就可以了。
如果有想去向清远墨墨这样的小公司实习的,笔者建议多了解这个公司的相关信息,因为很可能接触到BOSS的灵魂拷问。清远墨墨公司压力相比于大厂小,公司里养了很多猫,还是个猫咖。如果不是为了面包,笔者是很青睐这种公司的。虽然拿到了offer,还是婉拒了小姐姐,对方还很礼貌的问我,怎么不来了呢,是不喜欢广东吗? T_T 。
腾讯PCG一面
这次面试是在电话上进行的,面试官小哥哥说话很清晰,问的问题也很细,总体来说表现还是可以的。
1.初始化 webpack.config.js 最后的配置结果
2.初始化compiler对象,注册所有配置的插件,插件监听webpack构建生命周期钩子。 调用run。
3. 根据入口文件,分析模块依赖(深度遍历),treeshicking
4.对应的文件使用对应loader loader是一个函数 右到左的顺序执行 输入参数是一个字符串,输出参数也是一个字符串
5.得到每个文件结果,包含每个模块以及他们之间的依赖关系,生成chunk。webpack将所有的模块打包成一个函数
6.最后生成bound文件 是一个自执行函数
强缓存 Expires 字段(受限制于本地时间)
catcel-control字段 max-age 、 public、 private 、no-store 、no-catch
协商缓存 Last-Modified服务器发往客户端、f-Modified-Since客户端发往服务器,携带 Last-Modified 不准确 ,引入Etag
Etag 文件的唯一识别符 通常是计算文件内容的md5
function add(a, b) {
let res = ''
let newA = a.split('')
let newB = b.split('')
let c = 0
while (newA.length || newB.length || c) {
c += parseInt(newA.pop() || 0) + parseInt(newB.pop() || 0)
res = c % 10 + res
c = c > 9 ? 1 : 0
}
return res
}
function multiply(a, b) {
let arr = []
let num = 0;
for (let i of a) {
let temp = num
for (let j of b) {
if (!arr[temp]) arr[temp] = 0
arr[temp] += (i * j)
temp++
}
num++
}
for (let i = arr.length-1; i >0; i--) {
if (arr[i] > 9) arr[i-1] += parseInt(arr[i]/10)
arr[i] = arr[i]%10
}
return +arr.join('')
}
这次面试感觉还不错,面试官小哥哥给我讲了很多东西,还告诉我他在工作中的实际业务,使用的技术栈,现在的前端发展。对我这样的双非学历也一视同仁,我个人是非常尊敬欣赏这样的面试官的。打call!
阿里钉钉
阿里钉钉是在钉钉上加了群,和群主老哥聊过几句,最后也是这位老哥面的我。上来就是两个笔试题。
1.函数防抖?
function throttle(fn,delay) { //节流
let lasttime = 0
return function () {
let nowtime = new Date().getTime()
if(nowtime-lasttime>=delay){
fn.call(this)
lasttime = nowtime
}
}
}
2.爬梯子问题?
function jumpFloor(number)
{
let fib = [0,1,2]
if(number<3) return fib[number]
for(let i = 3;i<=number;i++){
fib.push(fib[i-1]+fib[i-2])
}
return fib.pop()
}
面试题
这次面试和以前的面试遇到的问题差不多,但对面没有直接问我问题,而是从实际问题引导我回答。我能听出对面是在引导我回答某方面的知识,但是我就是没有听懂他到底想问什么。面试快结束时,他对我说:我和你是老乡,之前也有在钉钉上聊过,所以特意把你的简历拿到了我这里,不知道这对你是好事还是坏事。(听到这里我知道已经凉了)之后他还顺便提醒我,你爬梯子代码那里写的是 * 号,应该是 + 号。 (我心里一阵凉风)。
心里很感谢这位钉钉的老哥,下定决心把平时模糊的概念一定要弄懂。
阿里CBU一面
/* 字符串隐藏部分内容
* mask('85022088'); // 85****88
*/
function mask(str, char) {
if (str.length <= 4) return str.replace(/\w/g, char)
let newStr = ''
let start = 0
let mask = `${char}${char}${char}${char}`
start = Math.floor(str.length / 2 - 2)
newStr = str.slice(0, start) + mask + str.slice(start + 4, str.length)
return newStr
}
这次面试总体感觉很不错,主要是因为面试官小哥人很幽默,面试氛围也很放松,和我闲聊了很多。这个小哥带给我很多积极能量,笔者希望能在以后遇到越来越多这样的人。
腾讯PCG二面
PCG二面很突然,早上刚起床来的电话,就匆匆开始了~
DNS
迭代查询 浏览器缓存记录 、本地host文件记录 、本地的DNS服务器
递归查询 根服务器 顶级域名、二级域名、权威服务器
逐层封装 tcp->ip->数据链路层(首部mac) 帧 ->比特流 -> 经过路由根据ip转发 -> ip解析到mac地址。 逐层拆解。
tcp三次握手过程 建立http连接
https、http
建立https连接 (TLS/SSL握手)1 客户端发送请求,支持的加密协议到服务端 、 服务端返回公钥和证书到客户端
2 客户端证书验证 生成对称密钥随机数 公钥对其加密,发送到服务端
3 服务器私钥解密发来的公钥,用公钥加密数据。建立通信http重定向 状态码 等
浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树。重排重绘。
这是个开放性问题,我也只能答到这种程度。
字节商业变现平台一面
个人觉得是因为这次面试问的问题恰好都是我了解的,对面印象不错,甚至夸赞我基础很牢固。面完直接开始进行二面。
字节商业变现平台二面 + HR面
这次面试官是部门的leader,比较严肃
大概是这些问题,有点记不清了。面完后就被告知通过了,等HR。两天后HR面,主要是问问你的优缺点,最近在读什么书,平时成绩如何。面完的两个小时便拿到offer,不得不说字节的效率是真的很高。个人觉得之所以字节发展的如此之快,和字节的务实、技术气氛浓厚,在管理上扁平化,有着很大关系。
这里拿到字节的offer后,网易来电面试,因为地域问题(笔者是东北银),婉拒了这次邀请。
腾讯CSIG交叉面 + HR面
过了大概几天开始腾讯PCG三面,这段时间拿到字节offer后面试欲望十分低迷。在PCG三面的时候我拒绝了接下来的面试。对面问了我为什么不面了,去了哪家公司,表示尊重选择。戏剧性的是,之后过了两天腾讯CSIG部门来电,我表示不太想继续面的时候,对方表示理解,告诉我之前PCG的面试的评价还不错,并问我如果直接发offer,是否愿意来腾讯。笔者当时很惊讶,答了愿意。没想到直接发邮件邀我三面。
三面面试官明显是一个大佬,在腾讯会议上面试,主要问了些项目的细节,全程只有不到20分钟,之后就进入到了HR面。
HR面的时候,对方迟到了10分钟,我连忙打电话过去问,HR小姐姐抱歉说刚刚在开会,之后电话面了20分钟。一周后拿到正式offer。
美团到店事业群凉面
这次面试我没有任何准备,来的很突然,拿到三个offer的我不禁有些得意,以为能掌控一切,没想到凉凉。。。
function FindContinuousSequence(sum)
{
let [start,end] = [1,2]
let result = []
while(start<end){
let total = (start+end)*(end-start+1)/2 //这里把求和公式忘掉了,最后还是对面提醒的我。
if(total<sum)end++
else if(total>sum)start++
else{
let list = []
for(let i=start;i<=end;i++){
list.push(i)
}
result.push(list)
end++ //start++
}
}
return result
}
这次面试问的大部分都是项目相关的事。面试老哥操着一口标准的东北话,跟我聊了50分钟,大部分时候都是我俩在那哈哈哈的笑,或者是他在那沉默。个人感觉表现的不是很好,不过手里有offer,挂了也没所谓啦。
阿里CBU二面
这次面试谈到项目时说了我做的云盘和聊天室,对方表示怀疑我是在培训班做的,我表示我只是个大三学生呀(哪有钱报培训班)。虽然问到的几乎所有问题都答了出来。但对面表示项目上没有亮点,建议我我在一些方向继续深挖。
我很感谢面试官的建议。笔者虽然基础还OK,但是确实在项目上有所欠缺,对面也是很看重项目经验。
之后对方部门组加了我微信,问到拿到哪些offer后(说了腾讯),表示可以去深造半年,秋招的时候会再次主动联系我。(那好吧)。有些遗憾的是,笔者春招是第二次与阿里失之交臂了,唉,菜是原罪啊。
尾声
笔者的面试经历大概就是这样了,感谢你的阅读。希望我们一起加油,为了搬砖努力把~