春招的心路历程-字节跳动上岸

  |  

前言

这篇文章,记录一下我从开始准备实习,到最后成功收到字节跳动的实习offer的心路历程。希望能对目前还在春招中努力面试,或者计划找工作的同学们有所帮助。


69

首先介绍一下我自己,我叫祝佳磊,是来自西安电子科技大学的一名21届本科毕业生,目前大三在读,专业是网络空间安全。我是从大三上期末开始准备找一个实习工作的,从年前开始,到如今的四月中旬,历经2个多月。前后也面了大大小小三四十场面试了,面过的公司和部门也很多,例如阿里云、阿里达摩院、钉钉、阿里淘系、阿里新制造,腾讯imweb,字节跳动好好学习部门、今日头条等。最后成功的通过了字节跳动今日头条的所有面试,目前在等offer的发放,成功上岸。说来也巧,我的第一次正式面试是字节跳动的好好学习方向,真的是起也字节,终也字节。

在这两个多月的面试中,经历了很多,有因为面试通过的兴奋,有面试失败的失落,也有因为面试受到的打击怀疑过自己。不过还好坚持了下来,所以也有一个不错的结果。接下来就跟大家分享一下我的面试过程和学习经验,希望对大家,尤其是学习前端或者打算学习前端的同学有所帮助。

字节跳动今日头条面试经历

因为比较菜,目前只有一个offer,字节跳动是我唯一面完全程的面试,所以就给大家分享一下字节跳动的面试全过程。

首先要感谢一下藤野同学,是藤野同学把我的简历推荐给他曾经实习过的导师的,让我有了这次面试经历。藤野同学还推荐了我到腾讯的imweb团队,只可惜二面结束以后没有通过。

这里也希望大家能够明白,校友真的是一个很好的资源。尤其是我们学校,在互联网行业内是比较有名的,可谓是校友遍天下。像我之前面试淘系的时候,淘系前端校招的负责人元泉学长就是我们学校11届的毕业生,面试我的大果学长是我们学校15届的毕业生。所以希望大家能多寻求同学、学长学姐的帮助,也希望有能力的同学也可以多帮助还在寻找实习机会的同学。

一面

我是在3月28号把简历发送给藤野同学的,他当天帮我内推了。3月31号我的简历通过了建立评估。4月1号,hr和我联系确定了4月3号16.30进行面试

由于面试的时间比较久了,加上我当时没能及时的写面经,所以很多面试问题我现在也想不起来了。这其实不是一个好习惯,如果同学们以后面试,尽量在面试结束后,把刚刚的面试经过以及问题记录下来,有助于后面回顾,解决面试时没能解决的问题,查漏补缺。

我把我还记得的一些问题写下来:

  • 未知高宽的元素如何实现水平垂直居中
  • 如何用CSS绘制一个扇形
  • JS对象的原型链问题
  • 算法实行对查找一个树到指定值的路径,这是一个深度优先算法问题

还有一些其它问题,记不起来了。

一面面试官是一个小姐姐,为人比较和善。一面结束后,面试官让我等待一下,它们要进行一下讨论。这也是字节面试的特点,字节的一面和二面是连在一起进行的,如果一面通过,那么接下来二面面试官就会进来继续二面,如果没有通过,一面面试官会进来通知的。而有些公司的话,每一轮面试是错开的,在面试结束以后,他们会说,今天就先到这里,如果有后续的话会再和你联系的。

二面

如果一面是问一些基础技术的话,那么二面就要开始问到基础的核心,这里我也列举一下我还记得的面试问题

  • 什么是虚拟DOM,他的作用是什么,这涉及到JS执行引擎和DOM渲染引擎的切换从而导致的性能损耗问题

  • MVVM框架是一个怎样的形式,他是如何实现数据的双向绑定的

  • 了解JS的事件循环吗,是一个怎么样的过程

  • 我看你的简历里有些用过原生的XMLHttpRequest,那么你用Promise封装一下XHR的请求过程,实现这样的一个效果fetch(url).then(res) {console.log(res)}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function fetch(url) {
    let pro = new Promise((resolve, reject) => {
    if(window.XMLHttpRequest) {
    let xhr = new XMLHttpRequest();
    } else {
    let xhr = ActiveXObject("Microsoft.XMLHTTP");
    }
    // 做一个浏览器兼容的判断
    xhr.onreadystatechange = function() {
    if(xhr.readystate == 4) {
    if(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
    resolve(JSON.parse(xhr.responseText));
    } else {
    reject('请求失败');
    }
    }
    }
    xhr.open('GET', url, fasle);
    xhr.send
    });
    return pro;
    }
  • 十行代码内实现一个二叉树的先序遍历,二叉树的结构自己实现

  • 浏览器的同源策略有了解吗,那我们如何针对这个策略实现跨域请求

  • margin塌陷有了解过吗

  • 浏览器的缓存策略有了解过吗,什么情况下浏览器可以使用本地缓存,什么情况下浏览器一定要重新请求服务器资源。

  • Vue框架的如果存在一个组件,这个组件有一个子组件,那么这个父子组件的生命周期是怎么样的

  • JS是单线程还是多线程语言,它有哪几种方式实现异步

  • 防抖和节流的概念有了解过吗,如何实现一个防抖函数

  • 写一个封装函数,传入的参数为一个函数,封装完以后在原函数正常执行的基础上,多输出一个1

    1
    2
    3
    4
    5
    6
    7
    8
    let getFunc = function(func) {
    return () => {
    let arr = [].prototype.slice.call(arguments);
    func.apply(this, arr);
    console.log(1)
    }
    }
    let newFunc = getFunc(func);

剩下的就不太记得了。

其实一般来说,技术一面是比较好通过的,问题都比较基础。但是技术二面的难度就比较大了,它会根据你的简历,考察你对这个岗位需要具备的技术的掌握情况。所问的问题都会很有深度,他会考察你一门语言的运行原理,框架的架构基础,编程和算法的掌握能力,解决实际问题的能力,对一些技术难点的看法,对一些业内标准的理解。

三面

因为一二面结束以后是清明节,所以我跟hr把三面的时间约到了4月8号的晚上17.30。

三面一般我们称为leader面,一般的一面二面,都是有组内技术人员负责的,而三面开始,面试你的就是你应聘部门的leader了。

三面开始,面试官就很少问技术细节了。他会根据你的简历,了解你的技术栈构成,会开始跟你聊你的项目,你项目的特点,它的应用场景有哪些,你在项目中的角色定位,负责哪些功能,具体用什么技术实现的,你再实现过程中遇到的难点,你是如何生成自己的解决方案的。

这里,做过项目的同学,最好在面试之前,再回顾一下自己的项目,最好能清楚的在面试的过程中,介绍自己项目,以及你在其中起到的作用,你针对问题置定的解决方案。

如果没有做过项目的同学,最好还是写一点,比如说你有一个想要实现的东西,就动手去写。不得不说项目经验真的很重要,技术岗的简历,最看重的是你的技术栈构成和掌握情况,以及项目经历和实习经历,这些在写简历的时候也要着重的写。当然,如果实在没有项目经历,那么三年下来,你做过的大作业也不少,好好准备,也可以作为项目经历来讲。

三面面的很顺利,leader也很平易近人,我们大概聊了一个半小时,后面还讨论了一下Chrome 80浏览器对于Cookie samesite属性默认值的修改的问题。

这里也有一个建议给大家,多了解你学习的技术和你处的行业的前沿问题和业内标准的问题,尤其是在三面的时候可以跟面试官交流。一来可以把面试官引到你擅长的问题上,二来可以显示出你对这门技术的热爱,对前沿问题的关注。

面完以后,leader让我加了一下他的微信,然后让我等5分钟,hr后续会跟我联系的。之后hr打来电话和我确定了hr面的时间

HR面

字节跳动的面试流程比较少,阿里的话在面之后,还会有一个交叉面,由其它部门的leader再对你进行一次面试,但是字节没有交叉面,所以三面结束以后就是HR面了。

HR面我约的是4月9号,早上10.30,因为11点有课,所以面的比较快。

HR面的话它主要考察的就是你的学习能力,会问及你为什么要选择这个技术方向,你又是如何在平时学习的。还会问及你之前在项目过程中,如何跟组内成员进行任务分工,沟通。问你对后续学习的安排,对公司的了解,你想要在公司中学习到什么或获得什么。还会问你的实习时间能有多长,在什么时间段,什么时候可以入职。这里我的建议是,能说长一点,就说长一点,因为公司都希望能招到稳定的长期实习,尤其是能转正的岗位。还会问你是否还在面试其它公司,是否已经受到其它公司的offer。这里千万别觉得说,收到几个offer,或者同时面几家公司不好意思,直接跟他说你已经有的offer,然后说,不过我更喜欢或者更向往我们公司的氛围,就是吹这家公司,所以我还是更愿意试一试,如果收到offer,我还是更愿意加入我们公司。这样一来表明了,你的技术是受到多家公司的认可的。二来表明了你对这个公司的意愿更加强烈。不过有就是有,没有就是没有,不能乱说。

这个就是我面试字节的整个过程,下面讲讲我的求职经验

求职经验

我觉的求职最重要的四个点:基础、项目、简历、心态

下面我逐一讲一下

基础

只要是技术岗位,不管是哪个方向的,一个扎实基础尤为重要,它是你通过笔试和一二面的保障。不同的技术方向可能需要掌握的技能不同,以我应聘的前端实习岗位为例,需要掌握的基础有:

  • JavaScript,以及ECMAScript6、7标准
  • html、css,以及HTML5、CSS3标准
  • 一个前端MVVM框架的使用,及其原理
  • 数据结构与算法基础
  • 计算机网络基础,例如HTTP、HTTPS协议,DNS解析
  • 浏览器的一些标准,譬如浏览器缓存策略、浏览器同源策略,浏览器对JS执行引擎和DOM渲染引擎的操作等。
  • 常见的前端Web安全问题
  • 了解一门后端语言,前端一般以Node.js为主,因为他也是用JavaScript语法的
  • 常见的编程设计模式,性能优化的方式
  • 前端工程化的工具:主要是webpack和plugin

有的同学可能不太了解自己要学习或者要从事的方向,到底要掌握哪些基础。那么我觉得最好的方法就是,去看岗位招聘信息。一般岗位招聘信息中会详细列出满足公司需求的人员需要掌握哪些技术,你根据这些查漏补缺就行了。

推荐几个学习的网站:牛客网,CSDN博客,掘金博客,leetcode(这个是刷算法题的)

项目

这里我还是不得不强调一下项目的重要性。项目是你简历吸引面试官的一大亮点,而且这个不是靠短期突击就能实现的,需要你平时的积累。而且最好的项目是要有实际应用价值的。我知道网上有很多的教学视频,各个方向的都有,什么从零开始用XX语言实现一个XXX应用。老实说这些项目没有什么特点,最主要的是没有你思考的过程,你只需要跟着做就行了。而不用思考,为什么我要在这个项目中实现这个功能,我需要运用什么技术去实现这个功能,出现的问题我是怎么总结归纳,从而形成一套自己的解决方案的。你要明白一点,一切的项目都是由需求而生的。所以与其跟着这些视频些项目,不如实现一下你脑海中想要做的东西。这样既能丰富你的简历,在leader面的时候也有可以谈的内容。

简历

简历是你对自己的一个总结,所以一个好的简历很重要。自己的简历要写的丰富一点,特别是对项目的描述。要写清楚自己担任的职位,项目的源码地址,如果是上线的项目可以写上线上地址,还有项目使用的技术栈、主要功能以及技术难点都要写清楚,这样面试官可以通过你的项目经历做一个初步的评估。所以项目经历越丰富越好,但是也不要什么项目都往简历上写。还是像我说的那样,写有实际应用价值的项目。

现在的简历模板很多,找一个好看的不难。我这里就提一点,有些简历它的技能掌握模块,用的是一些百分比,进度条什么的,其实这样的方式不好。因为它无法直观的展示你对某项技能的掌握能力,面试官无法知道,你这100%是什么水平,你60%对应的又是什么水平。在我看来,直接了当一点。了解、熟悉、掌握、熟练掌握、精通,一般用这几个词来描述就够了。还有,千万不要坑自己,什么程度就用什么词。就只是听过的东西,就别往简历上写。

还有,联系方式千万别留错了,尤其是邮箱和电话。有些人会觉得简历留QQ邮箱很low,其实并没有,我投阿里留的还是QQ邮箱呢。留常用的就行,别因为其它的,留一个很久不用了,可能密码都忘了的邮箱。

心态

前面三项可以说是面试前的准备,那么一个良好心态,就是你应对面试的关键。

首先一点,就是别紧张。不过紧张是难免的,我的第一次面试是面的字节跳动-好好学习方向,我记得我当时回答面试关的问题,声音都在颤,面试官让我现写代码的时候,大脑一片空白。面完回头看看,其实有些题都听简单的。针对紧张,我个人没有什么好的解决办法。我的经验就是多面,面多了自然就不怕了。

其次,就是你的抗压能力。面试的时候肯定会出现,面试官问的你答不上来,再问还是答不上来的情况,这个时候心态不能崩。一般来说,面试官的水平肯定是比我们高的,那么在面试的过程中,问题的难度肯定是会逐渐增大的,因为面试官也想了解到你在某一方面目前的能力上限,所以一定会出现答不上来的情况。

这个时候,就需要懂得放弃。针对一时答不上来的问题,如果之前接触过,可以跟面试官说,容我思考一下,或者请求面试官给点提示。能说多少说多少,如果还是答不上来,那么就果断的放弃,死磕只会让面试官觉得你再死撑,浪费时间,印象就不会好。如果面试官问的,你的确没有接触过或者了解过。那么就直接了当的说,不好意思,这个方面我没有接触过,面试官也不会为难你。

面试失败是常有的事,不要气馁。这里分享一下我的经历,在钉钉二面的时候,当时的面试官给我的反馈是,我觉得你不够热爱前端。说实话的,当时挺受打击的。你一直在坚持学习,一直为之付出努力的事情,被别人这样的否定。以至于我开始怀疑,我是不是真的不够热爱前端。后来也想明白,热不热爱是自己的事情,别让别人的评价影响你,只要坚持就会有结果,最后也的确得偿所愿了。

学习经历

最后讲一下自己的学习经历,希望能对想要从事前端方向的同学有所帮助。

其实我身边的同学都知道,我一开始学的并不是前端,而是Web安全,后来转的前端开发。这其实是一个方向选择的问题,在我学习Web安全的过程中,发现同期学习的同学都进步的很快,而我有点踏步不前,所以我开始怀疑自己到底适不适合这个方向。有时候,当方向错了,停下来,也是一种前进。当时也徘徊过一段事件,那时候研究过Java,接触了Java Servlet,一种后端技术,最终还是确定了想做前端。其实前端技术我接触的也比较早,毕竟Web安全跟前端还是有一点关联的。不过当时学HTML和CSS的时候内心是有点鄙夷的,这也能算编程,不过后来还是称为了自己当初讨厌的样子。其实现在在很多人眼中,对前端还是存在偏见,以至于前端开发者也调侃自己就是一个切图仔。不过那都是十几年前的事情了,当时万维网刚起步,前端技术的确很不成熟,大多数前端在做的无非就是实现设计师设计的网页设计稿。不过随着前端技术的成熟,尤其是JS这一门语言的发展,让前端技术开始攻城略地。我当时选择前端也是因为JS这门语言的应用范围真的很广泛。

上图虽然有点夸张,但是也很好的说明了JS的发展前景。的确,现在前端的技术方向十分的广泛。网页,移动端网页,数据可视化,微信小程序,后端的Node.js等等。甚至现在一些安卓软件也不再使用传统的Java开发,而是通过一个内嵌的浏览器引擎,使用前端开发技术开发手机应用。而且像大多数男生都玩的LOL,它的客户端初始页面也是通过前端技术实现的。

那么怎么样才能从前端入门到可以开始找工作呢。这里介绍一下我自己的学习路线

基础:HTML、CSS以及JavaScript是必须要掌握的,HTML的话比较简单,可以通过W3CSchool的网站学习,CSS的话推荐看《CSS权威指南》。JavaScript的话可以看《JavaScript高级程序设计》,这本书我们又称为红宝书,可以说只要是做前端的,不可能没看过这本书。

进阶:ES6、ES7标准,这个是JavaScript的核心标准,一定要深入理解,还有就是JavaScript的核心,这个可以看《你不知道的JavaScript》有上中下卷,我当是看的感受是,我真的对JavaScript一无所知。HTML和CSS方面,需要去了解HTML5和CSS3的标准。

网络:前端所需要的网络方面的知识主要就是http、https、tcp和udp

前端框架:现在国内主流的前端框架主要就是Vue和React,我个人学的是Vue,但是我推荐大家还是学习React,从我面试了解到了情况,大公司主要使用的还是React+Redux这一套。

算法和数据结构基础:这部分的话,我只能说多刷题吧,leetcode刷就可以了

剩下的无非是关注一些技术论坛,实时了解新技术。

结语

找个实习的确不容易,所以希望大家还是能多多努力,多多准备。也可以多向周围的同学学习,获取经验。最后祝大家能找到心意的工作吧。

文章目录
  1. 1. 字节跳动今日头条面试经历
    1. 1.1. 一面
    2. 1.2. 二面
    3. 1.3. 三面
    4. 1.4. HR面
  2. 2. 求职经验
    1. 2.1. 基础
    2. 2.2. 项目
    3. 2.3. 简历
    4. 2.4. 心态
  3. 3. 学习经历
  4. 4. 结语