Blog - wingsico

简单记录一下第二次面试的经历,之后总结各个不熟悉知识点再进行整理。

为什么选择实习

考研or实习都是一种选择,不同的人适合不同的路,都需要结合自己的实际情况来决定。

就拿我自己来说吧,从大一开始接触互联网,接触前端后,自己对考研就没有什么想法了,因为当时自己对考研也没有什么概念,而且也遇到了自己比较喜欢的前端,觉得做前端是一件很幸福的事情。再加上优秀的学长拿到各种offer,自己心里对以后的自己也更加期盼,希望自己和他们一样优秀。

一步步走来,也遇到了很多困惑,也经常陷入到非常迷茫的状态,总是反问自己,自己是否真的适合做前端呢?加上周边人都非常优秀,自卑和不自信总是让我焦躁不安。加上大二下学期 Teambition 的面试失利,更觉得自己出来是根本找不到好工作/实习。再加上家人希望我考研的想法、女票考研、想深造等等的原因让我在大三上学期中下旬做出了去考研的决定,觉得尝试过了,就算失败没考上也是不会后悔,而且就算失败了到时候出来凭借自己三年来所学的前端知识应该也不至于没事做。抱着这样的想法,我踏上了考研的征途。

我开始了解有关考研的一切:学校、科目、复习计划、书籍等等等,开始每天英语,数学的轮番轰炸,开始6点半起床7/8点开始学习,到晚上10点多结束的生活,也早早的定好了意向学校。每天就是看视频、记笔记、学英语,但是学校也有一些事情(比如徐某的作业),也会干扰的自己的一些复习计划,加上女票因为一些身体原因也经常需要去医院之类的,我也应该陪同。在各种干扰下,自己的一个学习进度一直很缓慢,做题也非常的慢,心中难免会焦虑。而周某人=。=一天到晚给我发各种实习,扰乱我的心境(雾),让我一再有屏蔽他的想法(23333)。

但自己还是硬着头皮坚持了几个月,但每天并没有学习一天的充实感,学习进展也随着难度的增大而更加缓慢。之后让我再去思考到底是考研或者实习就发生在彪彪去头条实习之后。我开始仔细考虑,自己是否真的要去考研。

花了一个星期,我一直考虑以下问题:

  1. 考研的目的是什么
  2. 以后想从事什么方面的工作
  3. 考研会给我带来什么,实习会给我带来什么
  4. 对于以后想从事的行业是否对学历有着硬性的要求
  5. 自己现在的水平能不能找到一份较为满意的实习
  6. 一年后如果失败了如何应对
  7. 是否会后悔自己的决定

我的想法依次如下:

  1. 对我而言,考研是为了:
    1. 提高学历
    2. 深造以获得更多选择
    3. 重新学习大学的课程
    4. 陪女票一起,度过这段困难的时期
    5. 满足家人的要求
    6. 提高自己的竞争力
  2. 了解了关于云计算、大数据之类的,再读了一些关于分布式的论文后觉得这行也挺有意思的,想着如果能考上研究生希望去研究这一方面的技术。或者继续从事前端相关的事情。但后面更深入的了解关于云计算、大数据的一些具体的东西,觉得自己可能不太适合。但事无绝对,你没有深入一个行业去了解你永远无法知道自己到底适不适合它。但至少,前端我是很喜欢的也愿意去做相关的行业。
  3. 考研给我带来的也就是我考研的目的,而实习的话我在最初的选择也只有前端这一个选择,那么实习给我带来的是更早的接触公司的一些实际需要考虑的一些问题,技术上的提升,更早的经济收入、社会了解等等。
  4. 如果从事前端,在学历要求上更没有其他岗位的那么严格,初级阶段门槛也比较低。但是如果想往人工智能、大数据等方向进行发展的话,大部分还是会要求一个研究生的学历的。因为它需要这样一个较高门槛才可以去真正做出一些东西来的。
  5. 对于自己的水平,我一直是不是很自信,觉得自己学的东西比较浅,也有一些浮躁。虽然之前大二Teambition面试失败,但是很大一部分原因归结于自己没有准备(裸试可还行。。),所以对于自己的水平到底能否去承担起一个这样的职位还是没有底的。而后面彪彪拿到offer也给我了一些信心,我觉得我跟彪彪的水平差不多,我也许可以去尝试一下。
  6. 对于失败,我从一开始就非常的坚定,绝不二战的,失败了就直接去找前端的实习工作。但是,一年前端的空窗期会对自己的水平造成多大的影响以及前端行业的一年后会发展成什么样自己能否跟上,这些都是让我所担忧的。
  7. 选择前端,我不会后悔,至少我对考研我尝试过几个月,了解自己的一个学习状态。而对于选择考研,并不知道自己是否会后悔。

综合考虑一些问题之后,和家里人也沟通了很多次,各种思想斗争后,还是决定重拾前端。对于前端,我始终有着很大的热情,能够且愿意把时间花在上面,就算是遇到困难也会慢慢沉下心去解决。对于考研,我已经尝试过了,觉得自己的精力无法再全身心的投入进去,就算之后想起这个决定也不会觉得后悔。

就这样,我做出了这个决定,一个不再回头的决定 —— 找实习

实习准备

由于花费了数个月去准备考研,对于前端的知识就忘了一些,在提前联系了在头条的学长咨询相关情况后,决定先花一个月来准备,刚开始的计划是这样:

  1. 每天两道leetcode算法题
  2. 刷面经
  3. 每天看看公众号文章以及掘金文章
  4. 做一个关于react + typescript的项目
  5. 读一本关于前端工程化的书,再看看你不知道javascript
  6. 限定自己最晚投简历的一个时间(定为5月31日,但实际上6月2日才投)
  7. 每天解决一个自己不熟悉的点,列出了一份清单并贴在墙上

后面发现写新的项目有点来不及,时间不是很充裕。真正做到了的也就是把一些不熟悉的清单项仔仔细细的去读懂,每天刷两道算法题(到了后面就刷的更少了),读的书也只读了差不多一半,到后面快要到deadline就直接快速翻了翻相关的内容。

以上计划在这次面试除了第三点(也就是再去做个项目),都对这次面试起到了比较大的作用,其中起了较大作用的是 1, 2,6,7。然后最重要的就是刷面经了,通过刷面经,基本上解决了百分之六十的问题,很多被问到的问题也是我通过刷面经之后才知道的。所以刷面经很重要!!很重要!!很重要!!

关于简历的话,我还是使用了子健学长的简历模板,然后彪彪用的也是(然后在面试的时候就问了为啥你俩简历看起来样子都差不多)。如果有内推的话,简历只要把你的信息写好,做过哪些项目,会什么技术之类的写好就行,主要还是看笔试面试。

然后在这篇文章的最后会给出我看的一些比较好的文章的链接。

面试

每轮面试基本上都有一个自我介绍环境,简单介绍一下自己的信息,前端经历,项目经历,性格什么的。

一面

第一面的面试官感觉是个很随和很好相处的人,给我的感觉就是聊天没有什么压力,如果你答对了会给你一些反馈,答错了也会给你解释一下(虽然我答错的题目他也不能很清晰说出个所以然来)

一面问的问题都比较基础,我把我能想起来的都写在下面:


  1. 自己实现一个bind
  2. 写一个算法:找到一个数组的子数组,使得这个子数组的和大于一个给定的值n,并且这个子数组最短。比如arr = [1,2,3,4,5,6],n= 10,那么最短的就是 [5,6]
  3. vue.$nextTick原理,回退方案
  4. 异步队列,宏任务微任务(通过代码的执行顺序考察)
  5. 如何判断数据类型,为什么用 Object.prototype.toString.call() 来做,直接toString为什么不行
  6. setImmediate和setTimeout区别
  7. 闭包
  8. 逻辑运算(&&, || , !),运算符优先级
  9. this指向
  10. “aaa” == new String(“aaa”) // true or false
  11. null == undefined // true or false
  12. 字符串和数字运算得到的结果,比如 1 + “2” + 1 或者 “2” + 1 + “2” 或者 “2” - 0 + 3之类的
  13. es6 modules 和 commonjs 模块方案之间的区别(不是用法上的区别)
  14. http状态码
  15. CSRF是什么,如何防御
  16. 垂直居中方案
  17. position:relative相对谁定位
  18. new操作做了哪些事情

上面只是说了一个大概的,面试官实际上拿了一份pdf笔试题给我做了一下,然后能想起来就这么多,基本上都回答出来了,除了第13点,和第2点(基本思路对了,但是代码跑了个死循环=-=)

然后真心觉得面试官很能聊得来,就像聊天一样没有什么压力。

二面

二面的面试官比较严肃,给人一种居高临下的压力。这轮面试表现不太好,一方面是因为面对比较严肃的面试官我内心压力挺大,很多问题都有点答非所问。另一方面有些场景下原理了解的不是特别深,被问到就有点慌了阵脚。

下面是我能回想起来的一些问题:


  1. cookie,sessionStorage, localStorage 作用和区别
  2. 写一个寄生组合式继承
  3. 说一下事件的执行机制(事件捕获、冒泡)
  4. 用过Jquery吗?$.on用过吗?
  5. 介绍一下http
  6. https的通信原理
  7. http2.0有哪些新特性
  8. Vue的数据劫持,用Object.defineProperty相比于Proxy有什么缺点
  9. Vue为什么需要this.$set
  10. requestAnimationFrame是什么,用它做动画和setTimeout有什么区别
  11. 前端路由的实现原理(history, hash)
  12. 使用命令式代码进行路由跳转的时候(Router.push),如何监听url的变化,(Router.push的具体实现相当于黑盒,不能修改)
  13. 什么是反向代理
  14. 网页扫码登陆是怎么做的
  15. 同源策略,如何跨域请求资源
  16. 请求跨域资源要发几次请求,请求同源资源发几次请求,option请求是做什么的
  17. http的请求中包含哪些属性(比如Content-type之类的)
  18. 了解哪些加密算法,有什么区别
  19. 资源的缓存(协商缓存、强缓存),区别
  20. 说一下事件委托
  21. 对nodejs了解多少
  22. 你的优势是什么
  23. 你的缺点是什么
  24. 你有什么问题想问的吗?

3,4,8,11,12,16,23这几点感觉回答的不太好,虽然原理都知道,但是进行一些扩展问一下就不懂了,比如说知道vue数据劫持的原理是什么,但是不知道那两个方案有什么区别。虽然知道路由实现的原理,但是对于后面的给出的场景(监听url变化)没有想到一个很好的解决方案(连最基本的暴力setInterval都没想到)。对于请求中包含的属性也没有说太多,感觉是因为紧张想不起来。

然后说缺点的时候有点作死,说自己对于不喜欢的事情可能不是那么上心。。然后面试官说那给你分配你一些你可能不喜欢的业务的时候你是不是也不上心不好好做。。这个缺点我没有提前去想好怎么说,然后感觉就比较作死。。

然后后面面试官也看出我比较紧张(虽然我也跟他说了),然后让我调整心态,放松,不要沮丧。

wtf?我听到不要沮丧的时候我整个人都不好了。。难道我就死在二面了。。让我失败了也不要沮丧什么的。。当时我的心就凉了半截。。不过最后他说了这一轮给我过。。才放下心来。

后面问你有没有什么问题想问,我当时又作死去问他他觉得我表现怎么样。。不说了,最好不要问这个问题,现在想想脑子是不是哪根筋答错了。应该可以问问项目规划或者技术栈什么的。

对于二面,我想说的就是,学习知识的时候要多思考,多问问为什么,才能有去查看原理的一些问题。其次,面对自己不懂的问题,不要含糊的回答,大方的直截了当地说不懂就行了,不知道 > 乱说。然后就是要调整好自己的心态,面对压力的表现也是考核的一部分。(然后吐槽一下我花了大量时间看React的东西然后一点没问。。)

三面

三面面试官也比较随和,交流也很舒服。但是感觉说话不多,不过整个面试下来都是比较轻松的。

这一面关于技术的问的比较少,就问了一道leetcode上面的算法题。

寻找两个有序数组的中位数:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数。偶数需要将中间两个值除以二。

这道题我做过,在leetcode上是hard级别的题目,但是要求是O(log(n+m))的复杂度,我写了一个O(n+m)的。然后问我有没有更快的算法,有没有O(log(n+m))级别的实现。但这个复杂度的算法有点复杂,需要提前进行一些数学运算在结合二分查找来做优化,一时半会也没想出来,不过他也没有追究这个问题。

之后就问了项目相关,有没有什么项目可以给他看一下的,然后我就拿了重构的Us项目给他看(由于我已经没有一些权限了,所以只能看到家园圈子那一块),然后问了问你做了哪些事情,怎么设计的之类的问题。这个就是结合项目和你当时做的一些方案去说了。(所以说项目很重要,项目经验很重要)

在之后就问问一下简历上写的用node做爬虫的,是怎么做的。然后我就说了一下具体的实现难点,比如异步、并发控制,代理ip池,缓存中间数据等等,然后问了我为什么做这个项目,就又说到了这个是拿去参加比赛的项目中的一部分。然后就问了问我比赛的流程,怎么比的,获奖了没有,小组几个人完成的之类。

在之后又问了问高考成绩,跟当时一本线比高了多少分什么的。再之后就谈了谈实习相关,比如能实习多久之类的

总得来说三面是最简单的,没有过多的技术谈话,整个过程基本上都是我在不停的说,然后也是三个面试中用时最短的了,面完结束后就让我等hr电话了。

HR(这个不算面试,就是聊天)

这个就直接跟HR在电话中交谈,大概花了十多分钟。

问的问题:

  1. 家住哪
  2. 能实习多久
  3. 会去秋招吗
  4. 如果以后有更好的工作机会(腾讯阿里),会去吗
  5. 对于北京觉不觉得太远了
  6. 毕业是考研还是工作呢
  7. 有什么想问的吗

对于会不会去秋招我的回答是会去,会去尝试一下更好的公司面试是怎么样的,看看自己水平如何,但是还是留在头条实习。对于以后有更好的机会我老老实实回答的会去。然后对于北京我觉得还是有点远的,不过实习嘛,地点在我看来就没有那么重要。

总结

总的来说头条的面试效率很高,我提交简历一两个小时后就跟我联系约面试时间了,然后半个下午就完成了一二轮面试,第二天进行的第三面,每次面试持续时间一个小时左右。总之有几点建议:

  1. 面试的话一定要刷面经
  2. 一定要对自己学的知识再去深入的了解一下
  3. 要去做算法题
  4. 遇到不会的不要慌了阵脚,要及时调整好心态
  5. 知之为知之,不知为不知
  6. 至少做一个拿得出手项目

最后希望大家都能拿到自己心仪的offer。

参考链接

  1. 牛客网前端面试总结
  2. 小火柴的前端小站
  3. 面试官系列:
    1. 面试官系列(1): 如何实现深克隆
    2. 面试官系列(2): Event Bus的实现
    3. 面试官系列(3): 前端路由的实现
    4. 面试官系列(4): 基于Proxy 数据劫持的双向绑定优势所在
    5. 面试官系列(5): 你为什么使用前端框架
    6. 面试官系列(6): 写过『通用前端组件』吗?
    7. 面试官系列(7): 聊一聊 Babel
    8. 面试官(8): React 强调的『不可变数据结构』怎么实现?
  4. forthealllight’s blog
  5. 前端面试搜集
  6. BAT前端开发面经 - 附解答

以上均为参考链接,且都有一些回答的。然后感觉刷面经的主要作用就是让你知道你自己哪里不懂,然后再去通过其他方式来

 评论