说起来非常神奇,3月22日晚上我决定投个简历试试,然后就打开了腾讯校招的网站,开始填网页上的简历,前三页是一些基础个人信息、联系方式、照片等等。第四页是很多实习经历、项目经历之类的,因为内容很多,我就想着一边改一边填。结果晚上12点钟的时候接到个邮件,问:同学,你怎么简历上看不到信息?(因为我第四页的内容还没填)我就把简历的pdf发过去了,然后就神奇地约了一面时间……这大概就是“简历被捞”?
3月25日下午两点点做了一个笔试,发了一个腾讯文档,里面有4道算法。
时间是下午2点到3点,语言不限。第一次这种形式的笔试,比较紧张。以前写算法题都是用C++写的,这次因为是面前端就第一次全程用js写了。
第一题是普通的js基础语法操作,写的时候没看到有进位这个限制。
第二题动规,以前见过。但我当时心态过于紧张,已经很久没写过算法题了,觉得自己一个小时内不可能把思路实现成完整没有bug的代码,就写了个f(n) = max (f(n-2),f(n-1)+data(n))。
第三题写了一个前序和中序,如果中序和前序输出的结果相同就是一样的树。
第四题转换成求第k大个数(算法课上其实都写过,算法老师我对不起你),然后log复杂度就是分治,时间不够了,就没写。
不得不说面试小哥真的很善良,邮件说说大概看了一下,第四题可以好好想想,晚上八点聊一下。结束后就在leetcode上找了一下第四题的解析,自己再写了一遍写了上去。
晚上8点的面试,处女面,全程一个小时多。电话信号不太好,讲完上午的题以后就加微信打微信电话了。面到一半才想起来拿笔记一下面试内容防止忘掉……所以只记得一些我答错的和印象比较深刻的题目(所以并不是基本上所有题都答错了……有些答对的基本都是是90%面经里都会出现的问题,除了第一个问题下面的问题都不分时间先后)。
面试小哥声音听起来挺年轻亲切的。
没啥好说的,稍微准备了一下,不会口胡。
我说电子书,ES5是网道的一个教程,ES6是阮一峰的开源电子书,《ES6入门教程》。(这个小哥很推崇看书)
讲了一下上午的笔试。提醒了我一下第一题有进位的问题,让我口述了一下第二题的思路(要么是奇数层要么是偶数层,动规)。第三问问如果不用递归,给你一个头结点,怎么遍历二叉树。我描述了一下用一个队列可以bfs。(如果是中序前序的话应该用栈)第四问讲了一下思路,然后说自己想到了用分治,但是跟k有关的变量一些边界条件当时时间太少了就没写出来。
(事后看了面试小哥微信的招聘文案,应聘要求里把熟悉算法和数据结构加粗了……不过还好实习考察的算法不是很艰深)快排主要是一个序列选定一个游标,可以是中间那个数、开始那个数或者随便哪个,两边往中间遍历,把这个数组排序成左边的数都小于这个游标,右边的数都大于这个游标。时间复杂度nlogn,最坏是n^2(全是逆序的)。归并排序是把两个有序数组归并成一个。
跟vue有关的就这个问题,因为我字里行间都透露着“对于vue我就知道这个了”(哭)。讲了一下Object.defineProperty()对于get和set的劫持。
我说了XMLHTTPRequest这个类,还好没继续问,具体的方法我都没记。
(这个问题之前的问题是“你js、jquery、vue.js哪个了解的多一点”,我vue就是只知道个双向数据绑定的程度,然后就说主要是原生js和jQuery。之后就开始问JQuery的问题了,当时我心态有点小崩,补基础的时候基本上看的都是js的内容。)
我记得哪儿看到过这个,但就记得是js模块通过某种语法暴露出了这个符号。面试小哥说可以回去了解一下。之后查阅资料得:
$代表jQuery对象,同时也是一个函数对象
$()和jQuery()是jQuery的核心函数,执行这两个元素返回的是一个DOM元素
$()是一个函数,等同于jQuery(),可在括号内传参数,传参后可获取元素
$(".one")表示获取class=“one"的元素,返回一个jQuery对象
$(”.one").onclick表示class="one"的点击事件
$.post() $.get() $.ajax() 都是jQuery对象的方法
我说了个document.getElementById()和其他一些方法,然后说还有一些方法可以获得父标签下的字标签列表啥的。小哥说具体什么方法,比如获取h标签下的ul标签下的li标签,我说不太清楚以后小哥说没你说的那么复杂,很简单的,可以回去了解一下。
事后查阅得:
document.querySelectorAll()
晕了,JQuery用多了忘了这个了……
我哭了,我都不知道JQuery有animate()方法。然后我说可以用CSS3的animation(面试前一天刚看的),让我具体说一下。我说给div的这个css写一个伪类,具体哪个伪类,我当时不知道是不是hover(没实践过)就说不清楚。这个伪类绑定一个animation的关键帧。
事后简单写了一下,还真是hover……
hello
.s{
margin-left:0;
width:100px;
height:100px;
background:red;
}
.s:hover{
animation:move 2s;
}
@keyframes move
{
0% {margin-left:0;}
100% {margin-left:100px;}
}
用JQuery.animate()写了个类似的。
hello
#d{
background:red;
width:100px;
height:100px;
margin-left:10px;
}
我讲了一下标准盒模型和怪异盒模型,盒模型从内到外是content-padding-border-margin。标准盒模型,width=content,怪异盒模型,width=content+padding+border。
??这又涉及到我的知识盲区了,面试小哥真的心善,引导我在纸上画了一个盒模型,然后说怎么利用盒模型的这些层次实现这个效果。当然我还是“??”,面试小哥说我可以回去看一下。
事后查阅资料:
.triangle {
width: 0px;
height: 0px;
border-width: 26px;
border-style: solid; /*定义的是实现边框*/
border-color: transparent #dadada #dadada transparent;
/*顺时针顺序,上右底左*/
/*若是三个值的话,上,左右两侧,底*/
/*若是两个值的话,上底,左右两侧*/
/*若是一个值的话,四个方向都一样*/
}
茅塞顿开……这样的话也可以画梯形和其他奇怪的形状了……有点trick
到这里面的时候已经有点久了,我头已经有点晕了……XSS和CSRF都是面试常客,我也就是了解的程度,基本开始口胡,就说是在字符串内嵌入恶意代码,具体问什么代码,我继续口胡js和sql什么的。面试小哥说那你说的是sql注入吧,那比如mysql是怎么防范这种攻击的?我:?,只好说了个存储过程。然后小哥说回去后可以补一下这方面内容。
XSS和CSRF这篇文章讲的不错:XSS与CSRF攻击
简单来说,XSS类似注入这样的js代码,在用户的浏览器中执行。防范措施有:通过 Content-Security-PolicyHTTP头来开启CSP、HttpOnly保护cookie不能在客户端读取、输入检查转义等。
CSRF攻击主要是在用户打开合法的A网站的同时,诱导其打开钓鱼网站B,在B网站内访问A网站的接口,诸如删除数据库内容、转账等等,因为跨域,所以得不到服务器返回的解析的结果,目的只是利用用户在A网站的cookie执行服务端的操作。防范措施有:Referer Check和token等。
这句总结我觉得挺好:
XSS是利用用户对指定网站的信任
CSRF是利用网站对用户的信任
总算有个比较熟的了。讲了一下构造函数的原型对象,实例对象的__proto__指向构造函数的原型对象,原型对象也有自己的__proto__,构成了原型链。
bind()是更改一个函数的this指向,返回这个新的函数。apply的参数是一个数组,call的参数就是缺省的形参。
ES5有arguments,ES6有…的缺省运算符。
基本也是面试必问,计网期末考也考过……中规中矩讲了一开始DNS解析,然后TCP,最后返回网页。DNS这部分提到了端口,我回答web服务默认是80端口。TCP三次握手详细讲了一下(我好像口胡成了三次挥手)。接下来返回网页的这部分真的是重灾区,浏览器、DOM的渲染机制我基本全靠蒙。
前提的情景是,一个网页,头部是10个,有10个css,中间是body,最后是10个
,一个css下载要10秒,10个css要多少秒?我踌躇了一会儿,回答说10秒,因为是异步非阻塞的。(不太确定)那10个js加载要多少秒,100秒,因为js阻塞DOM。提了一下ES6的defer和async。
加载css的n秒内,浏览器页面是什么样子?我一蒙,说是白屏,然后小哥善良地引导我说这时候DOM不是已经解析了吗?这个问题基本爆炸了。
事后查阅资料得:
css加载不会阻塞DOM树的解析
css加载会阻塞DOM树的渲染
css加载会阻塞后面js语句的执行
唉,原地爆炸,前提情景是,刷新了一下页面,每个资源都会访问服务器吗?我说不会,有缓存。小哥引导说有缓存就一定不会访问服务器吗。我说缓存的资源在获得时会有个有效期限(这就是我认知的极限了)。小哥让我多了解一下浏览器的缓存策略。
浏览器的缓存策略
一开始问的是“ip多少位”,我一听很紧张,这么弱智的题目如果我说错了估计就完蛋了。我冷静了一会儿说ipv4是32位,然后顺理成章问ipv6多少位。(计网老师我对不起你)我只记得上课对ipv6的印象是“怎么一下子比ipv4多了这么多位?”最后记不起来就说是128位还是256位(应该是128位),面试小哥让我回去看一下ipv6相关知识。
我晕了,我就在计网考试前背过这个,然后口胡说前两行是ip(应该是端口,ip是网络层的),后面有些字段是ACK、SEQ、FIN啥的用来握手和挥手。然后面试小哥说没关系就随便问一下,他也背不住,但前两行肯定不是ip。(我当时觉得自己应该会被当成白痴了)
TCP是全双工。全双工是同时可以发送接收,半双工是同时只能发送或者接收。
基本上面试必问,我就说了JSONP、CORS和webSocket,其他一些不熟的就没说了。JSONP是前后端配合,因为script标签不受同源政策,所以可以直接返回一个字符串,这个字符串作为js代码直接执行,通过指定回调函数名来进行后续的操作。CORS就是用户在跨域时,浏览器自动加上几个头字段,origin之类的,主要是后端对返回的报文头进行处理,比如设定哪些域可以跨域等等,比如springMVC就可以通过注释全局设置跨域或者单独设置。(具体的字段我不记得了,小哥也没继续问)webSocket我就只知道聊天系统一般是用这个做的,还好没有问。
这就属于我的知识盲区了……然后小哥说上古时代是用iframe,再古一点用form的action不受同源政策的影响。
我想了一下“页”是“叶”还是“页”来着,然后说是虚存到实际内存的一种映射方式,因为虚存肯定比实际内存大,然后就需要一种存储管理方式让虚拟内存地址映射到实际内存的地址取出数据,因此还有缺页处理之类的。(差点就要对不起操作系统老师了)
(小哥提到了编译原理,我赶忙说这学期编译原理正在学)
我讲了微信小程序的一个Canvas的模块,详情见【微信小程序】可拖拽操作的“树状图”模块的制作和小程序经验的总结
我说自己写过spring那一套,了解过python后端,本科学习过C/C++。
面到50分钟左右的时候就开始问一些类似学习排名、四六级成绩、学校地址、家庭住址、兴趣爱好、考不考研的问题了。我当时可能过于紧张,以及看的一些面经对我进行了误导。在问兴趣爱好的时候我说“可以跟技术无关吗?”(因为看到了一个面经这个问题上被怼了),面试小哥说没关系。
我先问了“听说有的部门只写js,有的部门只写css”,小哥说他们部门是只写js的,但问了这么多css的问题也不是说css一点也不用掌握,万一哪天要写呢。第二个问题是后端数据是自己编还是怎么,小哥说有专门的后端同学。第三个问题是怎么称呼面试官,比如“学长”“师兄”之类的,小哥说他们不在意这个,可以随便称呼。
面试小哥还问我了不了解事业群,我还真不了解。然后介绍了一下自己的部门是微信公众号团队的,我觉得还不错呀,至少是我听过用过的东西。
面完后微信问我,我对加班怎么看?我又一度紧张,这不是死亡问题吗?面试小哥说:兄弟,当程序员就别想着不加班了。仔细想想这是在提醒我标准答案?
3月27日下午四点半约的二面,太惨了……而且面试过程中的音质非常差。我就不说我当时回答了些什么,就记录一下问题和有关答案。
跟一面一样,还是电话面试前先一个小时做了四个算法题。
看着简历上的项目问的,我晕,数据引擎是啥……
我就在es6入门教程的目录里看过这个……
稍微讲了一下https的过程,对称加密非对称加密结果这次面试后的下个星期的计算机系统与安全课上就布置作业,我晕……
因为感觉自己挂定了,就没怎么记,电话全程也就三四十分钟。但后来竟然过了,可能是基础部分答得比较好,毕竟面试官也知道你一个大三学生几斤几两,不会问太深的框架细节问题。
3月30日的时候发了邮件约hr面时间。约的是4月1日下午2点,2点20分才来电话,我都以为是二面表现太差被鸽了……hr是个女生,开场说抱歉耽搁了点时间电话打迟了,全程都挺友好的,没有压力面非常友善的交流。本来想一边面一边拿笔记一下,但因为信号不太好我只能四处走动,只记下一些自己印象比较深的问题,排序不分先后。
4月3日上午10点多offer call(平时基本上这个点我都在睡觉……前一天睡得比较早才醒了),下午发了offer邮件。第一次投简历第一次面试就这么神奇的结束了……
不可否认有运气因素,至少我遇到的面试题跟百度上的各种前端暑期实习比起来真的简单很多。从2月20日左右开始准备面试,包括整理自己过去做的项目、回顾项目代码、总结出难点和技术点,补js基础(ES5和ES6),写简历,然后就是反复地看面经。每天基本上都是写学校的课程作业+看js。大概学到“面经上的题目都能看懂,大部分能回答出来”的程度就开始投了。
可能是团队要求,对基础、数据结构、算法这块要求更多一些,虽然很多面试问题我都在胡说八道,但两次的小型笔试我做的都还ok(一面前一天正好复习了一下排序算法……)。但讲道理前端的算法要求也不高,可能是考察你的代码风格之类的吧。
个人感觉包括hr面,表现的都比较阳光向上?以及打电话过程中一定要有礼貌。
ES5:网道-JavaScript 教程
ES6:阮一峰-ES6入门教程
还看了点vue,但面试的时候除了一个双向数据绑定,其他啥都没问。