有点沮丧,两面技术面都过了,在boss面非技术面试的时候莫名其妙地被刷了。下面详细说下这次经历,总之,收获颇多
一面
之前笔试了,没有收到面试通知,果断去霸面。一面是4月1日愚人节,其实都有给面试官祝节日快乐后马上滚蛋的准备,所以,有之后的经历还是蛮意外的
面试开始,面试官让做一张试卷,A4纸,正反两面,都是些基础题,很快绝大部分都搞定了,到最后,修修补补, 剩下一道没做,正式开始了面试。现在想来,虽然笔试过了, 其实好多都是有问题的
首先,面试官让作自我介绍,我详细说了从什么时候开始学前端,怎样学习的。由于基础知识还算过得去,看得出来,面试官还是满意的。
第一个问题,如何判断当前的域名是属于腾讯的,也就是主域名要是qq.com。我就说,通过location.hostname取得服务器名,然后判断这个字符串是否包含qq.com,写了一个正则,/*.qq.com*/,很快就被否定了,面试官说,如果是qq.com.baidu.com呢,改为/*.qq.com$/。面试官说域名恰好是qq.com呢。由于正则只是打了个基础,再用正则来匹配就不会了,面试官提醒,正则不会可以用原始的方法嘛。想了想,可以取得字符串最后六个字符,判断是不是qq.com,似乎是没了问题,但面试官又说假如是aqq.com呢,哦,对呀,不行,我说那就先判断服务器名的长度,如果恰好只有六个字符,且是qq.com,那么就判断是,如果长于六个字符,那就用正则来匹配,就这样第一个问题过了。
第二个问题,统计一张页面中出现频率最高的字母。我说,先取得页面中所有的字符,然后循环遍字符串,然后和26个字母匹配,统计出现的每个字符。其实在说时,也没底,具体怎么实施还不清楚,面试官说循环几次,磨破了头也想不出来。
“把代码写出来!”
开始写代码,发现其实两个循环就够了,首先用一个letters对象来记录每个字母出现的频率,初始化为0。由于字符串也可以用下标取得每个字符,所以主循环是一个for循环 ,遍历每个字符,然后用for/in循环判断text[i]是否在letters对象中,在就将对应的字母加1,每个字符必然都会在letters对象中出现,这样最终就得到每个字符出现的频率数。面试官问,如果开始是一个空对象呢,同样的,代码结构不变,for/in循环中,判断字符如果出现在letters对象中,将对应字符频率加1,如果没有出现,则为letters增加这个字符属性,将频率置为0。面试官又提醒有问题,想了想没想到,他直接说了,因为这个字符已经出现过一个了,所以应该置为1。面试官说然后呢,我说最后返回letters就行了。真是捉急,做题做得把目标都给忘了,题目是找出出现频率最高的字母。
嗯,又开始遍历letters对象,写下for (var i = 0; i < letters.length; i++) {...}就这样又犯下脑残错误,letters属性明明是字母,上面还用了for/in循环,居然还这样写!
一面总共就这两个问题,包括做试卷的时间,总共花了一个小时左右,每个问题勉勉强强地过了。到楼下的时候,不到半个小时,又收到了第二天面试的通知。后来还补发了一条短信,明天请带电脑,进行机试!心里忐忑啊,机试挂的几率太大了
二面机试
二面在4月2号下午四点,也是早早地就过去了。差不多就在四点开始做题
第一题是搜索框自动补全功能实现,不能用库,想想悲剧了。由于还要面试其他同学,面试官隔一段时间就会来问我做得咋样了。折腾了半天,没有半点气色,老实给面试官说原始的没有写过,不会做,然后面试官说那你就用你会的方式实现。好吧,开开心心地引入jQuery,还是折腾了一会,基本的自动补全功能总算出来了。这道题做出来花了四十分钟左右吧,挺惊险的
第二题,面试官问,如何保存一个溢出的数。我说用二进制表示吧,后来面试官又问了什么,反正他不打算再考这道题,换成了一道CSS题目
第三题,一共两列,左边100px,右边随着浏览器窗口自适应。还是折腾了一会,最后解决方案是,用一个container包含两列(两个子div),container用clearfix方法清除子元素浮动,两列向左浮动,container和自适应的列不设置宽度,这样得到了效果,面试官看了看,让过了。
第四题在第三题的基础上扩展,三列,左右100px,中间自适应。这道题没做出来,到现在才发现自己还有一个BFC的盲点,其实可以container包含三列,第一第二列分别左右浮动,并固定宽度,第三列不浮动,用overflow和*zoom:1使其具有BFC由于第二列向右浮动,脱离正常流,那么第三列,也就是自适应的列会出现在中间。这道题没做出来,面试官也没有刁难,换了另外一道题
第五题也是最后一道题,实现拖放功能。也就是在页面上拖动一个div块,最后它会停在鼠标松开时的位置。很幸运,在4月2号早上看了下《JavaScript高级程序设计》,正好看了这个题,很块就搞定了,实现还不错。
二面结束大概六点二十,面试官最后问实习时间大概有多长(心中窃喜,心想,二面是过了,技术面过了,把握就大大地有了),我说大四没什么课,可以一直实习。看的出来,他又收到满意答复。
最后我又问,还会有几面啊。他说如果还有的话,还会有两面,一面是专业面试,一面是hr面。我问什么是专业面试,他举了一个例子,70%的人喜欢打篮球,80%的人喜欢踢足球,问同时打篮球和踢足球的人的范围。还补了一句,这个问题你能打出来吗?这是我心里自苦恼,我这是何必呢,自己往刀子上碰
以前上概率论课做过这种题,谁还记得啊,拿出纸笔,画画写写,加提醒,居然弄出来了。
二面结束时,异常兴奋,心想,实习的事儿把握大大地有了
万恶的三面
收到三面通知是在晚上十一点四十左右。以为第二天是考面试官说的这种类似逻辑的题,还熬夜看了些IT面试逻辑题,奇奇怪怪的题看了不少。晚上没睡好,欣喜加担忧
虽然是在下午三点面试,由于朋友是在早上,所以早早地就起床了,其实是六点过醒后再也睡不着,索性七点四十就起床了。
面试官一看就不是码农。让我做性格方面的介绍,简单说了两句就开始了面试。
奇怪的是,一开始他说,在他的部门,是去做终端开发,问我数据结构和算法学得咋样,我就郁闷,我面的是前端,技术面也是前端,要找我去做终端!还是很淡定地应对,我数据结构和算法入门了,后来转前端没怎么搞这些了,大一的时候学过,近期补了补。我又说,可以呀,我本来就是打算以后做ios开发的(真是这样),在这个问题上纠结了一会,开始了正式的”压力面“,主要考察应变能力。
第一个问题,前端性能优化有哪些。基本的我还是知道一些的,答了几条,其实从这个时候我就知道他不懂前端,他很可能是通过你答的流畅度来判断你说的是否正确,答完之后他没有深究,继续下一题。
第二个问题,一个手机app要做一个网盘功能,但是有一个有一万条记录的列表,没有分类,用户在打开app时,查找列表会耗很多流量,同时对服务器来说也是很大的压力,问我该怎么解决。想了一会,想从服务器入手,我说,可以用DNS负载均衡来缓解服务器的压力,这样对用户来说,访问资源也会加快。第二,给app增加提醒功能,提醒用户,这个请求会耗费较多流量,同意就请求,不容易就不请求。第三时,只请求一部分数据,用户不需要的数据就不请求。期间他还刁难了几句,都问题不大,应对上了,这个问题他跳过了
第三个问题,如果在一亿条记录中,随机取出两份属性相同的记录。问题关键是,总的数据量很大,取得的记录数不是重点,关键是要保证两份记录属性相同,比如,记录的男女属性,所在城市等信息不会影响结果。很重要的一点是要保证随机。
完全没有思路,想了半天都没头绪,后来他举了一个例子,他说,比如取QQ号位数是0的记录。后来我说,根据从腾讯98年成立开始到现在成立16周年,根据用户注册时间来划分块,然后在每块里面取。他纠正我还要给出随机取的方法,比如每个块有一千万条记录,你怎样从中随机取。这个问题最终以失败而告终。
第四个问题问,产品经理提了一个需求,问你该怎样应对。问题就简单,没有额外的信息,没有是与否,不管你是同意还是不同意这个需求。我说,这个问题从两个放面来看,一是同意该这个需求,就给产品说,需求可以改动,但是产品周期可能会增加。面试官说,没问题,加吧,其他条件都不是问题。从另一面来说,不同意该需求,我说,先分析改动需求的利与弊,如果改动需求增加的付出,和商业利益比较,利大于弊,那么可以改动。面试官提醒,在一个公司里,你就一个螺丝钉,谈不上商业利益,商业利益根本不在你考虑的范围之内,你又该如何应答。
我又说,经过技术主管的评估,改动这个需求产品的整个架构都会改变,改动的代价太大。他问,那你样去和产品说呢,意思是,结论你们技术团队是得出了,关键是你怎样和产品去交流。他还补了一句,这个需求如果是马化腾提出的呢。这下还怎把我给问住了,因为当时有点紧张,还没有抓住他问题的关键,又去纠结于技术团都的讨论之类的,他继续提醒,就是已经讨论过了,结论已经有了,你怎样和产品说,这个需求不改动,你怎样给产品说,最后产品又该怎样给马总交代。
此时,他似乎挖了一个坑,他说,你不用紧张,答不出来也没关系。哇塞,终于找打一个台阶下,我说,确实啊,没有切身体会过,不知道该怎么办了。如果这里是导致我失败的原因之一我真是笨死,自动往坑里跳。
第五个问题。产品在各种机型上通过了测试,但是到了用户那就是有问题,他举例说是微信。我说首先是收集用户反馈,确定用户的所用的机型,然后测试人员搭建和用户相同的环境,再进行测试。他又说,很遗憾,测试通过,但用户还是有问题。他还特意补充,其他条件可以任意满足,反正用户那就是有问题。我又说,那通过远程协助的方式来解决,他说,现在远程协助的技术用不了了,你又该如何解决。想了一会,我说,因为,这个问题在大面积的用户那出现,已经影响了我们产品,如果可能的话派工程师去与用户直接面对面的交流。
到这里,问题算是问完了。
最后,他又提到了开始的问题,也就是让我做终端开发的问题,还说很可能实习的时候就开始做终端。我狠了狠心,说可以,就是不知道时间上来得急不。现在想起来,自己还真是笨死,居然没有提,我可以做终端的前端开发啊,反而一直强调,自己是做前端,想去实习的时候接触专业的前端团队。后来他还问了,你是哪里人啊,我说是四川某城市的,他问为什么不去成都啊,我说北上广杭的环境相对成熟些,较成都好。
到这里三面正式结束,本以为,技术面过了,这种面试应该问题不大,何况,三面时我还答得挺多的。晚上回到学校,查微信是复试中,4月4号早上没收到通知,就觉得有问题,下午再查微信时,很遗憾,未能通过面试………
写在最后
说实在的,能通过技术面已经是很幸运了,自己没什么实际的项目经验,主要是看书,写demo,写过的东西可能还真算不上项目。但是到现在还是想不通三面的问题出在哪,哪里是问题的关键,希望看过这篇文章的人能帮我指点一二。
技术方面的事。自己确实还欠缺很多,不过很幸运的是,我还有一些时间,还有机会。自己还投了其他一些公司,不管怎样,接下来还需要不断努力,争取在今年九月份真正找工作的时候,凭借现在的经历,那时候的实力,找到好的归宿