分享一位同学的阿里、百度前端面经

前端技术江湖

共 5208字,需浏览 11分钟

 ·

2020-12-06 11:58

【第一部分 面试前的准备】

从决定找工作开始,我其实经历过一系列思想斗争,最开始想的是,等自己完全准备充分之后,再开始投简历面试。然而,由于惰性,我发现自己很难判断什么时候是完全准备好的时候。

这次换工作的第一次面试,当时的心态就是报着学习的态度,总要迈出第一步,也许当你放低了自己的预期,实际面试过程中可能也就不会那么紧张和不自然了,我当时报的期望就是通过面试查找自己有哪些不足,以及了解一下市场上的真实需求。我的目标很明确,就是要通过大厂面试。这次现场面试,让我一下就找到了状态,决定全力准备面试。

依稀记得当时自己一共投了7家公司,当时有四家公司(此时没有阿里和美团)觉得有意向,还想进一步了解我一下,商量之后再和我约时间。后序接到面试邀约电话时,我意识到,自己还需要再准备一下。这里有个心得是,当你觉得自己还需要再准备一下的时候,可以诚恳地和HR或者面试官约定时间,通常时间为1周左右,一般面试官也会理解。你可以说自己很珍惜这次面试机会,需要再好好准备一下。

然后,我为接下来的面试做了如下准备:

1)阅读了《浏览器原理与工作实践》专栏中关于浏览器渲染原理等内容

2)当时和一些同学组织了leetcode刷题小组,大概每周至少3-5题的刷题速度。每周参与线上刷题分享的活动,刷题活动共持续大概1-3个月左右,这期间穿插着面试、总结和差缺补漏。

基本上以上准备,让我面试前增加了不少信心。

【第二部分 面试题目】

美团、阿里的具体面试题目,我按照「前端基础知识、前端框架的底层原理、性能优化、计算机网络、算法、前端工程化、项目经验」这七大部分来给大家总结:

  1. 前端基础知识,主要从前端四大模块 HTML\CSS\JavaScript\DOM, BOM 方面以及前端框架如React\Vue 等准备。

CSS:

大概会有1-2个问题,主要考察各个常见布局的实现,比如垂直水平居中、双栏布局、随窗口变化的正方形、网格布局等等,一般需要手写代码,这里推荐张鑫旭老师的 CSS 世界,多看几遍足够应对面试。

HTML:

在我面试的过程中这个问的不多,之前 winter 老师有一道面试题,说说你常用的 HTML 标签,然后由这道问题可以延伸出很多细节,进而考察你对 HTML 知识的掌握。

JavaScript:

考察 JavaScript 的细节问题是最多的,通常包括但不限于:

1)JavaScript的基本类型

2)setTimeout、Promise、async/await 三者之间异步解决方案的区别?

3)宏任务和微任务,通常会给出一段代码,让你给出输出结果,并解释?

4)解释 JavaScript 的单线程模型,以及为什么这样设计?setTimeout 的延时为何做不到精确?

5)手写实现 Promise?

6)原型链知识的考察,形式也是给出一段代码,让你给出输出结果,并解释?

7)说说你用过的 ES6 语法的功能点,对 ES2017-9 的新增功能点是否有关注?

8)解释 JavaScript 的闭包?解释 this 指针指向的问题以及常用改变 this 指针指向的函数? apply, bind, call 三者之间的区别?

9)JavaScript 继承的几种方式及优缺点?

10)实现节流或者防抖代码?

11)fetch 是否可以共享 Cookie?两个 then 分别对应着什么?

12)手写代码实现红绿灯效果,红灯3秒,绿灯1秒,黄灯2秒,循环重复?

13)JavaScript 是如何操作 Cookie 的?

DOM API:

这方面也很少被问到,印象中有这几道:

1)如何翻转 DOM?冒泡和捕获机制,实际应用有哪些?

2)冒泡和捕获机制,以及实际应用?

  1. 前端框架的底层原理

我们以 React 为例,经常会考察内容包括:

1)setState 的内部实现?

2)什么是虚拟 DOM,引入虚拟 DOM 的目的,虚拟 DOM 一定能解决性能问题么?

3)React Hooks 有哪些了解?

4)react redux 的底层原理?如何完成异步请求?介绍自己常用哪些 redux 中间件?以组合函数的方式手写代码实现中间件的级联功能?

5)react 的 diff 算法了解么?

6)react 的 fiber 算法了解么?

7)react pureComponent 和 Component 有何区别?

8)react 的生命周期,新版和旧版都需要了解

9)react 的单向数据流如何理解?

10)如何设计组件?

11)react memo?

12)react 无尽列表是如何实现的?

  1. 性能优化

1)浏览器的渲染原理是一定会被问到的?

2)浏览器输入一个 url 之后的过程,以及过程中应用了哪些缓存,如何优化?

3)script 标签和 link 标签的先后顺序对页面加载的影响?

4)async 和 defer 的区别?

5)react native(因为我的简历中有写到使用过 RN)有哪些坑?

  1. 计算机网络

1)解释 TCP/IP 的三次握手和四次挥手?

2)解释跨域问题以及前端常用的解决方案?

3)CORS 的细节,哪些是简单请求?哪些是非简单请求?

4)解释 HTTPS? 解释 HTTP/2?

5)HTTP 报文的格式?

  1. 算法

1)手写冒泡排序?

2)给定两组数,分别以链表方式存储,求和?注意进位

3)数组去重?

4)微信红包是如何实现的?

5)给定一组数,求和函数是带延时的网络请求,如何在最快的时间内计算出这组数据的和?

  1. 前端工程化

1)webpack 如何拆分大文件?

2)webpack 打包的过程?

3)webpack 的基本配置?

  1. 项目经验

这部分大概很多同学都很关心,到底应该怎么写自己的项目经验。出场率最高的问题也是介绍一下你做得最出色的项目?

首先最重要的是,实事求是。

这方面我认为主要考察候选人在工作中所承担的角色,以及平时工作中是否注意积累和总结,其实大多数人平时是不善于总结的,我自己也是,所以平时注意写“详历”是对自己很有帮助的。

关于祥历如何写,极客时间《面试现场》专栏中有提到,我觉得非常好,分享给大家

详历的结构如下:

开头,“有段经历,正好遇到了这个问题……”。(讲清问题背景)

发展,“一般的做法是做不到的,因为……”。(讲问题的复杂性和挑战)

高潮,“我一开始用到……后来……”。(讲解决方案的形成过程)

结局,“成果是……”。(讲结果、影响、意义)

所谓“详历”,是相对于“简历”更详细的工作经历和能力的总结,用故事的方式,记录工作的成果、职位、经验和能力发展,相当于你的工作档案,用于回顾个人工作经历,撰写简历,也是回答面试问题的经历素材库。这些素材体现你的个人经验、技能、潜力、动机。详历是你个人工作经历的故事汇编,是你能力的索引,是给你自己参考用的,随着经历的增加而越来越充实;而简历是给面试官看的,最好因职位而异。

详历主要有三个作用:有助于职业规划,可视化技能体系、经验分布和成长路径。是定制简历的母版。提供面试素材。当被问到“这个项目最大的提高是什么”,或者“你失败的一次沟通是怎样的”,你可以从准备好的详历中,快速选取恰当的故事,讲给面试官。

【第三部分 面试流程,以及美团、阿里面试有什么不同的体会】

(待大亮补充,比如:)

可能很多同学都想知道大厂的面试流程,这里我也简要分享一下:

总的来说大厂对于候选人的基础知识要求还是非常严格的,当然也更看重候选人的潜力和心智,因为在大厂看来知识是死的,只要时间足够,通常都可以掌握,但是潜力和心智状态,却和每个人的成长轨迹和阅历有关。

一面面试官通常是你未来的同事。面试主要考察候选人的基础知识,我遇到的面试官都非常nice,会寒暄几句,帮助你脱离紧张的情绪,然后进入正式面试环节。我记得看过一个TED的演讲,内容是关于紧张,里面讲就算你真的紧张的不行,也不必担心,因为人总是比较在意自己的,所以就算你觉得自己非常紧张了,在面试官眼中你表现得也没有你想象的那么紧张。

二面面试官通常是你未来的直级leader。这里阿里和美团不一样的点在于,当时阿里主要考察了我对于过往项目的掌握程度,以及我在项目中的角色,然后和我聊了很多个人成长方面的心得和看法;美团则侧重考察了我一面面试官没有问到的基础知识点,这里其实每个公司可能都不太一样。

三面面试官通常是你整个部门的leader,主要从职业发展和候选人背景方面进行考察,过程中也会穿插着考些算法题,不过都不难,主要考察候选率的编程能力的。美团到这里就结束了,之后就是HR和你聊聊薪水,个人背景,跳槽原因等等。

阿里比较特殊,会多一轮交叉面试,四面是HRG和集团技术大佬混合面试,我个人觉得主要考察候选人的沟通、应变及潜力等等,没太问技术相关的问题,可能我比较幸运吧

想说的是如果想求职阿里,就要做好打持久战的准备,阿里的面试周期比较长,1-2个月也是很正常的,所以要做好心理准备,如果面试完没有收到阿里的邮件,应该就通过面试了,没有消息就是最好的消息。美团就很快,当然也看部门是否急需招人,我面试的部门当天就走完了全部流程。

【第四部分 其他 Tips】

下面这些 Tips,都是我平常自己准备面试会遵循的,希望也可以帮助到你。

  1. 简历编写,如何过初步筛选

网上优化简历的方法论很多,我就不多展开了,我列举一下我的简历框架,希望能给你一些启发

1)尽量一页纸展示自己的内容。

2)总体分为7个模块:个人信息、教育及工作背景、技能清单、项目经验、开源项目、个人博客、自我评价,其中开源项目和个人博客部分可有可无,如果有,自然是加分项。

3)技能清单里面,写清楚自己熟悉的语言、框架,甚至能证明你有某方面能力的证书。这里需要注意的是,千万别写“精通”,除非你这门语言或者框架的缔造者,一般来说精通一门语言或者框架确实很难。

4)项目部分,我的书写方式是 工作+结果。挑选项目中我参与的比较重要的部分,然后描述清楚工作内容和我的产出结果,尽量数字化自己的成果,比如项目时间、代码量、提高百分比等。再者,项目部分一定要真实,你需要对你写的内容了如指掌并且负责,否则面试官可能会认为你人品有问题。

5)自我评价部分,通常来说,适当包装自己的优点即可。如果某个企业你十分心仪,也可以参考对方的企业文化,重点匹配自己的内容即可。另外,你写的优点最好能用1-2个例子来佐证,比如我写了自己自驱力强,阿里面试官问到我的时候,我就介绍了自己主动学习,参与前端训练营的培训、买了很多专栏并学习、关注了很多技术博客,并写文章总结等等。

  1. 怎么谈薪资

如果到了谈钱的时候,首先恭喜你前期的努力终于快见到回报了。我们程序员通常都比较内向,不善于谈这些,我也一样,但谈钱其实没有什么不好意思的。你可能跟我一样,有着错误的心理认知:自己少要点,公司看到我们要的不多,可能会考虑给 Offer。实际上,当你几轮面试过后,你应该可以判断出自己是否有可能拿到 Offer的。这时候,你可以先调研一下行业薪资水平,然后再结合自己的水平给出自己的预期,这种情况下,你拿到的 Offer才可能不至于让自己委屈。有时候,不敢多要也是正常的,多面试几次,多拿到几个 Offer,底气自然也就足了。

  1. 养精蓄锐

面试前吃饱饭也是很重要的,记得有次面试一个大厂,没吃早饭,然后坐地铁1个小时,3轮面试3.5个小时,三面的时候自己的专注力和精力能明显感觉到是跟不上的,这样也是会影响自己临场发挥的

【最后的心得】

以上就是我的面试经历分享了,最后,还有几点心得来跟大家分享:

  1. 临时抱佛脚搜面经、背题,通常来说是没用的,但是我们通过面试查找不足,然后努力补足短板,及时总结是很有必要的。在找工作的过程中我每面试一家公司,都会写面试总结,记录面试遇到的题目,回忆自己回答好和不好的地方。

  2. 面试过程中,对于完全不知道的答案的题目,回答不知道也没有什么。面试是一个综合考察的过程,不会因为你一两个题目回答不够好就将你淘汰,而且面试过程中如果遇到不太明白细节的问题,可以和面试官老师做进一步沟通,这也是你展示自己沟通能力的好机会,千万别自己闷头苦想。试想想如果项目中遇到不会的,也会是需要虚心请教的,不然闷头苦干只会 delay 项目进度。

  3. 在我看来,每一次面试都是一次绝佳的学习机会,尤其是大厂的面试官老师无论是经验、阅历以及专业知识,都能很好的给我正向反馈。在面试百度时,二面面试官就和我聊了很多人生选择以及个人成长方面的思考,面试阿里时也是二面面试官和我聊了很多工作方法论方面的思考,这些对我来说,比熟记几个知识点更有价值和意义。

点个『在看』支持下 

浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报