CVTE(视源股份)前端实习生面经

忐忑

从3月6号在线笔试到3月8号技术一面二面,短短3天的时间,让我尝到了求职的不易,这是我第一次正儿八经参加面试,还是专业面试,3月7号晚上接到一面邀请短信的时候,有些高兴又有些担心,还差点失了眠。我做Web有一年半了,但是早期的时候,给自己定位全栈,学的东西很杂,也不深入,尽管勉勉强强做了些项目有一些成绩,但是真正开始了解前端也只是半年前,也是这半年我开始知道自己前端的水平还停留在5,6年前传统Web前端的地步。我是知道这学期校方要求去参加实习的,所以那时候突然就觉得很慌,自己一直以来的自信和骄傲都站不住脚了。于是,那段时间,我关注了大量的技术类公众号,每天坚持读一读,了解这个世界最新的技术尤其是前端的技术革新,以至于不会闭门造车;除此之外,我开始去打磨自己前端的基本功,我去找了《JS高程(第三版)》,一共700多页,闲暇的时候就读一读,这本书让我真正见识到了JS的厉害之处,想要学好JS还真不是件易事;我的CSS基础很弱,知识零碎不系统,为此我买了《精通CSS(第三版)》,大概400页,这本书的第三版也是今年二月底才上市销售的,我已经看了一半,内容很不错,知识系统而且有大量高级CSS的用法和实例,如果想提高CSS能力或是了解CSS的工作原理,我极力推荐这本书。

在线笔试

其实,做完笔试题目后,我是有些惊讶的,因为笔试27道题(25道不定项选择题,1道算法,1道JS高级API的用法),几乎80%的内容是有关JS的,虽然现在JS很火,而且基本上中台前台业务都有JS一力承担,但是作为Web前端实习生这个岗位,我觉得这样的试题比例有些偏颇了。我没记错的话,HTML的内容没有考,CSS的也仅仅考了一两道。幸好,我是先看的《JS高程》后看的《精通CSS》,要不然要惨了。凭着我的记忆,题目的内容大概有这些:

  • JS作用域的知识,JS全局作用域、局部(函数)作用域的概念和我们熟知的C或JAVA都不太一样,设计和实现思路不同,这也是导致JS中没有块级作用域的原因
  • JS闭包,闭包是JS中特有的一个有意思的概念,它的意思是有权访问另一个函数作用域中的变量的函数,通过闭包可以解决JS中没有块级作用域的缺陷
  • JS原型和原型链的知识,JS的原型是为了面向对象而设计的,原型链则是为继承而出现的一种编程技巧。其中尤其要注意,实体、构造函数、和原型之间的关系。
  • 同源策略和跨域问题,我们知道在ajax中是默认使用同源策略,不同协议,不同域名,不同端口的服务请求不被允许,但是通过一些手段,解决跨域问题的方案是有的(如,CORS、JSONP、图像PING等)。这个地方也是我的一个短板,后期研究后会写一篇专题博客讲解Ajax跨域。
  • Array对象的常用API,在JS中Array对象的重要不用多说,通过Array可以模仿许多数据结构,而且JS中Array对象有许多实用方便的API,在编程中可以节省很多时间和精力。我记得,笔试中是考了Array.map()这个API
  • DOM事件对象event,记得当时考的是如何阻止DOM元素的默认事件(比如,点击链接会跳转到href属性对应的URL),这个是使用 preventDefault() 这个API
  • ES5中的Object.defineProperty高级API,这个记忆很深刻,因为笔试前几天我刚看过Vue的响应式双向绑定的底层原理 ,还写了写代码。笔试中的题目是这样的 :
function proxy(){
	//to do 
}
var animal = {};
var rabbit = {
	name : ''
};
proxy(animal);
animal.name = 'rabbit';
console.log(rabbit.name);

题目大概就是这样的,没有任何解释,给我一段代码,让我补全proxy函数,也没告诉我最后console.log输出的rabbit.name 到底是多少?我猜想这里是让animal对象代理rabbit,因为兔子肯定属于动物嘛,用动物代理兔子,实现代理后,动物的属性变了会导致相应的兔子的属性也发生变化。那这不就是一个简单的单向数据绑定吗?animal对象加上一个访问器属性并让变化及时响应到rabbit对象上去就好了。实现这一代理,使用Object.defineProperty这个API就可以完成。

  • 有关CSS的内容出的很浅,我记忆中有一个 box-shadow 的题目,5个参数值搞清楚就没啥问题。其他的我有些忘记了,反正CSS的内容偏基础,不难。对于那些高级的CSS特性(如伪类,伪元素之类都没有考)
  • 剩下的就是一个算法题了,当时写了,但是不太对,后来下去又解决了。题目是这样的,可以自己思考一下:
// 买卖股票最大收益问题
//假设有一个数组 , 如[1,2,3,4,5,6,7],数组中的第i项(i=0,1,2...)表示第i+1天的股票价格
//你可以任意的买入和卖出股票,以获取一定差价利润,但是规定在下一次买入之前你要卖出你的股票,
//且不允许同一天买和卖 ,现在要求输入价格数组,输出最大的收益,下面几个例子

//input : [1,2,3,4,5,6,7]  output: 6     (第一天买入,最后一天卖出,收益最大)
//input : [7,1,5,3,4,2,1]  output:5      (第二天买入,第三天卖出,第四天买入,第五天卖出,收益最大)

专业一面

笔试大概就是个这个情况,总体来说,题目中等难度。下面说一下我的专业一面,面试我的是一个很年轻的小伙子,感觉比我大不了多少岁,(长舒一口气~)。事实上,如我料想的一样,一面不是很难,整个过程聊的还挺愉快,问的问题不多,我回答的比较多 (为了拖时间啊,问的问题越少出现翻车的可能性就越小啊) 。还有一个我觉得比较好的技巧,就是你在思考问题的时候,不要默不作声,不要把你的面试官凉着,你顺带着把你的思考过程说给面试官听,这样即避免了让面试官等你的尴尬,又显得你的水平比较高,而且即使一个问题你不知道如何回答,也不至于一句话也不说,这样可以给面试官留下好印象,会加分不少的。还有一点,请注意礼貌,保持轻松,保持微笑,我就是全程和面试官聊着天面试完的。一面里的问题,我个人觉得专业性的问题不多,下面是我记忆中的几个问题:

  • 千年老套俗——请自我介绍一下自己。还好不虚,我在去的路上已经想好了自我介绍。“你好,我是西工大软件专业的大三学生,有着西工大人的执着,来自河南,有着河南人的朴实,我热爱前端,但是对自己的定位是全栈,平时喜欢自己瞎折腾,喜欢唱歌,偶尔也跳个舞” 。回答不算是最好的,但是我觉得做自我介绍时可以简短但是要全面,不要一味说技术也不要只顾介绍自己的身份,至于爱好一句盖过就行了。还有就是,说话的时候,大可不必过于严肃,其实对于这种比较年轻的面试官来说,你紧张,他也会跟着紧张。所以,可以说的活泼轻松些,把面试的气氛首先控制下来。
  • 问项目中遇到过那些问题?如何解决的? 这也是个套俗的问题,不过不好答。我做那个微信小程序中确实遇到过不少问题,但是能值得拿出来说的可能不多,而且时间久远,很多地方确实是想不起来了。不慌,如果你需要时间思考和回忆,那你就给面试官直说,“我这个小程序是半年前做的,全栈式开发的,给我点时间,我回忆一下”。 后来我说了3个地方,一个是微信小程序中数字签证这个地方,当时不理解原理;一个是微信小程序中SVG的引入问题,需要转为Base64编码才能加入;还有一个是说的Restful接口冗余的问题如何解决的 。后来我有说,我了解到一种新技术叫 graphQL ,是未来升级和替代Restful接口规范的新接口规范,被称为 结构化查询接口规范 。结果面试官也不知道,这个地方也很加分,其实我也不懂,只是知道,但是唬住了面试官。
  • 后来又问了一道算法题,让我现场编程,不过后来因为时间关系让我说一下思路即可。这个算法题大概是这样的:
// 一个数组,例如 [3,30,34, 5,9],将其中的项重新组合,使得拼接起来的数字最大
//比如上面那个数组 ,最大数便是 ’9534330‘
// input : 一个整数数组  output : 最大的拼接整数

这个题如何解,不再详解,提示一下,利用基数排序的高位比较法,但是像 3 30 34 这几个数,高位都是 3 ,如何比较?提示一下,需要给 3 补一个低位 ,关键就是到底补几?

专业二面

一面我只记得了这几个问题,一面后那个面试官小哥哥直接让我去扫码等待二面,心里喜忧参半。因为当时快5点了,马上今天的面试就到结尾了,这时候面试官都是想赶紧结束去吃饭的,所以形势对我很不利啊,但没办法啊,等了大概20-30分钟,人家直接来找我了,但是公众号显示的是还没到我啊(黑人问号???),虽然还没准备好,但只能硬着头皮上了(cry) 。果不其然,面试官看了我的简历后,然后问了我一个要吐血的问题,当场蒙蔽(cry),这个问题是:

  • 假设你现在访问一个京东页面,页面发起了100个http请求,请问会建立多少个TCP连接?

面试我的是一个看起来稍微年长些的前辈,我此时的内心独白是 “ 卧槽 ,姜还是老的辣呀 ,我这是上来送人头的节奏啊 " ,不过我尽量往HTTP和TCP的方面扯了一点,面试官说不对,然后就给我简单解释了一下。我这里结合面试官的解释,和我下来后的查阅,总结为以下内容:

  1. HTTP 长连接和短链接以及多路复用
    • HTTP/1.0,默认为短链接,即没进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
    • HTTP/1.1起,默认使用长连接,会在响应头加入代码: Connection:keep-alive
      但是长连接也不是一直连接,有一个timeout时间限制,是服务器可配置的
      此时,100个HTTP连接,就不一定会建立100个TCP连接
    • HTTP/2.0 ,可以实现HTTP请求的多路复用,即多个stream共享一个TCP连接,这样就大大节省了每个连接都要建立TCP连接的时间开销
  2. 考虑不同浏览器单站点并发连接数不同 ,配合长连接,也将导致不同浏览器可能对这100个HTTP请求建立的TCP连接也不尽相同
  3. 考虑同源策略下的跨域访问限制 , 因为同源策略的影响,对于不同域的Ajax请求有可能被限制访问,也会导致TCP连接数有所改变
  4. 考虑服务器的压力和期望用户量。有时候服务器为了避免高并发量的交互访问,会限制TCP连接数的上限;还有,有些服务在建立之初会有一个期望用户量,比如,如果一个系统期望用户为1000个,那么根据一些经验公式,只要系统满足支持200个并发用户就行了,此时TCP的上限将参考期望用户数的大小

以上内容仅作参考,有更好的答案可以评论区评论,一起交流一下!下面接着正文说,

  • 第二个问题是问了我项目中的事,和一面中的差不多,不再多说了
  • 第三个问题是一个现场编程题,是一个简单的数据结构和进程调度问题,题目如下:
function a(notify){
	setTimeout(function(){
		console.log('1');
		notify();
	},150);
}
function b(notify){
	setTimeout(function(){
		console.log('2');
		notify();
	},100);
}
function c(notify){
	setTimeout(function(){
		console.log('3');
		notify();
	},300);
}
let queue = [a,b,c];
let num = 2;
function execute(queue , num){
 //to do
}

题目中 a,b,c表示三个要执行的事务,queue是一个执行队列,num是可使用的最大窗口数(每个窗口每次只能执行一个事务),现在补全execute函数和notify函数,来正确调度这三个事务,最后的输出应该是 2,1,3 。
这个题有两个关键点,一个是队列的调度,先进先出策略;一个是事务执行完后如何通知其他待处理事务。 当时,我没有写完,时间关系面试官让我大概说了下思路,后来有一些小问题,面试官又带着我给我现场编了一手程,并给我解释,佩服!下面是我下来有尝试写完了的代码,仅供参考


function execute(queue , num){
	var curNum = new Object();
	curNum.num = num;
	while(queue.length!=0){                  //队列不为空就一直执行调度
		if(curNum != 0){                     //窗口不为空时,从队列中取一个任务
			(queue.shift())(function(){
				curNum.num++;                //此时a,b,c中curNum共享一个内存地址,这样就达到通知的效果
			});
			curNum.num--;                    //队列中取出一个执行,窗口减一
		}
	}
}
  • 之后问我还有什么问题想要问的吗?我就问了些关于CVTE前端团队的现状和未来规划,又聊了聊公司的产品方向和业务主战场等

总体来说,CVTE实习生专业面试的问题不是很难,主要是看一些基本的编程能力,逻辑思维能力以及一些项目经验。很多更专业的问题都没有问,比如HTML语义化,CSS布局,JS高级API,浏览器解析原理等这些我觉得可能要问的问题,结果都没问

终面(hr灵魂大拷问)

今天,也就是3月10号,我刚去面试完hr面,感觉表现一般,不像专业面试那样更有把握。官方给出1-3工作日的答复时间,现在静待“佳”音吧!希望可以拿到Offer ,后期结果出来了在做补充!

今天是3月14号,星期四,CVTE终面后的第四天,结果终于出来了,很荣幸被CVTE认可了。回想这4天,心里还挺忐忑的,这是我第一次面试,而且HR面个人感觉不太好(下面详细说),所以今天当看到自己通过的时候还是很开心的。下面就HR面(也被称为综合面试),来说说大概的问的内容,我的回答保密起见就不再多说了。

其实HR面的面试官很温柔,说话也很平和,而且走技术岗的HR面一般相对也轻松。但是因为我理工科,嘴笨,不太会表达,虽然面试的时候气氛还挺好的,和HR聊的也挺开心的。但是下来自我反省了一下觉得自己的回答很平常,有的地方还结结巴巴的,可能是我的态度很好加了不少分吧。

  • 问家庭背景和现在的情况,教育的经历,童年时候的事情。我感觉是性格评估吧,因为当时我说我小时候4岁前是和奶奶住的,HR顺口说了句,喔那大概就是你性格形成的关键时期吧。但其实我个人认为,我的性格是后期形成的,也为此和HR讲了讲我之后发生的一些事情来证明。这个环节或者是问题,我觉得你千万不要说谎,性格这个东西你的一言一行中就表现出来了,你可以有选择的说,不想说的事可以不说,但是一定不要说谎。
  • 问对现在职业的认识,以及5-10年后对于生活和事业上的规划。说实话,对职业的认识或是对事业的规划这个好说,我想操心的人大概都已经想过自己以后想干什么,想往哪个方面发展。但是对未来生活的规划,这个真不好答,不知道如何答,然后面试官就换了个方式问,你觉得5年后或者更多年后,你想要的生活是什么样的? 当时差点想脱口而出“房子车子票子妹子” ,理智的我犹豫了一下然后随便文雅的扯了点我也忘记说了啥
  • 问除了CVTE还有其他的offer或者面试吗? 这个真的是一个挖好的火坑 ,我也正是因为这里才觉得自己表现的不好。因为当时我确实有,但是我害怕这会不会是试探我对CVTE的忠心,但是我这个人不太会说谎,顺口就说了“ 有 ” , 说完我就后悔了 , 然后HR来了一个灵魂大拷问“请问如果你同时获得了这两个Offer,你是选CVTE,还是另一家?” 。 当时有些慌乱 ,作为我来说,我肯定是两者都会考虑的 ,肯定那个对我更有利我选择那个啊。所以,我实话实说了 ,嗯 , 然后又慌乱的表示了一下CVTE也是很好的选择啊。当时就觉得自己凉凉了(翻到最后,有插曲!!!有惊喜!!!)

基本上,比较印象深刻的就是这些问题,当然也问了一些其他的,有些忘记了。

小插曲

——从面试厅出来后,我觉得回答不是很好,于是走向一进门的休息区,想要好好反省一下自己的回答。
——坐在沙发上的我越想越不对劲,对自己的回答后悔不已(就是上面那个问题,你懂的)
——抬头,看到旁边有位小姐姐,为了排解我抑郁的心情,我和小姐姐聊了聊
——我 : 我觉得我要凉了啊
——小姐姐: 为什么这样说?
——我 :因为我面试的时候说了,我还有另一家的面试,这不是有些凉了吗?
——小姐姐:那怎么会凉呢?如果你没有别的面试,反而会减分的
——我 :为啥?
——小姐姐:因为没有的话,说明你能力有问题啊,HR看问题是从多个角度的,你说这个无所谓的,不影响
——我一想,好像也是,我还在奇怪为啥这位小姐姐,会这么优秀,可以去当HR了
——这是,刚刚面试我的那位面试官出来倒水,和这位小姐姐打了个招呼
——小姐姐:这个小伙说他感觉自己凉了,因为自己说了有别的面试
——面试官:这个没关系的。 转身去倒水了
——我 ??? 一脸懵逼
——小姐姐:你是不是觉得自己已经凉了?我是面试官
惊了 , 后来和小姐姐又聊了一会就走了 ,真是奇妙而傻逼(我自己)的经历

你可能感兴趣的:(前端开发,web开发)